ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDA1MzI0MDIuLjE4Y2Y1NzYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMzYsMTUgKzM2LDEzIEBACiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvQ2FDZXJ0cy5tawogCiAjCi0jIERpc2FibGUgdGVzdCBtb2R1bGVzIGlmIExJQkNPUkVfU0tJUF9URVNUUyBlbnZhciBpcyBzZXQKKyMgRGlzYWJsZSB0ZXN0IG1vZHVsZXMgaWYgTElCQ09SRV9TS0lQX1RFU1RTIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4KICMKIAogaWZuZXEgKCQoTElCQ09SRV9TS0lQX1RFU1RTKSwpCiAkKGluZm8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopCiAkKGluZm8gKiBsaWJjb3JlIHRlc3RzIGFyZSBza2lwcGVkIGJlY2F1c2UgZW52aXJvbm1lbnQgdmFyaWFibGUgTElCQ09SRV9TS0lQX1RFU1RTPSQoTElCQ09SRV9TS0lQX1RFU1RTKSkKICQoaW5mbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKikKLUFMTF9NT0RVTEVfVEFHUyA6PSAkKGZpbHRlci1vdXQgdGVzdHMsJChBTExfTU9EVUxFX1RBR1MpKQotQUxMX01PRFVMRVMgOj0gJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRV9OQU1FX1RBR1MudGVzdHMpLCQoQUxMX01PRFVMRVMpKQogZW5kaWYKIAogCkBAIC02MCw5ICs1OCw2IEBACiAgICAgICAgICQoSE9TVF9PVVQpL2Jpbi9kZXhvcHQgXAogICAgICAgICAkKEhPU1RfT1VUKS9saWIvbGliamF2YWNvcmUuc28gXAogICAgICAgICBjYWNlcnRzLWhvc3QgXAotICAgICAgICAkKEhPU1RfT1VUKS91c3Ivc2hhcmUvem9uZWluZm8vem9uZWluZm8uZGF0IFwKLSAgICAgICAgJChIT1NUX09VVCkvdXNyL3NoYXJlL3pvbmVpbmZvL3pvbmVpbmZvLmlkeCBcCi0gICAgICAgICQoSE9TVF9PVVQpL3Vzci9zaGFyZS96b25laW5mby96b25laW5mby52ZXJzaW9uIFwKICAgICAgICAgY29yZS1ob3N0ZGV4IFwKICAgICAgICAgYm91bmN5Y2FzdGxlLWhvc3RkZXggXAogICAgICAgICBhcGFjaGUteG1sLWhvc3RkZXggXApkaWZmIC0tZ2l0IGEvSmF2YUxpYnJhcnkubWsgYi9KYXZhTGlicmFyeS5tawppbmRleCAyNmE1ODZhLi45OGRlMWYyIDEwMDY0NAotLS0gYS9KYXZhTGlicmFyeS5taworKysgYi9KYXZhTGlicmFyeS5tawpAQCAtODMsNiArODMsNyBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRSA6PSBjb3JlCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0phdmFMaWJyYXJ5Lm1rCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IHR6ZGF0YQogCiBpbmNsdWRlICQoQlVJTERfSkFWQV9MSUJSQVJZKQogCkBAIC05MCwxNyArOTEsMTggQEAKIAogCiAjIE1ha2UgdGhlIGNvcmUtdGVzdHMgbGlicmFyeS4KK2lmZXEgKCQoTElCQ09SRV9TS0lQX1RFU1RTKSwpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXRlc3QtamF2YS1maWxlcy11bmRlcixkYWx2aWsgZG9tIGpzb24gbHVuaSBzdXBwb3J0IHhtbCkKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAkKHRlc3RfcmVzb3VyY2VfZGlycykKIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyA6PSB0cnVlCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBib3VuY3ljYXN0bGUgY29yZSBjb3JlLWp1bml0Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gc3FsaXRlLWpkYmMgbW9ja3dlYnNlcnZlcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IHNxbGl0ZS1qZGJjIG1vY2t3ZWJzZXJ2ZXIgbmlzdC1wa2l4LXRlc3RzCiBMT0NBTF9KQVZBQ0ZMQUdTIDo9ICQobG9jYWxfamF2YWNfZmxhZ3MpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfTU9EVUxFIDo9IGNvcmUtdGVzdHMKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvSmF2YUxpYnJhcnkubWsKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQorZW5kaWYKIAogIyBUaGlzIG9uZSdzIHRyaWNreS4gT25lIG9mIG91ciB0ZXN0cyBuZWVkcyB0byBoYXZlIGEKICMgcmVzb3VyY2Ugd2l0aCBhICIjIiBpbiBpdHMgbmFtZSwgYnV0IFBlcmZvcmNlIGRvZXNuJ3QKQEAgLTEzOSwyMiArMTQxLDI1IEBACiAgICAgTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKICAgICBMT0NBTF9NT0RVTEUgOj0gY29yZS1ob3N0ZGV4CiAgICAgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9KYXZhTGlicmFyeS5taworICAgIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gdHpkYXRhLWhvc3QKIAogICAgIGluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKIAogICAgICMgTWFrZSB0aGUgY29yZS10ZXN0cyBsaWJyYXJ5LgorICAgIGlmZXEgKCQoTElCQ09SRV9TS0lQX1RFU1RTKSwpCiAgICAgaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtdGVzdC1qYXZhLWZpbGVzLXVuZGVyLGRhbHZpayBkb20ganNvbiBsdW5pIHN1cHBvcnQgeG1sKQogICAgIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAkKHRlc3RfcmVzb3VyY2VfZGlycykKICAgICBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQogICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGJvdW5jeWNhc3RsZS1ob3N0ZGV4IGNvcmUtaG9zdGRleCBjb3JlLWp1bml0LWhvc3RkZXgKLSAgICBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gc3FsaXRlLWpkYmMtaG9zdCBtb2Nrd2Vic2VydmVyLWhvc3RkZXgKKyAgICBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gc3FsaXRlLWpkYmMtaG9zdCBtb2Nrd2Vic2VydmVyLWhvc3QgbmlzdC1wa2l4LXRlc3RzLWhvc3QKICAgICBMT0NBTF9KQVZBQ0ZMQUdTIDo9ICQobG9jYWxfamF2YWNfZmxhZ3MpCiAgICAgTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKICAgICBMT0NBTF9NT0RVTEUgOj0gY29yZS10ZXN0cy1ob3N0ZGV4CiAgICAgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9KYXZhTGlicmFyeS5tawogICAgIExPQ0FMX0JVSUxEX0hPU1RfREVYIDo9IHRydWUKICAgICBpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCisgICAgZW5kaWYKIGVuZGlmCiAKICMKQEAgLTE2MiwxOSArMTY3LDE5IEBACiAjCiAjCiAjIFJ1biB3aXRoOgotIyAgICAgbSBsaWJjb3JlLWRvY3MKKyMgICAgIG1tIC1qMzIgbGliY29yZS1kb2NzCiAjCiAjIE1haW4gb3V0cHV0OgotIyAgICAgb3V0L3RhcmdldC9jb21tb24vZG9jcy9saWJjb3JlL3JlZmVyZW5jZS9wYWNrYWdlcy5odG1sCisjICAgICAuLi9vdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2xpYmNvcmUvcmVmZXJlbmNlL3BhY2thZ2VzLmh0bWwKICMKICMgQWxsIHRleHQgZm9yIHByb29mcmVhZGluZyAob3IgcnVubmluZyB0b29scyBvdmVyKToKLSMgICAgIG91dC90YXJnZXQvY29tbW9uL2RvY3MvbGliY29yZS1wcm9vZnJlYWQudHh0CisjICAgICAuLi9vdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2xpYmNvcmUtcHJvb2ZyZWFkLnR4dAogIwogIyBUT0RPIGxpc3Qgb2YgbWlzc2luZyBqYXZhZG9jLCBldGM6Ci0jICAgICBvdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2xpYmNvcmUtZG9jcy10b2RvLmh0bWwKKyMgICAgIC4uL291dC90YXJnZXQvY29tbW9uL2RvY3MvbGliY29yZS1kb2NzLXRvZG8uaHRtbAogIwogIyBSZXJ1bjoKLSMgICAgIHJtIC1yZiBvdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2xpYmNvcmUtdGltZXN0YW1wICYmIG0gbGliY29yZS1kb2NzCisjICAgICBybSAtcmYgLi4vb3V0L3RhcmdldC9jb21tb24vZG9jcy9saWJjb3JlLXRpbWVzdGFtcCAmJiBtbSAtajMyIGxpYmNvcmUtZG9jcwogIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTE5MCw3ICsxOTUsNyBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYmNvcmUKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvSmF2YUxpYnJhcnkubWsKIAotTE9DQUxfRFJPSURET0NfT1BUSU9OUzo9IFwKK0xPQ0FMX0RST0lERE9DX09QVElPTlMgOj0gXAogIC1vZmZsaW5lbW9kZSBcCiAgLXRpdGxlICJsaWJjb3JlIiBcCiAgLXByb29mcmVhZCAkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktcHJvb2ZyZWFkLnR4dCBcCmRpZmYgLS1naXQgYS9OYXRpdmVDb2RlLm1rIGIvTmF0aXZlQ29kZS5tawppbmRleCAxYWFiOTAxLi5iN2M4YjBlIDEwMDY0NAotLS0gYS9OYXRpdmVDb2RlLm1rCisrKyBiL05hdGl2ZUNvZGUubWsKQEAgLTUxLDYgKzUxLDMwIEBACiAjIHdlIGFyZW4ndCBxdWl0ZSBkZWZpbmluZyBhIG5ldyBydWxlIHlldCwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAjIHN1Yi5tayBmaWxlcyBkb24ndCBzZWUgYW55dGhpbmcgc3RyYXkgZnJvbSB0aGUgbGFzdCBydWxlIHRoYXQgd2FzCiAjIHNldCB1cC4KKworIyBTZXQgdXAgdGhlIHRlc3QgbGlicmFyeSBmaXJzdAoraWZlcSAoJChMSUJDT1JFX1NLSVBfVEVTVFMpLCkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9ICQoY29yZV9tYWdpY19sb2NhbF90YXJnZXQpCitjb3JlX3NyY19maWxlcyA6PQorCisjIEluY2x1ZGUgdGhlIHN1Yi5tayBmaWxlcy4KKyQoZm9yZWFjaCBkaXIsIFwKKyAgICBsdW5pL3NyYy90ZXN0L25hdGl2ZSwgXAorICAgICQoZXZhbCAkKGNhbGwgaW5jbHVkZS1jb3JlLW5hdGl2ZS1kaXIsJChkaXIpKSkpCisKKyMgVGhpcyBpcyBmb3IgdGhlIHRlc3QgbGlicmFyeSwgc28gcmVuYW1lIHRoZSB2YXJpYWJsZS4KK3Rlc3Rfc3JjX2ZpbGVzIDo9ICQoY29yZV9zcmNfZmlsZXMpCitjb3JlX3NyY19maWxlcyA6PQorCisjIEV4dHJhY3Qgb3V0IHRoZSBhbGxvd2VkIExPQ0FMXyogdmFyaWFibGVzLiBOb3RlOiAkKHNvcnQpIGFsc28KKyMgcmVtb3ZlcyBkdXBsaWNhdGVzLgordGVzdF9jX2luY2x1ZGVzIDo9ICQoc29ydCBsaWJjb3JlL2luY2x1ZGUgJChMT0NBTF9DX0lOQ0xVREVTKSAkKEpOSV9IX0lOQ0xVREUpKQordGVzdF9zaGFyZWRfbGlicmFyaWVzIDo9ICQoc29ydCAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpKQordGVzdF9zdGF0aWNfbGlicmFyaWVzIDo9ICQoc29ydCAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpKQorZW5kaWYgIyBMSUJDT1JFX1NLSVBfVEVTVFMKKworCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSAkKGNvcmVfbWFnaWNfbG9jYWxfdGFyZ2V0KQogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9OYXRpdmVDb2RlLm1rCkBAIC05Niw2ICsxMjAsMzIgQEAKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCisKKyMgVGVzdCBsaWJyYXJ5CitpZmVxICgkKExJQkNPUkVfU0tJUF9URVNUUyksKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAkKGNvcmVfY2ZsYWdzKQorTE9DQUxfQ1BQRkxBR1MgKz0gJChjb3JlX2NwcGZsYWdzKQoraWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorIyBJZ25vcmUgIm5vdGU6IHRoZSBtYW5nbGluZyBvZiAndmFfbGlzdCcgaGFzIGNoYW5nZWQgaW4gR0NDIDQuNCIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCitlbmRpZgorCisjIERlZmluZSB0aGUgcnVsZXMuCitMT0NBTF9TUkNfRklMRVMgOj0gJCh0ZXN0X3NyY19maWxlcykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJCh0ZXN0X2NfaW5jbHVkZXMpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGVzdF9zaGFyZWRfbGlicmFyaWVzKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAkKHRlc3Rfc3RhdGljX2xpYnJhcmllcykKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEUgOj0gbGliamF2YWNvcmV0ZXN0cworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9OYXRpdmVDb2RlLm1rCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2VuZGlmICMgTElCQ09SRV9TS0lQX1RFU1RTCisKKwogIwogIyBCdWlsZCBmb3IgdGhlIGhvc3QuCiAjCkBAIC0xMTQsNCArMTY0LDIwIEBACiAgICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKGNvcmVfc2hhcmVkX2xpYnJhcmllcykgbGliZXhwYXQgbGliaWN1dWMgbGliaWN1aTE4biBsaWJzc2wgbGliY3J5cHRvIGxpYnotaG9zdAogICAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChjb3JlX3N0YXRpY19saWJyYXJpZXMpCiAgICAgaW5jbHVkZSAkKEJVSUxEX0hPU1RfU0hBUkVEX0xJQlJBUlkpCisKKyAgICBpZmVxICgkKExJQkNPUkVfU0tJUF9URVNUUyksKQorICAgIGluY2x1ZGUgJChDTEVBUl9WQVJTKQorICAgICMgRGVmaW5lIHRoZSBydWxlcy4KKyAgICBMT0NBTF9TUkNfRklMRVMgOj0gJCh0ZXN0X3NyY19maWxlcykKKyAgICBMT0NBTF9DRkxBR1MgKz0gJChjb3JlX2NmbGFncykKKyAgICBMT0NBTF9DX0lOQ0xVREVTIDo9ICQodGVzdF9jX2luY2x1ZGVzKQorICAgIExPQ0FMX0NQUEZMQUdTICs9ICQoY29yZV9jcHBmbGFncykKKyAgICBMT0NBTF9MRExJQlMgKz0gLWxkbCAtbHB0aHJlYWQKKyAgICBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorICAgIExPQ0FMX01PRFVMRSA6PSBsaWJqYXZhY29yZXRlc3RzCisgICAgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9OYXRpdmVDb2RlLm1rCisgICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRlc3Rfc2hhcmVkX2xpYnJhcmllcykKKyAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICQodGVzdF9zdGF0aWNfbGlicmFyaWVzKQorICAgIGluY2x1ZGUgJChCVUlMRF9IT1NUX1NIQVJFRF9MSUJSQVJZKQorICAgIGVuZGlmICMgTElCQ09SRV9TS0lQX1RFU1RTCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9BZGRpdGlvbkJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9BZGRpdGlvbkJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODg1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL0FkZGl0aW9uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworLyoqCisgKiBXaGF0IGRvIHZhcmlvdXMga2luZHMgb2YgYWRkaXRpb24gY29zdD8KKyAqLworcHVibGljIGNsYXNzIEFkZGl0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgaW50IHRpbWVBZGRDb25zdGFudFRvTG9jYWxJbnQoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gMTIzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZUFkZFR3b0xvY2FsSW50cyhpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgaW50IGNvbnN0YW50ID0gMTIzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICs9IGNvbnN0YW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBsb25nIHRpbWVBZGRDb25zdGFudFRvTG9jYWxMb25nKGludCByZXBzKSB7CisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAxMjNMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBsb25nIHRpbWVBZGRUd29Mb2NhbExvbmdzKGludCByZXBzKSB7CisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgbG9uZyBjb25zdGFudCA9IDEyM0w7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gY29uc3RhbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGZsb2F0IHRpbWVBZGRDb25zdGFudFRvTG9jYWxGbG9hdChpbnQgcmVwcykgeworICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICs9IDEyMy4wZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgZmxvYXQgdGltZUFkZFR3b0xvY2FsRmxvYXRzKGludCByZXBzKSB7CisgICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMGY7CisgICAgICAgIGZsb2F0IGNvbnN0YW50ID0gMTIzLjBmOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICs9IGNvbnN0YW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBkb3VibGUgdGltZUFkZENvbnN0YW50VG9Mb2NhbERvdWJsZShpbnQgcmVwcykgeworICAgICAgICBkb3VibGUgcmVzdWx0ID0gMC4wOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICs9IDEyMy4wOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBkb3VibGUgdGltZUFkZFR3b0xvY2FsRG91YmxlcyhpbnQgcmVwcykgeworICAgICAgICBkb3VibGUgcmVzdWx0ID0gMC4wOworICAgICAgICBkb3VibGUgY29uc3RhbnQgPSAxMjMuMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBjb25zdGFudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvQXJyYXlDb3B5QmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL0FycmF5Q29weUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWQyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL0FycmF5Q29weUJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgQXJyYXlDb3B5QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWFudWFsQXJyYXlDb3B5KGludCByZXBzKSB7CisgICAgICAgIGNoYXJbXSBzcmMgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGNoYXJbXSBkc3QgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODE5MjsgKytpKSB7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9TeXN0ZW1fYXJyYXlDb3B5KGludCByZXBzKSB7CisgICAgICAgIGNoYXJbXSBzcmMgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGNoYXJbXSBkc3QgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCAwLCBkc3QsIDAsIDgxOTIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9BcnJheXNfY29weU9mKGludCByZXBzKSB7CisgICAgICAgIGNoYXJbXSBzcmMgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGNoYXJbXSBkc3QgPSBBcnJheXMuY29weU9mKHNyYywgODE5Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0FycmF5c19jb3B5T2ZSYW5nZShpbnQgcmVwcykgeworICAgICAgICBjaGFyW10gc3JjID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjaGFyW10gZHN0ID0gQXJyYXlzLmNvcHlPZlJhbmdlKHNyYywgMCwgODE5Mik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0FycmF5SXRlcmF0aW9uQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL0FycmF5SXRlcmF0aW9uQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMjU1YgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvQXJyYXlJdGVyYXRpb25CZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3M7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCisvKioKKyAqIEhvdyBkbyB2YXJpb3VzIHdheXMgb2YgaXRlcmF0aW5nIHRocm91Z2ggYW4gYXJyYXkgY29tcGFyZT8KKyAqLworcHVibGljIGNsYXNzIEFycmF5SXRlcmF0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBGb29bXSBtQXJyYXkgPSBuZXcgRm9vWzI3XTsKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUFycmF5Lmxlbmd0aDsgKytpKSBtQXJyYXlbaV0gPSBuZXcgRm9vKCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVBcnJheUl0ZXJhdGlvbihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHN1bSArPSBtQXJyYXlbaV0ubVNwbGF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVBcnJheUl0ZXJhdGlvbkNhY2hlZChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBGb29bXSBsb2NhbEFycmF5ID0gbUFycmF5OworICAgICAgICAgICAgaW50IGxlbiA9IGxvY2FsQXJyYXkubGVuZ3RoOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3VtICs9IGxvY2FsQXJyYXlbaV0ubVNwbGF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVBcnJheUl0ZXJhdGlvbkZvckVhY2goaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChGb28gYTogbUFycmF5KSB7CisgICAgICAgICAgICAgICAgc3VtICs9IGEubVNwbGF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9BcnJheUxpc3RJdGVyYXRpb25CZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvQXJyYXlMaXN0SXRlcmF0aW9uQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1ZjE0NQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvQXJyYXlMaXN0SXRlcmF0aW9uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogSXMgYSBoYW5kLWNvZGVkIGNvdW50ZWQgbG9vcCB0aHJvdWdoIGFuIEFycmF5TGlzdCBjaGVhcGVyIHRoYW4gZW5oYW5jZWQgZm9yPworICovCitwdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBBcnJheUxpc3Q8Rm9vPiBtTGlzdCA9IG5ldyBBcnJheUxpc3Q8Rm9vPigpOworICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNzsgKytpKSBtTGlzdC5hZGQobmV3IEZvbygpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZUFycmF5TGlzdEl0ZXJhdGlvbkluZGV4ZWQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgQXJyYXlMaXN0PEZvbz4gbGlzdCA9IG1MaXN0OworICAgICAgICAgICAgaW50IGxlbiA9IGxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIHN1bSArPSBsaXN0LmdldChpKS5tU3BsYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZUFycmF5TGlzdEl0ZXJhdGlvbkZvckVhY2goaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChGb28gYSA6IG1MaXN0KSB7CisgICAgICAgICAgICAgICAgc3VtICs9IGEubVNwbGF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9CdWZmZXJlZFppcEZpbGVCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvQnVmZmVyZWRaaXBGaWxlQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkMzgyMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvQnVmZmVyZWRaaXBGaWxlQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOworCitwdWJsaWMgZmluYWwgY2xhc3MgQnVmZmVyZWRaaXBGaWxlQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBAUGFyYW0oeyIxMjgiLCAiMTAyNCIsICI4MTkyIiwgIjY1NTM2In0pIGludCBjb21wcmVzc2VkU2l6ZTsKKyAgICBAUGFyYW0oeyI0IiwgIjMyIiwgIjEyOCJ9KSBpbnQgcmVhZFNpemU7CisKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShnZXRDbGFzcygpLmdldE5hbWUoKSwgIi56aXAiKTsKKyAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgwKTsKKyAgICAgICAgWmlwT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBvdXQucHV0TmV4dEVudHJ5KG5ldyBaaXBFbnRyeSgiZW50cnkuZGF0YSIpKTsKKyAgICAgICAgaW50IHdyaXR0ZW4gPSAwOworICAgICAgICB3aGlsZSAod3JpdHRlbiA8IGNvbXByZXNzZWRTaXplKSB7CisgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKGRhdGEpOworICAgICAgICAgICAgaW50IHRvV3JpdGUgPSBNYXRoLm1pbihjb21wcmVzc2VkU2l6ZSAtIHdyaXR0ZW4sIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShkYXRhLCAwLCB0b1dyaXRlKTsKKyAgICAgICAgICAgIHdyaXR0ZW4gKz0gdG9Xcml0ZTsKKyAgICAgICAgfQorICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVW5idWZmZXJlZFJlYWQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoImVudHJ5LmRhdGEiKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbcmVhZFNpemVdOworICAgICAgICAgICAgd2hpbGUgKGluLnJlYWQoYnVmZmVyKSAhPSAtMSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCdWZmZXJlZFJlYWQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoImVudHJ5LmRhdGEiKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3JlYWRTaXplXTsKKyAgICAgICAgICAgIHdoaWxlIChpbi5yZWFkKGJ1ZmZlcikgIT0gLTEpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICB6aXBGaWxlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZpZWxkQWNjZXNzQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL0ZpZWxkQWNjZXNzQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljYjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvRmllbGRBY2Nlc3NCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworLyoqCisgKiBXaGF0IGRvZXMgZmllbGQgYWNjZXNzIGNvc3Q/CisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZEFjY2Vzc0JlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5uZXIgeworICAgICAgICBwdWJsaWMgaW50IHB1YmxpY0lubmVySW50VmFsOworICAgICAgICBwcm90ZWN0ZWQgaW50IHByb3RlY3RlZElubmVySW50VmFsOworICAgICAgICBwcml2YXRlIGludCBwcml2YXRlSW5uZXJJbnRWYWw7CisgICAgICAgIGludCBwYWNrYWdlSW5uZXJJbnRWYWw7CisgICAgfQorICAgIGludCBpbnRWYWwgPSA0MjsKKyAgICBmaW5hbCBpbnQgZmluYWxJbnRWYWwgPSA0MjsKKyAgICBzdGF0aWMgaW50IHN0YXRpY0ludFZhbCA9IDQyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGljRmluYWxJbnRWYWwgPSA0MjsKKyAgICBwdWJsaWMgaW50IHRpbWVGaWVsZChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGludFZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVGaWVsZEZpbmFsKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmluYWxJbnRWYWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRmllbGRTdGF0aWMoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBzdGF0aWNJbnRWYWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRmllbGRTdGF0aWNGaW5hbChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0YXRpY0ZpbmFsSW50VmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZUZpZWxkQ2FjaGVkKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgY2FjaGVkSW50VmFsID0gdGhpcy5pbnRWYWw7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBjYWNoZWRJbnRWYWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRmllbGRQcml2YXRlSW5uZXJDbGFzc1B1YmxpY0ZpZWxkKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBJbm5lciBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gaW5uZXIucHVibGljSW5uZXJJbnRWYWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRmllbGRQcml2YXRlSW5uZXJDbGFzc1Byb3RlY3RlZEZpZWxkKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBJbm5lciBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gaW5uZXIucHJvdGVjdGVkSW5uZXJJbnRWYWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRmllbGRQcml2YXRlSW5uZXJDbGFzc1ByaXZhdGVGaWVsZChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgSW5uZXIgaW5uZXIgPSBuZXcgSW5uZXIoKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGlubmVyLnByaXZhdGVJbm5lckludFZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVGaWVsZFByaXZhdGVJbm5lckNsYXNzUGFja2FnZUZpZWxkKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBJbm5lciBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gaW5uZXIucGFja2FnZUlubmVySW50VmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9Gb28uamF2YSBiL2JlbmNobWFya3MvRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4OGRkNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvRm9vLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzOworCisvKioKKyAqIEEgdHJpdmlhbCBjbGFzcyB1c2VkIGJ5IHNldmVyYWwgYmVuY2htYXJrcy4KKyAqLworcHVibGljIGNsYXNzIEZvbyB7CisgICAgaW50IG1TcGxhdDsKK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvSGFzaGVkQ29sbGVjdGlvbnNCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvSGFzaGVkQ29sbGVjdGlvbnNCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI2MjcxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9IYXNoZWRDb2xsZWN0aW9uc0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworCisvKioKKyAqIEhvdyBkbyB0aGUgdmFyaW91cyBoYXNoIG1hcHMgY29tcGFyZT8KKyAqLworcHVibGljIGNsYXNzIEhhc2hlZENvbGxlY3Rpb25zQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lSGFzaE1hcEdldChpbnQgcmVwcykgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgbWFwLnB1dCgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG1hcC5nZXQoImhlbGxvIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZUhhc2hNYXBHZXRfU3luY2hyb25pemVkKGludCByZXBzKSB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgeworICAgICAgICAgICAgbWFwLnB1dCgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKKyAgICAgICAgICAgICAgICBtYXAuZ2V0KCJoZWxsbyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVIYXNodGFibGVHZXQoaW50IHJlcHMpIHsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBtYXAucHV0KCJoZWxsbyIsICJ3b3JsZCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbWFwLmdldCgiaGVsbG8iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lTGlua2VkSGFzaE1hcEdldChpbnQgcmVwcykgeworICAgICAgICBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgbWFwLnB1dCgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG1hcC5nZXQoImhlbGxvIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZUNvbmN1cnJlbnRIYXNoTWFwR2V0KGludCByZXBzKSB7CisgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIG1hcC5wdXQoImhlbGxvIiwgIndvcmxkIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBtYXAuZ2V0KCJoZWxsbyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9NZXRob2RJbnZvY2F0aW9uQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL01ldGhvZEludm9jYXRpb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9NZXRob2RJbnZvY2F0aW9uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKKy8qKgorICogQ29tcGFyZXMgdmFyaW91cyBraW5kcyBvZiBtZXRob2QgaW52b2NhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1ldGhvZEludm9jYXRpb25CZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIGludGVyZmFjZSBJIHsKKyAgICAgICAgdm9pZCBlbXB0eUludGVyZmFjZSgpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDIGltcGxlbWVudHMgSSB7CisgICAgICAgIHByaXZhdGUgaW50IGZpZWxkOworCisgICAgICAgIHByaXZhdGUgaW50IGdldEZpZWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCB0aW1lSW50ZXJuYWxHZXR0ZXIoaW50IHJlcHMpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRGaWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgdGltZUludGVybmFsRmllbGRBY2Nlc3MoaW50IHJlcHMpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW1wdHlTdGF0aWMoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbXB0eVZpcnR1YWwoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbXB0eUludGVyZmFjZSgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJbnRlcm5hbEdldHRlcihpbnQgcmVwcykgeworICAgICAgICBuZXcgQygpLnRpbWVJbnRlcm5hbEdldHRlcihyZXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSW50ZXJuYWxGaWVsZEFjY2VzcyhpbnQgcmVwcykgeworICAgICAgICBuZXcgQygpLnRpbWVJbnRlcm5hbEZpZWxkQWNjZXNzKHJlcHMpOworICAgIH0KKworICAgIC8vIFRlc3QgYW4gaW50cmluc2ljLgorICAgIHB1YmxpYyBpbnQgdGltZVN0cmluZ0xlbmd0aChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICJoZWxsbywgd29ybGQhIi5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVFbXB0eVN0YXRpYyhpbnQgcmVwcykgeworICAgICAgICBDIGMgPSBuZXcgQygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgYy5lbXB0eVN0YXRpYygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUVtcHR5VmlydHVhbChpbnQgcmVwcykgeworICAgICAgICBDIGMgPSBuZXcgQygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgYy5lbXB0eVZpcnR1YWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVFbXB0eUludGVyZmFjZShpbnQgcmVwcykgeworICAgICAgICBJIGMgPSBuZXcgQygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgYy5lbXB0eUludGVyZmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lciB7CisgICAgICAgIHByaXZhdGUgaW50IGk7CisgICAgICAgIHByaXZhdGUgdm9pZCBwcml2YXRlTWV0aG9kKCkgeyArK2k7IH0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvdGVjdGVkTWV0aG9kKCkgeyArK2k7IH0KKyAgICAgICAgcHVibGljIHZvaWQgcHVibGljTWV0aG9kKCkgeyArK2k7IH0KKyAgICAgICAgdm9pZCBwYWNrYWdlTWV0aG9kKCkgeyArK2k7IH0KKyAgICAgICAgZmluYWwgdm9pZCBmaW5hbFBhY2thZ2VNZXRob2QoKSB7ICsraTsgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVQcml2YXRlSW5uZXJQdWJsaWNNZXRob2QoaW50IHJlcHMpIHsKKyAgICAgICAgSW5uZXIgaW5uZXIgPSBuZXcgSW5uZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGlubmVyLnB1YmxpY01ldGhvZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVByaXZhdGVJbm5lclByb3RlY3RlZE1ldGhvZChpbnQgcmVwcykgeworICAgICAgICBJbm5lciBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgaW5uZXIucHJvdGVjdGVkTWV0aG9kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUHJpdmF0ZUlubmVyUHJpdmF0ZU1ldGhvZChpbnQgcmVwcykgeworICAgICAgICBJbm5lciBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgaW5uZXIucHJpdmF0ZU1ldGhvZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVByaXZhdGVJbm5lclBhY2thZ2VNZXRob2QoaW50IHJlcHMpIHsKKyAgICAgICAgSW5uZXIgaW5uZXIgPSBuZXcgSW5uZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGlubmVyLnBhY2thZ2VNZXRob2QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVQcml2YXRlSW5uZXJGaW5hbFBhY2thZ2VNZXRob2QoaW50IHJlcHMpIHsKKyAgICAgICAgSW5uZXIgaW5uZXIgPSBuZXcgSW5uZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICBpbm5lci5maW5hbFBhY2thZ2VNZXRob2QoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvTXVsdGlwbGljYXRpb25CZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvTXVsdGlwbGljYXRpb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY5NDViCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9NdWx0aXBsaWNhdGlvbkJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKKy8qKgorICogSG93IG11Y2ggZG8gdmFyaW91cyBraW5kcyBvZiBtdWx0aXBsaWNhdGlvbiBjb3N0PworICovCitwdWJsaWMgY2xhc3MgTXVsdGlwbGljYXRpb25CZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDEwKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICo9IDEwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDgoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKj0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVNdWx0aXBseUludEJ5VmFyaWFibGUxMChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgaW50IGZhY3RvciA9IDEwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICo9IGZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVNdWx0aXBseUludEJ5VmFyaWFibGU4KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBpbnQgZmFjdG9yID0gODsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAqPSBmYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL1N0cmluZ0l0ZXJhdGlvbkJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9TdHJpbmdJdGVyYXRpb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM2YWUyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9TdHJpbmdJdGVyYXRpb25CZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3M7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCisvKioKKyAqIEhvdyBkbyB0aGUgdmFyaW91cyBzY2hlbWVzIGZvciBpdGVyYXRpbmcgdGhyb3VnaCBhIHN0cmluZyBjb21wYXJlPworICovCitwdWJsaWMgY2xhc3MgU3RyaW5nSXRlcmF0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nSXRlcmF0aW9uMChpbnQgcmVwcykgeworICAgICAgICBTdHJpbmcgcyA9ICJoZWxsbywgd29ybGQhIjsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGNoYXIgY2g7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ0l0ZXJhdGlvbjEoaW50IHJlcHMpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiaGVsbG8sIHdvcmxkISI7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjaGFyIGNoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHMubGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGNoID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ0l0ZXJhdGlvbjIoaW50IHJlcHMpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiaGVsbG8sIHdvcmxkISI7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjaGFyIGNoOworICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gcy50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoYXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgY2ggPSBjaGFyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nVG9DaGFyQXJyYXkoaW50IHJlcHMpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiaGVsbG8sIHdvcmxkISI7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBzLnRvQ2hhckFycmF5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL1ZpcnR1YWxWZXJzdXNJbnRlcmZhY2VCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvVmlydHVhbFZlcnN1c0ludGVyZmFjZUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjljODEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL1ZpcnR1YWxWZXJzdXNJbnRlcmZhY2VCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3M7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBJcyB0aGVyZSBhIHBlcmZvcm1hbmNlIHJlYXNvbiB0byAiUHJlZmVyIHZpcnR1YWwgb3ZlciBpbnRlcmZhY2UiLCBhcyB0aGUKKyAqIEFuZHJvaWQgZG9jdW1lbnRhdGlvbiBvbmNlIGNsYWltZWQ/CisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsVmVyc3VzSW50ZXJmYWNlQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWFwUHV0KGludCByZXBzKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBtYXAucHV0KCJoZWxsbyIsICJ3b3JsZCIpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVIYXNoTWFwUHV0KGludCByZXBzKSB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbWFwLnB1dCgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvWG1sUGFyc2VCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvWG1sUGFyc2VCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU3YjkzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9YbWxQYXJzZUJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3M7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworCitwdWJsaWMgY2xhc3MgWG1sUGFyc2VCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgQFBhcmFtIFN0cmluZyB4bWxGaWxlOworICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCisgICAgc3RhdGljIExpc3Q8U3RyaW5nPiB4bWxGaWxlVmFsdWVzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICIvZXRjL2FwbnMtY29uZi54bWwiLAorICAgICAgICAgICAgIi9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIiwKKyAgICAgICAgICAgICIvZXRjL3Blcm1pc3Npb25zL2ZlYXR1cmVzLnhtbCIKKyAgICApOworCisgICAgcHJpdmF0ZSBTQVhQYXJzZXIgc2F4UGFyc2VyOworICAgIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlcjsKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBYbWxQdWxsUGFyc2VyPiBreG1sQ29uc3RydWN0b3I7CisgICAgcHJpdmF0ZSBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgWG1sUHVsbFBhcnNlcj4gZXhwYXRDb25zdHJ1Y3RvcjsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10geG1sQnl0ZXMgPSBnZXRYbWxCeXRlcygpOworICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxCeXRlcyk7CisgICAgICAgIGlucHV0U3RyZWFtLm1hcmsoeG1sQnl0ZXMubGVuZ3RoKTsKKworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZG9jdW1lbnRCdWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAga3htbENvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yKSBDbGFzcy5mb3JOYW1lKCJvcmcua3htbDIuaW8uS1htbFBhcnNlciIpLmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgIGV4cGF0Q29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3IpIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyIikKKyAgICAgICAgICAgICAgICAuZ2V0Q29uc3RydWN0b3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRYbWxCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHhtbEZpbGUpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICB3aGlsZSAoKGNvdW50ID0gZmlsZUluLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGJ5dGVzT3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICB9CisgICAgICAgIGZpbGVJbi5jbG9zZSgpOworICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRpbWVTYXgoaW50IHJlcHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGVsZW1lbnRDb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5yZXNldCgpOworICAgICAgICAgICAgRWxlbWVudENvdW50ZXJTYXhIYW5kbGVyIGVsZW1lbnRDb3VudGVyU2F4SGFuZGxlciA9IG5ldyBFbGVtZW50Q291bnRlclNheEhhbmRsZXIoKTsKKyAgICAgICAgICAgIHNheFBhcnNlci5wYXJzZShpbnB1dFN0cmVhbSwgZWxlbWVudENvdW50ZXJTYXhIYW5kbGVyKTsKKyAgICAgICAgICAgIGVsZW1lbnRDb3VudCArPSBlbGVtZW50Q291bnRlclNheEhhbmRsZXIuZWxlbWVudENvdW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50Q291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWxlbWVudENvdW50ZXJTYXhIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gMDsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBlbGVtZW50Q291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgdGltZURvbShpbnQgcmVwcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLnJlc2V0KCk7CisgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBlbGVtZW50Q291bnQgKz0gY291bnREb21FbGVtZW50cyhkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnRDb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjb3VudERvbUVsZW1lbnRzKE5vZGUgbm9kZSkgeworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ICs9IGNvdW50RG9tRWxlbWVudHMobm9kZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGludCB0aW1lRXhwYXQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGVzdFhtbFB1bGwoZXhwYXRDb25zdHJ1Y3RvciwgcmVwcyk7CisgICAgfQorCisgICAgcHVibGljIGludCB0aW1lS3htbChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0ZXN0WG1sUHVsbChreG1sQ29uc3RydWN0b3IsIHJlcHMpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHRlc3RYbWxQdWxsKENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBYbWxQdWxsUGFyc2VyPiBjb25zdHJ1Y3RvciwgaW50IHJlcHMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGVsZW1lbnRDb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5yZXNldCgpOworICAgICAgICAgICAgWG1sUHVsbFBhcnNlciB4bWxQdWxsUGFyc2VyID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHhtbFB1bGxQYXJzZXIuc2V0SW5wdXQoaW5wdXRTdHJlYW0sICJVVEYtOCIpOworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSB4bWxQdWxsUGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50Q291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnRDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFJ1bm5lci5tYWluKFhtbFBhcnNlQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQW5ub3RhdGVkRWxlbWVudEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Fubm90YXRlZEVsZW1lbnRCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Fubm90YXRlZEVsZW1lbnRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBBbm5vdGF0ZWRFbGVtZW50QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIHByaXZhdGUgQ2xhc3M8Pz4gdHlwZTsKKyAgICBwcml2YXRlIEZpZWxkIGZpZWxkOworICAgIHByaXZhdGUgTWV0aG9kIG1ldGhvZDsKKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0eXBlID0gVHlwZS5jbGFzczsKKyAgICAgICAgZmllbGQgPSBUeXBlLmNsYXNzLmdldEZpZWxkKCJmaWVsZCIpOworICAgICAgICBtZXRob2QgPSBUeXBlLmNsYXNzLmdldE1ldGhvZCgibWV0aG9kIiwgU3RyaW5nLmNsYXNzKTsKKyAgICB9CisKKworICAgIC8vIGdldCBhbm5vdGF0aW9ucyBieSBtZW1iZXIgdHlwZSBhbmQgbWV0aG9kCisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0VHlwZUFubm90YXRpb25zKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0RmllbGRBbm5vdGF0aW9ucyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgZmllbGQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRNZXRob2RBbm5vdGF0aW9ucyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgbWV0aG9kLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUdldFR5cGVBbm5vdGF0aW9uKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlLmdldEFubm90YXRpb24oTWFya2VyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRGaWVsZEFubm90YXRpb24oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIGZpZWxkLmdldEFubm90YXRpb24oTWFya2VyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRNZXRob2RBbm5vdGF0aW9uKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtZXRob2QuZ2V0QW5ub3RhdGlvbihNYXJrZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlzVHlwZUFubm90YXRpb25QcmVzZW50KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlLmlzQW5ub3RhdGlvblByZXNlbnQoTWFya2VyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc0ZpZWxkQW5ub3RhdGlvblByZXNlbnQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoTWFya2VyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc01ldGhvZEFubm90YXRpb25QcmVzZW50KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChNYXJrZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IGFubm90YXRpb25zIGJ5IHJlc3VsdCBzaXplCisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0QWxsUmV0dXJuc0xhcmdlQW5ub3RhdGlvbihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgSGFzTGFyZ2VBbm5vdGF0aW9uLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0QWxsUmV0dXJuc1NtYWxsQW5ub3RhdGlvbihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgSGFzU21hbGxBbm5vdGF0aW9uLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0QWxsUmV0dXJuc01hcmtlckFubm90YXRpb24oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEhhc01hcmtlckFubm90YXRpb24uY2xhc3MuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRBbGxSZXR1cm5zTm9Bbm5vdGF0aW9uKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBIYXNOb0Fubm90YXRpb25zLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0QWxsUmV0dXJuc1RocmVlQW5ub3RhdGlvbnMoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEhhc1RocmVlQW5ub3RhdGlvbnMuY2xhc3MuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gZ2V0IGFubm90YXRpb25zIHdpdGggaW5oZXJpdGFuY2UKKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRBbm5vdGF0aW9uc09uU3ViY2xhc3MoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEV4dGVuZHNIYXNUaHJlZUFubm90YXRpb25zLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0RGVjbGFyZWRBbm5vdGF0aW9uc09uU3ViY2xhc3MoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEV4dGVuZHNIYXNUaHJlZUFubm90YXRpb25zLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHRoZSBhbm5vdGF0ZWQgZWxlbWVudHMKKworICAgIEBNYXJrZXIKKyAgICBwdWJsaWMgY2xhc3MgVHlwZSB7CisgICAgICAgIEBNYXJrZXIgcHVibGljIFN0cmluZyBmaWVsZDsKKyAgICAgICAgQE1hcmtlciBwdWJsaWMgdm9pZCBtZXRob2QoQE1hcmtlciBTdHJpbmcgcGFyYW1ldGVyKSB7fQorICAgIH0KKworICAgIEBMYXJnZShhID0gIm9uIGNsYXNzIiwgYiA9IHsiQSIsICJCIiwgIkMiIH0sCisgICAgICAgICAgICBjID0gQFNtYWxsKGU9IkUxIiwgZj0xNjk1OTM4MjU2LCBnPTcyNjQwODExMTQ1MTA3MTMwMDBMKSwKKyAgICAgICAgICAgIGQgPSB7IEBTbWFsbChlPSJFMiIsIGY9MTY5NTkzODI1NiwgZz03MjY0MDgxMTE0NTEwNzEzMDAwTCkgfSkKKyAgICBwdWJsaWMgY2xhc3MgSGFzTGFyZ2VBbm5vdGF0aW9uIHt9CisKKyAgICBAU21hbGwoZT0iRTEiLCBmPTE2OTU5MzgyNTYsIGc9NzI2NDA4MTExNDUxMDcxMzAwMEwpCisgICAgcHVibGljIGNsYXNzIEhhc1NtYWxsQW5ub3RhdGlvbiB7fQorCisgICAgQE1hcmtlcgorICAgIHB1YmxpYyBjbGFzcyBIYXNNYXJrZXJBbm5vdGF0aW9uIHt9CisKKyAgICBwdWJsaWMgY2xhc3MgSGFzTm9Bbm5vdGF0aW9ucyB7fQorCisgICAgQExhcmdlKGEgPSAib24gY2xhc3MiLCBiID0geyJBIiwgIkIiLCAiQyIgfSwKKyAgICAgICAgICAgIGMgPSBAU21hbGwoZT0iRTEiLCBmPTE2OTU5MzgyNTYsIGc9NzI2NDA4MTExNDUxMDcxMzAwMEwpLAorICAgICAgICAgICAgZCA9IHsgQFNtYWxsKGU9IkUyIiwgZj0xNjk1OTM4MjU2LCBnPTcyNjQwODExMTQ1MTA3MTMwMDBMKSB9KQorICAgIEBTbWFsbChlPSJFMSIsIGY9MTY5NTkzODI1NiwgZz03MjY0MDgxMTE0NTEwNzEzMDAwTCkKKyAgICBATWFya2VyCisgICAgcHVibGljIGNsYXNzIEhhc1RocmVlQW5ub3RhdGlvbnMge30KKworICAgIHB1YmxpYyBjbGFzcyBFeHRlbmRzSGFzVGhyZWVBbm5vdGF0aW9ucyB7fQorCisKKyAgICAvLyB0aGUgYW5ub3RhdGlvbnMKKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIEBpbnRlcmZhY2UgTWFya2VyIHt9CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIExhcmdlIHsKKyAgICAgICAgU3RyaW5nIGEoKSBkZWZhdWx0ICIiOworICAgICAgICBTdHJpbmdbXSBiKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgU21hbGwgYygpIGRlZmF1bHQgQFNtYWxsOworICAgICAgICBTbWFsbFtdIGQoKSBkZWZhdWx0IHt9OworICAgIH0KKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIEBpbnRlcmZhY2UgU21hbGwgeworICAgICAgICBTdHJpbmcgZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIGludCBmKCkgZGVmYXVsdCAwOworICAgICAgICBsb25nIGcoKSBkZWZhdWx0IDBMOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW5uZXIubWFpbihBbm5vdGF0ZWRFbGVtZW50QmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQmlnSW50ZWdlckJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0JpZ0ludGVnZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFiOTAxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0JpZ0ludGVnZXJCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBCaWdJbnRlZ2VyQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmFuZG9tRGl2aXNpb24oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgQmlnSW50ZWdlciB4ID0gbmV3IEJpZ0ludGVnZXIoMTAyNCwgcik7CisgICAgICAgIEJpZ0ludGVnZXIgeSA9IG5ldyBCaWdJbnRlZ2VyKDEwMjQsIHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgeC5kaXZpZGUoeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmFuZG9tR2NkKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIEJpZ0ludGVnZXIgeCA9IG5ldyBCaWdJbnRlZ2VyKDEwMjQsIHIpOworICAgICAgICBCaWdJbnRlZ2VyIHkgPSBuZXcgQmlnSW50ZWdlcigxMDI0LCByKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHguZ2NkKHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJhbmRvbU11bHRpcGxpY2F0aW9uKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIEJpZ0ludGVnZXIgeCA9IG5ldyBCaWdJbnRlZ2VyKDEwMjQsIHIpOworICAgICAgICBCaWdJbnRlZ2VyIHkgPSBuZXcgQmlnSW50ZWdlcigxMDI0LCByKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHgubXVsdGlwbHkoeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQml0U2V0QmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQml0U2V0QmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5MTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9CaXRTZXRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK3B1YmxpYyBjbGFzcyBCaXRTZXRCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIEBQYXJhbSh7ICIxMDAwIiwgIjEwMDAwIiB9KQorICAgIHByaXZhdGUgaW50IHNpemU7CisKKyAgICBwcml2YXRlIEJpdFNldCBiczsKKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBicyA9IG5ldyBCaXRTZXQoc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlzRW1wdHlUcnVlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWJzLmlzRW1wdHkoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc0VtcHR5RmFsc2UoaW50IHJlcHMpIHsKKyAgICAgICAgYnMuc2V0KGJzLnNpemUoKSAtIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgaWYgKGJzLmlzRW1wdHkoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGJzLmdldChpICUgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2xlYXIoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGJzLmNsZWFyKGkgJSBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTZXQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGJzLnNldChpICUgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2V0T24oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGJzLnNldChpICUgc2l6ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2V0T2ZmKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBicy5zZXQoaSAlIHNpemUsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9CeXRlQnVmZmVyQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQnl0ZUJ1ZmZlckJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTIwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQnl0ZUJ1ZmZlckJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK3B1YmxpYyBjbGFzcyBCeXRlQnVmZmVyQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgZW51bSBNeUJ5dGVPcmRlciB7CisgICAgICAgIEJJRyhCeXRlT3JkZXIuQklHX0VORElBTiksIExJVFRMRShCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgICAgIGZpbmFsIEJ5dGVPcmRlciBieXRlT3JkZXI7CisgICAgICAgIE15Qnl0ZU9yZGVyKEJ5dGVPcmRlciBieXRlT3JkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYnl0ZU9yZGVyID0gYnl0ZU9yZGVyOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhcmFtIHByaXZhdGUgTXlCeXRlT3JkZXIgYnl0ZU9yZGVyOworCisgICAgQFBhcmFtKHsidHJ1ZSIsICJmYWxzZSJ9KSBwcml2YXRlIGJvb2xlYW4gYWxpZ25lZDsKKworICAgIGVudW0gTXlCdWZmZXJUeXBlIHsKKyAgICAgICAgRElSRUNULCBIRUFQLCBNQVBQRUQ7CisgICAgfQorICAgIEBQYXJhbSBwcml2YXRlIE15QnVmZmVyVHlwZSBidWZmZXJUeXBlOworCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIG5ld0J1ZmZlcihNeUJ5dGVPcmRlciBieXRlT3JkZXIsIGJvb2xlYW4gYWxpZ25lZCwgTXlCdWZmZXJUeXBlIGJ1ZmZlclR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBzaXplID0gYWxpZ25lZCA/IDgxOTIgOiA4MTkyICsgOCArIDE7CisgICAgICAgIEJ5dGVCdWZmZXIgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChidWZmZXJUeXBlKSB7CisgICAgICAgIGNhc2UgRElSRUNUOgorICAgICAgICAgICAgcmVzdWx0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhFQVA6CisgICAgICAgICAgICByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFQUEVEOgorICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gbmV3IEZpbGUoIi9zZGNhcmQvYm0udG1wIik7CisgICAgICAgICAgICBpZiAobmV3IEZpbGUoIi90bXAiKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgcnVubmluZyBvbiB0aGUgZGVza3RvcC4KKyAgICAgICAgICAgICAgICB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWFwcGVkQnl0ZUJ1ZmZlclRlc3QiLCAiLnRtcCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wRmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0bXBGaWxlLCAicnciKTsKKyAgICAgICAgICAgIHJhZi5zZXRMZW5ndGgoODE5Mio4KTsKKyAgICAgICAgICAgIEZpbGVDaGFubmVsIGZjID0gcmFmLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZjLm1hcChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfV1JJVEUsIDAsIGZjLnNpemUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQub3JkZXIoYnl0ZU9yZGVyLmJ5dGVPcmRlcik7CisgICAgICAgIHJlc3VsdC5wb3NpdGlvbihhbGlnbmVkID8gMCA6IDEpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vCisgICAgLy8gcGVla2luZworICAgIC8vCisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9nZXRCeXRlKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX2dldEJ5dGVBcnJheShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgc3JjID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICAgICAgYnl0ZVtdIGRzdCA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICBzcmMuZ2V0KGRzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9nZXRCeXRlX2luZGV4ZWQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLmdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX2dldENoYXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLmdldENoYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDaGFyQnVmZmVyX2dldENoYXJBcnJheShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENoYXJCdWZmZXIgc3JjID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKS5hc0NoYXJCdWZmZXIoKTsKKyAgICAgICAgY2hhcltdIGRzdCA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgc3JjLmdldChkc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUJ5dGVCdWZmZXJfZ2V0Q2hhcl9pbmRleGVkKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5nZXRDaGFyKGkgKiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX2dldERvdWJsZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgc3JjID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHNyYy5wb3NpdGlvbihhbGlnbmVkID8gMCA6IDEpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMuZ2V0RG91YmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRG91YmxlQnVmZmVyX2dldERvdWJsZUFycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRG91YmxlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSkuYXNEb3VibGVCdWZmZXIoKTsKKyAgICAgICAgZG91YmxlW10gZHN0ID0gbmV3IGRvdWJsZVsxMDI0XTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLnBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgIHNyYy5nZXQoZHN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX2dldEZsb2F0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5nZXRGbG9hdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZsb2F0QnVmZmVyX2dldEZsb2F0QXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGbG9hdEJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpLmFzRmxvYXRCdWZmZXIoKTsKKyAgICAgICAgZmxvYXRbXSBkc3QgPSBuZXcgZmxvYXRbMTAyNF07CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBzcmMuZ2V0KGRzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9nZXRJbnQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLmdldEludCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUludEJ1ZmZlcl9nZXRJbnRBcnJheShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludEJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpLmFzSW50QnVmZmVyKCk7CisgICAgICAgIGludFtdIGRzdCA9IG5ldyBpbnRbMTAyNF07CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBzcmMuZ2V0KGRzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9nZXRMb25nKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5nZXRMb25nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTG9uZ0J1ZmZlcl9nZXRMb25nQXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb25nQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSkuYXNMb25nQnVmZmVyKCk7CisgICAgICAgIGxvbmdbXSBkc3QgPSBuZXcgbG9uZ1sxMDI0XTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLnBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgIHNyYy5nZXQoZHN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX2dldFNob3J0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5nZXRTaG9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVNob3J0QnVmZmVyX2dldFNob3J0QXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTaG9ydEJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpLmFzU2hvcnRCdWZmZXIoKTsKKyAgICAgICAgc2hvcnRbXSBkc3QgPSBuZXcgc2hvcnRbMTAyNF07CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBzcmMuZ2V0KGRzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIHBva2luZworICAgIC8vCisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9wdXRCeXRlKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKDApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMucHV0KChieXRlKSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX3B1dEJ5dGVBcnJheShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICAgICAgYnl0ZVtdIHNyYyA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBkc3QucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICBkc3QucHV0KHNyYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9wdXRDaGFyKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wdXRDaGFyKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2hhckJ1ZmZlcl9wdXRDaGFyQXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDaGFyQnVmZmVyIGRzdCA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSkuYXNDaGFyQnVmZmVyKCk7CisgICAgICAgIGNoYXJbXSBzcmMgPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgZHN0LnBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgIGRzdC5wdXQoc3JjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX3B1dERvdWJsZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgc3JjID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHNyYy5wb3NpdGlvbihhbGlnbmVkID8gMCA6IDEpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMucHV0RG91YmxlKDAuMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRG91YmxlQnVmZmVyX3B1dERvdWJsZUFycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRG91YmxlQnVmZmVyIGRzdCA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSkuYXNEb3VibGVCdWZmZXIoKTsKKyAgICAgICAgZG91YmxlW10gc3JjID0gbmV3IGRvdWJsZVsxMDI0XTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgZHN0LnBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgIGRzdC5wdXQoc3JjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX3B1dEZsb2F0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wdXRGbG9hdCgwLjBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdEJ1ZmZlcl9wdXRGbG9hdEFycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxvYXRCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKS5hc0Zsb2F0QnVmZmVyKCk7CisgICAgICAgIGZsb2F0W10gc3JjID0gbmV3IGZsb2F0WzEwMjRdOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBkc3QucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgZHN0LnB1dChzcmMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUJ5dGVCdWZmZXJfcHV0SW50KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNyYy5wdXRJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSW50QnVmZmVyX3B1dEludEFycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50QnVmZmVyIGRzdCA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSkuYXNJbnRCdWZmZXIoKTsKKyAgICAgICAgaW50W10gc3JjID0gbmV3IGludFsxMDI0XTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgZHN0LnBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgIGRzdC5wdXQoc3JjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyX3B1dExvbmcoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXJCZW5jaG1hcmsubmV3QnVmZmVyKGJ5dGVPcmRlciwgYWxpZ25lZCwgYnVmZmVyVHlwZSk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3JjLnB1dExvbmcoMEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUxvbmdCdWZmZXJfcHV0TG9uZ0FycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9uZ0J1ZmZlciBkc3QgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpLmFzTG9uZ0J1ZmZlcigpOworICAgICAgICBsb25nW10gc3JjID0gbmV3IGxvbmdbMTAyNF07CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7ICsraSkgeworICAgICAgICAgICAgICAgIGRzdC5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBkc3QucHV0KHNyYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQnl0ZUJ1ZmZlcl9wdXRTaG9ydChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgc3JjID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHNyYy5wb3NpdGlvbihhbGlnbmVkID8gMCA6IDEpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcmMucHV0U2hvcnQoKHNob3J0KSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTaG9ydEJ1ZmZlcl9wdXRTaG9ydEFycmF5KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2hvcnRCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKS5hc1Nob3J0QnVmZmVyKCk7CisgICAgICAgIHNob3J0W10gc3JjID0gbmV3IHNob3J0WzEwMjRdOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBkc3QucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgZHN0LnB1dChzcmMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisvKgorICAgIHB1YmxpYyB2b2lkIHRpbWVfbmV3X2J5dGVBcnJheShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBieXRlW10gYnMgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfQnl0ZUJ1ZmZlcl9hbGxvY2F0ZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg4MTkyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqLworfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0J5dGVCdWZmZXJTY2FsYXJWZXJzdXNWZWN0b3JCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9CeXRlQnVmZmVyU2NhbGFyVmVyc3VzVmVjdG9yQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3NWRlYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9CeXRlQnVmZmVyU2NhbGFyVmVyc3VzVmVjdG9yQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitwdWJsaWMgY2xhc3MgQnl0ZUJ1ZmZlclNjYWxhclZlcnN1c1ZlY3RvckJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgIEBQYXJhbSBwcml2YXRlIEJ5dGVCdWZmZXJCZW5jaG1hcmsuTXlCeXRlT3JkZXIgYnl0ZU9yZGVyOworICBAUGFyYW0oeyJ0cnVlIiwgImZhbHNlIn0pIHByaXZhdGUgYm9vbGVhbiBhbGlnbmVkOworICBAUGFyYW0gcHJpdmF0ZSBCeXRlQnVmZmVyQmVuY2htYXJrLk15QnVmZmVyVHlwZSBidWZmZXJUeXBlOworCisgIHB1YmxpYyB2b2lkIHRpbWVNYW51YWxCeXRlQnVmZmVyQ29weShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyQmVuY2htYXJrLm5ld0J1ZmZlcihieXRlT3JkZXIsIGFsaWduZWQsIGJ1ZmZlclR5cGUpOworICAgIEJ5dGVCdWZmZXIgZHN0ID0gQnl0ZUJ1ZmZlckJlbmNobWFyay5uZXdCdWZmZXIoYnl0ZU9yZGVyLCBhbGlnbmVkLCBidWZmZXJUeXBlKTsKKyAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgc3JjLnBvc2l0aW9uKDApOworICAgICAgZHN0LnBvc2l0aW9uKDApOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4MTkyOyArK2kpIHsKKyAgICAgICAgZHN0LnB1dChzcmMuZ2V0KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRpbWVCeXRlQnVmZmVyQnVsa0dldChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZUJ1ZmZlciBzcmMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGFsaWduZWQgPyA4MTkyIDogODE5MiArIDEpOworICAgIGJ5dGVbXSBkc3QgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgc3JjLnBvc2l0aW9uKGFsaWduZWQgPyAwIDogMSk7CisgICAgICBzcmMuZ2V0KGRzdCwgMCwgZHN0Lmxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGltZURpcmVjdEJ5dGVCdWZmZXJCdWxrR2V0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlQnVmZmVyIHNyYyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoYWxpZ25lZCA/IDgxOTIgOiA4MTkyICsgMSk7CisgICAgYnl0ZVtdIGRzdCA9IG5ldyBieXRlWzgxOTJdOworICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICBzcmMucG9zaXRpb24oYWxpZ25lZCA/IDAgOiAxKTsKKyAgICAgIHNyYy5nZXQoZHN0LCAwLCBkc3QubGVuZ3RoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9DaGFyYWN0ZXJCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9DaGFyYWN0ZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM1MTNiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoYXJhY3RlckJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKKy8qKgorICogVGVzdHMgdmFyaW91cyBDaGFyYWN0ZXIgbWV0aG9kcywgaW50ZW5kZWQgZm9yIHRlc3RpbmcgbXVsdGlwbGUKKyAqIGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IGVhY2ggb3RoZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyYWN0ZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgQFBhcmFtIHByaXZhdGUgQ2hhcmFjdGVyU2V0IGNoYXJhY3RlclNldDsKKworICAgIEBQYXJhbSBwcml2YXRlIE92ZXJsb2FkIG92ZXJsb2FkOworCisgICAgcHJpdmF0ZSBjaGFyW10gY2hhcnM7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5jaGFycyA9IGNoYXJhY3RlclNldC5jaGFyczsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBPdmVybG9hZCB7IENIQVIsIElOVCB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBuYW5vc1RvVW5pdHMoZG91YmxlIG5hbm9zKSB7CisgICAgICAgIHJldHVybiBuYW5vcyAvIDY1NTM2OworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENoYXJhY3RlclNldCB7CisgICAgICAgIEFTQ0lJKDEyOCksCisgICAgICAgIFVOSUNPREUoNjU1MzYpOworICAgICAgICBmaW5hbCBjaGFyW10gY2hhcnM7CisgICAgICAgIENoYXJhY3RlclNldChpbnQgc2l6ZSkgeworICAgICAgICAgICAgdGhpcy5jaGFycyA9IG5ldyBjaGFyWzY1NTM2XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjU1MzY7ICsraSkgeworICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gKGNoYXIpIChpICUgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIGZha2UgYmVuY2htYXJrIHRvIGdpdmUgdXMgYSBiYXNlbGluZS4KKyAgICBwdWJsaWMgYm9vbGVhbiB0aW1lSXNTcGFjZShpbnQgcmVwcykgeworICAgICAgICBib29sZWFuIGR1bW15ID0gZmFsc2U7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBkdW1teSBePSAoKGNoYXIpIGNoID09ICcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtbXkgXj0gKGNoID09ICcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkdW1teTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRGlnaXQoaW50IHJlcHMpIHsKKyAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5kaWdpdChjaGFyc1tjaF0sIDEwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuZGlnaXQoKGludCkgY2hhcnNbY2hdLCAxMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUdldE51bWVyaWNWYWx1ZShpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoKGludCkgY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNEaWdpdChpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzRGlnaXQoY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNEaWdpdCgoaW50KSBjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc0lkZW50aWZpZXJJZ25vcmFibGUoaW50IHJlcHMpIHsKKyAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0lkZW50aWZpZXJJZ25vcmFibGUoY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNJZGVudGlmaWVySWdub3JhYmxlKChpbnQpIGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlzSmF2YUlkZW50aWZpZXJQYXJ0KGludCByZXBzKSB7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoKGludCkgY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNKYXZhSWRlbnRpZmllclN0YXJ0KGludCByZXBzKSB7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCgoaW50KSBjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc0xldHRlcihpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzTGV0dGVyKGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzTGV0dGVyKChpbnQpIGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlzTGV0dGVyT3JEaWdpdChpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoKGludCkgY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNMb3dlckNhc2UoaW50IHJlcHMpIHsKKyAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoaW50KSBjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVJc1NwYWNlQ2hhcihpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKChpbnQpIGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlzVXBwZXJDYXNlKGludCByZXBzKSB7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGludCkgY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNXaGl0ZXNwYWNlKGludCByZXBzKSB7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoaW50KSBjaGFyc1tjaF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVUb0xvd2VyQ2FzZShpbnQgcmVwcykgeworICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChpbnQpIGNoYXJzW2NoXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRvVXBwZXJDYXNlKGludCByZXBzKSB7CisgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGludCkgY2hhcnNbY2hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQ2hhcnNldEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoYXJzZXRCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNhZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoYXJzZXRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBDaGFyc2V0QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBAUGFyYW0oeyAiMSIsICIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwMCIgfSkKKyAgICBwcml2YXRlIGludCBsZW5ndGg7CisKKyAgICAvLyBjYW5vbmljYWwgICAgPT4gY2Fub25pY2FsIGNoYXJzZXQgbmFtZQorICAgIC8vIGJ1aWx0LWluICAgICA9PiBndWFyYW50ZWVkLXByZXNlbnQgY2hhcnNldAorICAgIC8vIHNwZWNpYWwtY2FzZSA9PiBsaWJjb3JlIHRyZWF0cyB0aGlzIGNoYXJzZXQgc3BlY2lhbGx5IGZvciBwZXJmb3JtYW5jZQorICAgIEBQYXJhbSh7CisgICAgICAgICJVVEYtMTYiLCAgICAgLy8gICAgIGNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCBub24tc3BlY2lhbC1jYXNlCisgICAgICAgICJVVEYtOCIsICAgICAgLy8gICAgIGNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgICAgICJVVEY4IiwgICAgICAgLy8gbm9uLWNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgICAgICJJU08tODg1OS0xIiwgLy8gICAgIGNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgICAgICI4ODU5XzEiLCAgICAgLy8gbm9uLWNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgICAgICJJU08tODg1OS0yIiwgLy8gICAgIGNhbm9uaWNhbCwgbm9uLWJ1aWx0LWluLCBub24tc3BlY2lhbC1jYXNlCisgICAgICAgICI4ODU5XzIiLCAgICAgLy8gbm9uLWNhbm9uaWNhbCwgbm9uLWJ1aWx0LWluLCBub24tc3BlY2lhbC1jYXNlCisgICAgICAgICJVUy1BU0NJSSIsICAgLy8gICAgIGNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgICAgICJBU0NJSSIgICAgICAgLy8gbm9uLWNhbm9uaWNhbCwgICAgIGJ1aWx0LWluLCAgICAgc3BlY2lhbC1jYXNlCisgICAgfSkKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIHZvaWQgdGltZV9uZXdfU3RyaW5nX0JTdHJpbmcoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBtYWtlQnl0ZXMobWFrZVN0cmluZyhsZW5ndGgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG5ldyBTdHJpbmcoYnl0ZXMsIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9uZXdfU3RyaW5nX0JJSShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBieXRlW10gYnl0ZXMgPSBtYWtlQnl0ZXMobWFrZVN0cmluZyhsZW5ndGgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgIG5ldyBTdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9uZXdfU3RyaW5nX0JJSVN0cmluZyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBieXRlW10gYnl0ZXMgPSBtYWtlQnl0ZXMobWFrZVN0cmluZyhsZW5ndGgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgIG5ldyBTdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCwgbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9TdHJpbmdfZ2V0Qnl0ZXMoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3RyaW5nID0gbWFrZVN0cmluZyhsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgc3RyaW5nLmdldEJ5dGVzKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IGJlbmNobWFyayB0aGlzIHB1cmUtamF2YSBpbXBsZW1lbnRhdGlvbiBmb3IgVVMtQVNDSUkgYW5kIElTTy04ODU5LTEgdG9vIQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gY2hhcmFjdGVycyB0byBVUy1BU0NJSSBvciBJU08tODg1OS0xIGJ5dGVzLCB1c2luZyB0aGUgZmFjdCB0aGF0CisgICAgICogVW5pY29kZSBjb2RlIHBvaW50cyBiZXR3ZWVuIFUrMDAwMCBhbmQgVSswMDdmIGluY2x1c2l2ZSBhcmUgaWRlbnRpY2FsIHRvIFVTLUFTQ0lJLCB3aGlsZQorICAgICAqIFUrMDAwMCB0byBVKzAwZmYgaW5jbHVzaXZlIGFyZSBpZGVudGljYWwgdG8gSVNPLTg4NTktMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9EaXJlY3RNYXBwZWRCeXRlcyhjaGFyW10gY2hhcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBtYXhWYWxpZENoYXIpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIGludCBvID0gb2Zmc2V0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBjaGFyc1tvKytdOworICAgICAgICAgICAgcmVzdWx0W2ldID0gKGJ5dGUpICgoY2ggPD0gbWF4VmFsaWRDaGFyKSA/IGNoIDogJz8nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSB0b1V0ZjhCeXRlcyhjaGFyW10gY2hhcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgVW5zYWZlQnl0ZVNlcXVlbmNlIHJlc3VsdCA9IG5ldyBVbnNhZmVCeXRlU2VxdWVuY2UobGVuZ3RoKTsKKyAgICAgICAgdG9VdGY4Qnl0ZXMoY2hhcnMsIG9mZnNldCwgbGVuZ3RoLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b1V0ZjhCeXRlcyhjaGFyW10gY2hhcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFVuc2FmZUJ5dGVTZXF1ZW5jZSBvdXQpIHsKKyAgICAgICAgZmluYWwgaW50IGVuZCA9IG9mZnNldCArIGxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGVuZDsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBjaGFyc1tpXTsKKyAgICAgICAgICAgIGlmIChjaCA8IDB4ODApIHsKKyAgICAgICAgICAgICAgICAvLyBPbmUgYnl0ZS4KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoY2gpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDB4ODAwKSB7CisgICAgICAgICAgICAgICAgLy8gVHdvIGJ5dGVzLgorICAgICAgICAgICAgICAgIG91dC53cml0ZSgoY2ggPj4gNikgfCAweGMwKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoKGNoICYgMHgzZikgfCAweDgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gQ2hhcmFjdGVyLk1JTl9TVVJST0dBVEUgJiYgY2ggPD0gQ2hhcmFjdGVyLk1BWF9TVVJST0dBVEUpIHsKKyAgICAgICAgICAgICAgICAvLyBBIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIGNoYXIgaGlnaCA9IChjaGFyKSBjaDsKKyAgICAgICAgICAgICAgICBjaGFyIGxvdyA9IChpICsgMSAhPSBlbmQpID8gY2hhcnNbaSArIDFdIDogJ1x1MDAwMCc7CisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNTdXJyb2dhdGVQYWlyKGhpZ2gsIGxvdykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCc/Jyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBOb3cgd2Uga25vdyB3ZSBoYXZlIGEgKnZhbGlkKiBzdXJyb2dhdGUgcGFpciwgd2UgY2FuIGNvbnN1bWUgdGhlIGxvdyBzdXJyb2dhdGUuCisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvQ29kZVBvaW50KGhpZ2gsIGxvdyk7CisgICAgICAgICAgICAgICAgLy8gRm91ciBieXRlcy4KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoKGNoID4+IDE4KSB8IDB4ZjApOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgoKGNoID4+IDEyKSAmIDB4M2YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCgoY2ggPj4gNikgJiAweDNmKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgoY2ggJiAweDNmKSB8IDB4ODApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaHJlZSBieXRlcy4KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoKGNoID4+IDEyKSB8IDB4ZTApOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgoKGNoID4+IDYpICYgMHgzZikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoKGNoICYgMHgzZikgfCAweDgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKGludCBsZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdBJyArIChpICUgMjYpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1ha2VCeXRlcyhTdHJpbmcgcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoYXJzZXRGb3JOYW1lQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQ2hhcnNldEZvck5hbWVCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RmYjhiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoYXJzZXRGb3JOYW1lQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBDaGFyc2V0Rm9yTmFtZUJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgLy8gY2Fub25pY2FsICAgID0+IGNhbm9uaWNhbCBjaGFyc2V0IG5hbWUKKyAgICAvLyBidWlsdC1pbiAgICAgPT4gZ3VhcmFudGVlZC1wcmVzZW50IGNoYXJzZXQKKyAgICAvLyBzcGVjaWFsLWNhc2UgPT4gbGliY29yZSB0cmVhdHMgdGhpcyBjaGFyc2V0IHNwZWNpYWxseSBmb3IgcGVyZm9ybWFuY2UKKyAgICBAUGFyYW0oeworICAgICAgICAiVVRGLTE2IiwgICAgIC8vICAgICBjYW5vbmljYWwsICAgICBidWlsdC1pbiwgbm9uLXNwZWNpYWwtY2FzZQorICAgICAgICAiVVRGLTgiLCAgICAgIC8vICAgICBjYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgICAgICAiVVRGOCIsICAgICAgIC8vIG5vbi1jYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgICAgICAiSVNPLTg4NTktMSIsIC8vICAgICBjYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgICAgICAiODg1OV8xIiwgICAgIC8vIG5vbi1jYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgICAgICAiSVNPLTg4NTktMiIsIC8vICAgICBjYW5vbmljYWwsIG5vbi1idWlsdC1pbiwgbm9uLXNwZWNpYWwtY2FzZQorICAgICAgICAiODg1OV8yIiwgICAgIC8vIG5vbi1jYW5vbmljYWwsIG5vbi1idWlsdC1pbiwgbm9uLXNwZWNpYWwtY2FzZQorICAgICAgICAiVVMtQVNDSUkiLCAgIC8vICAgICBjYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgICAgICAiQVNDSUkiICAgICAgIC8vIG5vbi1jYW5vbmljYWwsICAgICBidWlsdC1pbiwgICAgIHNwZWNpYWwtY2FzZQorICAgIH0pCisgICAgcHJpdmF0ZSBTdHJpbmcgY2hhcnNldE5hbWU7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2hhcnNldEZvck5hbWUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9DaGVja3N1bUJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NoZWNrc3VtQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9DaGVja3N1bUJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkFkbGVyMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKKworcHVibGljIGNsYXNzIENoZWNrc3VtQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWRsZXJfYmxvY2soaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDAwMF07CisgICAgICAgIEFkbGVyMzIgYWRsZXIgPSBuZXcgQWRsZXIzMigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgYWRsZXIudXBkYXRlKGJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lQWRsZXJfYnl0ZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFkbGVyMzIgYWRsZXIgPSBuZXcgQWRsZXIzMigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgYWRsZXIudXBkYXRlKDEpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVDcmNfYmxvY2soaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDAwMF07CisgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgY3JjLnVwZGF0ZShieXRlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZUNyY19ieXRlKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBjcmMudXBkYXRlKDEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NpcGhlckJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0NpcGhlckJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vQ2lwaGVyQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKKworaW1wb3J0IGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3I7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5JdlBhcmFtZXRlclNwZWM7CisKKy8qKgorICogQ2lwaGVyIGJlbmNobWFya3MuIE9ubHkgcnVucyBvbiBBRVMgY3VycmVudGx5IGJlY2F1c2Ugb2YgdGhlIGNvbWJpbmF0b3JpYWwKKyAqIGV4cGxvc2lvbiBvZiB0aGUgdGVzdCBhcyBpdCBzdGFuZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBDaXBoZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFfU0laRSA9IDgxOTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERBVEEgPSBuZXcgYnl0ZVtEQVRBX1NJWkVdOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElWX1NJWkUgPSAxNjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBJViA9IG5ldyBieXRlW0lWX1NJWkVdOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBEQVRBX1NJWkU7IGkrKykgeworICAgICAgICAgICAgREFUQVtpXSA9IChieXRlKSBpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSVZfU0laRTsgaSsrKSB7CisgICAgICAgICAgICBJVltpXSA9IChieXRlKSBpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhcmFtIHByaXZhdGUgQWxnb3JpdGhtIGFsZ29yaXRobTsKKworICAgIHB1YmxpYyBlbnVtIEFsZ29yaXRobSB7CisgICAgICAgIEFFUywKKyAgICB9OworCisgICAgQFBhcmFtIHByaXZhdGUgTW9kZSBtb2RlOworCisgICAgcHVibGljIGVudW0gTW9kZSB7CisgICAgICAgIENCQywKKyAgICAgICAgQ0ZCLAorICAgICAgICBDVFIsCisgICAgICAgIEVDQiwKKyAgICAgICAgT0ZCLAorICAgIH07CisKKyAgICBAUGFyYW0gcHJpdmF0ZSBQYWRkaW5nIHBhZGRpbmc7CisKKyAgICBwdWJsaWMgZW51bSBQYWRkaW5nIHsKKyAgICAgICAgTk9QQURESU5HLAorICAgICAgICBQS0NTMVBBRERJTkcsCisgICAgfTsKKworICAgIEBQYXJhbSh7IjEyOCIsICIxOTIiLCAiMjU2In0pIHByaXZhdGUgaW50IGtleVNpemU7CisKKyAgICBAUGFyYW0oeyIxNiIsICIzMiIsICI2NCIsICIxMjgiLCAiMTAyNCIsICI4MTkyIn0pIHByaXZhdGUgaW50IGlucHV0U2l6ZTsKKworICAgIEBQYXJhbSBwcml2YXRlIEltcGxlbWVudGF0aW9uIGltcGxlbWVudGF0aW9uOworCisgICAgcHVibGljIGVudW0gSW1wbGVtZW50YXRpb24geyBPcGVuU1NMLCBCb3VuY3lDYXN0bGUgfTsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3ZpZGVyTmFtZTsKKworICAgIC8vIEtleSBnZW5lcmF0aW9uIGlzbid0IHBhcnQgb2YgdGhlIGJlbmNobWFyayBzbyBjYWNoZSB0aGUgcmVzdWx0cworICAgIHByaXZhdGUgc3RhdGljIE1hcDxJbnRlZ2VyLCBTZWNyZXRLZXk+IEtFWV9TSVpFUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFNlY3JldEtleT4oKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGNpcGhlckFsZ29yaXRobTsKKyAgICBwcml2YXRlIFNlY3JldEtleSBrZXk7CisKKyAgICBwcml2YXRlIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVtEQVRBLmxlbmd0aF07CisKKyAgICBwcml2YXRlIENpcGhlciBjaXBoZXJFbmNyeXB0OworCisgICAgcHJpdmF0ZSBDaXBoZXIgY2lwaGVyRGVjcnlwdDsKKworICAgIHByaXZhdGUgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBzcGVjOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNpcGhlckFsZ29yaXRobSA9IGFsZ29yaXRobS50b1N0cmluZygpICsgIi8iICsgbW9kZS50b1N0cmluZygpICsgIi8iCisgICAgICAgICAgICAgICAgKyBwYWRkaW5nLnRvU3RyaW5nKCk7CisKKyAgICAgICAgU3RyaW5nIGtleUFsZ29yaXRobSA9IGFsZ29yaXRobS50b1N0cmluZygpOworICAgICAgICBrZXkgPSBLRVlfU0laRVMuZ2V0KGtleVNpemUpOworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIEtleUdlbmVyYXRvciBnZW5lcmF0b3IgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2Uoa2V5QWxnb3JpdGhtKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5pbml0KGtleVNpemUpOworICAgICAgICAgICAga2V5ID0gZ2VuZXJhdG9yLmdlbmVyYXRlS2V5KCk7CisgICAgICAgICAgICBLRVlfU0laRVMucHV0KGtleVNpemUsIGtleSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGltcGxlbWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE9wZW5TU0w6CisgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lID0gIkFuZHJvaWRPcGVuU1NMIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQm91bmN5Q2FzdGxlOgorICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSA9ICJCQyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGltcGxlbWVudGF0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgIT0gTW9kZS5FQ0IpIHsKKyAgICAgICAgICAgIHNwZWMgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKElWKTsKKyAgICAgICAgfQorCisgICAgICAgIGNpcGhlckVuY3J5cHQgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoY2lwaGVyQWxnb3JpdGhtLCBwcm92aWRlck5hbWUpOworICAgICAgICBjaXBoZXJFbmNyeXB0LmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5LCBzcGVjKTsKKworICAgICAgICBjaXBoZXJEZWNyeXB0ID0gQ2lwaGVyLmdldEluc3RhbmNlKGNpcGhlckFsZ29yaXRobSwgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgY2lwaGVyRGVjcnlwdC5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgc3BlYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUVuY3J5cHQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgY2lwaGVyRW5jcnlwdC5kb0ZpbmFsKERBVEEsIDAsIGlucHV0U2l6ZSwgb3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVEZWNyeXB0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIGNpcGhlckRlY3J5cHQuZG9GaW5hbChEQVRBLCAwLCBpbnB1dFNpemUsIG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRGF0ZVRvU3RyaW5nQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRGF0ZVRvU3RyaW5nQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3NjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9EYXRlVG9TdHJpbmdCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKKworcHVibGljIGZpbmFsIGNsYXNzIERhdGVUb1N0cmluZ0JlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgRGF0ZSBkYXRlOworICAgIENhbGVuZGFyIGNhbGVuZGFyOworICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKDApOworICAgICAgICBjYWxlbmRhciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICBjYWxlbmRhci5zZXRUaW1lKGRhdGUpOworICAgICAgICBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBISDptbTpzcyB6enogeXl5eSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVEYXRlVG9TdHJpbmcoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgZGF0ZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURhdGVUb1N0cmluZ19Gb3JtYXR0ZXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSBNTU0gZGQgSEg6bW06c3Mgenp6IHl5eXkiKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRGF0ZVRvU3RyaW5nX0Nsb25lZEZvcm1hdHRlcihpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAoKFNpbXBsZURhdGVGb3JtYXQpIGZvcm1hdC5jbG9uZSgpKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRGF0ZVRvU3RyaW5nX0FuZHJvaWREYXRlRm9ybWF0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBEYXRlRm9ybWF0LmZvcm1hdCgiRUVFIE1NTSBkZCBrazptbTpzcyB6enogeXl5eSIsIGNhbGVuZGFyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW5uZXIubWFpbihEYXRlVG9TdHJpbmdCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9EZWZhdWx0Q2hhcnNldEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0RlZmF1bHRDaGFyc2V0QmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3YjAxMwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9EZWZhdWx0Q2hhcnNldEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdENoYXJzZXRCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyB2b2lkIHRpbWVfZGVmYXVsdENoYXJzZXQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0RpZ2VzdEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0RpZ2VzdEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDBmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRGlnZXN0QmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3Q7CisKK3B1YmxpYyBjbGFzcyBEaWdlc3RCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFfU0laRSA9IDgxOTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERBVEEgPSBuZXcgYnl0ZVtEQVRBX1NJWkVdOworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREFUQV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIERBVEFbaV0gPSAoYnl0ZSlpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhcmFtIHByaXZhdGUgQWxnb3JpdGhtIGFsZ29yaXRobTsKKworICAgIHB1YmxpYyBlbnVtIEFsZ29yaXRobSB7IE1ENSwgU0hBMSwgU0hBMjU2LCAgU0hBMzg0LCBTSEE1MTIgfTsKKworICAgIEBQYXJhbSBwcml2YXRlIEltcGxlbWVudGF0aW9uIGltcGxlbWVudGF0aW9uOworCisgICAgcHVibGljIGVudW0gSW1wbGVtZW50YXRpb24geyBPUEVOU1NMLCBCT1VOQ1lDQVNUTEUgfTsKKworICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIERpZ2VzdD4gZGlnZXN0Q2xhc3M7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLiI7CisgICAgICAgIHN3aXRjaCAoaW1wbGVtZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgT1BFTlNTTDoKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gKCJPcGVuU1NMRGlnZXN0JCIgKyBhbGdvcml0aG0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCT1VOQ1lDQVNUTEU6CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9IChhbGdvcml0aG0gKyAiRGlnZXN0Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGltcGxlbWVudGF0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZGlnZXN0Q2xhc3MgPSAoQ2xhc3M8PyBleHRlbmRzIERpZ2VzdD4pQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgRGlnZXN0IGRpZ2VzdCA9IGRpZ2VzdENsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkaWdlc3QudXBkYXRlKERBVEEsIDAsIERBVEFfU0laRSk7CisgICAgICAgICAgICBkaWdlc3QuZG9GaW5hbChuZXcgYnl0ZVtkaWdlc3QuZ2V0RGlnZXN0U2l6ZSgpXSwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRG5zQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRG5zQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTcxNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9EbnNCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBEbnNCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyB2b2lkIHRpbWVEbnMoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBob3N0cyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAid3d3LmFtYXpvbi5jb20iLAorICAgICAgICAgICAgInotZWN4LmltYWdlcy1hbWF6b24uY29tIiwKKyAgICAgICAgICAgICJnLWVjeC5pbWFnZXMtYW1hem9uLmNvbSIsCisgICAgICAgICAgICAiZWN4LmltYWdlcy1hbWF6b24uY29tIiwKKyAgICAgICAgICAgICJhZC5kb3VibGVjbGljay5jb20iLAorICAgICAgICAgICAgImJweC5hOS5jb20iLAorICAgICAgICAgICAgImQzZHRpazRkejFuZWowLmNsb3VkZnJvbnQubmV0IiwKKyAgICAgICAgICAgICJ1YWMuYWR2ZXJ0aXNpbmcuY29tIiwKKyAgICAgICAgICAgICJzZXJ2ZWRieS5hZHZlcnRpc2luZy5jb20iLAorICAgICAgICAgICAgInZpZXcuYXRkbXQuY29tIiwKKyAgICAgICAgICAgICJybWQuYXRkbXQuY29tIiwKKyAgICAgICAgICAgICJzcGUuYXRkbXQuY29tIiwKKyAgICAgICAgICAgICJ3d3cuZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAid3d3LmNubi5jb20iLAorICAgICAgICAgICAgImJhZC5ob3N0Lm10di5jb3JwLmdvb2dsZS5jb20iLAorICAgICAgICB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdHNbaSAlIGhvc3RzLmxlbmd0aF0pOworICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9Eb1ByaXZpbGVnZWRCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9Eb1ByaXZpbGVnZWRCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZiMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0RvUHJpdmlsZWdlZEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitwdWJsaWMgY2xhc3MgRG9Qcml2aWxlZ2VkQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lRGlyZWN0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRpbWVGYXN0QW5kU2xvdyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZVNlcGFyYXRvcjsKKyAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpbmVTZXBhcmF0b3IgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3QWN0aW9uKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmV1c2VkQWN0aW9uKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+IGFjdGlvbiA9IG5ldyBSZXVzYWJsZUFjdGlvbigibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXVzYWJsZUFjdGlvbiBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb248U3RyaW5nPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBSZXVzYWJsZUFjdGlvbihTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBydW4oKSB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRG91YmxlQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRG91YmxlQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2OTJhYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9Eb3VibGVCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBEb3VibGVCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHByaXZhdGUgZG91YmxlIGQgPSAxLjI7CisgICAgcHJpdmF0ZSBsb25nIGwgPSA0NjA4MDgzMTM4NzI1NDkxNTA3TDsKKworICAgIHB1YmxpYyB2b2lkIHRpbWVEb3VibGVUb0xvbmdCaXRzKGludCByZXBzKSB7CisgICAgICAgIGxvbmcgcmVzdWx0ID0gMTIzOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCAhPSBsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMb25nLnRvU3RyaW5nKHJlc3VsdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURvdWJsZVRvUmF3TG9uZ0JpdHMoaW50IHJlcHMpIHsKKyAgICAgICAgbG9uZyByZXN1bHQgPSAxMjM7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyhkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKExvbmcudG9TdHJpbmcocmVzdWx0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTG9uZ0JpdHNUb0RvdWJsZShpbnQgcmVwcykgeworICAgICAgICBkb3VibGUgcmVzdWx0ID0gMTIzLjA7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKERvdWJsZS50b1N0cmluZyhyZXN1bHQpICsgIiAiICsgRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHMocmVzdWx0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRXF1YWxzSGFzaENvZGVCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9FcXVhbHNIYXNoQ29kZUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWE0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRXF1YWxzSGFzaENvZGVCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFcXVhbHNIYXNoQ29kZUJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHJpdmF0ZSBlbnVtIFR5cGUgeworICAgICAgICBVUkkoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyB0ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSSSh0ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgVVJMKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGFic3RyYWN0IE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBAUGFyYW0gVHlwZSB0eXBlOworCisgICAgT2JqZWN0IGExOworICAgIE9iamVjdCBhMjsKKyAgICBPYmplY3QgYjE7CisgICAgT2JqZWN0IGIyOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGExID0gdHlwZS5uZXdJbnN0YW5jZSgiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vbWFpbC91LzAvP3NodmE9MSNpbmJveCIpOworICAgICAgICBhMiA9IHR5cGUubmV3SW5zdGFuY2UoImh0dHBzOi8vbWFpbC5nb29nbGUuY29tL21haWwvdS8wLz9zaHZhPTEjaW5ib3giKTsKKyAgICAgICAgYjEgPSB0eXBlLm5ld0luc3RhbmNlKCJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL25ldC9VUkkuaHRtbCIpOworICAgICAgICBiMiA9IHR5cGUubmV3SW5zdGFuY2UoImh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvbmV0L1VSSS5odG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUVxdWFscyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrPTMpIHsKKyAgICAgICAgICAgIGExLmVxdWFscyhiMSk7CisgICAgICAgICAgICBhMS5lcXVhbHMoYTIpOworICAgICAgICAgICAgYjEuZXF1YWxzKGIyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVIYXNoQ29kZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrPTIpIHsKKyAgICAgICAgICAgIGExLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBiMS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0V4cGVuc2l2ZU9iamVjdHNCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9FeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ZTI5OAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9FeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEJlbmNobWFya3MgY3JlYXRpb24gYW5kIGNsb25pbmcgdmFyaW91cyBleHBlbnNpdmUgb2JqZWN0cy4KKyAqLworcHVibGljIGNsYXNzIEV4cGVuc2l2ZU9iamVjdHNCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyB2b2lkIHRpbWVOZXdEYXRlRm9ybWF0VGltZUluc3RhbmNlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCk7CisgICAgICAgICAgICBkZi5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsb25lZERhdGVGb3JtYXRUaW1lSW5zdGFuY2UoaW50IHJlcHMpIHsKKyAgICAgICAgRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgKChEYXRlRm9ybWF0KSBkZi5jbG9uZSgpKS5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJldXNlZERhdGVGb3JtYXRUaW1lSW5zdGFuY2UoaW50IHJlcHMpIHsKKyAgICAgICAgRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChkZikgeworICAgICAgICAgICAgICAgIGRmLmZvcm1hdChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3Q29sbGF0b3IoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5VUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2xvbmVkQ29sbGF0b3IoaW50IHJlcHMpIHsKKyAgICAgICAgQ29sbGF0b3IgYyA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5VUyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBjLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3RGF0ZUZvcm1hdFN5bWJvbHMoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG5ldyBEYXRlRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsb25lZERhdGVGb3JtYXRTeW1ib2xzKGludCByZXBzKSB7CisgICAgICAgIERhdGVGb3JtYXRTeW1ib2xzIGRmcyA9IG5ldyBEYXRlRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgZGZzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3RGVjaW1hbEZvcm1hdFN5bWJvbHMoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsb25lZERlY2ltYWxGb3JtYXRTeW1ib2xzKGludCByZXBzKSB7CisgICAgICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRmcyA9IG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgZGZzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3TnVtYmVyRm9ybWF0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDbG9uZWROdW1iZXJGb3JtYXQoaW50IHJlcHMpIHsKKyAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBuZi5jbG9uZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU51bWJlckZvcm1hdFRyaXZpYWxGb3JtYXRMb25nKGludCByZXBzKSB7CisgICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZShMb2NhbGUuVVMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbmYuZm9ybWF0KDEwMjRMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVMb25nVG9TdHJpbmcoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIExvbmcudG9TdHJpbmcoMTAyNEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU51bWJlckZvcm1hdFRyaXZpYWxGb3JtYXREb3VibGUoaW50IHJlcHMpIHsKKyAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBuZi5mb3JtYXQoMTAyNC4wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVOZXdTaW1wbGVEYXRlRm9ybWF0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsb25lZFNpbXBsZURhdGVGb3JtYXQoaW50IHJlcHMpIHsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgc2RmLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV3R3JlZ29yaWFuQ2FsZW5kYXIoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsb25lZEdyZWdvcmlhbkNhbGVuZGFyKGludCByZXBzKSB7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBnYy5jbG9uZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Zsb2F0QmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRmxvYXRCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJiYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Zsb2F0QmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgRmxvYXRCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHByaXZhdGUgZmxvYXQgZiA9IDEuMmY7CisgICAgcHJpdmF0ZSBpbnQgaSA9IDEwNjcwMzA5Mzg7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRmxvYXRUb0ludEJpdHMoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDEyMzsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKGYpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgIT0gaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSW50ZWdlci50b1N0cmluZyhyZXN1bHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdFRvUmF3SW50Qml0cyhpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTIzOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgcmVzdWx0ID0gRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHMoZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCAhPSBpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihJbnRlZ2VyLnRvU3RyaW5nKHJlc3VsdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUludEJpdHNUb0Zsb2F0KGludCByZXBzKSB7CisgICAgICAgIGZsb2F0IHJlc3VsdCA9IDEyMy4wZjsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZsb2F0LmludEJpdHNUb0Zsb2F0KGkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgIT0gZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oRmxvYXQudG9TdHJpbmcocmVzdWx0KSArICIgIiArIEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHJlc3VsdCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Zvcm1hdHRlckJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0Zvcm1hdHRlckJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNGNmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vRm9ybWF0dGVyQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBDb21wYXJlcyBGb3JtYXR0ZXIgYWdhaW5zdCBoYW5kLXdyaXR0ZW4gU3RyaW5nQnVpbGRlciBjb2RlLgorICovCitwdWJsaWMgY2xhc3MgRm9ybWF0dGVyQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX05vRm9ybWF0dGluZyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBmLmZvcm1hdCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgZG9lc24ndCBhY3R1YWxseSBuZWVkIGFueSBmb3JtYXR0aW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nQnVpbGRlcl9Ob0Zvcm1hdHRpbmcoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgYW55IGZvcm1hdHRpbmciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGb3JtYXR0ZXJfT25lSW50KGludCByZXBzKSB7CisgICAgICAgIEludGVnZXIgdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoMTAyNCk7IC8vIFdlJ3JlIG5vdCB0cnlpbmcgdG8gYmVuY2htYXJrIGJveGluZyBoZXJlLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBmLmZvcm1hdCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGFuIGludCAlZCBpbiBpdCIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGb3JtYXR0ZXJfT25lSW50QXJhYmljKGludCByZXBzKSB7CisgICAgICAgIExvY2FsZSBhcmFiaWMgPSBuZXcgTG9jYWxlKCJhciIpOworICAgICAgICBJbnRlZ2VyIHZhbHVlID0gSW50ZWdlci52YWx1ZU9mKDEwMjQpOyAvLyBXZSdyZSBub3QgdHJ5aW5nIHRvIGJlbmNobWFyayBib3hpbmcgaGVyZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOworICAgICAgICAgICAgZi5mb3JtYXQoYXJhYmljLCAidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGFuIGludCAlZCBpbiBpdCIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTdHJpbmdCdWlsZGVyX09uZUludChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoInRoaXMgaXMgYSByZWFzb25hYmx5IHNob3J0IHN0cmluZyB0aGF0IGhhcyBhbiBpbnQgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoMTAyNCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBpbiBpdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZvcm1hdHRlcl9PbmVIZXhJbnQoaW50IHJlcHMpIHsKKyAgICAgICAgSW50ZWdlciB2YWx1ZSA9IEludGVnZXIudmFsdWVPZigxMDI0KTsgLy8gV2UncmUgbm90IHRyeWluZyB0byBiZW5jaG1hcmsgYm94aW5nIGhlcmUuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoKTsKKyAgICAgICAgICAgIGYuZm9ybWF0KCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBoYXMgYW4gaW50ICV4IGluIGl0IiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ0J1aWxkZXJfT25lSGV4SW50KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGFuIGludCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKDEwMjQpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGluIGl0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX09uZUZsb2F0KGludCByZXBzKSB7CisgICAgICAgIEZsb2F0IHZhbHVlID0gRmxvYXQudmFsdWVPZigxMC4yNGYpOyAvLyBXZSdyZSBub3QgdHJ5aW5nIHRvIGJlbmNobWFyayBib3hpbmcgaGVyZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOworICAgICAgICAgICAgZi5mb3JtYXQoInRoaXMgaXMgYSByZWFzb25hYmx5IHNob3J0IHN0cmluZyB0aGF0IGhhcyBhIGZsb2F0ICVmIGluIGl0IiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZvcm1hdHRlcl9PbmVGbG9hdF9kb3QyZihpbnQgcmVwcykgeworICAgICAgICBGbG9hdCB2YWx1ZSA9IEZsb2F0LnZhbHVlT2YoMTAuMjRmKTsgLy8gV2UncmUgbm90IHRyeWluZyB0byBiZW5jaG1hcmsgYm94aW5nIGhlcmUuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoKTsKKyAgICAgICAgICAgIGYuZm9ybWF0KCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBoYXMgYSBmbG9hdCAlLjJmIGluIGl0IiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZvcm1hdHRlcl9Ud29GbG9hdHMoaW50IHJlcHMpIHsKKyAgICAgICAgRmxvYXQgdmFsdWUgPSBGbG9hdC52YWx1ZU9mKDEwLjI0Zik7IC8vIFdlJ3JlIG5vdCB0cnlpbmcgdG8gYmVuY2htYXJrIGJveGluZyBoZXJlLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBmLmZvcm1hdCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIHR3byBmbG9hdHMgJWYgYW5kICVmIGluIGl0IiwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTdHJpbmdCdWlsZGVyX09uZUZsb2F0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGEgZmxvYXQgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoMTAuMjRmKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGluIGl0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX09uZVN0cmluZyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBmLmZvcm1hdCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGEgc3RyaW5nICVzIGluIGl0IiwgImhlbGxvIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nQnVpbGRlcl9PbmVTdHJpbmcoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBoYXMgYSBzdHJpbmcgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoImhlbGxvIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBpbiBpdCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0hvc3RuYW1lVmVyaWZpZXJCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9Ib3N0bmFtZVZlcmlmaWVyQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMThjNAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9Ib3N0bmFtZVZlcmlmaWVyQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkNvbnRleHQ7CisKKy8qKgorICogVGhpcyBiZW5jaG1hcmsgbWFrZXMgYSByZWFsIEhUVFAgY29ubmVjdGlvbiB0byBhIGhhbmRmdWwgb2YgaG9zdHMgYW5kCisgKiBjYXB0dXJlcyB0aGUgc2VydmVkIGNlcnRpZmljYXRlcyBhcyBhIGJ5dGUgYXJyYXkuIEl0IHRoZW4gdmVyaWZpZXMgZWFjaAorICogY2VydGlmaWNhdGUgaW4gdGhlIGJlbmNobWFyayBsb29wLCBiZWluZyBjYXJlZnVsIHRvIGNvbnZlcnQgZnJvbSB0aGUKKyAqIGJ5dGVbXSB0byB0aGUgY2VydGlmaWNhdGUgZWFjaCB0aW1lLiBPdGhlcndpc2UgdGhlIGNlcnRpZmljYXRlIGNsYXNzCisgKiBjYWNoZXMgcHJldmlvdXMgcmVzdWx0cyB3aGljaCBza2V3cyB0aGUgcmVzdWx0cyBvZiB0aGUgYmVuY2htYXJrOiBJbiBwcmFjdGljZQorICogZWFjaCBjZXJ0aWZpY2F0ZSBpbnN0YW5jZSBpcyB2ZXJpZmllZCBvbmNlIGFuZCB0aGVuIHJlbGVhc2VkLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSG9zdG5hbWVWZXJpZmllckJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisKKyAgICBAUGFyYW0oeyJhbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAibS5nb29nbGUuY29tIiwKKyAgICAgICAgICAgICJ3d3cuZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAid3d3LmFtYXpvbi5jb20iLAorICAgICAgICAgICAgInd3dy51YnMuY29tIn0pIFN0cmluZyBob3N0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdG5hbWU7CisgICAgcHJpdmF0ZSBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1lVmVyaWZpZXI7CisgICAgcHJpdmF0ZSBieXRlW11bXSBlbmNvZGVkQ2VydGlmaWNhdGVzOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwcyIsIGhvc3QsICIvIik7CisgICAgICAgIGhvc3RuYW1lVmVyaWZpZXIgPSBIdHRwc1VSTENvbm5lY3Rpb24uZ2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoKTsKKyAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cHNVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRIb3N0bmFtZVZlcmlmaWVyKG5ldyBIb3N0bmFtZVZlcmlmaWVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5KFN0cmluZyBob3N0bmFtZSwgU1NMU2Vzc2lvbiBzc2xTZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZENlcnRpZmljYXRlcyA9IGNlcnRpZmljYXRlc1RvQnl0ZXMoc3NsU2Vzc2lvbi5nZXRQZWVyQ2VydGlmaWNhdGVzKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIb3N0bmFtZVZlcmlmaWVyQmVuY2htYXJrLnRoaXMuaG9zdG5hbWUgPSBob3N0bmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVZlcmlmeShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcyA9IGJ5dGVzVG9DZXJ0aWZpY2F0ZXMoZW5jb2RlZENlcnRpZmljYXRlcyk7CisgICAgICAgICAgICBGYWtlU1NMU2Vzc2lvbiBzc2xTZXNzaW9uID0gbmV3IEZha2VTU0xTZXNzaW9uKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VydGlmaWNhdGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBob3N0bmFtZVZlcmlmaWVyLnZlcmlmeShob3N0bmFtZSwgc3NsU2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXVtdIGNlcnRpZmljYXRlc1RvQnl0ZXMoQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtjZXJ0aWZpY2F0ZXMubGVuZ3RoXVtdOworICAgICAgICBmb3IgKGludCBpID0gMCwgY2VydGlmaWNhdGVzTGVuZ3RoID0gY2VydGlmaWNhdGVzLmxlbmd0aDsgaSA8IGNlcnRpZmljYXRlc0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBjZXJ0aWZpY2F0ZXNbaV0uZ2V0RW5jb2RlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBDZXJ0aWZpY2F0ZVtdIGJ5dGVzVG9DZXJ0aWZpY2F0ZXMoYnl0ZVtdW10gZW5jb2RlZENlcnRpZmljYXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0aWZpY2F0ZUZhY3RvcnkgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CisgICAgICAgIENlcnRpZmljYXRlW10gcmVzdWx0ID0gbmV3IENlcnRpZmljYXRlW2VuY29kZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkQ2VydGlmaWNhdGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBjZXJ0aWZpY2F0ZUZhY3RvcnkuZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZENlcnRpZmljYXRlc1tpXSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFrZVNTTFNlc3Npb24gaW1wbGVtZW50cyBTU0xTZXNzaW9uIHsKKyAgICAgICAgcHVibGljIGludCBnZXRBcHBsaWNhdGlvbkJ1ZmZlclNpemUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENpcGhlclN1aXRlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRJZCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldFBhY2tldEJ1ZmZlclNpemUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldFBlZXJDZXJ0aWZpY2F0ZXMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBlZXJIb3N0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBnZXRQZWVyUG9ydCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU1NMU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVOYW1lcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBSdW5uZXIubWFpbihIb3N0bmFtZVZlcmlmaWVyQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50Q29uc3RhbnREaXZpc2lvbkJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludENvbnN0YW50RGl2aXNpb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThiNzgzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludENvbnN0YW50RGl2aXNpb25CZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBJbnRDb25zdGFudERpdmlzaW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgaW50IHRpbWVEaXZpZGVJbnRCeUNvbnN0YW50MihpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAvPSAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZURpdmlkZUludEJ5Q29uc3RhbnQ4KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0IC89IDg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRGl2aWRlSW50QnlDb25zdGFudDEwKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0IC89IDEwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZURpdmlkZUludEJ5Q29uc3RhbnQxMDAoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgLz0gMTAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZURpdmlkZUludEJ5Q29uc3RhbnQxMDBfSGFuZE9wdGltaXplZChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChpbnQpICgoMHg1MWViODUxZkwgKiByZXN1bHQpID4+PiAzNyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lRGl2aWRlSW50QnlDb25zdGFudDIwNDgoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgLz0gMjA0ODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVEaXZpZGVJbnRCeVZhcmlhYmxlMihpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgaW50IGZhY3RvciA9IDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgLz0gZmFjdG9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZURpdmlkZUludEJ5VmFyaWFibGUxMChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgaW50IGZhY3RvciA9IDEwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0IC89IGZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9JbnRDb25zdGFudE11bHRpcGxpY2F0aW9uQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50Q29uc3RhbnRNdWx0aXBsaWNhdGlvbkJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50Q29uc3RhbnRNdWx0aXBsaWNhdGlvbkJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBJbnRDb25zdGFudE11bHRpcGxpY2F0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgaW50IHRpbWVNdWx0aXBseUludEJ5Q29uc3RhbnQ2KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICo9IDY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lTXVsdGlwbHlJbnRCeUNvbnN0YW50NyhpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAqPSA3OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDgoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKj0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVNdWx0aXBseUludEJ5Q29uc3RhbnQ4X1NoaWZ0KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0IDw8PSAzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDEwKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICo9IDEwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDEwX1NoaWZ0KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIChyZXN1bHQgPDwgMikpIDw8IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lTXVsdGlwbHlJbnRCeUNvbnN0YW50MjA0NyhpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAqPSAyMDQ3OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZU11bHRpcGx5SW50QnlDb25zdGFudDIwNDgoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKj0gMjA0ODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBwdWJsaWMgaW50IHRpbWVNdWx0aXBseUludEJ5Q29uc3RhbnQyMDQ5KGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICo9IDIwNDk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lTXVsdGlwbHlJbnRCeVZhcmlhYmxlMTAoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGludCBmYWN0b3IgPSAxMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAqPSBmYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lTXVsdGlwbHlJbnRCeVZhcmlhYmxlOChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgaW50IGZhY3RvciA9IDg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgKj0gZmFjdG9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludENvbnN0YW50UmVtYWluZGVyQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50Q29uc3RhbnRSZW1haW5kZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc0NzIxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludENvbnN0YW50UmVtYWluZGVyQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgSW50Q29uc3RhbnRSZW1haW5kZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyBpbnQgdGltZVJlbWFpbmRlckludEJ5Q29uc3RhbnQyKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICU9IDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIGludCB0aW1lUmVtYWluZGVySW50QnlDb25zdGFudDgoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgJT0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKy8qCisgICAgcHVibGljIGludCB0aW1lUmVtYWluZGVySW50QnlDb25zdGFudDEwKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICU9IDEwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZVJlbWFpbmRlckludEJ5Q29uc3RhbnQxMDAoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgJT0gMTAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorKi8KKyAgICBwdWJsaWMgaW50IHRpbWVSZW1haW5kZXJJbnRCeUNvbnN0YW50MjA0OChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAlPSAyMDQ4OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgdGltZVJlbWFpbmRlckludEJ5VmFyaWFibGUyKGludCByZXBzKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICBpbnQgZmFjdG9yID0gMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAlPSBmYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisvKgorICAgIHB1YmxpYyBpbnQgdGltZVJlbWFpbmRlckludEJ5VmFyaWFibGUxMChpbnQgcmVwcykgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgaW50IGZhY3RvciA9IDEwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICU9IGZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyovCit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50ZWdlckJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludGVnZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFiYjVkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludGVnZXJCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworcHVibGljIGNsYXNzIEludGVnZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyBpbnQgdGltZUxvbmdTaWdudW1CcmFuY2goaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgdCArPSBzaWdudW0xKC1pKTsKKyAgICAgICAgICAgIHQgKz0gc2lnbnVtMSgwKTsKKyAgICAgICAgICAgIHQgKz0gc2lnbnVtMShpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRpbWVMb25nU2lnbnVtQnJhbmNoRnJlZShpbnQgcmVwcykgeworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICB0ICs9IHNpZ251bTIoLWkpOworICAgICAgICAgICAgdCArPSBzaWdudW0yKDApOworICAgICAgICAgICAgdCArPSBzaWdudW0yKGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBzaWdudW0xKGxvbmcgdikgeworICAgICAgICByZXR1cm4gdiA8IDAgPyAtMSA6ICh2ID09IDAgPyAwIDogMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNpZ251bTIobG9uZyB2KSB7CisgICAgICAgIHJldHVybiAoKGludCkodiA+PiA2MykpIHwgKGludCkgKC12ID4+PiA2Myk7IC8vIEhhY2tlcidzIGRlbGlnaHQgMi03CisgICAgfQorCisgICAgcHVibGljIGludCB0aW1lTG9uZ0JpdENvdW50X0JpdFNldChpbnQgcmVwcykgeworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICB0ICs9IHBvcCgobG9uZykgaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBvcChsb25nIGwpIHsKKyAgICAgICAgaW50IGNvdW50ID0gcG9wWChsICYgMHhmZmZmZmZmZkwpOworICAgICAgICBjb3VudCArPSBwb3BYKGwgPj4+IDMyKTsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwb3BYKGxvbmcgeCkgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAgICAgLy8gZGVsZWdhdGUgdG8gSW50ZWdlci5iaXRDb3VudChpKTsgY29uc2lkZXIgdXNpbmcgbmF0aXZlIGNvZGUKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQorICAgICAgICB4ID0geCAtICgoeCA+Pj4gMSkgJiAweDU1NTU1NTU1KTsKKyAgICAgICAgeCA9ICh4ICYgMHgzMzMzMzMzMykgKyAoKHggPj4+IDIpICYgMHgzMzMzMzMzMyk7CisgICAgICAgIHggPSAoeCArICh4ID4+PiA0KSkgJiAweDBmMGYwZjBmOworICAgICAgICB4ID0geCArICh4ID4+PiA4KTsKKyAgICAgICAgeCA9IHggKyAoeCA+Pj4gMTYpOworICAgICAgICByZXR1cm4gKGludCkgeCAmIDB4MDAwMDAwM2Y7CisgICAgfQorCisgICAgcHVibGljIGludCB0aW1lTG9uZ0JpdENvdW50XzJJbnQoaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgdCArPSBwb3AyKChsb25nKSBpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcG9wMihsb25nIGwpIHsKKyAgICAgICAgaW50IGNvdW50ID0gSW50ZWdlci5iaXRDb3VudCgoaW50KSAobCAmIDB4ZmZmZmZmZmZMKSk7CisgICAgICAgIGNvdW50ICs9IEludGVnZXIuYml0Q291bnQoKGludCkgKGwgPj4+IDMyKSk7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRpbWVMb25nQml0Q291bnRfTG9uZyhpbnQgcmVwcykgeworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICB0ICs9IExvbmcuYml0Q291bnQoKGxvbmcpIGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRhYmxlIGZvciBTZWFsJ3MgYWxnb3JpdGhtIGZvciBOdW1iZXIgb2YgVHJhaWxpbmcgWmVyb3MuIEhhY2tlcidzIERlbGlnaHQKKyAgICAgKiBvbmxpbmUsIEZpZ3VyZSA1LTE4IChodHRwOi8vd3d3LmhhY2tlcnNkZWxpZ2h0Lm9yZy9yZXZpc2lvbnMucGRmKQorICAgICAqIFRoZSBlbnRyaWVzIHdob3NlIHZhbHVlIGlzIC0xIGFyZSBuZXZlciByZWZlcmVuY2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBOVFpfVEFCTEUgPSB7CisgICAgICAgIDMyLCAgMCwgIDEsIDEyLCAgMiwgIDYsIC0xLCAxMywgICAzLCAtMSwgIDcsIC0xLCAtMSwgLTEsIC0xLCAxNCwKKyAgICAgICAgMTAsICA0LCAtMSwgLTEsICA4LCAtMSwgLTEsIDI1LCAgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMSwgMjcsIDE1LAorICAgICAgICAzMSwgMTEsICA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsICAgOSwgLTEsIC0xLCAyNCwgLTEsIC0xLCAyMCwgMjYsCisgICAgICAgIDMwLCAtMSwgLTEsIC0xLCAtMSwgMjMsIC0xLCAxOSwgIDI5LCAtMSwgMjIsIDE4LCAyOCwgMTcsIDE2LCAtMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtYmVyT2ZUcmFpbGluZ1plcm9zSEQoaW50IGkpIHsKKyAgICAgICAgLy8gU2VhbCdzIGFsZ29yaXRobSAtIEhhY2tlcidzIERlbGlnaHQgNS0xOAorICAgICAgICBpICY9IC1pOworICAgICAgICBpID0gKGkgPDwgIDQpICsgaTsgICAgLy8geCAqPSAxNworICAgICAgICBpID0gKGkgPDwgIDYpICsgaTsgICAgLy8geCAqPSA2NQorICAgICAgICBpID0gKGkgPDwgMTYpIC0gaTsgICAgLy8geCAqPSA2NTUzNQorICAgICAgICByZXR1cm4gTlRaX1RBQkxFW2kgPj4+IDI2XTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtYmVyT2ZUcmFpbGluZ1plcm9zT0woaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIE5UWl9UQUJMRVsoKGkgJiAtaSkgKiAweDA0NTBGQkFGKSA+Pj4gMjZdOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgdGltZU51bWJlck9mVHJhaWxpbmdaZXJvc0hEKGludCByZXBzKSB7CisgICAgICAgIGludCB0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHQgKz0gbnVtYmVyT2ZUcmFpbGluZ1plcm9zSEQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgcHVibGljIGludCB0aW1lTnVtYmVyT2ZUcmFpbGluZ1plcm9zT0woaW50IHJlcHMpIHsKKyAgICAgICAgaW50IHQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgdCArPSBudW1iZXJPZlRyYWlsaW5nWmVyb3NPTChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSW50ZWdyYWxUb1N0cmluZ0JlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludGVncmFsVG9TdHJpbmdCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWI5ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0ludGVncmFsVG9TdHJpbmdCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgSW50ZWdyYWxUb1N0cmluZ0JlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BTEwgID0gMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElVTSA9IDEyMzQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVJHRSAgPSAxMjM0NTY3ODsKKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nX3NtYWxsKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNNQUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhNRURJVU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9JbnRlZ2VyVG9TdHJpbmdfbGFyZ2UoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoTEFSR0UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9JbnRlZ2VyVG9TdHJpbmcyX3NtYWxsKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNNQUxMLCAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nMl9tZWRpdW0oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoTUVESVVNLCAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nMl9sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhMQVJHRSwgMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0ludGVnZXJUb1N0cmluZzEwX3NtYWxsKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNNQUxMLCAxMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0ludGVnZXJUb1N0cmluZzEwX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhNRURJVU0sIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nMTBfbGFyZ2UoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoTEFSR0UsIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nMTZfc21hbGwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoU01BTEwsIDE2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvU3RyaW5nMTZfbWVkaXVtKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKE1FRElVTSwgMTYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9JbnRlZ2VyVG9TdHJpbmcxNl9sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhMQVJHRSwgMTYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9JbnRlZ2VyVG9CaW5hcnlTdHJpbmdfc21hbGwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9CaW5hcnlTdHJpbmcoU01BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9JbnRlZ2VyVG9CaW5hcnlTdHJpbmdfbWVkaXVtKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvQmluYXJ5U3RyaW5nKE1FRElVTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0ludGVnZXJUb0JpbmFyeVN0cmluZ19sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b0JpbmFyeVN0cmluZyhMQVJHRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0ludGVnZXJUb0hleFN0cmluZ19zbWFsbChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhTTUFMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0ludGVnZXJUb0hleFN0cmluZ19tZWRpdW0oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoTUVESVVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfSW50ZWdlclRvSGV4U3RyaW5nX2xhcmdlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKExBUkdFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfU3RyaW5nQnVpbGRlcl9zbWFsbChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoU01BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9TdHJpbmdCdWlsZGVyX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoTUVESVVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfU3RyaW5nQnVpbGRlcl9sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoTEFSR0UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9Gb3JtYXR0ZXJfc21hbGwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVkIiwgU01BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9Gb3JtYXR0ZXJfbWVkaXVtKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZCIsIE1FRElVTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX0Zvcm1hdHRlcl9sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJWQiLCBMQVJHRSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vSmFyRmlsZUJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0phckZpbGVCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjZjYTIxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0phckZpbGVCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLio7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBKYXJGaWxlQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBAUGFyYW0oeworICAgICAgICAiL3N5c3RlbS9mcmFtZXdvcmsvYm91bmN5Y2FzdGxlLmphciIsCisgICAgICAgICIvc3lzdGVtL2ZyYW1ld29yay9jb3JlLmphciIsCisgICAgICAgICIvc3lzdGVtL2ZyYW1ld29yay9mcmFtZXdvcmsuamFyIgorICAgIH0pCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKGYpOworICAgICAgICAgICAgTWFuaWZlc3QgbSA9IGpmLmdldE1hbmlmZXN0KCk7CisgICAgICAgICAgICBqZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL0tleVBhaXJHZW5lcmF0b3JCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9LZXlQYWlyR2VuZXJhdG9yQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyYzkzNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9LZXlQYWlyR2VuZXJhdG9yQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgS2V5UGFpckdlbmVyYXRvckJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgQFBhcmFtIHByaXZhdGUgQWxnb3JpdGhtIGFsZ29yaXRobTsKKworICAgIHB1YmxpYyBlbnVtIEFsZ29yaXRobSB7CisgICAgICAgIFJTQSwKKyAgICAgICAgRFNBLAorICAgIH07CisKKyAgICBAUGFyYW0gcHJpdmF0ZSBJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRhdGlvbjsKKworICAgIHB1YmxpYyBlbnVtIEltcGxlbWVudGF0aW9uIHsgT3BlblNTTCwgQm91bmN5Q2FzdGxlIH07CisKKyAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3JBbGdvcml0aG07CisgICAgcHJpdmF0ZSBLZXlQYWlyR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgICBwcml2YXRlIFNlY3VyZVJhbmRvbSByYW5kb207CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5nZW5lcmF0b3JBbGdvcml0aG0gPSBhbGdvcml0aG0udG9TdHJpbmcoKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlcjsKKyAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uID09IEltcGxlbWVudGF0aW9uLkJvdW5jeUNhc3RsZSkgeworICAgICAgICAgICAgcHJvdmlkZXIgPSAiQkMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvdmlkZXIgPSAiQW5kcm9pZE9wZW5TU0wiOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKGdlbmVyYXRvckFsZ29yaXRobSwgcHJvdmlkZXIpOworICAgICAgICB0aGlzLnJhbmRvbSA9IFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZSgiU0hBMVBSTkciKTsKKyAgICAgICAgdGhpcy5nZW5lcmF0b3IuaW5pdGlhbGl6ZSgxMDI0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIEtleVBhaXIga2V5UGFpciA9IGdlbmVyYXRvci5nZW5lcmF0ZUtleVBhaXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9Mb29waW5nQmFja3dhcmRzQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vTG9vcGluZ0JhY2t3YXJkc0JlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vTG9vcGluZ0JhY2t3YXJkc0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworLyoqCisgKiBUZXN0aW5nIHRoZSBvbGQgY2FuYXJkIHRoYXQgbG9vcGluZyBiYWNrd2FyZHMgaXMgZmFzdGVyLgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqLworcHVibGljIGNsYXNzIExvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICBAUGFyYW0oeyIyIiwgIjIwIiwgIjIwMDAiLCAiMjAwMDAwMDAifSkgaW50IG1heDsKKworICBwdWJsaWMgaW50IHRpbWVGb3J3YXJkcyhpbnQgcmVwcykgeworICAgIGludCBkdW1teSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKKyAgICAgICAgZHVtbXkgKz0gajsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGR1bW15OworICB9CisKKyAgcHVibGljIGludCB0aW1lQmFja3dhcmRzKGludCByZXBzKSB7CisgICAgaW50IGR1bW15ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IG1heCAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgIGR1bW15ICs9IGo7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkdW1teTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL01hdGhCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9NYXRoQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhODcxZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9NYXRoQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworLyoqCisgKiBNYW55IG9mIHRoZXNlIHRlc3RzIGFyZSBib2d1cyBpbiB0aGF0IHRoZSBjb3N0IHdpbGwgdmFyeSB3aWxkbHkgZGVwZW5kaW5nIG9uIGlucHV0cy4KKyAqIEZvciBfbXlfIGN1cnJlbnQgcHVycG9zZXMsIHRoYXQncyBva2F5LiBCdXQgYmV3YXJlIQorICovCitwdWJsaWMgY2xhc3MgTWF0aEJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgZCA9IDEuMjsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IGYgPSAxLjJmOworICAgIHByaXZhdGUgZmluYWwgaW50IGkgPSAxOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsID0gMUw7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWJzRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5hYnMoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWJzRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5hYnMoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWJzSShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5hYnMoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWJzTChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5hYnMobCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQWNvcyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5hY29zKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUFzaW4oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguYXNpbihkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBdGFuKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLmF0YW4oZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQXRhbjIoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguYXRhbjIoMywgNCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2JydChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5jYnJ0KGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNlaWwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguY2VpbChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDb3B5U2lnbkQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguY29weVNpZ24oZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ29weVNpZ25GKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLmNvcHlTaWduKGYsIGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNvcHlTaWduRF9zdHJpY3QoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguY29weVNpZ24oZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ29weVNpZ25GX3N0cmljdChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5jb3B5U2lnbihmLCBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDb3MoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguY29zKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNvc2goaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguY29zaChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVFeHAoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguZXhwKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUV4cG0xKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLmV4cG0xKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZsb29yKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLmZsb29yKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUdldEV4cG9uZW50RChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5nZXRFeHBvbmVudChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRFeHBvbmVudEYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguZ2V0RXhwb25lbnQoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSHlwb3QoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguaHlwb3QoZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSUVFRXJlbWFpbmRlcihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5JRUVFcmVtYWluZGVyKGQsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUxvZyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5sb2coZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTG9nMTAoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgubG9nMTAoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTG9nMXAoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgubG9nMXAoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWF4RChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5tYXgoZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWF4RihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5tYXgoZiwgZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWF4SShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5tYXgoaSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWF4TChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5tYXgobCwgbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWluRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5taW4oZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWluRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5taW4oZiwgZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWluSShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5taW4oaSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWluTChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5taW4obCwgbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV4dEFmdGVyRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5uZXh0QWZ0ZXIoZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV4dEFmdGVyRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5uZXh0QWZ0ZXIoZiwgZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV4dFVwRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5uZXh0VXAoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTmV4dFVwRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5uZXh0VXAoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUG93KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnBvdyhkLCBkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSYW5kb20oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgucmFuZG9tKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmludChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5yaW50KGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJvdW5kRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5yb3VuZChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSb3VuZEYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgucm91bmQoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2NhbGJEKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnNjYWxiKGQsIDUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVNjYWxiRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgTWF0aC5zY2FsYihmLCA1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTaWdudW1EKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnNpZ251bShkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTaWdudW1GKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnNpZ251bShmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTaW4oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguc2luKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVNpbmgoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGguc2luaChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTcXJ0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnNxcnQoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVGFuKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnRhbihkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVUYW5oKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnRhbmgoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVG9EZWdyZWVzKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBNYXRoLnRvRGVncmVlcyhkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVUb1JhZGlhbnMoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgudG9SYWRpYW5zKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVVscEQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgudWxwKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVVscEYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE1hdGgudWxwKGYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL01lc3NhZ2VEaWdlc3RCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9NZXNzYWdlRGlnZXN0QmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkODA3NAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9NZXNzYWdlRGlnZXN0QmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlRGlnZXN0QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBX1NJWkUgPSA4MTkyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBEQVRBID0gbmV3IGJ5dGVbREFUQV9TSVpFXTsKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IERBVEFfU0laRTsgaSsrKSB7CisgICAgICAgICAgICBEQVRBW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXJhbSBwcml2YXRlIEFsZ29yaXRobSBhbGdvcml0aG07CisKKyAgICBwdWJsaWMgZW51bSBBbGdvcml0aG0geyBNRDUsIFNIQTEsIFNIQTI1NiwgIFNIQTM4NCwgU0hBNTEyIH07CisKKyAgICBAUGFyYW0gcHJpdmF0ZSBQcm92aWRlciBwcm92aWRlcjsKKworICAgIHB1YmxpYyBlbnVtIFByb3ZpZGVyIHsgQW5kcm9pZE9wZW5TU0wsIEJDIH07CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3QgZGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0udG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGRpZ2VzdC51cGRhdGUoREFUQSwgMCwgREFUQV9TSVpFKTsKKyAgICAgICAgICAgIGRpZ2VzdC5kaWdlc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9NdXRhYmxlSW50QmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vTXV0YWJsZUludEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNGYyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vTXV0YWJsZUludEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIE11dGFibGVJbnRCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgQVJSQVkoKSB7CisgICAgICAgICAgICBpbnRbXSB2YWx1ZSA9IG5ldyBpbnRbMV07CisKKyAgICAgICAgICAgIEBPdmVycmlkZSB2b2lkIHRpbWVDcmVhdGUoaW50IHJlcHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBpbnRbXSB7IDUgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUgdm9pZCB0aW1lSW5jcmVtZW50KGludCByZXBzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVbMF0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUgaW50IHRpbWVHZXQoaW50IHJlcHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gdmFsdWVbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIEFUT01JQygpIHsKKyAgICAgICAgICAgIEF0b21pY0ludGVnZXIgdmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgICAgICAgICBAT3ZlcnJpZGUgdm9pZCB0aW1lQ3JlYXRlKGludCByZXBzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcig1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUgdm9pZCB0aW1lSW5jcmVtZW50KGludCByZXBzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlIGludCB0aW1lR2V0KGludCByZXBzKSB7CisgICAgICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgYWJzdHJhY3Qgdm9pZCB0aW1lQ3JlYXRlKGludCByZXBzKTsKKyAgICAgICAgYWJzdHJhY3Qgdm9pZCB0aW1lSW5jcmVtZW50KGludCByZXBzKTsKKyAgICAgICAgYWJzdHJhY3QgaW50IHRpbWVHZXQoaW50IHJlcHMpOworICAgIH0KKworICAgIEBQYXJhbSBLaW5kIGtpbmQ7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ3JlYXRlKGludCByZXBzKSB7CisgICAgICAgIGtpbmQudGltZUNyZWF0ZShyZXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lSW5jcmVtZW50KGludCByZXBzKSB7CisgICAgICAgIGtpbmQudGltZUluY3JlbWVudChyZXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0KGludCByZXBzKSB7CisgICAgICAgIGtpbmQudGltZUdldChyZXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFJ1bm5lci5tYWluKE11dGFibGVJbnRCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9OYXRpdmVNZXRob2RCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9OYXRpdmVNZXRob2RCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQ4MmVmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL05hdGl2ZU1ldGhvZEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLk5hdGl2ZVRlc3RUYXJnZXQ7CisKK3B1YmxpYyBjbGFzcyBOYXRpdmVNZXRob2RCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyB2b2lkIHRpbWVfZW1wdHlKbmlTdGF0aWNTeW5jaHJvbml6ZWRNZXRob2QwKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIE5hdGl2ZVRlc3RUYXJnZXQuZW1wdHlKbmlTdGF0aWNTeW5jaHJvbml6ZWRNZXRob2QwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX2VtcHR5Sm5pU3luY2hyb25pemVkTWV0aG9kMChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE5hdGl2ZVRlc3RUYXJnZXQgbiA9IG5ldyBOYXRpdmVUZXN0VGFyZ2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBuLmVtcHR5Sm5pU3luY2hyb25pemVkTWV0aG9kMCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9lbXB0eUpuaVN0YXRpY01ldGhvZDAoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgTmF0aXZlVGVzdFRhcmdldC5lbXB0eUpuaVN0YXRpY01ldGhvZDAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfZW1wdHlKbmlNZXRob2QwKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTmF0aXZlVGVzdFRhcmdldCBuID0gbmV3IE5hdGl2ZVRlc3RUYXJnZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIG4uZW1wdHlKbmlNZXRob2QwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX2VtcHR5Sm5pU3RhdGljTWV0aG9kNihpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBhID0gLTE7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIE5hdGl2ZVRlc3RUYXJnZXQuZW1wdHlKbmlTdGF0aWNNZXRob2Q2KGEsIGIsIDEsIDIsIDMsIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZV9lbXB0eUpuaU1ldGhvZDYoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgYSA9IC0xOworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIE5hdGl2ZVRlc3RUYXJnZXQgbiA9IG5ldyBOYXRpdmVUZXN0VGFyZ2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBuLmVtcHR5Sm5pTWV0aG9kNihhLCBiLCAxLCAyLCAzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVfZW1wdHlKbmlTdGF0aWNNZXRob2Q2TChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBOYXRpdmVUZXN0VGFyZ2V0LmVtcHR5Sm5pU3RhdGljTWV0aG9kNkwobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lX2VtcHR5Sm5pTWV0aG9kNkwoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBOYXRpdmVUZXN0VGFyZ2V0IG4gPSBuZXcgTmF0aXZlVGVzdFRhcmdldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbi5lbXB0eUpuaU1ldGhvZDZMKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUGFyc2VCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9QYXJzZUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGI0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUGFyc2VCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CisKKy8qKgorICogTWVhc3VyZSB0aHJvdWdocHV0IG9mIHZhcmlvdXMgcGFyc2Vycy4KKyAqCisgKiA8cD5UaGlzIGJlbmNobWFyayByZXF1aXJlcyB0aGF0IFBhcnNlQmVuY2htYXJrRGF0YS56aXAgaXMgb24gdGhlIGNsYXNzcGF0aC4KKyAqIFRoYXQgZmlsZSBjb250YWlucyBUd2l0dGVyIGZlZWQgZGF0YSwgd2hpY2ggaXMgcmVwcmVzZW50YXRpdmUgb2Ygd2hhdAorICogYXBwbGljYXRpb25zIHdpbGwgYmUgcGFyc2luZy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcnNlQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIEBQYXJhbSBEb2N1bWVudCBkb2N1bWVudDsKKyAgICBAUGFyYW0gQXBpIGFwaTsKKworICAgIHByaXZhdGUgZW51bSBEb2N1bWVudCB7CisgICAgICAgIFRXRUVUUywKKyAgICAgICAgUkVBREVSX1NIT1JULAorICAgICAgICBSRUFERVJfTE9ORworICAgIH0KKworICAgIHByaXZhdGUgZW51bSBBcGkgeworICAgICAgICBBTkRST0lEX1NUUkVBTSgianNvbiIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBQYXJzZXIgbmV3UGFyc2VyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZFN0cmVhbVBhcnNlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBPUkdfSlNPTigianNvbiIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBQYXJzZXIgbmV3UGFyc2VyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3JnSnNvblBhcnNlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBYTUxfUFVMTCgieG1sIikgeworICAgICAgICAgICAgQE92ZXJyaWRlIFBhcnNlciBuZXdQYXJzZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmFsWG1sUHVsbFBhcnNlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBYTUxfRE9NKCJ4bWwiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgUGFyc2VyIG5ld1BhcnNlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbERvbVBhcnNlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBYTUxfU0FYKCJ4bWwiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgUGFyc2VyIG5ld1BhcnNlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNheFBhcnNlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHRlbnNpb247CisKKyAgICAgICAgcHJpdmF0ZSBBcGkoU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBleHRlbnNpb247CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBQYXJzZXIgbmV3UGFyc2VyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKyAgICBwcml2YXRlIFBhcnNlciBwYXJzZXI7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGV4dCA9IHJlc291cmNlVG9TdHJpbmcoIi8iICsgZG9jdW1lbnQubmFtZSgpICsgIi4iICsgYXBpLmV4dGVuc2lvbik7CisgICAgICAgIHBhcnNlciA9IGFwaS5uZXdQYXJzZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUGFyc2UoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW5uZXIubWFpbihQYXJzZUJlbmNobWFyay5jbGFzcywgYXJncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc291cmNlVG9TdHJpbmcoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IFBhcnNlQmVuY2htYXJrLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBzdWNoIGZpbGU6ICIgKyBwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpOworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgd2hpbGUgKChjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUGFyc2VyIHsKKyAgICAgICAgdm9pZCBwYXJzZShTdHJpbmcgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbmRyb2lkU3RyZWFtUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Kc29uUmVhZGVyIGpzb25SZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgPSBuZXcgYW5kcm9pZC51dGlsLkpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihkYXRhKSk7CisgICAgICAgICAgICByZWFkVG9rZW4oanNvblJlYWRlcik7CisgICAgICAgICAgICBqc29uUmVhZGVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0KGFuZHJvaWQudXRpbC5Kc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgICAgICByZWFkVG9rZW4ocmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRBcnJheShhbmRyb2lkLnV0aWwuSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZWFkVG9rZW4ocmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRUb2tlbihhbmRyb2lkLnV0aWwuSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlYWRlci5wZWVrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQkVHSU5fQVJSQVk6CisgICAgICAgICAgICAgICAgcmVhZEFycmF5KHJlYWRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJFR0lOX09CSkVDVDoKKyAgICAgICAgICAgICAgICByZWFkT2JqZWN0KHJlYWRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgICAgICAgICByZWFkZXIubmV4dExvbmcoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdG9rZW4iICsgcmVhZGVyLnBlZWsoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPcmdKc29uUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChkYXRhLnN0YXJ0c1dpdGgoIlsiKSkgeworICAgICAgICAgICAgICAgIG5ldyBKU09OQXJyYXkoZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc3RhcnRzV2l0aCgieyIpKSB7CisgICAgICAgICAgICAgICAgbmV3IEpTT05PYmplY3QoZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyYWxYbWxQdWxsUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgeG1sUGFyc2VyID0gYW5kcm9pZC51dGlsLlhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgICAgICB4bWxQYXJzZXIuc2V0SW5wdXQobmV3IFN0cmluZ1JlYWRlcihkYXRhKSk7CisgICAgICAgICAgICB4bWxQYXJzZXIubmV4dFRhZygpOworICAgICAgICAgICAgd2hpbGUgKHhtbFBhcnNlci5uZXh0KCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICB4bWxQYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHhtbFBhcnNlci5nZXRUZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxEb21QYXJzZXIgaW1wbGVtZW50cyBQYXJzZXIgeworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkYXRhKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sU2F4UGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZGF0YSkpLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUGFyc2VCZW5jaG1hcmtEYXRhLnppcCBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9QYXJzZUJlbmNobWFya0RhdGEuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzhlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUGFyc2VCZW5jaG1hcmtEYXRhLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUHJpb3JpdHlRdWV1ZUJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1ByaW9yaXR5UXVldWVCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU2NjFiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1ByaW9yaXR5UXVldWVCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK3B1YmxpYyBjbGFzcyBQcmlvcml0eVF1ZXVlQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBAUGFyYW0oeyIxMDAiLCAiMTAwMCIsICIxMDAwMCJ9KSBwcml2YXRlIGludCBxdWV1ZVNpemU7CisgICAgQFBhcmFtKHsiMCIsICIyNSIsICI1MCIsICI3NSIsICIxMDAifSkgcHJpdmF0ZSBpbnQgaGl0UmF0ZTsKKworICAgIHByaXZhdGUgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPiBwcTsKKyAgICBwcml2YXRlIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gdXNlcHE7CisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IHNlZWtFbGVtZW50czsKKyAgICBwcml2YXRlIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKDE4OTI3OTM4N0wpOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBxID0gbmV3IFByaW9yaXR5UXVldWU8SW50ZWdlcj4oKTsKKyAgICAgICAgdXNlcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZTxJbnRlZ2VyPigpOworICAgICAgICBzZWVrRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGludCBudW1TaGFyZWQgPSAoaW50KShxdWV1ZVNpemUgKiAoKGRvdWJsZSloaXRSYXRlIC8gMTAwKSk7CisgICAgICAgIC8vIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgd2UgcmVxdWlyZSB0byBlbmdpbmVlciBhIGhpdCByYXRlIG9mIGhpdFJhdGUlCisgICAgICAgIGludCB0b3RhbEVsZW1lbnRzID0gMiAqIHF1ZXVlU2l6ZSAtIG51bVNoYXJlZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIGFsbEVsZW1lbnRzLmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaHVmZmxlIHRoZXNlIGVsZW1lbnRzIHNvIHRoYXQgd2UgZ2V0IGEgcmVhc29uYWJsZSBkaXN0cmlidXRpb24gb2YgbWlzc2VkIGVsZW1lbnRzCisgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUoYWxsRWxlbWVudHMsIHJhbmRvbSk7CisgICAgICAgIC8vIGFkZCBzaGFyZWQgZWxlbWVudHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaGFyZWQ7IGkrKykgeworICAgICAgICAgICAgcHEuYWRkKGFsbEVsZW1lbnRzLmdldChpKSk7CisgICAgICAgICAgICBzZWVrRWxlbWVudHMuYWRkKGFsbEVsZW1lbnRzLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIHByaW9yaXR5IHF1ZXVlIG9ubHkgZWxlbWVudHMgKHRoZXNlIHdvbid0IGJlIHRvdWNoZWQpCisgICAgICAgIGZvciAoaW50IGkgPSBudW1TaGFyZWQ7IGkgPCBxdWV1ZVNpemU7IGkrKykgeworICAgICAgICAgICAgcHEuYWRkKGFsbEVsZW1lbnRzLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIG5vbi1wcmlvcml0eSBxdWV1ZSBlbGVtZW50cyAodGhlc2Ugd2lsbCBiZSBtaXNzZXMpCisgICAgICAgIGZvciAoaW50IGkgPSBxdWV1ZVNpemU7IGkgPCB0b3RhbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHNlZWtFbGVtZW50cy5hZGQoYWxsRWxlbWVudHMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICB1c2VwcSA9IG5ldyBQcmlvcml0eVF1ZXVlPEludGVnZXI+KHBxKTsKKyAgICAgICAgLy8gc2h1ZmZsZSBhZ2FpbiBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhY2Nlc3NlZCBpbiBhIGRpZmZlcmVudCBwYXR0ZXJuIHRoYW4gdGhleSB3ZXJlCisgICAgICAgIC8vIGluc2VydGVkCisgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUoc2Vla0VsZW1lbnRzLCByYW5kb20pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRpbWVSZW1vdmUoaW50IHJlcHMpIHsKKyAgICAgICAgYm9vbGVhbiBkdW1teSA9IGZhbHNlOworICAgICAgICBpbnQgZWxlbWVudHNTaXplID0gc2Vla0VsZW1lbnRzLnNpemUoKTsKKyAgICAgICAgLy8gQXQgbW9zdCBhbGxvdyB0aGUgcXVldWUgdG8gZW1wdHkgMTAlLgorICAgICAgICBpbnQgcmVzaXppbmdUaHJlc2hvbGQgPSBxdWV1ZVNpemUgLyAxMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIFJlc2V0IHF1ZXVlIGV2ZXJ5IHNvIG9mdGVuLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG1vcmUgb2Z0ZW4gZm9yIHNtYWxsZXIKKyAgICAgICAgICAgIC8vIHF1ZXVlU2l6ZXMsIGJ1dCBzaW5jZSBhIGNvcHkgaXMgbGluZWFyLCBpdCB3aWxsIGFsc28gY29zdCBwcm9wb3J0aW9uYWxseQorICAgICAgICAgICAgLy8gbGVzcywgYW5kIGhvcGVmdWxseSBpdCB3aWxsIGFwcHJveGltYXRlbHkgYmFsYW5jZSBvdXQuCisgICAgICAgICAgICBpZiAoaSAlIHJlc2l6aW5nVGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgICAgICB1c2VwcSA9IG5ldyBQcmlvcml0eVF1ZXVlPEludGVnZXI+KHBxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bW15ID0gdXNlcHEucmVtb3ZlKHNlZWtFbGVtZW50cy5nZXQoaSAlIGVsZW1lbnRzU2l6ZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkdW1teTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUHJvcGVydHlBY2Nlc3NCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9Qcm9wZXJ0eUFjY2Vzc0JlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmQ2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUHJvcGVydHlBY2Nlc3NCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUFjY2Vzc0JlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHJpdmF0ZSBWaWV3IHZpZXcgPSBuZXcgVmlldygpOworICAgIHByaXZhdGUgTWV0aG9kIHNldFg7CisgICAgcHJpdmF0ZSBHZW5lcmF0ZWRQcm9wZXJ0eSBnZW5lcmF0ZWRTZXR0ZXIgPSBuZXcgR2VuZXJhdGVkU2V0dGVyKCk7CisgICAgcHJpdmF0ZSBHZW5lcmF0ZWRQcm9wZXJ0eSBnZW5lcmF0ZWRGaWVsZCA9IG5ldyBHZW5lcmF0ZWRGaWVsZCgpOworICAgIHByaXZhdGUgRmllbGQgeDsKKyAgICBwcml2YXRlIE9iamVjdFtdIGFyZ3NCb3ggPSBuZXcgT2JqZWN0WzFdOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFggPSBWaWV3LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRYIiwgZmxvYXQuY2xhc3MpOworICAgICAgICB4ID0gVmlldy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJ4Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURpcmVjdFNldHRlcihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgdmlldy5zZXRYKDAuMWYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURpcmVjdEZpZWxkU2V0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICB2aWV3LnggPSAwLjFmOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURpcmVjdFNldHRlckFuZEJveGluZyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRmxvYXQgdmFsdWUgPSAwLjFmOworICAgICAgICAgICAgdmlldy5zZXRYKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVEaXJlY3RGaWVsZFNldEFuZEJveGluZyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgRmxvYXQgdmFsdWUgPSAwLjFmOworICAgICAgICAgICAgdmlldy54ID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVmbGVjdGlvblNldHRlckFuZFR3b0JveGVzKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIHNldFguaW52b2tlKHZpZXcsIDAuMWYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJlZmxlY3Rpb25TZXR0ZXJBbmRPbmVCb3goaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgYXJnc0JveFswXSA9IDAuMWY7CisgICAgICAgICAgICBzZXRYLmludm9rZSh2aWV3LCBhcmdzQm94KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWZsZWN0aW9uRmllbGRTZXQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgeC5zZXRGbG9hdCh2aWV3LCAwLjFmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZW5lcmF0ZWRTZXR0ZXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgZ2VuZXJhdGVkU2V0dGVyLnNldEZsb2F0KHZpZXcsIDAuMWYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUdlbmVyYXRlZEZpZWxkU2V0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIGdlbmVyYXRlZEZpZWxkLnNldEZsb2F0KHZpZXcsIDAuMWYpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFZpZXcgeworICAgICAgICBmbG9hdCB4OworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFgoZmxvYXQgeCkgeworICAgICAgICAgICAgdGhpcy54ID0geDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBpbnRlcmZhY2UgR2VuZXJhdGVkUHJvcGVydHkgeworICAgICAgICB2b2lkIHNldEZsb2F0KFZpZXcgdiwgZmxvYXQgZik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEdlbmVyYXRlZFNldHRlciBpbXBsZW1lbnRzIEdlbmVyYXRlZFByb3BlcnR5IHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoVmlldyB2LCBmbG9hdCBmKSB7CisgICAgICAgICAgICB2LnNldFgoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgR2VuZXJhdGVkRmllbGQgaW1wbGVtZW50cyBHZW5lcmF0ZWRQcm9wZXJ0eSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0KFZpZXcgdiwgZmxvYXQgZikgeworICAgICAgICAgICAgdi54ID0gZjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9SYW5kb21CZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9SYW5kb21CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkyODA1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1JhbmRvbUJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworcHVibGljIGNsYXNzIFJhbmRvbUJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHVibGljIHZvaWQgdGltZU5ld1JhbmRvbShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBSYW5kb20gcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgcm5nLm5leHRJbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZXVzZWRSYW5kb20oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSYW5kb20gcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcm5nLm5leHRJbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZXVzZWRTZWN1cmVSYW5kb20oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWN1cmVSYW5kb20gcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcm5nLm5leHRJbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVOZXdTZWN1cmVSYW5kb20oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJuZyA9IG5ldyBTZWN1cmVSYW5kb20oKTsKKyAgICAgICAgICAgIHJuZy5uZXh0SW50KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUmVhbFRvU3RyaW5nQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vUmVhbFRvU3RyaW5nQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxNGNmNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9SZWFsVG9TdHJpbmdCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgUmVhbFRvU3RyaW5nQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFNNQUxMICA9IC0xMjMuNDVmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1FRElVTSA9IC0xMjMuNDVlOGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTEFSR0UgID0gLTEyMy40NWUzNmY7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRmxvYXRfdG9TdHJpbmdfTmFOKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBGbG9hdC50b1N0cmluZyhGbG9hdC5OYU4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZsb2F0X3RvU3RyaW5nX05FR0FUSVZFX0lORklOSVRZKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBGbG9hdC50b1N0cmluZyhGbG9hdC5ORUdBVElWRV9JTkZJTklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRmxvYXRfdG9TdHJpbmdfUE9TSVRJVkVfSU5GSU5JVFkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEZsb2F0LnRvU3RyaW5nKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdF90b1N0cmluZ196ZXJvKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBGbG9hdC50b1N0cmluZygwLjBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdF90b1N0cmluZ19taW51c1plcm8oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIEZsb2F0LnRvU3RyaW5nKC0wLjBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdF90b1N0cmluZ19zbWFsbChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgRmxvYXQudG9TdHJpbmcoU01BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZsb2F0X3RvU3RyaW5nX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgRmxvYXQudG9TdHJpbmcoTUVESVVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9hdF90b1N0cmluZ19sYXJnZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgRmxvYXQudG9TdHJpbmcoTEFSR0UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ0J1aWxkZXJfc21hbGwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKFNNQUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTdHJpbmdCdWlsZGVyX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoTUVESVVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTdHJpbmdCdWlsZGVyX2xhcmdlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZChMQVJHRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX3NtYWxsKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZiIsIFNNQUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGb3JtYXR0ZXJfbWVkaXVtKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZiIsIE1FRElVTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX2xhcmdlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZiIsIExBUkdFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGb3JtYXR0ZXJfZG90MmZfc21hbGwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiUuMmYiLCBTTUFMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX2RvdDJmX21lZGl1bShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJS4yZiIsIE1FRElVTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX2RvdDJmX2xhcmdlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlLjJmIiwgTEFSR0UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1JlZmxlY3Rpb25CZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9SZWZsZWN0aW9uQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMGZhMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9SZWZsZWN0aW9uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHVibGljIHZvaWQgdGltZU9iamVjdF9nZXRDbGFzcyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEMgYyA9IG5ldyBDKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjLmdldENsYXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2xhc3NfZ2V0RmllbGQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBrbGFzcy5nZXRGaWVsZCgiZiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsYXNzX2dldERlY2xhcmVkRmllbGQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBrbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2xhc3NfZ2V0Q29uc3RydWN0b3IoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBrbGFzcy5nZXRDb25zdHJ1Y3RvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsYXNzX25ld0luc3RhbmNlKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBDLmNsYXNzOworICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGtsYXNzLmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsYXNzX2dldE1ldGhvZChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzPD8+IGtsYXNzID0gQy5jbGFzczsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIGtsYXNzLmdldE1ldGhvZCgibSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNsYXNzX2dldERlY2xhcmVkTWV0aG9kKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBDLmNsYXNzOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAga2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGaWVsZF9zZXRJbnQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIEZpZWxkIGYgPSBrbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmIik7CisgICAgICAgIEMgaW5zdGFuY2UgPSBuZXcgQygpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgZi5zZXRJbnQoaW5zdGFuY2UsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUZpZWxkX2dldEludChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzPD8+IGtsYXNzID0gQy5jbGFzczsKKyAgICAgICAgRmllbGQgZiA9IGtsYXNzLmdldERlY2xhcmVkRmllbGQoImYiKTsKKyAgICAgICAgQyBpbnN0YW5jZSA9IG5ldyBDKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBmLmdldEludChpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWV0aG9kX2ludm9rZVYoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIE1ldGhvZCBtID0ga2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm0iKTsKKyAgICAgICAgQyBpbnN0YW5jZSA9IG5ldyBDKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBtLmludm9rZShpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWV0aG9kX2ludm9rZVN0YXRpY1YoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBrbGFzcyA9IEMuY2xhc3M7CisgICAgICAgIE1ldGhvZCBtID0ga2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNtIik7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBtLmludm9rZShudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVNZXRob2RfaW52b2tlSShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzPD8+IGtsYXNzID0gQy5jbGFzczsKKyAgICAgICAgTWV0aG9kIG0gPSBrbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgic2V0RmllbGQiLCBpbnQuY2xhc3MpOworICAgICAgICBDIGluc3RhbmNlID0gbmV3IEMoKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIG0uaW52b2tlKGluc3RhbmNlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVNZXRob2RfaW52b2tlUHJlQm94ZWRJKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBDLmNsYXNzOworICAgICAgICBNZXRob2QgbSA9IGtsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRGaWVsZCIsIGludC5jbGFzcyk7CisgICAgICAgIEMgaW5zdGFuY2UgPSBuZXcgQygpOworICAgICAgICBJbnRlZ2VyIG9uZSA9IEludGVnZXIudmFsdWVPZigxKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIG0uaW52b2tlKGluc3RhbmNlLCBvbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1ldGhvZF9pbnZva2VTdGF0aWNJKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBDLmNsYXNzOworICAgICAgICBNZXRob2QgbSA9IGtsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRTdGF0aWNGaWVsZCIsIGludC5jbGFzcyk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBtLmludm9rZShudWxsLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVNZXRob2RfaW52b2tlU3RhdGljUHJlQm94ZWRJKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBDLmNsYXNzOworICAgICAgICBNZXRob2QgbSA9IGtsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRTdGF0aWNGaWVsZCIsIGludC5jbGFzcyk7CisgICAgICAgIEludGVnZXIgb25lID0gSW50ZWdlci52YWx1ZU9mKDEpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgbS5pbnZva2UobnVsbCwgb25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWd1bGFyTWV0aG9kSW52b2NhdGlvbihpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEMgaW5zdGFuY2UgPSBuZXcgQygpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgaW5zdGFuY2Uuc2V0RmllbGQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVndWxhckNvbnN0cnVjdG9yKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIG5ldyBDKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEMgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBzZiA9IDA7CisgICAgICAgIHB1YmxpYyBpbnQgZiA9IDA7CisKKyAgICAgICAgcHVibGljIEMoKSB7CisgICAgICAgICAgICAvLyBBIG5vbi1lbXB0eSBjb25zdHJ1Y3RvciBzbyB3ZSBkb24ndCBnZXQgb3B0aW1pemVkIGF3YXkuCisgICAgICAgICAgICBmID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG0oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc20oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZChpbnQgdmFsdWUpIHsKKyAgICAgICAgICAgIGYgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZChpbnQgdmFsdWUpIHsKKyAgICAgICAgICAgIHNmID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU1NMU29ja2V0QmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU1NMU29ja2V0QmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TU0xTb2NrZXRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5uZXQuU29ja2V0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBTU0xTb2NrZXRCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKworICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisKKyAgICBAUGFyYW0gcHJpdmF0ZSBXZWJTaXRlIHdlYlNpdGU7CisKKyAgICBwdWJsaWMgZW51bSBXZWJTaXRlIHsKKyAgICAgICAgRE9DUygiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20iKSwKKyAgICAgICAgTUFJTCgiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20iKSwKKyAgICAgICAgU0lURVMoImh0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbSIpLAorICAgICAgICBXV1coImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20iKTsKKyAgICAgICAgZmluYWwgSW5ldEFkZHJlc3MgaG9zdDsKKyAgICAgICAgZmluYWwgaW50IHBvcnQ7CisgICAgICAgIGZpbmFsIGJ5dGVbXSByZXF1ZXN0OworICAgICAgICBXZWJTaXRlKFN0cmluZyB1cmkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKKworICAgICAgICAgICAgICAgIHRoaXMuaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSh1cmwuZ2V0SG9zdCgpKTsKKworICAgICAgICAgICAgICAgIGludCBwID0gdXJsLmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFN0cmluZzsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSA0NDM7CisgICAgICAgICAgICAgICAgICAgIHBvcnRTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSBwOworICAgICAgICAgICAgICAgICAgICBwb3J0U3RyaW5nID0gIjoiICsgcG9ydDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSAoIkdFVCAiICsgdXJpICsgIiBIVFRQLzEuMFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkhvc3Q6ICIgKyBob3N0ICsgcG9ydFN0cmluZyArICJcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIlxyXG4iKS5nZXRCeXRlcygpOworCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGFyYW0gcHJpdmF0ZSBJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRhdGlvbjsKKworICAgIHB1YmxpYyBlbnVtIEltcGxlbWVudGF0aW9uIHsgT1BFTlNTTCwgSEFSTU9OWSB9OworCisgICAgcHJpdmF0ZSBTb2NrZXRGYWN0b3J5IHNmOworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNTTENvbnRleHQgc3NsQ29udGV4dDsKKyAgICAgICAgc3dpdGNoIChpbXBsZW1lbnRhdGlvbikgeworICAgICAgICAgICAgY2FzZSBPUEVOU1NMOgorICAgICAgICAgICAgICAgIHNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJTU0wiLCAiQW5kcm9pZE9wZW5TU0wiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFSTU9OWToKKyAgICAgICAgICAgICAgICBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiU1NMIiwgIkhhcm1vbnlKU1NFIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGltcGxlbWVudGF0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHNzbENvbnRleHQuaW5pdChudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGhpcy5zZiA9IHNzbENvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU29ja2V0IHMgPSBzZi5jcmVhdGVTb2NrZXQod2ViU2l0ZS5ob3N0LCB3ZWJTaXRlLnBvcnQpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvdXQud3JpdGUod2ViU2l0ZS5yZXF1ZXN0KTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gcy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGluLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1NjaGVtZVByZWZpeEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1NjaGVtZVByZWZpeEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MGZlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU2NoZW1lUHJlZml4QmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitwdWJsaWMgZmluYWwgY2xhc3MgU2NoZW1lUHJlZml4QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIGVudW0gU3RyYXRlZ3kgeworICAgICAgICBKQVZBKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIFN0cmluZyBleGVjdXRlKFN0cmluZyBzcGVjKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gc3BlYy5pbmRleE9mKCc6Jyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29sb24gPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sb247IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBzcGVjLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkU2NoZW1lQ2hhcihpLCBjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYy5zdWJzdHJpbmcoMCwgY29sb24pLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2NoZW1lQ2hhcihpbnQgaW5kZXgsIGNoYXIgYykgeworICAgICAgICAgICAgICAgIGlmICgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgKChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnKycgfHwgYyA9PSAnLScgfHwgYyA9PSAnLicpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgUkVHRVgoKSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXihbYS16QS1aXVthLXpBLVowLTkrXFwtLl0qKToiKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlIFN0cmluZyBleGVjdXRlKFN0cmluZyBzcGVjKSB7CisgICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHNwZWMpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCisgICAgICAgIGFic3RyYWN0IFN0cmluZyBleGVjdXRlKFN0cmluZyBzcGVjKTsKKyAgICB9CisKKyAgICBAUGFyYW0gU3RyYXRlZ3kgc3RyYXRlZ3k7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2NoZW1lUHJlZml4KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBzdHJhdGVneS5leGVjdXRlKCJodHRwOi8vYW5kcm9pZC5jb20iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9TZXJpYWxpemF0aW9uQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU2VyaWFsaXphdGlvbkJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTU4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU2VyaWFsaXphdGlvbkJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gYnl0ZXMoT2JqZWN0IG8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICBvdXQud3JpdGVPYmplY3Qobyk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkSW50QXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBpbnRBcnJheSA9IG5ldyBpbnRbMjU2XTsKKyAgICAgICAgcmVhZFNpbmdsZU9iamVjdChyZXBzLCBpbnRBcnJheSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVdyaXRlSW50QXJyYXkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBpbnRBcnJheSA9IG5ldyBpbnRbMjU2XTsKKyAgICAgICAgd3JpdGVTaW5nbGVPYmplY3QocmVwcywgaW50QXJyYXkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVhZEFycmF5TGlzdEludGVnZXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gb2JqZWN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgICAgICBvYmplY3QuYWRkKGkpOworICAgICAgICB9CisgICAgICAgIHJlYWRTaW5nbGVPYmplY3QocmVwcywgb2JqZWN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVBcnJheUxpc3RJbnRlZ2VyKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IG9iamVjdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgICAgb2JqZWN0LmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCBvYmplY3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkU3RyaW5nKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZFNpbmdsZU9iamVjdChyZXBzLCAiaGVsbG8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVhZE9iamVjdFN0cmVhbUNsYXNzKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQSBzcGVjaWFsIGNhc2UgYmVjYXVzZSBzZXJpYWxpemF0aW9uIGl0c2VsZiByZXF1aXJlcyB0aGlzIGNsYXNzLgorICAgICAgICAvLyAoVGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgdW5pdCB0ZXN0LikKKyAgICAgICAgT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwKFN0cmluZy5jbGFzcyk7CisgICAgICAgIHJlYWRTaW5nbGVPYmplY3QocmVwcywgb3NjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVTdHJpbmcoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBhdm9pZHMgSk5JLgorICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCAiaGVsbG8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVPYmplY3RTdHJlYW1DbGFzcyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEEgc3BlY2lhbCBjYXNlIGJlY2F1c2Ugc2VyaWFsaXphdGlvbiBpdHNlbGYgcmVxdWlyZXMgdGhpcyBjbGFzcy4KKyAgICAgICAgLy8gKFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHVuaXQgdGVzdC4pCisgICAgICAgIE9iamVjdFN0cmVhbUNsYXNzIG9zYyA9IE9iamVjdFN0cmVhbUNsYXNzLmxvb2t1cChTdHJpbmcuY2xhc3MpOworICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCBvc2MpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYSBiYXNlbGluZSBmb3IgdGhlIG90aGVycy4KKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVOb09iamVjdHMoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgb3V0LnJlc2V0KCk7CisgICAgICAgICAgICBiYW9zLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRTaW5nbGVPYmplY3QoaW50IHJlcHMsIE9iamVjdCBvYmplY3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBieXRlcyhvYmplY3QpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgICAgICAgICAgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIGJhaXMucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZVNpbmdsZU9iamVjdChpbnQgcmVwcywgT2JqZWN0IG8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG8pOworICAgICAgICAgICAgb3V0LnJlc2V0KCk7CisgICAgICAgICAgICBiYW9zLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVdyaXRlRXZlcnlLaW5kT2ZGaWVsZChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBMaXR0bGVCaXRPZkV2ZXJ5dGhpbmcoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZVNlcmlhbGl6YWJsZUJvb2xlYW4oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlQm9vbGVhbigpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVdyaXRlU2VyaWFsaXphYmxlQnl0ZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVCeXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVTZXJpYWxpemFibGVDaGFyKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTaW5nbGVPYmplY3QocmVwcywgbmV3IFNlcmlhbGl6YWJsZUNoYXIoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZVNlcmlhbGl6YWJsZURvdWJsZShpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVEb3VibGUoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZVNlcmlhbGl6YWJsZUZsb2F0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTaW5nbGVPYmplY3QocmVwcywgbmV3IFNlcmlhbGl6YWJsZUZsb2F0KCkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVTZXJpYWxpemFibGVJbnQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlSW50KCkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVTZXJpYWxpemFibGVMb25nKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTaW5nbGVPYmplY3QocmVwcywgbmV3IFNlcmlhbGl6YWJsZUxvbmcoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZVNlcmlhbGl6YWJsZVNob3J0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTaW5nbGVPYmplY3QocmVwcywgbmV3IFNlcmlhbGl6YWJsZVNob3J0KCkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVTZXJpYWxpemFibGVSZWZlcmVuY2UoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3cml0ZVNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlUmVmZXJlbmNlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkRXZlcnlLaW5kT2ZGaWVsZChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRTaW5nbGVPYmplY3QocmVwcywgbmV3IExpdHRsZUJpdE9mRXZlcnl0aGluZygpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVCb29sZWFuKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZFNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlQm9vbGVhbigpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVCeXRlKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZFNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlQnl0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVDaGFyKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZFNpbmdsZU9iamVjdChyZXBzLCBuZXcgU2VyaWFsaXphYmxlQ2hhcigpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVEb3VibGUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWFkU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVEb3VibGUoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkU2VyaWFsaXphYmxlRmxvYXQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWFkU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVGbG9hdCgpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVJbnQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWFkU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVJbnQoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkU2VyaWFsaXphYmxlTG9uZyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRTaW5nbGVPYmplY3QocmVwcywgbmV3IFNlcmlhbGl6YWJsZUxvbmcoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkU2VyaWFsaXphYmxlU2hvcnQoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWFkU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVTaG9ydCgpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGltZVJlYWRTZXJpYWxpemFibGVSZWZlcmVuY2UoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZWFkU2luZ2xlT2JqZWN0KHJlcHMsIG5ldyBTZXJpYWxpemFibGVSZWZlcmVuY2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJpYWxpemFibGVCb29sZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgYm9vbGVhbiB6OworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6YWJsZUJ5dGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBieXRlIGI7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXphYmxlQ2hhciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIGNoYXIgYzsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJpYWxpemFibGVEb3VibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBkb3VibGUgZDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJpYWxpemFibGVGbG9hdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIGZsb2F0IGY7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXphYmxlSW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IGk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXphYmxlTG9uZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIGxvbmcgajsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJpYWxpemFibGVTaG9ydCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHNob3J0IHM7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXphYmxlUmVmZXJlbmNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgT2JqZWN0IGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXR0bGVCaXRPZkV2ZXJ5dGhpbmcgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBib29sZWFuIHo7CisgICAgICAgIGJ5dGUgYjsKKyAgICAgICAgY2hhciBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGxvbmcgajsKKyAgICAgICAgc2hvcnQgczsKKyAgICAgICAgT2JqZWN0IGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1NpZ25hdHVyZUJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1NpZ25hdHVyZUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4M2RjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU2lnbmF0dXJlQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTaWduYXR1cmU7CisKKy8qKgorICogVGVzdHMgUlNBIGFuZCBEU0Egc2lnbmF0dXJlIGNyZWF0aW9uIGFuZCB2ZXJpZmljYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTaWduYXR1cmVCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFfU0laRSA9IDgxOTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERBVEEgPSBuZXcgYnl0ZVtEQVRBX1NJWkVdOworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREFUQV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIERBVEFbaV0gPSAoYnl0ZSlpOworICAgICAgICB9CisgICAgfQorICAgIEBQYXJhbSBwcml2YXRlIEFsZ29yaXRobSBhbGdvcml0aG07CisKKyAgICBwdWJsaWMgZW51bSBBbGdvcml0aG0geworICAgICAgICBNRDVXaXRoUlNBLAorICAgICAgICBTSEExV2l0aFJTQSwKKyAgICAgICAgU0hBMjU2V2l0aFJTQSwKKyAgICAgICAgU0hBMzg0V2l0aFJTQSwKKyAgICAgICAgU0hBNTEyV2l0aFJTQSwKKyAgICAgICAgU0hBMXdpdGhEU0EKKyAgICB9OworCisgICAgQFBhcmFtIHByaXZhdGUgSW1wbGVtZW50YXRpb24gaW1wbGVtZW50YXRpb247CisKKyAgICBwdWJsaWMgZW51bSBJbXBsZW1lbnRhdGlvbiB7IE9wZW5TU0wsIEJvdW5jeUNhc3RsZSB9OworCisgICAgLy8gS2V5IGdlbmVyYXRpb24gYW5kIHNpZ25pbmcgYXJlbid0IHBhcnQgb2YgdGhlIGJlbmNobWFyayBmb3IgdmVyaWZpY2F0aW9uCisgICAgLy8gc28gY2FjaGUgdGhlIHJlc3VsdHMKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLEtleVBhaXI+IEtFWV9QQUlSUyA9IG5ldyBIYXNoTWFwPFN0cmluZyxLZXlQYWlyPigpOworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsYnl0ZVtdPiBTSUdOQVRVUkVTID0gbmV3IEhhc2hNYXA8U3RyaW5nLGJ5dGVbXT4oKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHNpZ25hdHVyZUFsZ29yaXRobTsKKyAgICBwcml2YXRlIGJ5dGVbXSBzaWduYXR1cmU7CisgICAgcHJpdmF0ZSBQcml2YXRlS2V5IHByaXZhdGVLZXk7CisgICAgcHJpdmF0ZSBQdWJsaWNLZXkgcHVibGljS2V5OworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuc2lnbmF0dXJlQWxnb3JpdGhtID0gYWxnb3JpdGhtLnRvU3RyaW5nKCk7CisKKyAgICAgICAgU3RyaW5nIGtleUFsZ29yaXRobSA9IHNpZ25hdHVyZUFsZ29yaXRobS5zdWJzdHJpbmcoc2lnbmF0dXJlQWxnb3JpdGhtLmxlbmd0aCgpIC0gMyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFsZ29yaXRobS5sZW5ndGgoKSk7CisgICAgICAgIEtleVBhaXIga2V5UGFpciA9IEtFWV9QQUlSUy5nZXQoa2V5QWxnb3JpdGhtKTsKKyAgICAgICAgaWYgKGtleVBhaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBnZW5lcmF0b3IgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKGtleUFsZ29yaXRobSk7CisgICAgICAgICAgICBrZXlQYWlyID0gZ2VuZXJhdG9yLmdlbmVyYXRlS2V5UGFpcigpOworICAgICAgICAgICAgS0VZX1BBSVJTLnB1dChrZXlBbGdvcml0aG0sIGtleVBhaXIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJpdmF0ZUtleSA9IGtleVBhaXIuZ2V0UHJpdmF0ZSgpOworICAgICAgICB0aGlzLnB1YmxpY0tleSA9IGtleVBhaXIuZ2V0UHVibGljKCk7CisKKyAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBTSUdOQVRVUkVTLmdldChzaWduYXR1cmVBbGdvcml0aG0pOworICAgICAgICBpZiAodGhpcy5zaWduYXR1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgU2lnbmF0dXJlIHNpZ25lciA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShzaWduYXR1cmVBbGdvcml0aG0pOworICAgICAgICAgICAgc2lnbmVyLmluaXRTaWduKGtleVBhaXIuZ2V0UHJpdmF0ZSgpKTsKKyAgICAgICAgICAgIHNpZ25lci51cGRhdGUoREFUQSk7CisgICAgICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25lci5zaWduKCk7CisgICAgICAgICAgICBTSUdOQVRVUkVTLnB1dChzaWduYXR1cmVBbGdvcml0aG0sIHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2lnbihpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBTaWduYXR1cmUgc2lnbmVyOworICAgICAgICAgICAgc3dpdGNoIChpbXBsZW1lbnRhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgT3BlblNTTDoKKyAgICAgICAgICAgICAgICAgICAgc2lnbmVyID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKHNpZ25hdHVyZUFsZ29yaXRobSwgIkFuZHJvaWRPcGVuU1NMIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQm91bmN5Q2FzdGxlOgorICAgICAgICAgICAgICAgICAgICBzaWduZXIgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2Uoc2lnbmF0dXJlQWxnb3JpdGhtLCAiQkMiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW1wbGVtZW50YXRpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaWduZXIuaW5pdFNpZ24ocHJpdmF0ZUtleSk7CisgICAgICAgICAgICBzaWduZXIudXBkYXRlKERBVEEpOworICAgICAgICAgICAgc2lnbmVyLnNpZ24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVWZXJpZnkoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU2lnbmF0dXJlIHZlcmlmaWVyOworICAgICAgICAgICAgc3dpdGNoIChpbXBsZW1lbnRhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgT3BlblNTTDoKKyAgICAgICAgICAgICAgICAgICAgdmVyaWZpZXIgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2Uoc2lnbmF0dXJlQWxnb3JpdGhtLCAiQW5kcm9pZE9wZW5TU0wiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCb3VuY3lDYXN0bGU6CisgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVyID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKHNpZ25hdHVyZUFsZ29yaXRobSwgIkJDIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGltcGxlbWVudGF0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmVyaWZpZXIuaW5pdFZlcmlmeShwdWJsaWNLZXkpOworICAgICAgICAgICAgdmVyaWZpZXIudXBkYXRlKERBVEEpOworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaWN0TWF0aEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmljdE1hdGhCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGMwMzBhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmljdE1hdGhCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCisvKioKKyAqIE1hbnkgb2YgdGhlc2UgdGVzdHMgYXJlIGJvZ3VzIGluIHRoYXQgdGhlIGNvc3Qgd2lsbCB2YXJ5IHdpbGRseSBkZXBlbmRpbmcgb24gaW5wdXRzLgorICogRm9yIF9teV8gY3VycmVudCBwdXJwb3NlcywgdGhhdCdzIG9rYXkuIEJ1dCBiZXdhcmUhCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpY3RNYXRoQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBkID0gMS4yOworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgZiA9IDEuMmY7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaSA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGwgPSAxTDsKKworICAgIHB1YmxpYyB2b2lkIHRpbWVBYnNEKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmFicyhkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBYnNGKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmFicyhmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBYnNJKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmFicyhpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBYnNMKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmFicyhsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBY29zKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmFjb3MoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQXNpbihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5hc2luKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUF0YW4oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguYXRhbihkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBdGFuMihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5hdGFuMigzLCA0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDYnJ0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmNicnQoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ2VpbChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5jZWlsKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNvcHlTaWduRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5jb3B5U2lnbihkLCBkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDb3B5U2lnbkYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguY29weVNpZ24oZiwgZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ29zKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmNvcyhkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDb3NoKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmNvc2goZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRXhwKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmV4cChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVFeHBtMShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5leHBtMShkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVGbG9vcihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5mbG9vcihkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVHZXRFeHBvbmVudEQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguZ2V0RXhwb25lbnQoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0RXhwb25lbnRGKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmdldEV4cG9uZW50KGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUh5cG90KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmh5cG90KGQsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUlFRUVyZW1haW5kZXIoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguSUVFRXJlbWFpbmRlcihkLCBkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVMb2coaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubG9nKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUxvZzEwKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmxvZzEwKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUxvZzFwKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLmxvZzFwKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1heEQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWF4KGQsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1heEYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWF4KGYsIGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1heEkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWF4KGksIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1heEwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWF4KGwsIGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1pbkQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWluKGQsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1pbkYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWluKGYsIGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1pbkkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWluKGksIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU1pbkwoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubWluKGwsIGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU5leHRBZnRlckQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubmV4dEFmdGVyKGQsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU5leHRBZnRlckYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubmV4dEFmdGVyKGYsIGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU5leHRVcEQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubmV4dFVwKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZU5leHRVcEYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgubmV4dFVwKGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVBvdyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5wb3coZCwgZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmFuZG9tKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnJhbmRvbSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJpbnQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgucmludChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSb3VuZEQoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGgucm91bmQoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUm91bmRGKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnJvdW5kKGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVNjYWxiRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5zY2FsYihkLCA1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTY2FsYkYoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFN0cmljdE1hdGguc2NhbGIoZiwgNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2lnbnVtRChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5zaWdudW0oZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2lnbnVtRihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5zaWdudW0oZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU2luKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnNpbihkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVTaW5oKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnNpbmgoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3FydChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC5zcXJ0KGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRhbihpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC50YW4oZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVGFuaChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC50YW5oKGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRvRGVncmVlcyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgU3RyaWN0TWF0aC50b0RlZ3JlZXMoZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVG9SYWRpYW5zKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnRvUmFkaWFucyhkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVVbHBEKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnVscChkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVVbHBGKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBTdHJpY3RNYXRoLnVscChmKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDllZThiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIGVudW0gU3RyaW5nTGVuZ3RocyB7CisgICAgICAgIEVNUFRZKCIiKSwKKyAgICAgICAgU0hPUlQoInNob3J0IiksCisgICAgICAgIEVJR0hUWShtYWtlU3RyaW5nKDgwKSksCisgICAgICAgIEVJR0hUX0tJKG1ha2VTdHJpbmcoODE5MikpOworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nTGVuZ3RocyhTdHJpbmcgdmFsdWUpIHsgdGhpcy52YWx1ZSA9IHZhbHVlOyB9CisgICAgfQorICAgIEBQYXJhbSBwcml2YXRlIFN0cmluZ0xlbmd0aHMgczsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKGludCBsZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChjaGFyKSBpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUhhc2hDb2RlKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBzLnZhbHVlLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaW5nQnVpbGRlckJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0J1aWxkZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0J1aWxkZXJCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCisvKioKKyAqIFRlc3RzIHRoZSBwZXJmb3JtYW5jZSBvZiB2YXJpb3VzIFN0cmluZ0J1aWxkZXIgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0J1aWxkZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHsiMSIsICIxMCIsICIxMDAifSkgcHJpdmF0ZSBpbnQgbGVuZ3RoOworCisgICAgcHVibGljIHZvaWQgdGltZUFwcGVuZEJvb2xlYW4oaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRDaGFyKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ2MnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRDaGFyQXJyYXkoaW50IHJlcHMpIHsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gImNoYXJzIi50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoYXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRDaGFyU2VxdWVuY2UoaW50IHJlcHMpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIGNzID0gImNoYXJzIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQXBwZW5kRG91YmxlKGludCByZXBzKSB7CisgICAgICAgIGRvdWJsZSBkID0gMS4yOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUFwcGVuZEZsb2F0KGludCByZXBzKSB7CisgICAgICAgIGZsb2F0IGYgPSAxLjJmOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUFwcGVuZEludChpbnQgcmVwcykgeworICAgICAgICBpbnQgbiA9IDEyMzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRMb25nKGludCByZXBzKSB7CisgICAgICAgIGxvbmcgbCA9IDEyMzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRPYmplY3QoaW50IHJlcHMpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB0aW1lIHRoZSB0b1N0cmluZywgc28gZW5zdXJlIHdlJ3JlIGNhbGxpbmcgYSB0cml2aWFsIG9uZS4uLgorICAgICAgICBPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRTdHJpbmcoaW50IHJlcHMpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiY2hhcnMiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0Nhc2VNYXBwaW5nQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaW5nQ2FzZU1hcHBpbmdCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTViNTllCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0Nhc2VNYXBwaW5nQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworcHVibGljIGNsYXNzIFN0cmluZ0Nhc2VNYXBwaW5nQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBlbnVtIElucHV0cyB7CisgICAgICAgIEVNUFRZKCIiKSwKKworICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIGhhaXJ5IGlucHV0cyBsaWtlIHR1cmtpc2ggYW5kIGdyZWVrLgorICAgICAgICAvLyBUT0RPOiBsb2NhbGUgbWFrZXMgYSBkaWZmZXJlbmNlIHRvby4KKworICAgICAgICBMT1dFUjIobG93ZXIoMikpLAorICAgICAgICBVUFBFUjIodXBwZXIoMikpLAorICAgICAgICBNSVhFRDIobWl4ZWQoMikpLAorCisgICAgICAgIExPV0VSOChsb3dlcig4KSksCisgICAgICAgIFVQUEVSOCh1cHBlcig4KSksCisgICAgICAgIE1JWEVEOChtaXhlZCg4KSksCisKKyAgICAgICAgTE9XRVIzMihsb3dlcigzMikpLAorICAgICAgICBVUFBFUjMyKHVwcGVyKDMyKSksCisgICAgICAgIE1JWEVEMzIobWl4ZWQoMzIpKSwKKworICAgICAgICBMT1dFUjUxMihsb3dlcig1MTIpKSwKKyAgICAgICAgVVBQRVI1MTIodXBwZXIoNTEyKSksCisgICAgICAgIE1JWEVENTEyKG1peGVkKDUxMikpLAorCisgICAgICAgIExPV0VSMjA0OChsb3dlcigyMDQ4KSksCisgICAgICAgIFVQUEVSMjA0OCh1cHBlcigyMDQ4KSksCisgICAgICAgIE1JWEVEMjA0OChtaXhlZCgyMDQ4KSksCisKKyAgICAgICAgTE9XRVJfMU0obG93ZXIoMTAyNCoxMDI0KSksCisgICAgICAgIFVQUEVSXzFNKHVwcGVyKDEwMjQqMTAyNCkpLAorICAgICAgICBNSVhFRF8xTShtaXhlZCgxMDI0KjEwMjQpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWU7CisgICAgICAgIHByaXZhdGUgSW5wdXRzKFN0cmluZyB2YWx1ZSkgeyB0aGlzLnZhbHVlID0gdmFsdWU7IH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvd2VyKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlU3RyaW5nKGxlbmd0aCwgImEwYjFjMmQzZTRmNWc2aDdpOGo5a2xtbm9wcXJzdHV2d3h5eiIpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB1cHBlcihpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFrZVN0cmluZyhsZW5ndGgsICJBMEIxQzJEM0U0RjVHNkg3SThKOUtMTU5PUFFSU1RVVldYWVoiKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWl4ZWQoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG1ha2VTdHJpbmcobGVuZ3RoLCAiQWEwQmIxQ2MyRGQzRWU0RmY1R2c2SGg3SWk4Smo5S2tMbE1tTm5Pb1BwUXFSclNzVHRVdVZ2V3dYeFl5WnoiKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVN0cmluZyhpbnQgbGVuZ3RoLCBTdHJpbmcgYWxwaGFiZXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhbHBoYWJldC5jaGFyQXQoaSAlIGFscGhhYmV0Lmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBAUGFyYW0gcHJpdmF0ZSBJbnB1dHMgczsKKworICAgIHB1YmxpYyB2b2lkIHRpbWVUb1VwcGVyQ2FzZV9VUyhpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcy52YWx1ZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRvTG93ZXJDYXNlX1VTKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBzLnZhbHVlLnRvVXBwZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVG9VcHBlckNhc2VfQXNjaWkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHRvVXBwZXJDYXNlQXNjaWkocy52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVG9Mb3dlckNhc2VfQXNjaWkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHRvVXBwZXJDYXNlQXNjaWkocy52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVG9VcHBlckNhc2VfSUNVKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICBsaWJjb3JlLmljdS5JQ1UudG9VcHBlckNhc2Uocy52YWx1ZSwgTG9jYWxlLlVTLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRvTG93ZXJDYXNlX0lDVShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbGliY29yZS5pY3UuSUNVLnRvTG93ZXJDYXNlKHMudmFsdWUsIExvY2FsZS5VUy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvVXBwZXJDYXNlQXNjaWkoU3RyaW5nIHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHMubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoYyA8ICdhJyB8fCBjID4gJ3onKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGZhc3QgcGF0aCBhdm9pZHMgYWxsb2NhdGlvbgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzbG93IHBhdGg6IHMgY29udGFpbnMgbG93ZXIgY2FzZSBjaGFycworICAgICAgICAgICAgY2hhcltdIHJlc3VsdCA9IHMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjID0gcmVzdWx0W2ldOworICAgICAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gLT0gKCdhJyAtICdBJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyQ2FzZUFzY2lpKFN0cmluZyBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzLmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPCAnQScgfHwgYyA+ICdaJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBmYXN0IHBhdGggYXZvaWRzIGFsbG9jYXRpb24KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2xvdyBwYXRoOiBzIGNvbnRhaW5zIHVwcGVyIGNhc2UgY2hhcnMKKyAgICAgICAgICAgIGNoYXJbXSByZXN1bHQgPSBzLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYyA9IHJlc3VsdFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldICs9ICgnYScgLSAnQScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0lzRW1wdHlCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdJc0VtcHR5QmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiZTgwYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdJc0VtcHR5QmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdJc0VtcHR5QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNFbXB0eV9Ob25FbXB0eShpbnQgcmVwcykgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgJj0gISgieHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Ii5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0aW1lSXNFbXB0eV9FbXB0eShpbnQgcmVwcykgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHQgJj0gKCIiLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRpbWVMZW5ndGhFcXVhbHNaZXJvKGludCByZXBzKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdCAmPSAhKCJ4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiLmxlbmd0aCgpID09IDApOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KKyAKKyAgICBwdWJsaWMgdm9pZCB0aW1lRXF1YWxzRW1wdHkoaW50IHJlcHMpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0ICY9ICEieHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Ii5lcXVhbHMoIiIpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdMZW5ndGhCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdMZW5ndGhCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjJlMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ0xlbmd0aEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgU3RyaW5nTGVuZ3RoQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lTGVuZ3RoKGludCByZXBzKSB7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgbGVuZ3RoID0gInh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbmd0aCAhPSA1MSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaW5nU3BsaXRCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9TdHJpbmdTcGxpdEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZmRmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaW5nU3BsaXRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdTcGxpdEJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ1NwbGl0Q29tbWEoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgICJ0aGlzLGlzLGEsc2ltcGxlLGV4YW1wbGUiLnNwbGl0KCIsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nU3BsaXRMaXRlcmFsRG90KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAidGhpcy5pcy5hLnNpbXBsZS5leGFtcGxlIi5zcGxpdCgiXFwuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nU3BsaXROZXdsaW5lKGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAidGhpc1xuaXNcbmFcbnNpbXBsZVxuZXhhbXBsZVxuIi5zcGxpdCgiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVQYXR0ZXJuU3BsaXRDb21tYShpbnQgcmVwcykgeworICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIiwiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHAuc3BsaXQoInRoaXMsaXMsYSxzaW1wbGUsZXhhbXBsZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVBhdHRlcm5TcGxpdExpdGVyYWxEb3QoaW50IHJlcHMpIHsKKyAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJcXC4iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgICAgICAgIHAuc3BsaXQoInRoaXMuaXMuYS5zaW1wbGUuZXhhbXBsZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVN0cmluZ1NwbGl0SGFyZChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgICAgICAgInRoaXMsaXMsYSxoYXJkZXIsZXhhbXBsZSIuc3BsaXQoIlssXSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ1RvUmVhbEJlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N0cmluZ1RvUmVhbEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2E2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3RyaW5nVG9SZWFsQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgU3RyaW5nVG9SZWFsQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKworICAgIEBQYXJhbSh7CisgICAgICAgICJOYU4iLAorICAgICAgICAiLTEiLAorICAgICAgICAiMCIsCisgICAgICAgICIxIiwKKyAgICAgICAgIjEuMiIsCisgICAgICAgICItMTIzLjQ1IiwKKyAgICAgICAgIi0xMjMuNDVlOCIsCisgICAgICAgICItMTIzLjQ1ZTM2IgorICAgIH0pIFN0cmluZyBzdHJpbmc7CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lRmxvYXRfcGFyc2VGbG9hdChpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgRmxvYXQucGFyc2VGbG9hdChzdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZURvdWJsZV9wYXJzZURvdWJsZShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKHN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vU3lzdGVtUHJvcGVydGllc0JlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N5c3RlbVByb3BlcnRpZXNCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY3NWUxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1N5c3RlbVByb3BlcnRpZXNCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBTeXN0ZW1Qcm9wZXJ0aWVzQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lR2V0UHJvcGVydGllcyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICAgICAgICAvLyBGb3JjZSB0aGUgcHJvcGVydGllcyB0byBiZSByZWNyZWF0ZWQuCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhudWxsKTsKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVGhyZWFkTG9jYWxCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9UaHJlYWRMb2NhbEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDcxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVGhyZWFkTG9jYWxCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbEJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8Y2hhcltdPiBCVUZGRVIgPSBuZXcgVGhyZWFkTG9jYWw8Y2hhcltdPigpIHsKKyAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBjaGFyW10gaW5pdGlhbFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBjaGFyWzIwXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVGhyZWFkTG9jYWxfZ2V0KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBCVUZGRVIuZ2V0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVGltZVpvbmVCZW5jaG1hcmsuamF2YSBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9UaW1lWm9uZUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWYzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVGltZVpvbmVCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJlbmNobWFya3MucmVncmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitwdWJsaWMgY2xhc3MgVGltZVpvbmVCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICAgIHB1YmxpYyB2b2lkIHRpbWVUaW1lWm9uZV9nZXREZWZhdWx0KGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFRpbWVab25lLmdldERlZmF1bHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVUaW1lWm9uZV9nZXRUaW1lWm9uZVVUQyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lVGltZVpvbmVfZ2V0VGltZVpvbmVfZGVmYXVsdChpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBkZWZhdWx0SWQgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0SUQoKTsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKGRlZmF1bHRJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHRpbWUgem9uZSB3aXRoIHJlbGF0aXZlbHkgZmV3IHRyYW5zaXRpb25zLgorICAgIHB1YmxpYyB2b2lkIHRpbWVUaW1lWm9uZV9nZXRUaW1lWm9uZV9BbWVyaWNhX0NhcmFjYXMoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyArK3JlcCkgeworICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkFtZXJpY2EvQ2FyYWNhcyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQSB0aW1lIHpvbmUgd2l0aCBhIGxvdCBvZiB0cmFuc2l0aW9ucy4KKyAgICBwdWJsaWMgdm9pZCB0aW1lVGltZVpvbmVfZ2V0VGltZVpvbmVfQW1lcmljYV9TYW50aWFnbyhpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7ICsrcmVwKSB7CisgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiQW1lcmljYS9TYW50aWFnbyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVRpbWVab25lX2dldFRpbWVab25lX0dNVF9wbHVzXzEwKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgKytyZXApIHsKKyAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTAiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9VUkxDb25uZWN0aW9uQmVuY2htYXJrLmphdmEgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVVJMQ29ubmVjdGlvbkJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2VlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3JlZ3Jlc3Npb24vVVJMQ29ubmVjdGlvbkJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBiZW5jaG1hcmtzLnJlZ3Jlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgdGVzdHMuaHR0cC5Nb2NrUmVzcG9uc2U7CitpbXBvcnQgdGVzdHMuaHR0cC5Nb2NrV2ViU2VydmVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgVVJMQ29ubmVjdGlvbkJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisKKyAgICBAUGFyYW0oeyIwIiwgIjEwMjQiLCAiMTA0ODU3NiJ9KSBwcml2YXRlIGludCBib2R5U2l6ZTsKKyAgICBAUGFyYW0oeyIyMDQ4In0pIHByaXZhdGUgaW50IGNodW5rU2l6ZTsKKyAgICBAUGFyYW0oeyIxMDI0In0pIHByaXZhdGUgaW50IHJlYWRCdWZmZXJTaXplOworICAgIEBQYXJhbSBwcml2YXRlIFJlc3BvbnNlSGVhZGVycyByZXNwb25zZUhlYWRlcnM7CisgICAgQFBhcmFtIHByaXZhdGUgVHJhbnNmZXJFbmNvZGluZyB0cmFuc2ZlckVuY29kaW5nOworICAgIHByaXZhdGUgYnl0ZVtdIHJlYWRCdWZmZXI7CisKKyAgICBwcml2YXRlIE1vY2tXZWJTZXJ2ZXIgc2VydmVyOworICAgIHByaXZhdGUgVVJMIHVybDsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtyZWFkQnVmZmVyU2l6ZV07CisgICAgICAgIHNlcnZlciA9IG5ldyBNb2NrV2ViU2VydmVyKCk7CisKKyAgICAgICAgTW9ja1Jlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tSZXNwb25zZSgpOworICAgICAgICByZXNwb25zZUhlYWRlcnMuYXBwbHkocmVzcG9uc2UpOworICAgICAgICB0cmFuc2ZlckVuY29kaW5nLnNldEJvZHkocmVzcG9uc2UsIGJvZHlTaXplLCBjaHVua1NpemUpOworICAgICAgICBzZXJ2ZXIuZW5xdWV1ZShyZXNwb25zZSk7CisKKyAgICAgICAgc2VydmVyLnNldENvbnRpbnVvdXNTZXJ2aW5nKHRydWUpOworICAgICAgICBzZXJ2ZXIucGxheSgpOworCisgICAgICAgIHVybCA9IHNlcnZlci5nZXRVcmwoIi8iKTsKKyAgICAgICAgZ2V0KCk7IC8vIGVuc3VyZSB0aGUgc2VydmVyIGhhcyBzdGFydGVkIGl0cyB0aHJlYWRzLCBldGMuCisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50aWNlIHRoZSBzZXJ2ZXIgdG8gc2h1dCBpdHNlbGYgZG93biBncmFjZWZ1bGx5LiBUaGUgc2h1dGRvd24gbWV0aG9kCisgICAgICAgICAqIGRvZXNuJ3Qgd29yayBvbiBEYWx2aWsgYmVjYXVzZSBzb2NrZXQuY2xvc2UoKSBkb2Vzbid0IHJlbGVhc2UgYmxvY2tlZAorICAgICAgICAgKiB0aHJlYWRzLiBJbnN0ZWFkLCByZWFkIHRoZSBsYXN0IGNvbnRpbnVvdXNseS1zZXJ2ZWQgcmVxdWVzdCwgYW5kIHRoZW4KKyAgICAgICAgICogY2F1c2UgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgb3RoZXJ3aXNlLXJldXNhYmxlIEhUVFAgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHNlcnZlci5zZXRDb250aW51b3VzU2VydmluZyhmYWxzZSk7CisgICAgICAgIHNlcnZlci5lbnF1ZXVlKG5ldyBNb2NrUmVzcG9uc2UoKS5zZXREaXNjb25uZWN0QXRFbmQodHJ1ZSkpOworICAgICAgICBnZXQoKTsKKyAgICAgICAgZ2V0KCk7CisgICAgICAgIHNlcnZlci5zaHV0ZG93bigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgdGltZUdldChpbnQgcmVwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IGdldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmVhZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgdG90YWxCeXRlc1JlYWQgPSAwOworICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQocmVhZEJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBjb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxCeXRlc1JlYWQ7CisgICAgfQorCisgICAgZW51bSBUcmFuc2ZlckVuY29kaW5nIHsKKyAgICAgICAgRklYRURfTEVOR1RILAorICAgICAgICBDSFVOS0VEOworCisgICAgICAgIHZvaWQgc2V0Qm9keShNb2NrUmVzcG9uc2UgcmVzcG9uc2UsIGludCBib2R5U2l6ZSwgaW50IGNodW5rU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IFRyYW5zZmVyRW5jb2RpbmcuRklYRURfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShuZXcgYnl0ZVtib2R5U2l6ZV0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzID09IFRyYW5zZmVyRW5jb2RpbmcuQ0hVTktFRCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENodW5rZWRCb2R5KG5ldyBieXRlW2JvZHlTaXplXSwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gUmVzcG9uc2VIZWFkZXJzIHsKKyAgICAgICAgTUlOSU1BTCwKKyAgICAgICAgVFlQSUNBTDsKKworICAgICAgICB2b2lkIGFwcGx5KE1vY2tSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gVFlQSUNBTCkgeworICAgICAgICAgICAgICAgIC8qIGZyb20gaHR0cDovL2FwaS50d2l0dGVyLmNvbS8xL3N0YXR1c2VzL3B1YmxpY190aW1lbGluZS5qc29uICovCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJEYXRlOiBXZWQsIDMwIEp1biAyMDEwIDE3OjU3OjM5IEdNVCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiU2VydmVyOiBoaSIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiWC1SYXRlTGltaXQtUmVtYWluaW5nOiAwIik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJYLVJ1bnRpbWU6IDAuMDE2MzciKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiWC1SYXRlTGltaXQtQ2xhc3M6IGFwaV93aGl0ZWxpc3RlZCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIG1heC1hZ2U9MzAwIik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJYLVJhdGVMaW1pdC1SZXNldDogMTI3NzkyMDk4MCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiU2V0LUNvb2tpZTogX3R3aXR0ZXJfc2Vzcz1CQWg3RURvT2NtVjBkWEp1WDNSdklqWm9kSFJ3T2k4dlpHVjJMIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiblIzYVhSMFpYSXVZMjl0TDNCaFoyVnolMjUwQUwzTnBaMjVmYVc1ZmQybDBhRjkwZDJsMGRHVnlPZ3hqYzNKbVgybGtJaVV3IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiT0RGaE5HWTJOVE01TmpSbSUyNTBBTmpZMU4yTTJOemN3TldJME1EbG1aR1pqWmpvVmFXNWZibVYzWDNWelpYSmZabXh2ZHpBIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiNkVYUnlZVzV6JTI1MEFYM0J5YjIxd2REQWlLWE5vYjNkZlpHbHpZMjkyWlhKaFltbHNhWFI1WDJadmNsOXFaWE56WlhkcGJIIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiTnYlMjUwQWJqQTZFM05vYjNkZmFHVnNjRjlzYVc1ck1Eb1RjR0Z6YzNkdmNtUmZkRzlyWlc0aUxXVXlZamxoTm1NMyUyNTBBIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiTVdKaU56STNOV05sWkRJMU5EWTNNR016WldObU1URTBNakk0TjJFeU5HRTZEMk55WldGMFpXUmZZWFJzJTI1MEFLd2hpTSUyIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiNTJGNkpLUUU2Q1hWelpYSnBBOHRFM2lJS1pteGhjMmhKUXpvblFXTjBhVzl1UTI5dWRISnZiR3hsJTI1MEFjam82Um14aGMyIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZzZPa1pzWVhOb1NHRnphSHNBQmpvS1FIVnpaV1I3QURvSGFXUWlKV1ptTVROaE0yUXglMjUwQVpUVTFZVGt6TW1ZeU1XTTBNIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiR05oWmpVNE5EVmpNVFF6LS0xMTI1MDYyOGM4NTgzMDIxOTQzOGViN2ViYTk2YTU0MWE5YWY0MDk4OyBkb21haW49LnR3aXR0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXIuY29tOyBwYXRoPS8iKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkV4cGlyZXM6IFdlZCwgMzAgSnVuIDIwMTAgMTg6MDI6MzkgR01UIik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJWYXJ5OiBBY2NlcHQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvcmVncmVzc2lvbi9YbWxFbnRpdGllc0JlbmNobWFyay5qYXZhIGIvYmVuY2htYXJrcy9yZWdyZXNzaW9uL1htbEVudGl0aWVzQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1Y2MxOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvcmVncmVzc2lvbi9YbWxFbnRpdGllc0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmVuY2htYXJrcy5yZWdyZXNzaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKKworLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0xODEwMgorcHVibGljIGZpbmFsIGNsYXNzIFhtbEVudGl0aWVzQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgCisgIEBQYXJhbSh7IjEwIiwgIjEwMCIsICIxMDAwIn0pIGludCBsZW5ndGg7CisgIEBQYXJhbSh7IjAiLCAiMC41IiwgIjEuMCJ9KSBmbG9hdCBlbnRpdHlGcmFjdGlvbjsKKworICBwcml2YXRlIFhtbFB1bGxQYXJzZXJGYWN0b3J5IHhtbFB1bGxQYXJzZXJGYWN0b3J5OworICBwcml2YXRlIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKKworICAvKiogYSBzdHJpbmcgbGlrZSB7QGNvZGUgPGRvYz4mYW1wOyZhbXA7Kys8L2RvYz59LiAqLworICBwcml2YXRlIFN0cmluZyB4bWw7CisKKyAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgeG1sUHVsbFBhcnNlckZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICBTdHJpbmdCdWlsZGVyIHhtbEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHhtbEJ1aWxkZXIuYXBwZW5kKCI8ZG9jPiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxlbmd0aCAqIGVudGl0eUZyYWN0aW9uKTsgaSsrKSB7CisgICAgICB4bWxCdWlsZGVyLmFwcGVuZCgiJmFtcDsiKTsKKyAgICB9CisgICAgd2hpbGUgKHhtbEJ1aWxkZXIubGVuZ3RoKCkgPCBsZW5ndGgpIHsKKyAgICAgIHhtbEJ1aWxkZXIuYXBwZW5kKCIrIik7CisgICAgfQorICAgIHhtbEJ1aWxkZXIuYXBwZW5kKCI8L2RvYz4iKTsKKyAgICB4bWwgPSB4bWxCdWlsZGVyLnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRpbWVYbWxQYXJzZXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IHhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgU3RyaW5nUmVhZGVyKHhtbCkpOworICAgICAgd2hpbGUgKHBhcnNlci5uZXh0KCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRpbWVEb2N1bWVudEJ1aWxkZXIoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgIGRvY3VtZW50QnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcih4bWwpKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjdkYzAuLjAwMDAwMDAKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2Fubm90YXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08aHRtbD4KLSAgPGJvZHk+Ci0gICAgPHA+Ci0gICAgICBEZWZpbmVzIHNvbWUgYW5ub3RhdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gdGhlIEFuZHJvaWQgc3lzdGVtLCBlaXRoZXIKLSAgICAgIGZvciB0aGUgY29yZSBsaWJyYXJpZXMgb3IgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0gICAgPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYnl0ZWNvZGUvcGFja2FnZS5odG1sIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL2J5dGVjb2RlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMGU5Mi4uMDAwMDAwMAotLS0gYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYnl0ZWNvZGUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08aHRtbD4KLSAgPGJvZHk+Ci0gICAgPHA+Ci0gICAgICBQcm92aWRlcyBjbGFzc2VzIHJlbGF0ZWQgdG8gRGFsdmlrIGJ5dGVjb2RlLiAKLSAgICA8L3A+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vQmFzZURleENsYXNzTG9hZGVyLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0Jhc2VEZXhDbGFzc0xvYWRlci5qYXZhCmluZGV4IDYyZWM1ZTMuLmQzZWM5NWEgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vQmFzZURleENsYXNzTG9hZGVyLmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9CYXNlRGV4Q2xhc3NMb2FkZXIuamF2YQpAQCAtMjUsMTMgKzI1LDYgQEAKICAqIHtAbGluayBDbGFzc0xvYWRlcn0gaW1wbGVtZW50YXRpb25zLgogICovCiBwdWJsaWMgY2xhc3MgQmFzZURleENsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotICAgIC8qKiBvcmlnaW5hbGx5IHNwZWNpZmllZCBwYXRoIChqdXN0IHVzZWQgZm9yIHtAY29kZSB0b1N0cmluZygpfSkgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvcmlnaW5hbFBhdGg7Ci0KLSAgICAvKiogb3JpZ2luYWxseSBzcGVjaWZpZWQgbGlicmFyeSBwYXRoIChqdXN0IHVzZWQgZm9yIHtAY29kZSB0b1N0cmluZygpfSkgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvcmlnaW5hbExpYnJhcnlQYXRoOwotCi0gICAgLyoqIHN0cnVjdHVyZWQgbGlzdHMgb2YgcGF0aCBlbGVtZW50cyAqLwogICAgIHByaXZhdGUgZmluYWwgRGV4UGF0aExpc3QgcGF0aExpc3Q7CiAKICAgICAvKioKQEAgLTUwLDIyICs0MywxNiBAQAogICAgIHB1YmxpYyBCYXNlRGV4Q2xhc3NMb2FkZXIoU3RyaW5nIGRleFBhdGgsIEZpbGUgb3B0aW1pemVkRGlyZWN0b3J5LAogICAgICAgICAgICAgU3RyaW5nIGxpYnJhcnlQYXRoLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKICAgICAgICAgc3VwZXIocGFyZW50KTsKLQotICAgICAgICB0aGlzLm9yaWdpbmFsUGF0aCA9IGRleFBhdGg7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxMaWJyYXJ5UGF0aCA9IGxpYnJhcnlQYXRoOwotICAgICAgICB0aGlzLnBhdGhMaXN0ID0KLSAgICAgICAgICAgIG5ldyBEZXhQYXRoTGlzdCh0aGlzLCBkZXhQYXRoLCBsaWJyYXJ5UGF0aCwgb3B0aW1pemVkRGlyZWN0b3J5KTsKKyAgICAgICAgdGhpcy5wYXRoTGlzdCA9IG5ldyBEZXhQYXRoTGlzdCh0aGlzLCBkZXhQYXRoLCBsaWJyYXJ5UGF0aCwgb3B0aW1pemVkRGlyZWN0b3J5KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gcGF0aExpc3QuZmluZENsYXNzKG5hbWUpOwotCi0gICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiRGlkbid0IGZpbmQgY2xhc3MgXCIiICsgbmFtZSArICJcIiBvbiBwYXRoOiAiICsgb3JpZ2luYWxQYXRoKTsKKyAgICAgICAgQ2xhc3MgYyA9IHBhdGhMaXN0LmZpbmRDbGFzcyhuYW1lKTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIkRpZG4ndCBmaW5kIGNsYXNzIFwiIiArIG5hbWUgKyAiXCIgb24gcGF0aDogIiArIHBhdGhMaXN0KTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbGF6ejsKKyAgICAgICAgcmV0dXJuIGM7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjUsOSArMTEyLDIxIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIltkZXhQYXRoPSIgKyBvcmlnaW5hbFBhdGggKyAiLGxpYnJhcnlQYXRoPSIgKyBvcmlnaW5hbExpYnJhcnlQYXRoICsgIl0iOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMZExpYnJhcnlQYXRoKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoRmlsZSBkaXJlY3RvcnkgOiBwYXRoTGlzdC5nZXROYXRpdmVMaWJyYXJ5RGlyZWN0b3JpZXMoKSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiWyIgKyBwYXRoTGlzdCArICJdIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0RleFBhdGhMaXN0LmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL0RleFBhdGhMaXN0LmphdmEKaW5kZXggYmE0YmIxNS4uM2Q5ZWUzZSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9EZXhQYXRoTGlzdC5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vRGV4UGF0aExpc3QuamF2YQpAQCAtMjEsMTAgKzIxLDE2IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CitpbXBvcnQgbGliY29yZS5pby5FcnJub0V4Y2VwdGlvbjsKK2ltcG9ydCBsaWJjb3JlLmlvLklvVXRpbHM7CitpbXBvcnQgbGliY29yZS5pby5MaWJjb3JlOworaW1wb3J0IGxpYmNvcmUuaW8uU3RydWN0U3RhdDsKK2ltcG9ydCBzdGF0aWMgbGliY29yZS5pby5Pc0NvbnN0YW50cy4qOwogCiAvKioKICAqIEEgcGFpciBvZiBsaXN0cyBvZiBlbnRyaWVzLCBhc3NvY2lhdGVkIHdpdGggYSB7QGNvZGUgQ2xhc3NMb2FkZXJ9LgpAQCAtNDgsMTAgKzU0LDE0IEBACiAgICAgLyoqIGNsYXNzIGRlZmluaXRpb24gY29udGV4dCAqLwogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgZGVmaW5pbmdDb250ZXh0OwogCi0gICAgLyoqIGxpc3Qgb2YgZGV4L3Jlc291cmNlIChjbGFzcyBwYXRoKSBlbGVtZW50cyAqLworICAgIC8qKgorICAgICAqIExpc3Qgb2YgZGV4L3Jlc291cmNlIChjbGFzcyBwYXRoKSBlbGVtZW50cy4KKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHBhdGhFbGVtZW50cywgYnV0IHRoZSBGYWNlYm9vayBhcHAgdXNlcyByZWZsZWN0aW9uCisgICAgICogdG8gbW9kaWZ5ICdkZXhFbGVtZW50cycgKGh0dHA6Ly9iLzc3MjY5MzQpLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgRWxlbWVudFtdIGRleEVsZW1lbnRzOwogCi0gICAgLyoqIGxpc3Qgb2YgbmF0aXZlIGxpYnJhcnkgZGlyZWN0b3J5IGVsZW1lbnRzICovCisgICAgLyoqIExpc3Qgb2YgbmF0aXZlIGxpYnJhcnkgZGlyZWN0b3JpZXMuICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlW10gbmF0aXZlTGlicmFyeURpcmVjdG9yaWVzOwogCiAgICAgLyoqCkBAIC05MywxMSArMTAzLDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLmRlZmluaW5nQ29udGV4dCA9IGRlZmluaW5nQ29udGV4dDsKLSAgICAgICAgdGhpcy5kZXhFbGVtZW50cyA9Ci0gICAgICAgICAgICBtYWtlRGV4RWxlbWVudHMoc3BsaXREZXhQYXRoKGRleFBhdGgpLCBvcHRpbWl6ZWREaXJlY3RvcnkpOworICAgICAgICB0aGlzLmRleEVsZW1lbnRzID0gbWFrZURleEVsZW1lbnRzKHNwbGl0RGV4UGF0aChkZXhQYXRoKSwgb3B0aW1pemVkRGlyZWN0b3J5KTsKICAgICAgICAgdGhpcy5uYXRpdmVMaWJyYXJ5RGlyZWN0b3JpZXMgPSBzcGxpdExpYnJhcnlQYXRoKGxpYnJhcnlQYXRoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJEZXhQYXRoTGlzdFsiICsgQXJyYXlzLnRvU3RyaW5nKGRleEVsZW1lbnRzKSArCisgICAgICAgICAgICAiLG5hdGl2ZUxpYnJhcnlEaXJlY3Rvcmllcz0iICsgQXJyYXlzLnRvU3RyaW5nKG5hdGl2ZUxpYnJhcnlEaXJlY3RvcmllcykgKyAiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIEJhc2VEZXhDbGFzc0xvYWRlci5nZXRMZExpYnJhcnlQYXRoLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlW10gZ2V0TmF0aXZlTGlicmFyeURpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbmF0aXZlTGlicmFyeURpcmVjdG9yaWVzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNwbGl0cyB0aGUgZ2l2ZW4gZGV4IHBhdGggc3RyaW5nIGludG8gZWxlbWVudHMgdXNpbmcgdGhlIHBhdGgKICAgICAgKiBzZXBhcmF0b3IsIHBydW5pbmcgb3V0IGFueSBlbGVtZW50cyB0aGF0IGRvIG5vdCByZWZlciB0byBleGlzdGluZwpAQCAtMTU0LDM2ICsxNzUsMTkgQEAKICAgICAgKiBIZWxwZXIgZm9yIHtAbGluayAjc3BsaXRQYXRoc30sIHdoaWNoIGRvZXMgdGhlIGFjdHVhbCBzcGxpdHRpbmcKICAgICAgKiBhbmQgZmlsdGVyaW5nIGFuZCBhZGRpbmcgdG8gYSByZXN1bHQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzcGxpdEFuZEFkZChTdHJpbmcgcGF0aCwgYm9vbGVhbiB3YW50RGlyZWN0b3JpZXMsCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzcGxpdEFuZEFkZChTdHJpbmcgc2VhcmNoUGF0aCwgYm9vbGVhbiBkaXJlY3Rvcmllc09ubHksCiAgICAgICAgICAgICBBcnJheUxpc3Q8RmlsZT4gcmVzdWx0TGlzdCkgewotICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgIGlmIChzZWFyY2hQYXRoID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBwYXRoLnNwbGl0KFBhdHRlcm4ucXVvdGUoRmlsZS5wYXRoU2VwYXJhdG9yKSk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IHN0cmluZ3MpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHMpOwotCi0gICAgICAgICAgICBpZiAoISAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmNhblJlYWQoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE5vdGU6IFRoZXJlIGFyZSBvdGhlciBlbnRpdGllcyBpbiBmaWxlc3lzdGVtcyB0aGFuCi0gICAgICAgICAgICAgKiByZWd1bGFyIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHdhbnREaXJlY3RvcmllcykgewotICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogc2VhcmNoUGF0aC5zcGxpdCgiOiIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cnVjdFN0YXQgc2IgPSBMaWJjb3JlLm9zLnN0YXQocGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFkaXJlY3Rvcmllc09ubHkgfHwgU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZChuZXcgRmlsZShwYXRoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXJybm9FeGNlcHRpb24gaWdub3JlZCkgewogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHRMaXN0LmFkZChmaWxlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI2LDEyICsyMzAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICogdGhlIGV4Y2VwdGlvbiBoZXJlLCBhbmQgbGV0IGRleCA9PSBudWxsLgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHN1cHBvcnQgZGlyZWN0b3JpZXMgZm9yIGxvb2tpbmcgdXAgcmVzb3VyY2VzLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIHJ1bm5pbmcgbGliY29yZSB0ZXN0cy4KKyAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IEVsZW1lbnQoZmlsZSwgdHJ1ZSwgbnVsbCwgbnVsbCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0ubG9nVygiVW5rbm93biBmaWxlIHR5cGUgZm9yOiAiICsgZmlsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoemlwICE9IG51bGwpIHx8IChkZXggIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IEVsZW1lbnQoZmlsZSwgemlwLCBkZXgpKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IEVsZW1lbnQoZmlsZSwgZmFsc2UsIHppcCwgZGV4KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzYwLDE0ICszNjgsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGZpbmRMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSkgewogICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBTeXN0ZW0ubWFwTGlicmFyeU5hbWUobGlicmFyeU5hbWUpOwotCiAgICAgICAgIGZvciAoRmlsZSBkaXJlY3RvcnkgOiBuYXRpdmVMaWJyYXJ5RGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBmaWxlTmFtZSkuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKElvVXRpbHMuY2FuT3BlblJlYWRPbmx5KHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTM3NiwzMSArMzgyLDM4IEBACiAgICAgICovCiAgICAgLypwYWNrYWdlKi8gc3RhdGljIGNsYXNzIEVsZW1lbnQgewogICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgZmlsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRGlyZWN0b3J5OwogICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgemlwOwogICAgICAgICBwcml2YXRlIGZpbmFsIERleEZpbGUgZGV4RmlsZTsKIAogICAgICAgICBwcml2YXRlIFppcEZpbGUgemlwRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluaXQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKIAotICAgICAgICBwdWJsaWMgRWxlbWVudChGaWxlIGZpbGUsIEZpbGUgemlwLCBEZXhGaWxlIGRleEZpbGUpIHsKKyAgICAgICAgcHVibGljIEVsZW1lbnQoRmlsZSBmaWxlLCBib29sZWFuIGlzRGlyZWN0b3J5LCBGaWxlIHppcCwgRGV4RmlsZSBkZXhGaWxlKSB7CiAgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGhpcy5pc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OwogICAgICAgICAgICAgdGhpcy56aXAgPSB6aXA7CiAgICAgICAgICAgICB0aGlzLmRleEZpbGUgPSBkZXhGaWxlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpcmVjdG9yeSBcIiIgKyBmaWxlICsgIlwiIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoemlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInppcCBmaWxlIFwiIiArIHppcCArICJcIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiZGV4IGZpbGUgXCIiICsgZGV4RmlsZSArICJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWF5YmVJbml0KCkgewotICAgICAgICAgICAgaWYgKGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW5pdCA9IHRydWU7CisgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAKLSAgICAgICAgICAgIGlmICh6aXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRWl0aGVyIHRoaXMgZWxlbWVudCBoYXMgbm8gemlwL2phciBmaWxlIChmaXJzdAotICAgICAgICAgICAgICAgICAqIGNsYXVzZSksIG9yIHRoZSB6aXAvamFyIGZpbGUgZG9lc24ndCBoYXZlIGFuIGVudHJ5Ci0gICAgICAgICAgICAgICAgICogZm9yIHRoZSBnaXZlbiBuYW1lIChzZWNvbmQgY2xhdXNlKS4KLSAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeSB8fCB6aXAgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtNDIxLDcgKzQzNCwyNSBAQAogICAgICAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewogICAgICAgICAgICAgbWF5YmVJbml0KCk7CiAKKyAgICAgICAgICAgIC8vIFdlIHN1cHBvcnQgZGlyZWN0b3JpZXMgc28gd2UgY2FuIHJ1biB0ZXN0cyBhbmQvb3IgbGVnYWN5IGNvZGUKKyAgICAgICAgICAgIC8vIHRoYXQgdXNlcyBDbGFzcy5nZXRSZXNvdXJjZS4KKyAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeSkgeworICAgICAgICAgICAgICAgIEZpbGUgcmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoZmlsZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlRmlsZS50b1VSSSgpLnRvVVJMKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoemlwRmlsZSA9PSBudWxsIHx8IHppcEZpbGUuZ2V0RW50cnkobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRWl0aGVyIHRoaXMgZWxlbWVudCBoYXMgbm8gemlwL2phciBmaWxlIChmaXJzdAorICAgICAgICAgICAgICAgICAqIGNsYXVzZSksIG9yIHRoZSB6aXAvamFyIGZpbGUgZG9lc24ndCBoYXZlIGFuIGVudHJ5CisgICAgICAgICAgICAgICAgICogZm9yIHRoZSBnaXZlbiBuYW1lIChzZWNvbmQgY2xhdXNlKS4KKyAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9UZW1wb3JhcnlEaXJlY3RvcnkuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVGVtcG9yYXJ5RGlyZWN0b3J5LmphdmEKaW5kZXggZmYwZjc1OS4uZjhmYjBiMSAxMDA2NDQKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9UZW1wb3JhcnlEaXJlY3RvcnkuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1RlbXBvcmFyeURpcmVjdG9yeS5qYXZhCkBAIC0xOSw3OSArMTksMjAgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIC8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgdGhlIHNldHVwIG9mIHRoZSBjb3JlIGxpYnJhcnkncyBjb25jZXB0IG9mCi0gKiB3aGF0IHRoZSAiZGVmYXVsdCB0ZW1wb3JhcnkgZGlyZWN0b3J5IiBpcy4gQXBwbGljYXRpb24gY29kZSBtYXkKLSAqIGNhbGwgaW50byB0aGlzIGNsYXNzIHdpdGggYW4gYXBwcm9wcmlhdGUgYmFzZSBkaXJlY3RvcnkgZHVyaW5nIGl0cwotICogc3RhcnR1cCwgYXMgYSByZWFzb25hYmx5IGVhc3kgd2F5IHRvIGdldCB0aGUgc3RhbmRhcmQgcHJvcGVydHkKLSAqIDxjb2RlPmphdmEuaW8udG1wZGlyPC9jb2RlPiB0byBwb2ludCBhdCBzb21ldGhpbmcgdXNlZnVsLgorICogT2Jzb2xldGUsIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSBvbmx5LgogICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBUZW1wb3JhcnlEaXJlY3RvcnkgewotICAgIC8qKiBzeXN0ZW0gcHJvcGVydHkgbmFtZSBmb3IgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAiamF2YS5pby50bXBkaXIiOwotCi0gICAgLyoqIGZpbmFsIHBhdGggY29tcG9uZW50IG5hbWUgZm9yIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTkFNRSA9ICJ0bXAiOwotCi0gICAgLyoqIHdoZXRoZXIgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGhhcyBiZWVuIGNvbmZpZ3VyZWQgeWV0ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb25maWd1cmVkID0gZmFsc2U7Ci0KICAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggaXMgZXF1aXZhbGVudCB0bwotICAgICAqIDxjb2RlPnNldHVwRGlyZWN0b3J5KG5ldyBGaWxlKGJhc2VEaXIpKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZURpciB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgICAgKiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IG9ubHkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwRGlyZWN0b3J5KFN0cmluZyBiYXNlRGlyKSB7Ci0gICAgICAgIHNldFVwRGlyZWN0b3J5KG5ldyBGaWxlKGJhc2VEaXIpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgb25seSBpZiBvbmUgaXNuJ3QgYWxyZWFkeQotICAgICAqIGRlZmluZWQgZm9yIHRoaXMgcHJvY2VzcywgYW5kIG9ubHkgaWYgaXQgaXMgcG9zc2libGUgKGUuZy4sIHRoZQotICAgICAqIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcmVhZC13cml0ZSwgb3IgdGhlIGRpcmVjdG9yeQotICAgICAqIGNhbiBiZSBjcmVhdGVkKS4gVGhpcyBjYWxsIHdpbGwgZG8gb25lIG9mIHRocmVlIHRoaW5nczoKLSAgICAgKgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+cmV0dXJuIHdpdGhvdXQgZXJyb3IgYW5kIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcsIGlmIGEKLSAgICAgKiBwcmV2aW91cyBjYWxsIHRvIHRoaXMgbWV0aG9kIHN1Y2NlZWRlZDwvbGk+Ci0gICAgICogPGxpPnJldHVybiB3aXRob3V0IGVycm9yLCBoYXZpbmcgZWl0aGVyIGNyZWF0ZWQgYSB0ZW1wb3JhcnkKLSAgICAgKiBkaXJlY3RvcnkgdW5kZXIgdGhlIGdpdmVuIGJhc2Ugb3IgdmVyaWZpZWQgdGhhdCBzdWNoIGEgZGlyZWN0b3J5Ci0gICAgICogYWxyZWFkeSBleGlzdHM8L2xpPgotICAgICAqIDxsaT50aHJvdyA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlCi0gICAgICogZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkIG9yIGFjY2Vzc2VkPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2VEaXIgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICogVGhpcyBtZXRob2QgZXhpc3RzIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSBvbmx5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXBEaXJlY3RvcnkoRmlsZSBiYXNlRGlyKSB7Ci0gICAgICAgIGlmIChjb25maWd1cmVkKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9nRSgiQWxyZWFkeSBzZXQgdG86ICIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUEVSVFkpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoYmFzZURpciwgUEFUSF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGFic29sdXRlID0gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgICAgIGlmIChkaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSBpcyB1c2VkIGJ5IGEgbm9uLWRpcmVjdG9yeSBmaWxlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkaXIuY2FuUmVhZCgpICYmIGRpci5jYW5Xcml0ZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeGlzdGluZyBkaXJlY3RvcnkgaXMgbm90IHJlYWRhYmxlIGFuZCB3cml0YWJsZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWRpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeTogIiArIGFic29sdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShQUk9QRVJUWSwgYWJzb2x1dGUpOwotICAgICAgICBjb25maWd1cmVkID0gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1ZNRGVidWcuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1EZWJ1Zy5qYXZhCmluZGV4IGFjZTE0OWMuLjhmNDAxNjUgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1EZWJ1Zy5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vVk1EZWJ1Zy5qYXZhCkBAIC0xNjUsMTEgKzE2NSwxMCBAQAogICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB0byBjb250cm9sIG1ldGhvZCB0cmFjaW5nLiBUaGUgb25seSBvbmUgdGhhdAogICAgICAqIGlzIGN1cnJlbnRseSBkZWZpbmVkIGlzIHtAbGluayAjVFJBQ0VfQ09VTlRfQUxMT0NTfS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRNZXRob2RUcmFjaW5nKFN0cmluZyB0cmFjZUZpbGVOYW1lLAotICAgICAgICBpbnQgYnVmZmVyU2l6ZSwgaW50IGZsYWdzKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TWV0aG9kVHJhY2luZyhTdHJpbmcgdHJhY2VGaWxlTmFtZSwgaW50IGJ1ZmZlclNpemUsIGludCBmbGFncykgewogCiAgICAgICAgIGlmICh0cmFjZUZpbGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0cmFjZUZpbGVOYW1lID09IG51bGwiKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXJ0TWV0aG9kVHJhY2luZ05hdGl2ZSh0cmFjZUZpbGVOYW1lLCBudWxsLCBidWZmZXJTaXplLCBmbGFncyk7CkBAIC0xODMsOCArMTgyLDExIEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TWV0aG9kVHJhY2luZyhTdHJpbmcgdHJhY2VGaWxlTmFtZSwKICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGludCBidWZmZXJTaXplLCBpbnQgZmxhZ3MpCiAgICAgewotICAgICAgICBpZiAodHJhY2VGaWxlTmFtZSA9PSBudWxsIHx8IGZkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBpZiAodHJhY2VGaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRyYWNlRmlsZU5hbWUgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZkID09IG51bGwiKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXJ0TWV0aG9kVHJhY2luZ05hdGl2ZSh0cmFjZUZpbGVOYW1lLCBmZCwgYnVmZmVyU2l6ZSwgZmxhZ3MpOwpAQCAtMjkxLDE1ICsyOTMsMTYgQEAKICAgICAgKgogICAgICAqIFRoZSBWTSBtYXkgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgogICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIEZ1bGwgcGF0aG5hbWUgb2Ygb3V0cHV0IGZpbGUgKGUuZy4gIi9zZGNhcmQvZHVtcC5ocHJvZiIpLgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBGdWxsIHBhdGhuYW1lIG9mIG91dHB1dCBmaWxlIChlLmcuICIvc2RjYXJkL2R1bXAuaHByb2YiKS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBWTSB3YXMgYnVpbHQgd2l0aG91dAogICAgICAqICAgICAgICAgSFBST0Ygc3VwcG9ydC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvcGVuaW5nIG9yIHdyaXRpbmcgZmlsZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGEoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBkdW1wSHByb2ZEYXRhKGZpbGVOYW1lLCBudWxsKTsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGVuYW1lID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBkdW1wSHByb2ZEYXRhKGZpbGVuYW1lLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vWnlnb3RlLmphdmEgYi9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL1p5Z290ZS5qYXZhCmluZGV4IGMwNjMxNGUuLjllOTYyMDQgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vWnlnb3RlLmphdmEKKysrIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9aeWdvdGUuamF2YQpAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGRhbHZpay5zeXN0ZW07CiAKK2ltcG9ydCBsaWJjb3JlLmlvLkVycm5vRXhjZXB0aW9uOworaW1wb3J0IGxpYmNvcmUuaW8uTGliY29yZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogLyoqCkBAIC0xNzIsMTIgKzE3NSwxOCBAQAogCiAgICAgLyoqCiAgICAgICogRXhlY3V0ZXMgIi9zeXN0ZW0vYmluL3NoIC1jICZsdDtjb21tYW5kJmd0OyIgdXNpbmcgdGhlIGV4ZWMoKSBzeXN0ZW0gY2FsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zLgorICAgICAqIFRoaXMgbWV0aG9kIHRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIGV4ZWMoKSBmYWlsZWQsIG90aGVyd2lzZSwgdGhpcworICAgICAqIG1ldGhvZCBuZXZlciByZXR1cm5zLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIHNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY1NoZWxsKFN0cmluZyBjb21tYW5kKSB7Ci0gICAgICAgIG5hdGl2ZUV4ZWNTaGVsbChjb21tYW5kKTsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IHsgIi9zeXN0ZW0vYmluL3NoIiwgIi1jIiwgY29tbWFuZCB9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGliY29yZS5vcy5leGVjdihhcmdzWzBdLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoRXJybm9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE5NCw2ICsyMDMsNCBAQAogICAgICAgICAgICAgY29tbWFuZC5hcHBlbmQoIiAnIikuYXBwZW5kKGFyZy5yZXBsYWNlKCInIiwgIidcXCcnIikpLmFwcGVuZCgiJyIpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgbmF0aXZlRXhlY1NoZWxsKFN0cmluZyBjb21tYW5kKTsKIH0KZGlmZiAtLWdpdCBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcGFja2FnZS5odG1sIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDBkMzAuLjAwMDAwMDAKLS0tIGEvZGFsdmlrL3NyYy9tYWluL2phdmEvZGFsdmlrL3N5c3RlbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTxodG1sPgotICA8Ym9keT4KLSAgICA8cD4KLSAgICAgIFByb3ZpZGVzIHV0aWxpdHkgYW5kIHN5c3RlbSBpbmZvcm1hdGlvbiBjbGFzc2VzIHNwZWNpZmljIHRvIHRoZSBEYWx2aWsgVk0uCi0gICAgPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvc3lzdGVtL3Byb2ZpbGVyL1NhbXBsaW5nUHJvZmlsZXIuamF2YSBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcHJvZmlsZXIvU2FtcGxpbmdQcm9maWxlci5qYXZhCmluZGV4IDAyNjYxMDMuLjc0NDk3N2MgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcHJvZmlsZXIvU2FtcGxpbmdQcm9maWxlci5qYXZhCisrKyBiL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9zeXN0ZW0vcHJvZmlsZXIvU2FtcGxpbmdQcm9maWxlci5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICAvKioKICAgICAgKiBBIHNhbXBsZXIgaXMgY3JlYXRlZCBldmVyeSB0aW1lIHByb2ZpbGluZyBzdGFydHMgYW5kIGNsZWFyZWQKLSAgICAgKiBldmVyeXRpbWUgcHJvZmlsaW5nIHN0b3BzIGJlY2F1c2Ugb25jZSBhIHtAY29kZSBUaW1lclRhc2t9IGlzCisgICAgICogZXZlcnkgdGltZSBwcm9maWxpbmcgc3RvcHMgYmVjYXVzZSBvbmNlIGEge0Bjb2RlIFRpbWVyVGFza30gaXMKICAgICAgKiBjYW5jZWxlZCBpdCBjYW5ub3QgYmUgcmV1c2VkLgogICAgICAqLwogICAgIHByaXZhdGUgU2FtcGxlciBzYW1wbGVyOwpAQCAtOTQsNyArOTQsNyBAQAogICAgICAqICBSZWFsIGhwcm9mIG91dHB1dCBleGFtcGxlcyBkb24ndCBzdGFydCB0aGUgdGhyZWFkIGFuZCB0cmFjZQogICAgICAqICBpZGVudGlmaWVycyBhdCBvbmUgYnV0IHNlZW0gdG8gc3RhcnQgYXQgdGhlc2UgYXJiaXRyYXJ5CiAgICAgICogIGNvbnN0YW50cy4gSXQgY2VydGFpbmx5IHNlZW1zIHVzZWZ1bCB0byBoYXZlIHJlbGF0aXZlbHkgdW5pcXVlCi0gICAgICogIGlkZW50aWZlcnMgd2hlbiBtYW51YWwgc2VhcmNoaW5nIGhwcm9mIG91dHB1dC4KKyAgICAgKiAgaWRlbnRpZmllcnMgd2hlbiBtYW51YWwgc2VhcmNoaW5nIGhwcm9mIG91dHB1dC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBuZXh0VGhyZWFkSWQgPSAyMDAwMDE7CiAgICAgcHJpdmF0ZSBpbnQgbmV4dFN0YWNrVHJhY2VJZCA9IDMwMDAwMTsKQEAgLTE0Niw5ICsxNDYsOSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRocmVhZFNldCBUaGUgdGhyZWFkIHNldCBzcGVjaWZpZXMgd2hpY2ggdGhyZWFkcyB0bwogICAgICAqIHNhbXBsZS4gSW4gYSBnZW5lcmFsIHB1cnBvc2UgcHJvZ3JhbSwgYWxsIHRocmVhZHMgdHlwaWNhbGx5Ci0gICAgICogc2hvdWxkIGJlIHNhbXBsZSB3aXRoIGEgVGhyZWFkU2V0IHN1Y2ggYXMgcHJvdmllZCBieSB7QGxpbmsKLSAgICAgKiAjbmV3VGhyZWFkR3JvdXBUaGVhZFNldCBuZXdUaHJlYWRHcm91cFRoZWFkU2V0fS4gRm9yIGEKLSAgICAgKiBiZW5jaG1hcmsgYSBmaXhlZCBzZXQgc3VjaCBhcyBwcm92aWVkIGJ5IHtAbGluaworICAgICAqIHNob3VsZCBiZSBzYW1wbGUgd2l0aCBhIFRocmVhZFNldCBzdWNoIGFzIHByb3ZpZGVkIGJ5IHtAbGluaworICAgICAqICNuZXdUaHJlYWRHcm91cFRocmVhZFNldCBuZXdUaHJlYWRHcm91cFRocmVhZFNldH0uIEZvciBhCisgICAgICogYmVuY2htYXJrIGEgZml4ZWQgc2V0IHN1Y2ggYXMgcHJvdmlkZWQgYnkge0BsaW5rCiAgICAgICogI25ld0FycmF5VGhyZWFkU2V0IG5ld0FycmF5VGhyZWFkU2V0fSBjYW4gcmVkdWNlIHRoZSBvdmVyaGVhZAogICAgICAqIG9mIHByb2ZpbGluZy4KICAgICAgKi8KQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBUaHJlYWRTZXQgZm9yIGEgZml4ZWQgc2V0IG9mIHRocmVhZHMgdGhhdCB3aWxsIG5vdAogICAgICAqIHZhcnkgYXQgcnVudGltZS4gVGhpcyBoYXMgbGVzcyBvdmVyaGVhZCB0aGFuIGEgZHluYW1pY2FsbHkKLSAgICAgKiBjYWxjdWxhdGVkIHNldCwgc3VjaCBhcyB7QGxpbmsgI25ld1RocmVhZEdyb3VwVGhlYWRTZXR9LCB3aGljaCBoYXMKKyAgICAgKiBjYWxjdWxhdGVkIHNldCwgc3VjaCBhcyB7QGxpbmsgI25ld1RocmVhZEdyb3VwVGhyZWFkU2V0fSwgd2hpY2ggaGFzCiAgICAgICogdG8gZW51bWVyYXRlIHRoZSB0aHJlYWRzIGVhY2ggdGltZSBwcm9maWxlciB3YW50cyB0byBjb2xsZWN0CiAgICAgICogc2FtcGxlcy4KICAgICAgKi8KQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAqIHRocmVhZHMgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBUaHJlYWRHcm91cCBhbmQgdGhhdAogICAgICAqIFRocmVhZEdyb3VwJ3MgY2hpbGRyZW4uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJlYWRTZXQgbmV3VGhyZWFkR3JvdXBUaGVhZFNldChUaHJlYWRHcm91cCB0aHJlYWRHcm91cCkgeworICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkU2V0IG5ld1RocmVhZEdyb3VwVGhyZWFkU2V0KFRocmVhZEdyb3VwIHRocmVhZEdyb3VwKSB7CiAgICAgICAgIHJldHVybiBuZXcgVGhyZWFkR3JvdXBUaHJlYWRTZXQodGhyZWFkR3JvdXApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZGFsdmlrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2RhbHZpay9kZG1jL0RkbVNlcnZlci5qYXZhIGIvZGFsdmlrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2RhbHZpay9kZG1jL0RkbVNlcnZlci5qYXZhCmluZGV4IDYxYmVlMzQuLjc3MTdmZDkgMTAwNjQ0Ci0tLSBhL2RhbHZpay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9kYWx2aWsvZGRtYy9EZG1TZXJ2ZXIuamF2YQorKysgYi9kYWx2aWsvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvZGFsdmlrL2RkbWMvRGRtU2VydmVyLmphdmEKQEAgLTUwLDkgKzUwLDkgQEAKICAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSB0eXBlIGFscmVhZHkgaGFzIGEgaGFuZGxlciByZWdpc3RlcmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckhhbmRsZXIoaW50IHR5cGUsIENodW5rSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQorICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImhhbmRsZXIgPT0gbnVsbCIpOworICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUhhbmRsZXJNYXApIHsKICAgICAgICAgICAgIGlmIChtSGFuZGxlck1hcC5nZXQodHlwZSkgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHlwZSAiICsgSW50ZWdlci50b0hleFN0cmluZyh0eXBlKQpAQCAtMTcxLDQgKzE3MSwzIEBACiAgICAgICAgIHJldHVybiBoYW5kbGVyLmhhbmRsZUNodW5rKGNodW5rKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2V4cGVjdGF0aW9ucy9icm9rZW50ZXN0cy50eHQgYi9leHBlY3RhdGlvbnMvYnJva2VudGVzdHMudHh0CmluZGV4IGUxZDgxZTAuLmRmYzY1ZTcgMTAwNjQ0Ci0tLSBhL2V4cGVjdGF0aW9ucy9icm9rZW50ZXN0cy50eHQKKysrIGIvZXhwZWN0YXRpb25zL2Jyb2tlbnRlc3RzLnR4dApAQCAtMTgsMTEgKzE4LDYgQEAKICAgYnVnOiA1NTM0MjAyCiB9LAogewotICBkZXNjcmlwdGlvbjogImxpYmNvcmUuamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yVGVzdCBsb25nIHRlc3QgaXMgdG9vIGxvbmciLAotICBuYW1lOiAibGliY29yZS5qYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3JUZXN0I3Rlc3RfZ2V0SW5zdGFuY2UiLAotICBidWc6IDU1MTM3MjMKLX0sCi17CiAgIGRlc2NyaXB0aW9uOiAiU3VwcG9ydCBkaWdlc3QgYXV0aGVudGljYXRpb24gaW4gSHR0cFVSTENvbm5lY3Rpb24iLAogICBuYW1lOiAibGliY29yZS5uZXQuaHR0cC5QYXJzZWRIZWFkZXJzVGVzdCN0ZXN0UGFyc2VDaGFsbGVuZ2VzV2l0aE1hbnlQYXJhbWV0ZXJzIiwKICAgYnVnOiA2MTU2NDU0CkBAIC04OTAsMTUgKzg4NSw2IEBACiAgIHN1YnN0cmluZzogImphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb246ICUlIGRvZXNuJ3QgdGFrZSBhbiBhcmd1bWVudCIKIH0sCiB7Ci0gIGRlc2NyaXB0aW9uOiAiVGhlc2UgdGVzdHMgZXhwZWN0IHRvIGJlIGFibGUgdG8gbG9hZCByZXNvdXJjZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0iLAotICByZXN1bHQ6IEVYRUNfRkFJTEVELAotICBuYW1lczogWwotICAgICJsaWJjb3JlLmphdmEubGFuZy5PbGRDbGFzc1Rlc3QjdGVzdF9nZXRSZXNvdXJjZUFzU3RyZWFtTGphdmFfbGFuZ19TdHJpbmciLAotICAgICJsaWJjb3JlLmphdmEubGFuZy5PbGRDbGFzc1Rlc3QjdGVzdF9nZXRSZXNvdXJjZUFzU3RyZWFtX3dpdGhTaGFycENoYXIiLAotICAgICJsaWJjb3JlLmphdmEubGFuZy5PbGRDbGFzc1Rlc3QjdGVzdF9nZXRSZXNvdXJjZUxqYXZhX2xhbmdfU3RyaW5nIgotICBdCi19LAotewogICBkZXNjcmlwdGlvbjogIlNvbWUgdGVzdHMgKEV4Y2x1ZGVkUHJveHlUZXN0KSBjb25uZWN0IHRvIGEgcHVibGljIHdlYnNlcnZlciB0byBjaGVjayB0aGF0IHRoZSBIVFRQIGNsaWVudCB3b3JrcyIsCiAgIHJlc3VsdDogRVhFQ19GQUlMRUQsCiAgIGZhaWx1cmU6ICJjb25uZWN0IHRvIHRoZSBJbnRlcm5ldCIsCmRpZmYgLS1naXQgYS9leHBlY3RhdGlvbnMva25vd25mYWlsdXJlcy50eHQgYi9leHBlY3RhdGlvbnMva25vd25mYWlsdXJlcy50eHQKaW5kZXggNWUyNGJlMy4uNWQ3ZjcxNiAxMDA2NDQKLS0tIGEvZXhwZWN0YXRpb25zL2tub3duZmFpbHVyZXMudHh0CisrKyBiL2V4cGVjdGF0aW9ucy9rbm93bmZhaWx1cmVzLnR4dApAQCAtMjYsMTQgKzI2LDYgQEAKICAgYnVnOiA0NzIzNDEyCiB9LAogewotICBkZXNjcmlwdGlvbjogIkVuY29kZWQgYnl0ZXMgZG9uJ3QgbWF0Y2ggZm9yIEVDIGVsbGlwdGljIGN1cnZlIGtleXMgY3JlYXRlZCB0aHJvdWdoIEtleUZhY3RvcnkuZ2VuZXJhdGVQcml2YXRlKCkiLAotICBuYW1lczogWwotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5MlRlc3QjdGVzdF9nZW5lcmF0ZVByaXZhdGVMamF2YV9zZWN1cml0eV9zcGVjX0tleVNwZWMiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5MlRlc3QjdGVzdF9nZXRLZXlTcGVjTGphdmFfc2VjdXJpdHlfS2V5TGphdmFfbGFuZ19DbGFzcyIKLSAgXSwKLSAgYnVnOiAzNDgzMzY1Ci19LAotewogICBkZXNjcmlwdGlvbjogIkV4cGF0IHVzZXMgYW4gdW5ib3VuZGVkIG51bWJlciBvZiBnbG9iYWwgcmVmZXJlbmNlcyIsCiAgIG5hbWU6ICJsaWJjb3JlLnhtbC5FeHBhdFNheFBhcnNlclRlc3QjdGVzdEdsb2JhbFJlZmVyZW5jZVRhYmxlT3ZlcmZsb3ciLAogICBidWc6IDI3NzI2MjgKQEAgLTU4LDIzICs1MCwxMCBAQAogICBidWc6IDMzODc2NTUKIH0sCiB7Ci0gIG5hbWU6ICJvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5DaXBoZXJUZXN0I3Rlc3RHZXRNYXhBbGxvd2VkS2V5TGVuZ3RoIiwKLSAgYnVnOiAzMzg3Njg4Ci19LAotewogICBuYW1lOiAibGliY29yZS5qYXZhLmlvLkZpbGVUZXN0I3Rlc3RfZW1wdHlGaWxlbmFtZSIsCiAgIGJ1ZzogMzM4Nzc1OAogfSwKIHsKLSAgZGVzY3JpcHRpb246ICJUdXJraXNoIGRvdGxlc3MgaSBiZWhhdmVzIGRpZmZlcmVudGx5IG9uIGRhbHZpayB2cy4gUkkiLAotICBuYW1lczogWwotICAgICJsaWJjb3JlLmphdmEubGFuZy5TdHJpbmdUZXN0I3Rlc3RDaGFuZ2VDYXNlX2VuX1VTIiwKLSAgICAibGliY29yZS5qYXZhLmxhbmcuU3RyaW5nVGVzdCN0ZXN0RXF1YWxzSWdub3JlQ2FzZV9lbl9VUyIsCi0gICAgImxpYmNvcmUuamF2YS5sYW5nLlN0cmluZ1Rlc3QjdGVzdEVxdWFsc0lnbm9yZUNhc2VfdHJfVFIiCi0gIF0sCi0gIGJ1ZzogMzMyNTc5OQotfSwKLXsKICAgZGVzY3JpcHRpb246ICJLeG1sUHVsbFBhcnNlciBkb2Vzbid0IGVuZm9yY2UgdG9wLWxldmVsIGRvY3VtZW50IGVsZW1lbnQiLAogICBuYW1lczogWwogICAgICJsaWJjb3JlLnhtbC5LeG1sUHVsbFBhcnNlckR0ZFRlc3QjdGVzdERvY3R5cGVJbkRvY3VtZW50RWxlbWVudCIsCkBAIC0zMzQsMTEgKzMxMyw2IEBACiAgIG5hbWU6ICJ0ZXN0cy5qYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyVGVzdCN0ZXN0U2VjdXJlQ2xhc3NMb2FkZXJDbGFzc0xvYWRlciIKIH0sCiB7Ci0gIGRlc2NyaXB0aW9uOiAiQXNzZXJ0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvIHRydWUuLi4gV29ya3MgaW4gamF2YXguQ2VydGlmaWNhdGUiLAotICByZXN1bHQ6IEVYRUNfRkFJTEVELAotICBuYW1lOiAidGVzdHMuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVRlc3QjdGVzdEdldEVuY29kZWQiCi19LAotewogICBkZXNjcmlwdGlvbjogIk5vdCBhbGwgRHJpdmVycyBhcmUgbG9hZGVkIGluIHRlc3RzZXR1cC4gQ2xhc3NMb2FkZXIgaXNzdWUgaW4gRHJpdmVyTWFuYWdlci4iLAogICByZXN1bHQ6IEVYRUNfRkFJTEVELAogICBuYW1lOiAib3JnLmFwYWNoZS5oYXJtb255LnNxbC50ZXN0cy5qYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyVGVzdCN0ZXN0RGVyZWdpc3RlckRyaXZlciIKQEAgLTE2ODAsNSArMTY1NCw0MiBAQAogICAgICJsaWJjb3JlLnhtbC5KYXhlblhQYXRoVGVzdFN1aXRlJDQjeG1sL3dlYi54bWwgL3dlYi1hcHAvc2VydmxldFsxXSB1cHBlci1jYXNlKCBzZXJ2bGV0LWNsYXNzLCAnZnInICkiLAogICAgICJsaWJjb3JlLnhtbC5KYXhlblhQYXRoVGVzdFN1aXRlJDQjeG1sL3dlYi54bWwgL3dlYi1hcHAvc2VydmxldFsxXSB1cHBlci1jYXNlKCBzZXJ2bGV0LWNsYXNzLCAnZnItQ0EnICkiCiAgIF0KK30sCit7CisgIGRlc2NyaXB0aW9uOiAiQW5kcm9pZCdzIFBLSVggdmFsaWRhdGlvbiBmYWlscyBvbiBtYW55IE5JU1QgUEtJWCB0ZXN0cyIsCisgIGJ1ZzogODAzMDEzOCwKKyAgbmFtZXM6IFsKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0QmFzaWNDZXJ0aWZpY2F0ZVJldm9jYXRpb25UZXN0c19JbnZhbGlkTG9uZ1NlcmlhbE51bWJlclRlc3QxOCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdEJhc2ljQ2VydGlmaWNhdGVSZXZvY2F0aW9uVGVzdHNfSW52YWxpZE5lZ2F0aXZlU2VyaWFsTnVtYmVyVGVzdDE1IiwKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0QmFzaWNDZXJ0aWZpY2F0ZVJldm9jYXRpb25UZXN0c19JbnZhbGlkUmV2b2tlZENBVGVzdDIiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3RCYXNpY0NlcnRpZmljYXRlUmV2b2NhdGlvblRlc3RzX0ludmFsaWRSZXZva2VkRUVUZXN0MyIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdEJhc2ljQ2VydGlmaWNhdGVSZXZvY2F0aW9uVGVzdHNfSW52YWxpZFNlcGFyYXRlQ2VydGlmaWNhdGVhbmRDUkxLZXlzVGVzdDIwIiwKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0QmFzaWNDZXJ0aWZpY2F0ZVJldm9jYXRpb25UZXN0c19JbnZhbGlkU2VwYXJhdGVDZXJ0aWZpY2F0ZWFuZENSTEtleXNUZXN0MjEiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3RCYXNpY0NlcnRpZmljYXRlUmV2b2NhdGlvblRlc3RzX0ludmFsaWRVbmtub3duQ1JMRW50cnlFeHRlbnNpb25UZXN0OCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdEJhc2ljQ2VydGlmaWNhdGVSZXZvY2F0aW9uVGVzdHNfVmFsaWRTZXBhcmF0ZUNlcnRpZmljYXRlYW5kQ1JMS2V5c1Rlc3QxOSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERlbHRhQ1JMc19JbnZhbGlkZGVsdGFDUkxUZXN0MyIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERlbHRhQ1JMc19JbnZhbGlkZGVsdGFDUkxUZXN0NCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERlbHRhQ1JMc19JbnZhbGlkZGVsdGFDUkxUZXN0NiIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERlbHRhQ1JMc19JbnZhbGlkZGVsdGFDUkxUZXN0OSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19JbnZhbGlkSURQd2l0aGluZGlyZWN0Q1JMVGVzdDIzIiwKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0RGlzdHJpYnV0aW9uUG9pbnRzX0ludmFsaWRjUkxJc3N1ZXJUZXN0MzQiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3REaXN0cmlidXRpb25Qb2ludHNfSW52YWxpZGRpc3RyaWJ1dGlvblBvaW50VGVzdDIiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3REaXN0cmlidXRpb25Qb2ludHNfSW52YWxpZGRpc3RyaWJ1dGlvblBvaW50VGVzdDYiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3REaXN0cmlidXRpb25Qb2ludHNfSW52YWxpZG9ubHlTb21lUmVhc29uc1Rlc3QxNSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19JbnZhbGlkb25seVNvbWVSZWFzb25zVGVzdDE2IiwKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0RGlzdHJpYnV0aW9uUG9pbnRzX0ludmFsaWRvbmx5U29tZVJlYXNvbnNUZXN0MjAiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3REaXN0cmlidXRpb25Qb2ludHNfSW52YWxpZG9ubHlTb21lUmVhc29uc1Rlc3QyMSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZElEUHdpdGhpbmRpcmVjdENSTFRlc3QyNCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZElEUHdpdGhpbmRpcmVjdENSTFRlc3QyNSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZGNSTElzc3VlclRlc3QyOCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZGNSTElzc3VlclRlc3QyOSIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZGNSTElzc3VlclRlc3QzMCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdERpc3RyaWJ1dGlvblBvaW50c19WYWxpZGNSTElzc3VlclRlc3QzMyIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdEtleVVzYWdlX1ZhbGlkU2VsZklzc3VlZERObmFtZUNvbnN0cmFpbnRzVGVzdDE5IiwKKyAgICAibGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlTmlzdFBraXRzVGVzdCN0ZXN0VmVyaWZ5aW5nTmFtZUNoYWluaW5nX1ZhbGlkUkZDMzI4ME9wdGlvbmFsQXR0cmlidXRlVHlwZXNUZXN0OCIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdFZlcmlmeWluZ1BhdGhzd2l0aFNlbGZJc3N1ZWRDZXJ0aWZpY2F0ZXNfSW52YWxpZEJhc2ljU2VsZklzc3VlZE9sZFdpdGhOZXdUZXN0MiIsCisgICAgImxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZU5pc3RQa2l0c1Rlc3QjdGVzdFZlcmlmeWluZ1BhdGhzd2l0aFNlbGZJc3N1ZWRDZXJ0aWZpY2F0ZXNfVmFsaWRCYXNpY1NlbGZJc3N1ZWRDUkxTaWduaW5nS2V5VGVzdDYiLAorICAgICJsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVOaXN0UGtpdHNUZXN0I3Rlc3RWZXJpZnlpbmdQYXRoc3dpdGhTZWxmSXNzdWVkQ2VydGlmaWNhdGVzX1ZhbGlkQmFzaWNTZWxmSXNzdWVkTmV3V2l0aE9sZFRlc3Q0IgorICBdCiB9CiBdCmRpZmYgLS1naXQgYS9leHBlY3RhdGlvbnMvdGFnZ2VkdGVzdHMudHh0IGIvZXhwZWN0YXRpb25zL3RhZ2dlZHRlc3RzLnR4dAppbmRleCA4ODM4NjRjLi5hYTIyMGQwIDEwMDY0NAotLS0gYS9leHBlY3RhdGlvbnMvdGFnZ2VkdGVzdHMudHh0CisrKyBiL2V4cGVjdGF0aW9ucy90YWdnZWR0ZXN0cy50eHQKQEAgLTcsMTIgKzcsMTIgQEAKICAgZGVzY3JpcHRpb246ICJsYXJnZSB0ZXN0cyIsCiAgIHJlc3VsdDogU1VDQ0VTUywKICAgbmFtZXM6IFsKLSAgICAiamF2YS51dGlsLkVudW1TZXQuRW51bVNldEJhc2giLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXJUZXN0I3Rlc3RBbGxDb2RlUG9pbnRzIiwKLSAgICAibGliY29yZS5qYXZheC5uZXQuc3NsLlNTTFNvY2tldFRlc3QiLAorICAgIC8qIGxpYmNvcmUgdGVzdHMgdGhhdCB0YWtlIG92ZXIgMTUgbWludXRlcyBvbiBkZXZpY2UgYmVjYXVzZSBvZiBESFBhcmFtZXRlcnNIZWxwZXIuZ2VuZXJhdGVTYWZlUHJpbWVzICovCiAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8udGVzdHMuamF2YXguY3J5cHRvLmZ1bmMuS2V5QWdyZWVtZW50RnVuY3Rpb25hbFRlc3QiLAogICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHJpdmF0ZUtleVRlc3QiLAogICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLmphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHVibGljS2V5VGVzdCIsCisgICAgLyogbm9uLUFPU1AgdGVzdHMgaHR0cDovL2IvODAyNzA2NiAqLworICAgICJqYXZhLnV0aWwuRW51bVNldC5FbnVtU2V0QmFzaCIsCiAgICAgImphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbS5DbG9zZUFuZEF2YWlsYWJsZVJDIiwKICAgICAiamF2YS5pby5QcmludFN0cmVhbS5PdmVyc3luY2hyb25pemVkVGVzdCIsCiAgICAgImphdmEuaW8uUHJpbnRXcml0ZXIuT3ZlcnN5bmNocm9uaXplZFRlc3QiLApAQCAtNDIsNCArNDIsNCBAQAogICBdLAogICAidGFncyI6IFsgImxhcmdlIiBdCiB9Ci1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9TY29wZWRKYXZhVW5pY29kZVN0cmluZy5oIGIvaW5jbHVkZS9TY29wZWRKYXZhVW5pY29kZVN0cmluZy5oCmluZGV4IGIxMDhhNmIuLmY2ZWQ3YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcuaAorKysgYi9pbmNsdWRlL1Njb3BlZEphdmFVbmljb2RlU3RyaW5nLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogCisgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAorICoKICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKKyAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCkBAIC0yNCwzNCArMjQsNDQgQEAKIC8vIGpzdHJpbmcuIFdlIGdpdmUgSUNVIGEgZGlyZWN0IHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlcnMgb24gdGhlIEphdmEgaGVhcC4KIC8vIEl0J3MgY2xldmVyIGVub3VnaCB0byBjb3B5LW9uLXdyaXRlIGlmIG5lY2Vzc2FyeS4KIGNsYXNzIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHsKLXB1YmxpYzoKLSAgICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyhKTklFbnYqIGVudiwganN0cmluZyBzKSA6IG1FbnYoZW52KSwgbVN0cmluZyhzKSB7Ci0gICAgICAgIG1DaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnMobVN0cmluZywgTlVMTCk7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgY2hhckNvdW50ID0gZW52LT5HZXRTdHJpbmdMZW5ndGgobVN0cmluZyk7Ci0gICAgICAgIG1Vbmljb2RlU3RyaW5nLnNldFRvKGZhbHNlLCBtQ2hhcnMsIGNoYXJDb3VudCk7CisgcHVibGljOgorICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyhKTklFbnYqIGVudiwganN0cmluZyBzKSA6IG1FbnYoZW52KSwgbVN0cmluZyhzKSB7CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihtRW52LCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgbUNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyhtU3RyaW5nLCBOVUxMKTsKKyAgICAgIGNvbnN0IGludDMyX3QgY2hhckNvdW50ID0gZW52LT5HZXRTdHJpbmdMZW5ndGgobVN0cmluZyk7CisgICAgICBtVW5pY29kZVN0cmluZy5zZXRUbyhmYWxzZSwgbUNoYXJzLCBjaGFyQ291bnQpOwogICAgIH0KKyAgfQogCi0gICAgflNjb3BlZEphdmFVbmljb2RlU3RyaW5nKCkgewotICAgICAgICBtRW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMobVN0cmluZywgbUNoYXJzKTsKKyAgflNjb3BlZEphdmFVbmljb2RlU3RyaW5nKCkgeworICAgIGlmIChtU3RyaW5nICE9IE5VTEwpIHsKKyAgICAgIG1FbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhtU3RyaW5nLCBtQ2hhcnMpOwogICAgIH0KKyAgfQogCi0gICAgY29uc3QgVW5pY29kZVN0cmluZyYgdW5pY29kZVN0cmluZygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Vbmljb2RlU3RyaW5nOwotICAgIH0KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1TdHJpbmcgIT0gTlVMTCk7CisgIH0KIAotICAgIFVuaWNvZGVTdHJpbmcmIHVuaWNvZGVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtVW5pY29kZVN0cmluZzsKLSAgICB9CisgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHVuaWNvZGVTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vbmljb2RlU3RyaW5nOworICB9CiAKLXByaXZhdGU6Ci0gICAgSk5JRW52KiBtRW52OwotICAgIGpzdHJpbmcgbVN0cmluZzsKLSAgICBjb25zdCBVQ2hhciogbUNoYXJzOwotICAgIFVuaWNvZGVTdHJpbmcgbVVuaWNvZGVTdHJpbmc7CisgIFVuaWNvZGVTdHJpbmcmIHVuaWNvZGVTdHJpbmcoKSB7CisgICAgcmV0dXJuIG1Vbmljb2RlU3RyaW5nOworICB9CiAKLSAgICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ25tZW50LgotICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nKGNvbnN0IFNjb3BlZEphdmFVbmljb2RlU3RyaW5nJik7Ci0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcmKTsKKyBwcml2YXRlOgorICBKTklFbnYqIG1FbnY7CisgIGpzdHJpbmcgbVN0cmluZzsKKyAgY29uc3QgVUNoYXIqIG1DaGFyczsKKyAgVW5pY29kZVN0cmluZyBtVW5pY29kZVN0cmluZzsKKworICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ25tZW50LgorICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyhjb25zdCBTY29wZWRKYXZhVW5pY29kZVN0cmluZyYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTY29wZWRKYXZhVW5pY29kZVN0cmluZyYpOwogfTsKIAogI2VuZGlmICAvLyBTQ09QRURfSkFWQV9VTklDT0RFX1NUUklOR19IX2luY2x1ZGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL1Njb3BlZFByaW1pdGl2ZUFycmF5LmggYi9pbmNsdWRlL1Njb3BlZFByaW1pdGl2ZUFycmF5LmgKaW5kZXggMDc5ZTk4Yy4uZjY2MjZiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9TY29wZWRQcmltaXRpdmVBcnJheS5oCisrKyBiL2luY2x1ZGUvU2NvcGVkUHJpbWl0aXZlQXJyYXkuaApAQCAtNDAsNiArNDAsNyBAQAogICAgICAgICAgICAgfSBcCiAgICAgICAgIH0gXAogICAgICAgICBjb25zdCBQUklNSVRJVkVfVFlQRSogZ2V0KCkgY29uc3QgeyByZXR1cm4gbVJhd0FycmF5OyB9IFwKKyAgICAgICAgUFJJTUlUSVZFX1RZUEUgIyMgQXJyYXkgZ2V0SmF2YUFycmF5KCkgY29uc3QgeyByZXR1cm4gbUphdmFBcnJheTsgfSBcCiAgICAgICAgIGNvbnN0IFBSSU1JVElWRV9UWVBFJiBvcGVyYXRvcltdKHNpemVfdCBuKSBjb25zdCB7IHJldHVybiBtUmF3QXJyYXlbbl07IH0gXAogICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1FbnYtPkdldEFycmF5TGVuZ3RoKG1KYXZhQXJyYXkpOyB9IFwKICAgICBwcml2YXRlOiBcCkBAIC04Miw2ICs4Myw3IEBACiAgICAgICAgICAgICB9IFwKICAgICAgICAgfSBcCiAgICAgICAgIGNvbnN0IFBSSU1JVElWRV9UWVBFKiBnZXQoKSBjb25zdCB7IHJldHVybiBtUmF3QXJyYXk7IH0gXAorICAgICAgICBQUklNSVRJVkVfVFlQRSAjIyBBcnJheSBnZXRKYXZhQXJyYXkoKSBjb25zdCB7IHJldHVybiBtSmF2YUFycmF5OyB9IFwKICAgICAgICAgY29uc3QgUFJJTUlUSVZFX1RZUEUmIG9wZXJhdG9yW10oc2l6ZV90IG4pIGNvbnN0IHsgcmV0dXJuIG1SYXdBcnJheVtuXTsgfSBcCiAgICAgICAgIFBSSU1JVElWRV9UWVBFKiBnZXQoKSB7IHJldHVybiBtUmF3QXJyYXk7IH0gXAogICAgICAgICBQUklNSVRJVkVfVFlQRSYgb3BlcmF0b3JbXShzaXplX3QgbikgeyByZXR1cm4gbVJhd0FycmF5W25dOyB9IFwKZGlmZiAtLWdpdCBhL2pzb24vc3JjL21haW4vamF2YS9vcmcvanNvbi9KU09OT2JqZWN0LmphdmEgYi9qc29uL3NyYy9tYWluL2phdmEvb3JnL2pzb24vSlNPTk9iamVjdC5qYXZhCmluZGV4IGU3Y2E3MzUuLmMyYTY1NmMgMTAwNjQ0Ci0tLSBhL2pzb24vc3JjL21haW4vamF2YS9vcmcvanNvbi9KU09OT2JqZWN0LmphdmEKKysrIGIvanNvbi9zcmMvbWFpbi9qYXZhL29yZy9qc29uL0pTT05PYmplY3QuamF2YQpAQCAtNDEsMTIgKzQxLDEyIEBACiAgKiAgICAgICBiZSBjb2VyY2VkIHVzaW5nIHtAbGluayBOdW1iZXIjaW50VmFsdWUoKSBpbnRWYWx1ZX0uIFN0cmluZ3MKICAqICAgICAgIHRoYXQgY2FuIGJlIGNvZXJjZWQgdXNpbmcge0BsaW5rIERvdWJsZSN2YWx1ZU9mKFN0cmluZyl9IHdpbGwgYmUsCiAgKiAgICAgICBhbmQgdGhlbiBjYXN0IHRvIGludC4KLSAqICAgPGxpPldoZW4gdGhlIHJlcXVlc3RlZCB0eXBlIGlzIGEgbG9uZywgb3RoZXIge0BsaW5rIE51bWJlcn0gdHlwZXMgd2lsbAorICogICA8bGk+PGEgbmFtZT0ibG9zc3kiPldoZW4gdGhlIHJlcXVlc3RlZCB0eXBlIGlzIGEgbG9uZywgb3RoZXIge0BsaW5rIE51bWJlcn0gdHlwZXMgd2lsbAogICogICAgICAgYmUgY29lcmNlZCB1c2luZyB7QGxpbmsgTnVtYmVyI2xvbmdWYWx1ZSgpIGxvbmdWYWx1ZX0uIFN0cmluZ3MKICAqICAgICAgIHRoYXQgY2FuIGJlIGNvZXJjZWQgdXNpbmcge0BsaW5rIERvdWJsZSN2YWx1ZU9mKFN0cmluZyl9IHdpbGwgYmUsCiAgKiAgICAgICBhbmQgdGhlbiBjYXN0IHRvIGxvbmcuIFRoaXMgdHdvLXN0ZXAgY29udmVyc2lvbiBpcyBsb3NzeSBmb3IgdmVyeQogICogICAgICAgbGFyZ2UgdmFsdWVzLiBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyAiOTIyMzM3MjAzNjg1NDc3NTgwNiIgeWllbGRzIHRoZQotICogICAgICAgbG9uZyA5MjIzMzcyMDM2ODU0Nzc1ODA3LgorICogICAgICAgbG9uZyA5MjIzMzcyMDM2ODU0Nzc1ODA3LjwvYT4KICAqICAgPGxpPldoZW4gdGhlIHJlcXVlc3RlZCB0eXBlIGlzIGEgU3RyaW5nLCBvdGhlciBub24tbnVsbCB2YWx1ZXMgd2lsbCBiZQogICogICAgICAgY29lcmNlZCB1c2luZyB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0uIEFsdGhvdWdoIG51bGwgY2Fubm90IGJlCiAgKiAgICAgICBjb2VyY2VkLCB0aGUgc2VudGluZWwgdmFsdWUge0BsaW5rIEpTT05PYmplY3QjTlVMTH0gaXMgY29lcmNlZCB0byB0aGUKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSA9PSBudWxsIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuYW1lVmFsdWVQYWlycy5wdXQoa2V5LCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfQpAQCAtNDY4LDcgKzQ2OCw4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBtYXBwZWQgYnkge0Bjb2RlIG5hbWV9IGlmIGl0IGV4aXN0cyBhbmQgaXMgYSBsb25nIG9yCi0gICAgICogY2FuIGJlIGNvZXJjZWQgdG8gYSBsb25nLgorICAgICAqIGNhbiBiZSBjb2VyY2VkIHRvIGEgbG9uZy4gTm90ZSB0aGF0IEpTT04gcmVwcmVzZW50cyBudW1iZXJzIGFzIGRvdWJsZXMsCisgICAgICogc28gdGhpcyBpcyA8YSBocmVmPSIjbG9zc3kiPmxvc3N5PC9hPjsgdXNlIHN0cmluZ3MgdG8gdHJhbnNmZXIgbnVtYmVycyB2aWEgSlNPTi4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSlNPTkV4Y2VwdGlvbiBpZiB0aGUgbWFwcGluZyBkb2Vzbid0IGV4aXN0IG9yIGNhbm5vdCBiZSBjb2VyY2VkCiAgICAgICogICAgIHRvIGEgbG9uZy4KQEAgLTQ4NCw3ICs0ODUsOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgbWFwcGVkIGJ5IHtAY29kZSBuYW1lfSBpZiBpdCBleGlzdHMgYW5kIGlzIGEgbG9uZyBvcgotICAgICAqIGNhbiBiZSBjb2VyY2VkIHRvIGEgbG9uZy4gUmV0dXJucyAwIG90aGVyd2lzZS4KKyAgICAgKiBjYW4gYmUgY29lcmNlZCB0byBhIGxvbmcuIFJldHVybnMgMCBvdGhlcndpc2UuIE5vdGUgdGhhdCBKU09OIHJlcHJlc2VudHMgbnVtYmVycyBhcyBkb3VibGVzLAorICAgICAqIHNvIHRoaXMgaXMgPGEgaHJlZj0iI2xvc3N5Ij5sb3NzeTwvYT47IHVzZSBzdHJpbmdzIHRvIHRyYW5zZmVyIG51bWJlcnMgdmlhIEpTT04uCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgb3B0TG9uZyhTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gb3B0TG9uZyhuYW1lLCAwTCk7CkBAIC00OTIsNyArNDk0LDkgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG1hcHBlZCBieSB7QGNvZGUgbmFtZX0gaWYgaXQgZXhpc3RzIGFuZCBpcyBhIGxvbmcgb3IKLSAgICAgKiBjYW4gYmUgY29lcmNlZCB0byBhIGxvbmcuIFJldHVybnMge0Bjb2RlIGZhbGxiYWNrfSBvdGhlcndpc2UuCisgICAgICogY2FuIGJlIGNvZXJjZWQgdG8gYSBsb25nLiBSZXR1cm5zIHtAY29kZSBmYWxsYmFja30gb3RoZXJ3aXNlLiBOb3RlIHRoYXQgSlNPTiByZXByZXNlbnRzCisgICAgICogbnVtYmVycyBhcyBkb3VibGVzLCBzbyB0aGlzIGlzIDxhIGhyZWY9IiNsb3NzeSI+bG9zc3k8L2E+OyB1c2Ugc3RyaW5ncyB0byB0cmFuc2ZlcgorICAgICAqIG51bWJlcnMgdmlhIEpTT04uCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgb3B0TG9uZyhTdHJpbmcgbmFtZSwgbG9uZyBmYWxsYmFjaykgewogICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3B0KG5hbWUpOwpkaWZmIC0tZ2l0IGEvanNvbi9zcmMvbWFpbi9qYXZhL29yZy9qc29uL0pTT05Ub2tlbmVyLmphdmEgYi9qc29uL3NyYy9tYWluL2phdmEvb3JnL2pzb24vSlNPTlRva2VuZXIuamF2YQppbmRleCBlYmZhYmU0Li4yMDJlMmU2IDEwMDY0NAotLS0gYS9qc29uL3NyYy9tYWluL2phdmEvb3JnL2pzb24vSlNPTlRva2VuZXIuamF2YQorKysgYi9qc29uL3NyYy9tYWluL2phdmEvb3JnL2pzb24vSlNPTlRva2VuZXIuamF2YQpAQCAtNTQzLDcgKzU0Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBuZXh0VG8oU3RyaW5nIGV4Y2x1ZGVkKSB7CiAgICAgICAgIGlmIChleGNsdWRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZXhjbHVkZWQgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXh0VG9JbnRlcm5hbChleGNsdWRlZCkudHJpbSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkUmVhZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZFJlYWRlci5qYXZhCmluZGV4IDAzZWNmOWYuLjlmYmEwMzkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkUmVhZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRSZWFkZXIuamF2YQpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogUG9wdWxhdGVzIHRoZSBidWZmZXIgd2l0aCBkYXRhLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KICAgICAgKiB0aGUgYnVmZmVyIHN0aWxsIGNvbnRhaW5zIGRhdGE7IGllLiBpZiB7QGNvZGUgcG9zIDwgZW5kfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gdGhlIGJ1ZmZlciwgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgcmVhZCBpbnRvIHRoZSBidWZmZXIsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlCiAgICAgICogICAgICBzb3VyY2Ugc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZmlsbEJ1ZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCBtYXJrTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtYXJrTGltaXQgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXJrTGltaXQgPCAwOiIgKyBtYXJrTGltaXQpOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewogICAgICAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgICAqIEBwYXJhbSBidWZmZXIKICAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgcmVhZC4KICAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byBzdG9yZSB0aGUgYnl0ZXMgcmVhZAorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4ge0Bjb2RlIGJ1ZmZlcn0gdG8gc3RvcmUgdGhlIGNoYXJzIHJlYWQKICAgICAgKiAgICAgICAgICAgIGZyb20gdGhpcyByZWFkZXIuCiAgICAgICogQHBhcmFtIGxlbmd0aAogICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCwgbXVzdCBiZQpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICAgICAgICAgICB3aGlsZSAob3V0c3RhbmRpbmcgPiAwKSB7CiAKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGFyZSBieXRlcyBpbiB0aGUgYnVmZmVyLCBncmFiIHRob3NlIGZpcnN0LgorICAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGFyZSBjaGFycyBpbiB0aGUgYnVmZmVyLCBncmFiIHRob3NlIGZpcnN0LgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBlbmQgLSBwb3M7CiAgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA+IDApIHsKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgbWFrZQogICAgICAgICAgICAgICAgICAqIHN1cmUgd2UgcmVhbGx5LCByZWFsbHkgd2FudCB0by4gV2Ugd29uJ3QgYm90aGVyIGlmIHdlJ3JlCi0gICAgICAgICAgICAgICAgICogZG9uZSwgb3IgaWYgd2UndmUgYWxyZWFkeSBnb3Qgc29tZSBieXRlcyBhbmQgcmVhZGluZyBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAqIGRvbmUsIG9yIGlmIHdlJ3ZlIGFscmVhZHkgZ290IHNvbWUgY2hhcnMgYW5kIHJlYWRpbmcgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbSB3b3VsZCBibG9jay4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpZiAob3V0c3RhbmRpbmcgPT0gMCB8fCAob3V0c3RhbmRpbmcgPCBsZW5ndGggJiYgIWluLnJlYWR5KCkpKSB7CkBAIC0zMDIsNyArMzAyLDcgQEAKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogSWYgd2UncmUgdW5tYXJrZWQgYW5kIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gb3VyCi0gICAgICAgICAgICAgICAgICogYnVmZmVyLCByZWFkIHRoZSBieXRlcyBkaXJlY3RseSBpbnRvIHRoZSBjYWxsZXIncyBidWZmZXIuIFdlCisgICAgICAgICAgICAgICAgICogYnVmZmVyLCByZWFkIHRoZSBjaGFycyBkaXJlY3RseSBpbnRvIHRoZSBjYWxsZXIncyBidWZmZXIuIFdlCiAgICAgICAgICAgICAgICAgICogZG9uJ3QgcmVhZCBpbnRvIHNtYWxsZXIgYnVmZmVycyBiZWNhdXNlIHRoYXQgY291bGQgcmVzdWx0IGluCiAgICAgICAgICAgICAgICAgICogYSBtYW55IHJlYWRzLgogICAgICAgICAgICAgICAgICAqLwpAQCAtNDY0LDE3ICs0NjQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTa2lwcyB7QGNvZGUgYnl0ZUNvdW50fSBieXRlcyBpbiB0aGlzIHN0cmVhbS4gU3Vic2VxdWVudCBjYWxscyB0bwotICAgICAqIHtAY29kZSByZWFkfSB3aWxsIG5vdCByZXR1cm4gdGhlc2UgYnl0ZXMgdW5sZXNzIHtAY29kZSByZXNldH0gaXMKKyAgICAgKiBTa2lwcyB7QGNvZGUgY2hhckNvdW50fSBjaGFycyBpbiB0aGlzIHN0cmVhbS4gU3Vic2VxdWVudCBjYWxscyB0bworICAgICAqIHtAY29kZSByZWFkfSB3aWxsIG5vdCByZXR1cm4gdGhlc2UgY2hhcnMgdW5sZXNzIHtAY29kZSByZXNldH0gaXMKICAgICAgKiB1c2VkLgotICAgICAqIFNraXBwaW5nIGNoYXJhY3RlcnMgbWF5IGludmFsaWRhdGUgYSBtYXJrIGlmIHtAY29kZSBtYXJrTGltaXR9CisgICAgICoKKyAgICAgKiA8cD5Ta2lwcGluZyBjaGFyYWN0ZXJzIG1heSBpbnZhbGlkYXRlIGEgbWFyayBpZiB7QGNvZGUgbWFya0xpbWl0fQogICAgICAqIGlzIHN1cnBhc3NlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBieXRlQ291bnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAuCisgICAgICogQHBhcmFtIGNoYXJDb3VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHNraXBwZWQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnl0ZUNvdW50IDwgMH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGNoYXJDb3VudCA8IDB9LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIHJlYWRlciBpcyBjbG9zZWQgb3Igc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqIEBzZWUgI21hcmsoaW50KQpAQCAtNDgyLDM1ICs0ODEsMzUgQEAKICAgICAgKiBAc2VlICNyZXNldCgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIGJ5dGVDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJ5dGVDb3VudCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ5dGVDb3VudCA8IDA6ICIgKyBieXRlQ291bnQpOworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBjaGFyQ291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjaGFyQ291bnQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGFyQ291bnQgPCAwOiAiICsgY2hhckNvdW50KTsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKICAgICAgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZUNvdW50IDwgMSkgeworICAgICAgICAgICAgaWYgKGNoYXJDb3VudCA8IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgLSBwb3MgPj0gYnl0ZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgcG9zICs9IGJ5dGVDb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZUNvdW50OworICAgICAgICAgICAgaWYgKGVuZCAtIHBvcyA+PSBjaGFyQ291bnQpIHsKKyAgICAgICAgICAgICAgICBwb3MgKz0gY2hhckNvdW50OworICAgICAgICAgICAgICAgIHJldHVybiBjaGFyQ291bnQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGxvbmcgcmVhZCA9IGVuZCAtIHBvczsKICAgICAgICAgICAgIHBvcyA9IGVuZDsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkIDwgYnl0ZUNvdW50KSB7CisgICAgICAgICAgICB3aGlsZSAocmVhZCA8IGNoYXJDb3VudCkgewogICAgICAgICAgICAgICAgIGlmIChmaWxsQnVmKCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbmQgLSBwb3MgPj0gYnl0ZUNvdW50IC0gcmVhZCkgewotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gYnl0ZUNvdW50IC0gcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoZW5kIC0gcG9zID49IGNoYXJDb3VudCAtIHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zICs9IGNoYXJDb3VudCAtIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyQ291bnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGdldCBhbGwgdGhlIGNoYXJhY3RlcnMsIHNraXAgd2hhdCB3ZSByZWFkCiAgICAgICAgICAgICAgICAgcmVhZCArPSAoZW5kIC0gcG9zKTsKICAgICAgICAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZUNvdW50OworICAgICAgICAgICAgcmV0dXJuIGNoYXJDb3VudDsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkV3JpdGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9CdWZmZXJlZFdyaXRlci5qYXZhCmluZGV4IDU1YWUxMjEuLmJiYjE4ZjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL0J1ZmZlcmVkV3JpdGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vQnVmZmVyZWRXcml0ZXIuamF2YQpAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnVmZmVyZWRXcml0ZXJ9LCBwcm92aWRpbmcge0Bjb2RlIG91dH0gd2l0aCBhIGJ1ZmZlcgotICAgICAqIG9mIDgxOTIgYnl0ZXMuCisgICAgICogb2YgODE5MiBjaGFycy4KICAgICAgKgogICAgICAqIEBwYXJhbSBvdXQgdGhlIHtAY29kZSBXcml0ZXJ9IHRoZSBidWZmZXIgd3JpdGVzIHRvLgogICAgICAqLwpAQCAtNTUsMTEgKzU1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnVmZmVyZWRXcml0ZXJ9LCBwcm92aWRpbmcge0Bjb2RlIG91dH0gd2l0aCB7QGNvZGUgc2l6ZX0gYnl0ZXMKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCdWZmZXJlZFdyaXRlcn0sIHByb3ZpZGluZyB7QGNvZGUgb3V0fSB3aXRoIHtAY29kZSBzaXplfSBjaGFycwogICAgICAqIG9mIGJ1ZmZlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBvdXQgdGhlIHtAY29kZSBPdXRwdXRTdHJlYW19IHRoZSBidWZmZXIgd3JpdGVzIHRvLgotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiBidWZmZXIgaW4gY2hhcnMuCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHNpemUgPD0gMH0uCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkV3JpdGVyKFdyaXRlciBvdXQsIGludCBzaXplKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RTdHJlYW1DbGFzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YQppbmRleCBhMjg0ODlhLi4xYmRlMzE0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9PYmplY3RTdHJlYW1DbGFzcy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL09iamVjdFN0cmVhbUNsYXNzLmphdmEKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIHByaXZhdGUgdHJhbnNpZW50IENsYXNzPD8+IHJlc29sdmVkQ2xhc3M7CiAKICAgICBwcml2YXRlIHRyYW5zaWVudCBDbGFzczw/PiByZXNvbHZlZENvbnN0cnVjdG9yQ2xhc3M7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IHJlc29sdmVkQ29uc3RydWN0b3JNZXRob2RJZDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIHJlc29sdmVkQ29uc3RydWN0b3JNZXRob2RJZDsKIAogICAgIC8vIFNlcmlhbCB2ZXJzaW9uIFVJRCBvZiB0aGUgY2xhc3MgdGhlIGRlc2NyaXB0b3IgcmVwcmVzZW50cwogICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgc3ZVSUQ7CkBAIC02NTMsNyArNjUzLDcgQEAKICAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yQ2xhc3MoaW5zdGFudGlhdGlvbkNsYXNzKTsKICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGluc3RhbnRpYXRpb25DbGFzcywgcmVzb2x2ZWRDb25zdHJ1Y3Rvck1ldGhvZElkKTsKICAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzczw/PiBpbnN0YW50aWF0aW9uQ2xhc3MsIGludCBtZXRob2RJZCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzczw/PiBpbnN0YW50aWF0aW9uQ2xhc3MsIGxvbmcgbWV0aG9kSWQpOwogCiAgICAgcHJpdmF0ZSBDbGFzczw/PiByZXNvbHZlQ29uc3RydWN0b3JDbGFzcyhDbGFzczw/PiBvYmplY3RDbGFzcykgdGhyb3dzIEludmFsaWRDbGFzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChyZXNvbHZlZENvbnN0cnVjdG9yQ2xhc3MgIT0gbnVsbCkgewpAQCAtNzIwLDcgKzcyMCw3IEBACiAgICAgICAgIHJlc29sdmVkQ29uc3RydWN0b3JNZXRob2RJZCA9IGdldENvbnN0cnVjdG9ySWQocmVzb2x2ZWRDb25zdHJ1Y3RvckNsYXNzKTsKICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yQ2xhc3M7CiAgICAgfQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Q29uc3RydWN0b3JJZChDbGFzczw/PiBjKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRDb25zdHJ1Y3RvcklkKENsYXNzPD8+IGMpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHR3byBjbGFzc2VzIGJlbG9uZyB0byB0aGUgc2FtZSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRJbnB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGFhNzdlNmUuLjczOWZiOTggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkSW5wdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZElucHV0U3RyZWFtLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogCiAvKioKICAqIFJlY2VpdmVzIGluZm9ybWF0aW9uIGZyb20gYSBjb21tdW5pY2F0aW9ucyBwaXBlLiBXaGVuIHR3byB0aHJlYWRzIHdhbnQgdG8KQEAgLTIzNSw3ICsyMzYsNyBAQAogICAgICAgICAgICAgICAgIHdhaXQoMTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBJb1V0aWxzLnRocm93SW50ZXJydXB0ZWRJb0V4Y2VwdGlvbigpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHJlc3VsdCA9IGJ1ZmZlcltvdXQrK10gJiAweGZmOwpAQCAtMzE0LDcgKzMxNSw3IEBACiAgICAgICAgICAgICAgICAgd2FpdCgxMDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIElvVXRpbHMudGhyb3dJbnRlcnJ1cHRlZElvRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgdG90YWxDb3BpZWQgPSAwOwpAQCAtMzk0LDcgKzM5NSw3IEBACiAgICAgICAgICAgICAgICAgd2FpdCgxMDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIElvVXRpbHMudGhyb3dJbnRlcnJ1cHRlZElvRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlBpcGUgaXMgY2xvc2VkIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZFJlYWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vUGlwZWRSZWFkZXIuamF2YQppbmRleCA2MTkwYzg2Li44NDUwYTM0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9QaXBlZFJlYWRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1BpcGVkUmVhZGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2UgamF2YS5pbzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogCiAvKioKICAqIFJlY2VpdmVzIGluZm9ybWF0aW9uIG9uIGEgY29tbXVuaWNhdGlvbnMgcGlwZS4gV2hlbiB0d28gdGhyZWFkcyB3YW50IHRvIHBhc3MKQEAgLTI2MSw3ICsyNjIsNyBAQAogICAgICAgICAgICAgICAgIHdhaXQoMTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBJb1V0aWxzLnRocm93SW50ZXJydXB0ZWRJb0V4Y2VwdGlvbigpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IGNvcHlMZW5ndGggPSAwOwpAQCAtMzYyLDcgKzM2Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgSW9VdGlscy50aHJvd0ludGVycnVwdGVkSW9FeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGlwZSBpcyBjbG9zZWQiKTsKQEAgLTQxMSw3ICs0MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgSW9VdGlscy50aHJvd0ludGVycnVwdGVkSW9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGlwZSBpcyBjbG9zZWQiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2lvL1N0cmluZ1JlYWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nUmVhZGVyLmphdmEKaW5kZXggOWY4ZmYxMy4uNTU3OWQ2MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nUmVhZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nUmVhZGVyLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChyZWFkTGltaXQgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZWFkTGltaXQgPCAwOiAiICsgcmVhZExpbWl0KTsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvaW8vU3RyaW5nV3JpdGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdXcml0ZXIuamF2YQppbmRleCBmMGIxZDE4Li4yOTQ2NDgzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdXcml0ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9pby9TdHJpbmdXcml0ZXIuamF2YQpAQCAtNDksMTEgKzQ5LDExIEBACiAgICAgICogd3JpdGVyLgogICAgICAqCiAgICAgICogQHBhcmFtIGluaXRpYWxTaXplCi0gICAgICogICAgICAgICAgICB0aGUgaW50aWFsIHNpemUgb2YgdGhlIHRhcmdldCBzdHJpbmcgYnVmZmVyLgorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdGFyZ2V0IHN0cmluZyBidWZmZXIuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1dyaXRlcihpbnQgaW5pdGlhbFNpemUpIHsKICAgICAgICAgaWYgKGluaXRpYWxTaXplIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5pdGlhbFNpemUgPCAwOiAiICsgaW5pdGlhbFNpemUpOwogICAgICAgICB9CiAgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoaW5pdGlhbFNpemUpOwogICAgICAgICBsb2NrID0gYnVmOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9DbGFzcy5qYXZhCmluZGV4IGI2MTgzYTUuLmY2MThiNjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvQ2xhc3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL0NsYXNzLmphdmEKQEAgLTE0OCwxOCArMTQ4LDE1IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENsYXNzfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2xhc3Mgd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgZGVzY3JpYmVkIGluCi0gICAgICogdGhlIHtAbGluayBDbGFzcyBjbGFzcyBkZWZpbml0aW9ufTsgaG93ZXZlciwge0Bjb2RlIENsYXNzfWVzIHJlcHJlc2VudGluZwotICAgICAqIHByaW1pdGl2ZSB0eXBlcyBjYW4gbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgbWV0aG9kLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGFzcyBoYXMgbm90IGJlZW4gbG9hZGVkIHNvIGZhciwgaXQgaXMgYmVpbmcgbG9hZGVkIGFuZCBsaW5rZWQKLSAgICAgKiBmaXJzdC4gVGhpcyBpcyBkb25lIHRocm91Z2ggZWl0aGVyIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIGNhbGxpbmcgY2xhc3MKLSAgICAgKiBvciBvbmUgb2YgaXRzIHBhcmVudCBjbGFzcyBsb2FkZXJzLiBUaGUgY2xhc3MgaXMgYWxzbyBiZWluZyBpbml0aWFsaXplZCwKLSAgICAgKiB3aGljaCBtZWFucyB0aGF0IGEgcG9zc2libGUgc3RhdGljIGluaXRpYWxpemVyIGJsb2NrIGlzIGV4ZWN1dGVkLgorICAgICAqIGdpdmVuIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIG5vbi1wcmltaXRpdmUgY2xhc3MsIGFzIGRlc2NyaWJlZCBpbgorICAgICAqIHRoZSB7QGxpbmsgQ2xhc3MgY2xhc3MgZGVmaW5pdGlvbn0uCisgICAgICogUHJpbWl0aXZlIHR5cGVzIGNhbiBub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBtZXRob2Q7IHVzZSB7QGNvZGUgaW50LmNsYXNzfSBvciB7QGNvZGUgSW50ZWdlci5UWVBFfSBpbnN0ZWFkLgogICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5vbi1wcmltaXRpdmUtdHlwZSBjbGFzcyB0byBmaW5kLgotICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIHtAY29kZSBDbGFzc30gaW5zdGFuY2UuCisgICAgICogPHA+SWYgdGhlIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLCBpdCBpcyBsb2FkZWQgYW5kIGluaXRpYWxpemVkCisgICAgICogZmlyc3QuIFRoaXMgaXMgZG9uZSB0aHJvdWdoIGVpdGhlciB0aGUgY2xhc3MgbG9hZGVyIG9mIHRoZSBjYWxsaW5nIGNsYXNzCisgICAgICogb3Igb25lIG9mIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVycy4gSXQgaXMgcG9zc2libGUgdGhhdCBhIHN0YXRpYyBpbml0aWFsaXplciBpcyBydW4gYXMKKyAgICAgKiBhIHJlc3VsdCBvZiB0aGlzIGNhbGwuCisgICAgICoKICAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGNhbiBub3QgYmUgZm91bmQuCiAgICAgICogQHRocm93cyBMaW5rYWdlRXJyb3IKQEAgLTE3NCwyNCArMTcxLDE0IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENsYXNzfSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2xhc3Mgd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgZGVzY3JpYmVkIGluCi0gICAgICogdGhlIHtAbGluayBDbGFzcyBjbGFzcyBkZWZpbml0aW9ufSwgaG93ZXZlciB7QGNvZGUgQ2xhc3N9ZXMgcmVwcmVzZW50aW5nCi0gICAgICogcHJpbWl0aXZlIHR5cGVzIGNhbiBub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBtZXRob2QuIFNlY3VyaXR5IHJ1bGVzIHdpbGwKLSAgICAgKiBiZSBvYmV5ZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNsYXNzIGhhcyBub3QgYmVlbiBsb2FkZWQgc28gZmFyLCBpdCBpcyBiZWluZyBsb2FkZWQgYW5kIGxpbmtlZAotICAgICAqIGZpcnN0LiBUaGlzIGlzIGRvbmUgdGhyb3VnaCBlaXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIgb3Igb25lIG9mCi0gICAgICogaXRzIHBhcmVudCBjbGFzcyBsb2FkZXJzLiBUaGUgY2FsbGVyIGNhbiBhbHNvIHJlcXVlc3QgdGhlIGNsYXNzIHRvIGJlCi0gICAgICogaW5pdGlhbGl6ZWQsIHdoaWNoIG1lYW5zIHRoYXQgYSBwb3NzaWJsZSBzdGF0aWMgaW5pdGlhbGl6ZXIgYmxvY2sgaXMKLSAgICAgKiBleGVjdXRlZC4KKyAgICAgKiBnaXZlbiBuYW1lLiBUaGUgbmFtZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIGNsYXNzLCBhcyBkZXNjcmliZWQgaW4KKyAgICAgKiB0aGUge0BsaW5rIENsYXNzIGNsYXNzIGRlZmluaXRpb259LgorICAgICAqIFByaW1pdGl2ZSB0eXBlcyBjYW4gbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgbWV0aG9kOyB1c2Uge0Bjb2RlIGludC5jbGFzc30gb3Ige0Bjb2RlIEludGVnZXIuVFlQRX0gaW5zdGVhZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBub24tcHJpbWl0aXZlLXR5cGUgY2xhc3MgdG8gZmluZC4KLSAgICAgKiBAcGFyYW0gaW5pdGlhbGl6ZUJvb2xlYW4KLSAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGFzcyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lZCB7QGNvZGUgQ2xhc3N9IGluc3RhbmNlLgorICAgICAqIDxwPklmIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGxvYWRlZCwgaXQgaXMgbG9hZGVkIGZpcnN0LCB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgorICAgICAqIElmIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkIGFuZCB7QGNvZGUgc2hvdWxkSW5pdGlhbGl6ZX0gaXMgdHJ1ZSwKKyAgICAgKiB0aGUgY2xhc3Mgd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgICAgKgogICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgY2xhc3MgY2FuIG5vdCBiZSBmb3VuZC4KICAgICAgKiBAdGhyb3dzIExpbmthZ2VFcnJvcgpAQCAtMjAwLDcgKzE4Nyw3IEBACiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIGEKICAgICAgKiAgICAgICAgICAgICBjbGFzcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGZvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiBpbml0aWFsaXplQm9vbGVhbiwKKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGZvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiBzaG91bGRJbml0aWFsaXplLAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgewpAQCAtMjA5LDEyICsxOTYsMTIgQEAKICAgICAgICAgLy8gQ2F0Y2ggYW4gRXhjZXB0aW9uIHRocm93biBieSB0aGUgdW5kZXJseWluZyBuYXRpdmUgY29kZS4gSXQgd3JhcHMKICAgICAgICAgLy8gdXAgZXZlcnl0aGluZyBpbnNpZGUgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBldmVuIGlmIGUuZy4gYW4KICAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGlzIGFzIGEgd29ya2Fyb3VuZCBmb3IKLSAgICAgICAgLy8gYW4gRXhjZXB0aW9uSW5Jbml0aWxhaXplckVycm9yIHRoYXQncyBhbHNvIHdyYXBwZWQuIEl0IGlzIGFjdHVhbGx5CisgICAgICAgIC8vIGFuIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciB0aGF0J3MgYWxzbyB3cmFwcGVkLiBJdCBpcyBhY3R1YWxseQogICAgICAgICAvLyBleHBlY3RlZCB0byBiZSB0aHJvd24uIE1heWJlIHRoZSBzYW1lIGdvZXMgZm9yIG90aGVyIGVycm9ycy4KICAgICAgICAgLy8gTm90IHdyYXBwaW5nIHVwIGFsbCB0aGUgZXJyb3JzIHdpbGwgYnJlYWsgYW5kcm9pZCB0aG91Z2guCiAgICAgICAgIENsYXNzPD8+IHJlc3VsdDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemVCb29sZWFuLAorICAgICAgICAgICAgcmVzdWx0ID0gY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgc2hvdWxkSW5pdGlhbGl6ZSwKICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKQEAgLTIyNiwxNyArMjEzLDcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICAvKgotICAgICAqIFJldHVybnMgYSBjbGFzcyBieSBuYW1lIHdpdGhvdXQgYW55IHNlY3VyaXR5IGNoZWNrcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIG5vbi1wcmltaXRpdmUgdHlwZSBjbGFzcyB0byBmaW5kCi0gICAgICogQHBhcmFtIGluaXRpYWxpemVCb29sZWFuIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNsYXNzIHNob3VsZCBiZQotICAgICAqICAgICAgICBpbml0aWFsaXplZAotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIGNsYXNzLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBJZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgc3RhdGljIG5hdGl2ZSBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiBpbml0aWFsaXplQm9vbGVhbiwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUsIGJvb2xlYW4gc2hvdWxkSW5pdGlhbGl6ZSwKICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKIAogICAgIC8qKgpAQCAtMjQ1LDExICsyMjIsMTcgQEAKICAgICAgKiBtZW1iZXJzIGluaGVyaXRlZCBmcm9tIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuIElmIHRoZXJlIGFyZSBubyBzdWNoCiAgICAgICogY2xhc3MgbWVtYmVycyBvciBpZiB0aGlzIG9iamVjdCByZXByZXNlbnRzIGEgcHJpbWl0aXZlIHR5cGUgdGhlbiBhbiBhcnJheQogICAgICAqIG9mIGxlbmd0aCAwIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHVibGljIGNsYXNzIG1lbWJlcnMgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBDbGFzczw/PltdIGdldENsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGdWxsTGlzdE9mQ2xhc3Nlcyh0cnVlKTsKKyAgICAgICAgQ2xhc3M8Pz5bXSByZXN1bHQgPSBnZXREZWNsYXJlZENsYXNzZXModGhpcywgdHJ1ZSk7CisgICAgICAgIC8vIFRyYXZlcnNlIGFsbCBzdXBlcmNsYXNzZXMuCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA9IHRoaXMuZ2V0U3VwZXJjbGFzcygpOyBjICE9IG51bGw7IGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz5bXSB0ZW1wID0gZ2V0RGVjbGFyZWRDbGFzc2VzKGMsIHRydWUpOworICAgICAgICAgICAgaWYgKHRlbXAubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBhcnJheWNvcHkobmV3IENsYXNzW3Jlc3VsdC5sZW5ndGggKyB0ZW1wLmxlbmd0aF0sIHJlc3VsdCwgdGVtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gQSBnZXRBbm5vdGF0aW9uKENsYXNzPEE+IGFubm90YXRpb25UeXBlKSB7CkBAIC0yNzUsMTAgKzI1OCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIGFubm90YXRpb25zIG9mIHRoaXMgY2xhc3MuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucworICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGFubm90YXRpb25zIG9mIHRoaXMgY2xhc3MuIElmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucwogICAgICAqIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgYXJyYXkgY29udGFpbmluZyB0aGlzIGNsYXNzJyBhbm5vdGF0aW9ucy4KICAgICAgKiBAc2VlICNnZXREZWNsYXJlZEFubm90YXRpb25zKCkKICAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgewpAQCAtMzE4LDkgKzMwMCw2IEBACiAgICAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhpcyBjbGFzcy4gSWYgdGhpcyBjbGFzcyBkb2VzIG5vdCBoYXZlIGEKICAgICAgKiBjYW5vbmljYWwgbmFtZSBhcyBkZWZpbmVkIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIHRoZW4gdGhlCiAgICAgICogbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIGNsYXNzJyBjYW5vbmljYWwgbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGRvZXMgbm90IGhhdmUgYQotICAgICAqICAgICAgICAgY2Fub25pY2FsIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKCkgewogICAgICAgICBpZiAoaXNMb2NhbENsYXNzKCkgfHwgaXNBbm9ueW1vdXNDbGFzcygpKQpAQCAtMzYyLDExICszNDEsOCBAQAogICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGxvYWRlciB3aGljaCB3YXMgdXNlZCB0byBsb2FkIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieQogICAgICAqIHRoaXMge0Bjb2RlIENsYXNzfS4gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIHJldHVybiB7QGNvZGUgbnVsbH0gZm9yCiAgICAgICogY2xhc3NlcyB0aGF0IHdlcmUgbG9hZGVkIGJ5IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyLiBUaGUgQW5kcm9pZAotICAgICAqIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoLCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGFjdHVhbAotICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbG9hZGVyIGZvciB0aGUgcmVwcmVzZW50ZWQgY2xhc3MuCi0gICAgICogQHNlZSBDbGFzc0xvYWRlcgorICAgICAqIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoLCBhbHdheXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhbiBhY3R1YWwKKyAgICAgKiBjbGFzcyBsb2FkZXIuCiAgICAgICovCiAgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewogICAgICAgICBpZiAodGhpcy5pc1ByaW1pdGl2ZSgpKSB7CkBAIC0zODgsOCArMzY0LDYgQEAKICAgICAgKiB0aGlzIENsYXNzIHdpdGhvdXQgZG9pbmcgYW55IHNlY3VyaXR5IGNoZWNrcy4gVGhlIGJvb3RzdHJhcCBDbGFzc0xvYWRlcgogICAgICAqIGlzIHJldHVybmVkLCB1bmxpa2UgZ2V0Q2xhc3NMb2FkZXIoKSB3aGljaCByZXR1cm5zIG51bGwgaW4gcGxhY2Ugb2YgdGhlCiAgICAgICogYm9vdHN0cmFwIENsYXNzTG9hZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQ2xhc3NMb2FkZXIKICAgICAgKi8KICAgICBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlckltcGwoKSB7CiAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzTG9hZGVyKHRoaXMpOwpAQCAtMzk4LDMwICszNzIsMjIgQEAKIAogICAgIC8qCiAgICAgICogUmV0dXJucyB0aGUgZGVmaW5pbmcgY2xhc3MgbG9hZGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIHRoZSBjbGFzcyBsb2FkZXIgb2Ygd2hpY2ggd2Ugd2FudAotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGxvYWRlcgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihDbGFzczw/PiBjbGF6eik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzPD8+IGMpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHtAY29kZSBDbGFzc30gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCB0eXBlIGlmCiAgICAgICogdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUuIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoaXMgY2xhc3MKICAgICAgKiBkb2VzIG5vdCByZXByZXNlbnQgYW4gYXJyYXkgdHlwZS4gVGhlIGNvbXBvbmVudCB0eXBlIG9mIGFuIGFycmF5IHR5cGUgaXMKICAgICAgKiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIENsYXNzPD8+IGdldENvbXBvbmVudFR5cGUoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBwdWJsaWMKLSAgICAgKiBjb25zdHJ1Y3RvciBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciB0eXBlcy4KKyAgICAgKiBjb25zdHJ1Y3RvciBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHR5cGVzLgorICAgICAqIHtAY29kZSAoQ2xhc3NbXSkgbnVsbH0gaXMgZXF1aXZhbGVudCB0byB0aGUgZW1wdHkgYXJyYXkuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlcXVlc3RlZCBjb25zdHJ1Y3Rvci4KLSAgICAgKiAgICAgICAgICAgIHtAY29kZSAoQ2xhc3NbXSkgbnVsbH0gaXMgZXF1aXZhbGVudCB0byB0aGUgZW1wdHkgYXJyYXkuCi0gICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3IgZGVzY3JpYmVkIGJ5IHtAY29kZSBwYXJhbWV0ZXJUeXBlc30uCiAgICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29uc3RydWN0b3IgY2FuIG5vdCBiZSBmb3VuZC4KICAgICAgKiBAc2VlICNnZXREZWNsYXJlZENvbnN0cnVjdG9yKENsYXNzW10pCkBAIC00MzIsMTQgKzM5OCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb25zdHJ1Y3RvciBvciBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kIG5hbWUsIG9yICI8aW5pdD4iIHRvIHJldHVybiBhIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSByZWN1cnNpdmUgdHJ1ZSB0byBzZWFyY2ggc3VwZXJ0eXBlcy4KKyAgICAgKiBSZXR1cm5zIGEgY29uc3RydWN0b3Igb3IgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuIFVzZSAiPGluaXQ+IiB0byByZXR1cm4gYSBjb25zdHJ1Y3Rvci4KICAgICAgKi8KLSAgICBwcml2YXRlIE1lbWJlciBnZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKFN0cmluZyBuYW1lLCBib29sZWFuIHJlY3Vyc2l2ZSwKKyAgICBwcml2YXRlIE1lbWJlciBnZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKFN0cmluZyBuYW1lLCBib29sZWFuIHNlYXJjaFN1cGVyVHlwZXMsCiAgICAgICAgICAgICBib29sZWFuIHB1YmxpY09ubHksIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICBpZiAocmVjdXJzaXZlICYmICFwdWJsaWNPbmx5KSB7CisgICAgICAgIGlmIChzZWFyY2hTdXBlclR5cGVzICYmICFwdWJsaWNPbmx5KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsgLy8gY2FuJ3QgbG9va3VwIG5vbi1wdWJsaWMgbWVtYmVycyByZWN1cnNpdmVseQogICAgICAgICB9CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKQEAgLTQ1Myw3ICs0MTYsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInBhcmFtZXRlciB0eXBlIGlzIG51bGwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBNZW1iZXIgcmVzdWx0ID0gcmVjdXJzaXZlCisgICAgICAgIE1lbWJlciByZXN1bHQgPSBzZWFyY2hTdXBlclR5cGVzCiAgICAgICAgICAgICAgICAgPyBnZXRQdWJsaWNDb25zdHJ1Y3Rvck9yTWV0aG9kUmVjdXJzaXZlKG5hbWUsIHBhcmFtZXRlclR5cGVzKQogICAgICAgICAgICAgICAgIDogQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3Rvck9yTWV0aG9kKHRoaXMsIG5hbWUsIHBhcmFtZXRlclR5cGVzKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHB1YmxpY09ubHkgJiYgKHJlc3VsdC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkgewpAQCAtNDg2LDEyICs0NDksMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdHMgZm9yIGFsbCBwdWJsaWMKLSAgICAgKiBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIElmIHRoZXJlCisgICAgICogY29uc3RydWN0b3JzIGZvciB0aGlzIHtAY29kZSBDbGFzc30uIElmIHRoZXJlCiAgICAgICogYXJlIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkKICAgICAgKiBjbGFzcywgYSBwcmltaXRpdmUgdHlwZSBvciB2b2lkIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICogICAgICAgICB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogQHNlZSAjZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKQogICAgICAqLwogICAgIHB1YmxpYyBDb25zdHJ1Y3Rvcjw/PltdIGdldENvbnN0cnVjdG9ycygpIHsKQEAgLTUwNCwxMSArNDY1LDkgQEAKICAgICAgKiBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LiBJZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgYXQgYWxsLCBhbiBlbXB0eQogICAgICAqIGFycmF5IGlzIHJldHVybmVkLgogICAgICAqCi0gICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGFubm90YXRpb25zIGRlZmluZWQgZm9yIHRoZQotICAgICAqICAgICAgICAgY2xhc3MgdGhhdCB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cy4KICAgICAgKiBAc2VlICNnZXRBbm5vdGF0aW9ucygpCiAgICAgICovCi0gICAgbmF0aXZlIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpOworICAgIHB1YmxpYyBuYXRpdmUgQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb24gaWYgaXQgZXhpc3RzLgpAQCAtNTI2LDU4ICs0ODUsMjMgQEAKICAgICAgKiBDbGFzc30gcmVwcmVzZW50cy4gSWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgb3IgaW50ZXJmYWNlcyBkZWNsYXJlZCBvciBpZgogICAgICAqIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhcnJheSBjbGFzcywgYSBwcmltaXRpdmUgdHlwZSBvciB2b2lkLCB0aGVuIGFuCiAgICAgICogZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGgge0Bjb2RlIENsYXNzfSBvYmplY3RzIGZvciBhbGwgdGhlIGNsYXNzZXMgYW5kCi0gICAgICogICAgICAgICBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgaW4gbWVtYmVyIGRlY2xhcmF0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXREZWNsYXJlZENsYXNzZXMoKSB7CiAgICAgICAgIHJldHVybiBnZXREZWNsYXJlZENsYXNzZXModGhpcywgZmFsc2UpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXIgY2xhc3NlcyB3aXRob3V0IHBlcmZvcm1pbmcgYW55IHNlY3VyaXR5IGNoZWNrcwotICAgICAqIGZpcnN0LiBUaGlzIGluY2x1ZGVzIHRoZSBtZW1iZXIgY2xhc3NlcyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuIElmIG5vCi0gICAgICogbWVtYmVyIGNsYXNzZXMgZXhpc3QgYXQgYWxsLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHJlZmxlY3RzIHdoZXRoZXIgd2Ugd2FudCBvbmx5IHB1YmxpYyBtZW1iZXJzIG9yIGFsbCBvZiB0aGVtCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc2VzCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXIgY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICogSWYgbm8gbWVtYmVycyBleGlzdCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBDbGFzczw/PltdIGdldEZ1bGxMaXN0T2ZDbGFzc2VzKGJvb2xlYW4gcHVibGljT25seSkgewotICAgICAgICBDbGFzczw/PltdIHJlc3VsdCA9IGdldERlY2xhcmVkQ2xhc3Nlcyh0aGlzLCBwdWJsaWNPbmx5KTsKLQotICAgICAgICAvLyBUcmF2ZXJzZSBhbGwgc3VwZXJjbGFzc2VzCi0gICAgICAgIENsYXNzPD8+IGNsYXp6ID0gdGhpcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIHdoaWxlIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzczw/PltdIHRlbXAgPSBnZXREZWNsYXJlZENsYXNzZXMoY2xhenosIHB1YmxpY09ubHkpOwotICAgICAgICAgICAgaWYgKHRlbXAubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBhcnJheWNvcHkobmV3IENsYXNzW3Jlc3VsdC5sZW5ndGggKyB0ZW1wLmxlbmd0aF0sIHJlc3VsdCwgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWVtYmVyIGNsYXNzZXMgb2YgdGhlIGdpdmVuIGNsYXNzLiBObyBzZWN1cml0eSBjaGVja3MKLSAgICAgKiBhcmUgcGVyZm9ybWVkLiBJZiBubyBtZW1iZXJzIGV4aXN0LCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3MgdGhlIG1lbWJlcnMgb2Ygd2hpY2ggd2Ugd2FudAotICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHJlZmxlY3RzIHdoZXRoZXIgd2Ugd2FudCBvbmx5IHB1YmxpYyBtZW1iZXIgb3IgYWxsIG9mIHRoZW0KLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcycgY2xhc3MgbWVtYmVycwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBDbGFzczw/PltdIGdldERlY2xhcmVkQ2xhc3NlcyhDbGFzczw/PiBjbGF6eiwgYm9vbGVhbiBwdWJsaWNPbmx5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQ2xhc3M8Pz5bXSBnZXREZWNsYXJlZENsYXNzZXMoQ2xhc3M8Pz4gYywgYm9vbGVhbiBwdWJsaWNPbmx5KTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB7QGNvZGUgQ29uc3RydWN0b3J9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIHR5cGVzIHRoYXQgaXMgZGVjbGFyZWQgYnkgdGhlIGNsYXNzCisgICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlciB0eXBlcyB0aGF0IGlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcwogICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KKyAgICAgKiB7QGNvZGUgKENsYXNzW10pIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IGFycmF5LgogICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSByZXF1ZXN0ZWQgY29uc3RydWN0b3IuCi0gICAgICogICAgICAgICAgICB7QGNvZGUgKENsYXNzW10pIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IGFycmF5LgotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGRlc2NyaWJlZCBieSB7QGNvZGUgcGFyYW1ldGVyVHlwZXN9LgogICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBjb25zdHJ1Y3RvciBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgI2dldENvbnN0cnVjdG9yKENsYXNzW10pCkBAIC01OTIsMTAgKzUxNiw4IEBACiAgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHtAY29kZSBDb25zdHJ1Y3Rvcn0gb2JqZWN0cyBmb3IgYWxsCiAgICAgICogY29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uIElmCiAgICAgICogdGhlcmUgYXJlIG5vIGNvbnN0cnVjdG9ycyBvciBpZiB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhbiBhcnJheQotICAgICAqIGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlIG9yIHZvaWQgdGhlbiBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKiBjbGFzcywgYSBwcmltaXRpdmUgdHlwZSwgb3Igdm9pZCB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgogICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBjb25zdHJ1Y3RvcnMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkCi0gICAgICogICAgICAgICBieSB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogQHNlZSAjZ2V0Q29uc3RydWN0b3JzKCkKICAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RydWN0b3I8Pz5bXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKQEAgLTYwMywyMiArNTI1LDE1IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbnN0cnVjdG9ycyB3aXRob3V0IHBlcmZvcm1pbmcgYW55IHNlY3VyaXR5IGNoZWNrcwotICAgICAqIGZpcnN0LiBJZiBubyBjb25zdHJ1Y3RvcnMgZXhpc3QsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyBvZiBpbnRlcmVzdAotICAgICAqIEBwYXJhbSBwdWJsaWNPbmx5IHJlZmxlY3RzIHdoZXRoZXIgd2Ugd2FudCBvbmx5IHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgYWxsIG9mIHRoZW0KLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbnN0cnVjdG9ycworICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY29uc3RydWN0b3JzLiBJZiBubyBjb25zdHJ1Y3RvcnMgZXhpc3QsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSA8VD4gQ29uc3RydWN0b3I8VD5bXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygKLSAgICAgICAgICAgIENsYXNzPFQ+IGNsYXp6LCBib29sZWFuIHB1YmxpY09ubHkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSA8VD4gQ29uc3RydWN0b3I8VD5bXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycyhDbGFzczxUPiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHB1YmxpY09ubHkpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAY29kZSBGaWVsZH0gb2JqZWN0IGZvciB0aGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIEZpZWxkfSBvYmplY3QgZm9yIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lCiAgICAgICogd2hpY2ggaXMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KICAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZmllbGQuCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGZpZWxkIGluIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIGNsYXNzLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3RlZCBmaWVsZCBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgI2dldEZpZWxkKFN0cmluZykKICAgICAgKi8KQEAgLTYzOSw4ICs1NTQsNiBAQAogICAgICAqIGlmIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlIG9yIHZvaWQKICAgICAgKiB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgogICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICogICAgICAgICB0aGlzIGNsYXNzLgogICAgICAqIEBzZWUgI2dldEZpZWxkcygpCiAgICAgICovCiAgICAgcHVibGljIEZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7CkBAIC02NTAsMzIgKzU2MywyMyBAQAogICAgIC8qCiAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmaWVsZHMgd2l0aG91dCBwZXJmb3JtaW5nIGFueSBzZWN1cml0eSBjaGVja3MKICAgICAgKiBmaXJzdC4gSWYgbm8gZmllbGRzIGV4aXN0IGF0IGFsbCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIG9mIGludGVyZXN0Ci0gICAgICogQHBhcmFtIHB1YmxpY09ubHkgcmVmbGVjdHMgd2hldGhlciB3ZSB3YW50IG9ubHkgcHVibGljIGZpZWxkcyBvciBhbGwgb2YgdGhlbQotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmllbGRzCiAgICAgICovCi0gICAgc3RhdGljIG5hdGl2ZSBGaWVsZFtdIGdldERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGNsYXp6LCBib29sZWFuIHB1YmxpY09ubHkpOworICAgIHN0YXRpYyBuYXRpdmUgRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBjLCBib29sZWFuIHB1YmxpY09ubHkpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmllbGQgaWYgaXQgaXMgZGVmaW5lZCBieSB7QGNvZGUgY2xhenp9OyBudWxsIG90aGVyd2lzZS4gVGhpcworICAgICAqIFJldHVybnMgdGhlIGZpZWxkIGlmIGl0IGlzIGRlZmluZWQgYnkge0Bjb2RlIGN9OyBudWxsIG90aGVyd2lzZS4gVGhpcwogICAgICAqIG1heSByZXR1cm4gYSBub24tcHVibGljIG1lbWJlci4KICAgICAgKi8KLSAgICBzdGF0aWMgbmF0aXZlIEZpZWxkIGdldERlY2xhcmVkRmllbGQoQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBuYW1lKTsKKyAgICBzdGF0aWMgbmF0aXZlIEZpZWxkIGdldERlY2xhcmVkRmllbGQoQ2xhc3M8Pz4gYywgU3RyaW5nIG5hbWUpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHtAY29kZSBNZXRob2R9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBtZXRob2QgbWF0Y2hpbmcgdGhlCi0gICAgICogc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlciB0eXBlcyB0aGF0IGlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcworICAgICAqIGdpdmVuIG5hbWUgYW5kIHBhcmFtZXRlciB0eXBlcyB0aGF0IGlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcwogICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KKyAgICAgKiB7QGNvZGUgKENsYXNzW10pIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IGFycmF5LgogICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbWV0aG9kJ3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlcXVlc3RlZCBtZXRob2QuCi0gICAgICogICAgICAgICAgICB7QGNvZGUgKENsYXNzW10pIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IGFycmF5LgotICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkge0Bjb2RlIG5hbWV9IGFuZCB7QGNvZGUgcGFyYW1ldGVyVHlwZXN9LgogICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCBjb25zdHJ1Y3RvciBjYW4gbm90IGJlIGZvdW5kLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGNhbiBub3QgYmUgZm91bmQuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBuYW1lfSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHNlZSAjZ2V0TWV0aG9kKFN0cmluZywgQ2xhc3NbXSkKQEAgLTY5NSw4ICs1OTksNiBAQAogICAgICAqIG1ldGhvZHMgb3IgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkgY2xhc3MsIGEgcHJpbWl0aXZlCiAgICAgICogdHlwZSBvciB2b2lkIHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICogICAgICAgICB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogQHNlZSAjZ2V0TWV0aG9kcygpCiAgICAgICovCiAgICAgcHVibGljIE1ldGhvZFtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKQEAgLTcwNCw1OCArNjA2LDQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBtZXRob2RzIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgc2VjdXJpdHkgY2hlY2tzCi0gICAgICogZmlyc3QuIElmIG5vIG1ldGhvZHMgZXhpc3QsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWV0aG9kcy4gSWYgbm8gbWV0aG9kcyBleGlzdCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICovCi0gICAgc3RhdGljIG5hdGl2ZSBNZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gY2xhenosIGJvb2xlYW4gcHVibGljT25seSk7CisgICAgc3RhdGljIG5hdGl2ZSBNZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gYywgYm9vbGVhbiBwdWJsaWNPbmx5KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIG9yIG1ldGhvZCBpZiBpdCBpcyBkZWZpbmVkIGJ5IHtAY29kZSBjbGF6en07IG51bGwKLSAgICAgKiBvdGhlcndpc2UuIFRoaXMgbWF5IHJldHVybiBhIG5vbi1wdWJsaWMgbWVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCBuYW1lLCBvciAiPGluaXQ+IiB0byBnZXQgYSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb25zdHJ1Y3RvciBvciBtZXRob2QgaWYgaXQgaXMgZGVmaW5lZCBieSB7QGNvZGUgY307IG51bGwKKyAgICAgKiBvdGhlcndpc2UuIFRoaXMgbWF5IHJldHVybiBhIG5vbi1wdWJsaWMgbWVtYmVyLiBVc2UgIjxpbml0PiIgdG8gZ2V0IGEgY29uc3RydWN0b3IuCiAgICAgICovCi0gICAgc3RhdGljIG5hdGl2ZSBNZW1iZXIgZ2V0RGVjbGFyZWRDb25zdHJ1Y3Rvck9yTWV0aG9kKENsYXNzIGNsYXp6LCBTdHJpbmcgbmFtZSwgQ2xhc3NbXSBhcmdzKTsKKyAgICBzdGF0aWMgbmF0aXZlIE1lbWJlciBnZXREZWNsYXJlZENvbnN0cnVjdG9yT3JNZXRob2QoQ2xhc3MgYywgU3RyaW5nIG5hbWUsIENsYXNzW10gYXJncyk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJpbmcge0Bjb2RlIENsYXNzfSBvZiB0aGlzIHtAY29kZSBDbGFzc30uIFJldHVybnMKICAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGlzIG5vdCBhIG1lbWJlciBvZiBhbm90aGVyIGNsYXNzIG9yIGlmIHRoaXMKLSAgICAgKiB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkgY2xhc3MsIGEgcHJpbWl0aXZlIHR5cGUgb3Igdm9pZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRlY2xhcmluZyB7QGNvZGUgQ2xhc3N9IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkgY2xhc3MsIGEgcHJpbWl0aXZlIHR5cGUsIG9yIHZvaWQuCiAgICAgICovCi0gICAgbmF0aXZlIHB1YmxpYyBDbGFzczw/PiBnZXREZWNsYXJpbmdDbGFzcygpOworICAgIHB1YmxpYyBuYXRpdmUgQ2xhc3M8Pz4gZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGVuY2xvc2luZyB7QGNvZGUgQ2xhc3N9IG9mIHRoaXMge0Bjb2RlIENsYXNzfS4gSWYgdGhlcmUgaXMgbm8KICAgICAgKiBlbmNsb3NpbmcgY2xhc3MgdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVuY2xvc2luZyB7QGNvZGUgQ2xhc3N9IG9yIHtAY29kZSBudWxsfS4KICAgICAgKi8KLSAgICBuYXRpdmUgcHVibGljIENsYXNzPD8+IGdldEVuY2xvc2luZ0NsYXNzKCk7CisgICAgcHVibGljIG5hdGl2ZSBDbGFzczw/PiBnZXRFbmNsb3NpbmdDbGFzcygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW5jbG9zaW5nIHtAY29kZSBDb25zdHJ1Y3Rvcn0gb2YgdGhpcyB7QGNvZGUgQ2xhc3N9LCBpZiBpdCBpcyBhbgorICAgICAqIFJldHVybnMgdGhlIGVuY2xvc2luZyB7QGNvZGUgQ29uc3RydWN0b3J9IG9mIHRoaXMge0Bjb2RlIENsYXNzfSwgaWYgaXQgaXMgYW4KICAgICAgKiBhbm9ueW1vdXMgb3IgbG9jYWwvYXV0b21hdGljIGNsYXNzOyBvdGhlcndpc2Uge0Bjb2RlIG51bGx9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZW5jbG9zaW5nIHtAY29kZSBDb25zdHJ1Y3Rvcn0gaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9LgogICAgICAqLwotICAgIG5hdGl2ZSBwdWJsaWMgQ29uc3RydWN0b3I8Pz4gZ2V0RW5jbG9zaW5nQ29uc3RydWN0b3IoKTsKKyAgICBwdWJsaWMgbmF0aXZlIENvbnN0cnVjdG9yPD8+IGdldEVuY2xvc2luZ0NvbnN0cnVjdG9yKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbmNsb3Npbmcge0Bjb2RlIE1ldGhvZH0gb2YgdGhpcyB7QGNvZGUgQ2xhc3N9LCBpZiBpdCBpcyBhbgorICAgICAqIFJldHVybnMgdGhlIGVuY2xvc2luZyB7QGNvZGUgTWV0aG9kfSBvZiB0aGlzIHtAY29kZSBDbGFzc30sIGlmIGl0IGlzIGFuCiAgICAgICogYW5vbnltb3VzIG9yIGxvY2FsL2F1dG9tYXRpYyBjbGFzczsgb3RoZXJ3aXNlIHtAY29kZSBudWxsfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVuY2xvc2luZyB7QGNvZGUgTWV0aG9kfSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0uCiAgICAgICovCi0gICAgbmF0aXZlIHB1YmxpYyBNZXRob2QgZ2V0RW5jbG9zaW5nTWV0aG9kKCk7CisgICAgcHVibGljIG5hdGl2ZSBNZXRob2QgZ2V0RW5jbG9zaW5nTWV0aG9kKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGNvZGUgZW51bX0gY29uc3RhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAY29kZSBDbGFzc30uCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIGVudW19IGNvbnN0YW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQ2xhc3N9LgogICAgICAqIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoaXMge0Bjb2RlIENsYXNzfSBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0Bjb2RlCiAgICAgICogZW51bX0gdHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUge0Bjb2RlIGVudW19IGNvbnN0YW50cyBvciB7QGNvZGUgbnVsbH0uCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHdlIG9ubHkgY2FzdCBhZnRlciBjb25maXJtaW5nIHRoYXQgdGhpcyBjbGFzcyBpcyBhbiBlbnVtCiAgICAgcHVibGljIFRbXSBnZXRFbnVtQ29uc3RhbnRzKCkgewpAQCAtNzY3LDEzICs2NTYsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB7QGNvZGUgRmllbGR9IG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBwdWJsaWMgZmllbGQgd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbmFtZS4gVGhpcyBtZXRob2QgZmlyc3Qgc2VhcmNoZXMgdGhlIGNsYXNzIEMgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiBnaXZlbiBuYW1lLiBUaGlzIG1ldGhvZCBmaXJzdCBzZWFyY2hlcyB0aGUgY2xhc3MgQyByZXByZXNlbnRlZCBieQogICAgICAqIHRoaXMge0Bjb2RlIENsYXNzfSwgdGhlbiB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSBDIGFuZCBmaW5hbGx5IHRoZQogICAgICAqIHN1cGVyY2xhc3NlcyBvZiBDLgogICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZmllbGQuCi0gICAgICogQHJldHVybiB0aGUgcHVibGljIGZpZWxkIHNwZWNpZmllZCBieSB7QGNvZGUgbmFtZX0uCiAgICAgICogQHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWVsZCBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgI2dldERlY2xhcmVkRmllbGQoU3RyaW5nKQpAQCAtODIwLDggKzcwNiw2IEBACiAgICAgICogPHA+SWYgdGhlcmUgYXJlIG5vIHB1YmxpYyBmaWVsZHMgb3IgaWYgdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFycmF5IGNsYXNzLAogICAgICAqIGEgcHJpbWl0aXZlIHR5cGUgb3Ige0Bjb2RlIHZvaWR9IHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHB1YmxpYyBmaWVsZHMgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMKLSAgICAgKiAgICAgICAgIHtAY29kZSBDbGFzc30uCiAgICAgICogQHNlZSAjZ2V0RGVjbGFyZWRGaWVsZHMoKQogICAgICAqLwogICAgIHB1YmxpYyBGaWVsZFtdIGdldEZpZWxkcygpIHsKQEAgLTgyOSw3ICs3MTMsNyBAQAogICAgICAgICBnZXRQdWJsaWNGaWVsZHNSZWN1cnNpdmUoZmllbGRzKTsKIAogICAgICAgICAvKgotICAgICAgICAgKiBUaGUgcmVzdWx0IG1heSBpbmNsdWRlIGR1cGxpY2F0ZXMgd2hlbiBjbGF6eiBpbXBsZW1lbnRzIGFuIGludGVyZmFjZQorICAgICAgICAgKiBUaGUgcmVzdWx0IG1heSBpbmNsdWRlIGR1cGxpY2F0ZXMgd2hlbiB0aGlzIGNsYXNzIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlCiAgICAgICAgICAqIHRocm91Z2ggbXVsdGlwbGUgcGF0aHMuIFJlbW92ZSB0aG9zZSBkdXBsaWNhdGVzLgogICAgICAgICAgKi8KICAgICAgICAgQ29sbGVjdGlvblV0aWxzLnJlbW92ZUR1cGxpY2F0ZXMoZmllbGRzLCBGaWVsZC5PUkRFUl9CWV9OQU1FX0FORF9ERUNMQVJJTkdfQ0xBU1MpOwpAQCAtODU3LDEyICs3NDEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBUeXBlfXMgb2YgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIHtAY29kZSBDbGFzc30gZGlyZWN0bHkKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHlwZX1zIG9mIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyB7QGNvZGUgQ2xhc3N9IGRpcmVjdGx5CiAgICAgICogaW1wbGVtZW50cy4gSWYgdGhlIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlIG9yIHtAY29kZQogICAgICAqIHZvaWR9IHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAbGluayBUeXBlfSBpbnN0YW5jZXMgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlCi0gICAgICogICAgICAgICBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBjbGFzc30uCiAgICAgICovCiAgICAgcHVibGljIFR5cGVbXSBnZXRHZW5lcmljSW50ZXJmYWNlcygpIHsKICAgICAgICAgR2VuZXJpY1NpZ25hdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgR2VuZXJpY1NpZ25hdHVyZVBhcnNlcihnZXRDbGFzc0xvYWRlcigpKTsKQEAgLTg3MSwxMCArNzUyLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGNvZGUgVHlwZX0gdGhhdCByZXByZXNlbnRzIHRoZSBzdXBlcmNsYXNzIG9mIHRoaXMge0Bjb2RlCisgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFR5cGV9IHRoYXQgcmVwcmVzZW50cyB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIHtAY29kZQogICAgICAqIGNsYXNzfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIFR5cGV9IHJlcHJlc2VudGluZyB0aGUgc3VwZXJjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgVHlwZSBnZXRHZW5lcmljU3VwZXJjbGFzcygpIHsKICAgICAgICAgR2VuZXJpY1NpZ25hdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgR2VuZXJpY1NpZ25hdHVyZVBhcnNlcihnZXRDbGFzc0xvYWRlcigpKTsKQEAgLTg4NCwyOSArNzYzLDIyIEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHtAY29kZSBDbGFzc30gb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBpbnRlcmZhY2VzCi0gICAgICogc3BlY2lmaWVkIGluIHRoZSB7QGNvZGUgaW1wbGVtZW50c30gZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkCisgICAgICogaW4gdGhlIHtAY29kZSBpbXBsZW1lbnRzfSBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQKICAgICAgKiBieSB0aGlzIHtAY29kZSBDbGFzc30uIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGlzCiAgICAgICogaWRlbnRpY2FsIHRvIHRoZSBvcmRlciBpbiB0aGUgb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24uIElmIHRoZSBjbGFzcwogICAgICAqIGRvZXMgbm90IGltcGxlbWVudCBhbnkgaW50ZXJmYWNlcywgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGludGVyZmFjZXMgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMKLSAgICAgKiAgICAgICAgIGNsYXNzLgogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgQ2xhc3M8Pz5bXSBnZXRJbnRlcmZhY2VzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIE1ldGhvZH0gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHB1YmxpYyBtZXRob2Qgd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyIHR5cGVzLiBUaGlzIG1ldGhvZCBmaXJzdCBzZWFyY2hlcyB0aGUKKyAgICAgKiB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqIHtAY29kZSAoQ2xhc3NbXSkgbnVsbH0gaXMgZXF1aXZhbGVudCB0byB0aGUgZW1wdHkgYXJyYXkuCisgICAgICogVGhpcyBtZXRob2QgZmlyc3Qgc2VhcmNoZXMgdGhlCiAgICAgICogY2xhc3MgQyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30sIHRoZW4gdGhlIHN1cGVyY2xhc3NlcyBvZiBDIGFuZAogICAgICAqIGZpbmFsbHkgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgQyBhbmQgZmluYWxseSB0aGUgc3VwZXJjbGFzc2VzIG9mIEMKICAgICAgKiBmb3IgYSBtZXRob2Qgd2l0aCBtYXRjaGluZyBuYW1lLgogICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbWV0aG9kJ3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlcXVlc3RlZCBtZXRob2QuCi0gICAgICogICAgICAgICAgICB7QGNvZGUgKENsYXNzW10pIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVtcHR5IGFycmF5LgotICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBmaWVsZCBzcGVjaWZpZWQgYnkge0Bjb2RlIG5hbWV9LgogICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIG1ldGhvZCBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgI2dldERlY2xhcmVkTWV0aG9kKFN0cmluZywgQ2xhc3NbXSkKQEAgLTkyNCwxMyArNzk2LDEwIEBACiAgICAgICogZm9yIHRoZSBjbGFzcyBDIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gTWV0aG9kcyBtYXkgYmUKICAgICAgKiBkZWNsYXJlZCBpbiBDLCB0aGUgaW50ZXJmYWNlcyBpdCBpbXBsZW1lbnRzIG9yIGluIHRoZSBzdXBlcmNsYXNzZXMgb2YgQy4KICAgICAgKiBUaGUgZWxlbWVudHMgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBubyBwdWJsaWMgbWV0aG9kcyBvciBpZiB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhCi0gICAgICogcHJpbWl0aXZlIHR5cGUgb3Ige0Bjb2RlIHZvaWR9IHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgogICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogICAgICAgICB7QGNvZGUgQ2xhc3N9LgorICAgICAqIDxwPklmIHRoZXJlIGFyZSBubyBwdWJsaWMgbWV0aG9kcyBvciBpZiB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhCisgICAgICogcHJpbWl0aXZlIHR5cGUgb3Ige0Bjb2RlIHZvaWR9IHRoZW4gYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICoKICAgICAgKiBAc2VlICNnZXREZWNsYXJlZE1ldGhvZHMoKQogICAgICAqLwogICAgIHB1YmxpYyBNZXRob2RbXSBnZXRNZXRob2RzKCkgewpAQCAtOTQ2LDcgKzgxNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUG9wdWxhdGVzIHtAY29kZSByZXN1bHR9IHdpdGggcHVibGljIG1ldGhvZHMgZGVmaW5lZCBieSB7QGNvZGUgY2xhenp9LCBpdHMKKyAgICAgKiBQb3B1bGF0ZXMge0Bjb2RlIHJlc3VsdH0gd2l0aCBwdWJsaWMgbWV0aG9kcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MsIGl0cwogICAgICAqIHN1cGVyY2xhc3NlcywgYW5kIGFsbCBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzLCBpbmNsdWRpbmcgb3ZlcnJpZGRlbiBtZXRob2RzLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBnZXRQdWJsaWNNZXRob2RzUmVjdXJzaXZlKExpc3Q8TWV0aG9kPiByZXN1bHQpIHsKQEAgLTk2OSwxOCArODM4LDE1IEBACiAgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZAogICAgICAqIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgYml0cwogICAgICAqIGRlZmluZWQgYnkgY29uc3RhbnRzIGluIHRoZSB7QGxpbmsgTW9kaWZpZXJ9IGNsYXNzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CiAgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnModGhpcywgZmFsc2UpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBnaXZlbiBjbGFzcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgaW50ZXJlc3QKLSAgICAgKiBAaWdub3JlSW5uZXJDbGFzc2VzQXR0cmliIGRldGVybWluZXMgd2hldGhlciB3ZSBsb29rIGZvciBhbmQgdXNlIHRoZQorICAgICAqIHtAY29kZSBpZ25vcmVJbm5lckNsYXNzZXNBdHRyaWJ9IGRldGVybWluZXMgd2hldGhlciB3ZSBsb29rIGZvciBhbmQgdXNlIHRoZQogICAgICAqICAgICBmbGFncyBmcm9tIGFuICJpbm5lciBjbGFzcyIgYXR0cmlidXRlCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRNb2RpZmllcnMoQ2xhc3M8Pz4gY2xhenosIGJvb2xlYW4gaWdub3JlSW5uZXJDbGFzc2VzQXR0cmliKTsKQEAgLTk4OSw4ICs4NTUsNiBAQAogICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gRm9yIGEKICAgICAgKiBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0IHdoaWNoIGlzIHVzZWQsIHNlZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvZgogICAgICAqIHtAbGluayBDbGFzc30uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZTsKQEAgLTEwMzMsOCArODk3LDYgQEAKIAogICAgIC8qCiAgICAgICogUmV0dXJucyB0aGUgc2ltcGxlIG5hbWUgb2YgYSBtZW1iZXIgb3IgbG9jYWwgY2xhc3MsIG9yIG51bGwgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZ2V0SW5uZXJDbGFzc05hbWUoKTsKIApAQCAtMTA0NiwyMCArOTA4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgYnkge0Bjb2RlIHJlc05hbWV9LiBUaGUgbWFwcGluZwotICAgICAqIGJldHdlZW4gdGhlIHJlc291cmNlIG5hbWUgYW5kIHRoZSBVUkwgaXMgbWFuYWdlZCBieSB0aGUgY2xhc3MnIGNsYXNzCi0gICAgICogbG9hZGVyLgorICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UsIG9yIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHRoZSByZXNvdXJjZSBuYW1lIGFuZCB0aGUgVVJMIGlzIG1hbmFnZWQgYnkgdGhlIGNsYXNzJyBjbGFzcyBsb2FkZXIuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcmVzTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSdzIHtAY29kZSBVUkx9IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiAgICAgICAgIHRoZSByZXNvdXJjZSBjYW4gbm90IGJlIGZvdW5kLgogICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIKICAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyByZXNOYW1lKSB7CisgICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CiAgICAgICAgIC8vIEdldCBhYnNvbHV0ZSByZXNvdXJjZSBuYW1lLCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBzbGFzaAotICAgICAgICBpZiAocmVzTmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHJlc05hbWUgPSByZXNOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgaWYgKHJlc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZS5zdWJzdHJpbmcoMSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTdHJpbmcgcGtnID0gZ2V0TmFtZSgpOwogICAgICAgICAgICAgaW50IGRvdCA9IHBrZy5sYXN0SW5kZXhPZignLicpOwpAQCAtMTA2OSwzMyArOTI2LDI5IEBACiAgICAgICAgICAgICAgICAgcGtnID0gIiI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlc05hbWUgPSBwa2cgKyAiLyIgKyByZXNOYW1lOworICAgICAgICAgICAgcmVzb3VyY2VOYW1lID0gcGtnICsgIi8iICsgcmVzb3VyY2VOYW1lOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRGVsZWdhdGUgdG8gcHJvcGVyIGNsYXNzIGxvYWRlcgogICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOwogICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0UmVzb3VyY2UocmVzTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbG9hZGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UocmVzTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgc3RyZWFtIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHNwZWNpZmllZCBieQotICAgICAqIHtAY29kZSByZXNOYW1lfS4gVGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcmVzb3VyY2UgbmFtZSBhbmQgdGhlIHN0cmVhbSBpcwotICAgICAqIG1hbmFnZWQgYnkgdGhlIGNsYXNzJyBjbGFzcyBsb2FkZXIuCisgICAgICogUmV0dXJucyBhIHJlYWQtb25seSBzdHJlYW0gZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UsIG9yIG51bGwgaWYgdGhlIHJlc291cmNlCisgICAgICogaXMgbm90IGZvdW5kLgorICAgICAqIFRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHJlc291cmNlIG5hbWUgYW5kIHRoZSBzdHJlYW0gaXMgbWFuYWdlZCBieSB0aGUgY2xhc3MnIGNsYXNzIGxvYWRlci4KICAgICAgKgotICAgICAqIEBwYXJhbSByZXNOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBhIHN0cmVhbSBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBvciB7QGNvZGUgbnVsbH0gaWYgbm8KLSAgICAgKiAgICAgICAgIHJlc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGNhbiBiZSBmb3VuZC4KICAgICAgKiBAc2VlIENsYXNzTG9hZGVyCiAgICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc05hbWUpIHsKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CiAgICAgICAgIC8vIEdldCBhYnNvbHV0ZSByZXNvdXJjZSBuYW1lLCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBzbGFzaAotICAgICAgICBpZiAocmVzTmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHJlc05hbWUgPSByZXNOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgaWYgKHJlc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZS5zdWJzdHJpbmcoMSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTdHJpbmcgcGtnID0gZ2V0TmFtZSgpOwogICAgICAgICAgICAgaW50IGRvdCA9IHBrZy5sYXN0SW5kZXhPZignLicpOwpAQCAtMTEwNSwxNSArOTU4LDE1IEBACiAgICAgICAgICAgICAgICAgcGtnID0gIiI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlc05hbWUgPSBwa2cgKyAiLyIgKyByZXNOYW1lOworICAgICAgICAgICAgcmVzb3VyY2VOYW1lID0gcGtnICsgIi8iICsgcmVzb3VyY2VOYW1lOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRGVsZWdhdGUgdG8gcHJvcGVyIGNsYXNzIGxvYWRlcgogICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOwogICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTIyLDggKzk3NSw2IEBACiAgICAgICogQWxsIGNsYXNzZXMgZnJvbSBhbnkgZ2l2ZW4gZGV4IGZpbGUgd2lsbCBoYXZlIHRoZSBzYW1lIHNpZ25lcnMsIGJ1dCBkaWZmZXJlbnQgZGV4CiAgICAgICogZmlsZXMgbWF5IGhhdmUgZGlmZmVyZW50IHNpZ25lcnMuIFRoaXMgZG9lcyBub3QgZml0IHdlbGwgd2l0aCB0aGUgb3JpZ2luYWwKICAgICAgKiB7QGNvZGUgQ2xhc3NMb2FkZXJ9LWJhc2VkIG1vZGVsIG9mIHtAY29kZSBnZXRTaWduZXJzfS4pCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdFtdIGdldFNpZ25lcnMoKSB7CiAgICAgICAgIC8vIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTE3NjYuCkBAIC0xMTM2LDggKzk4Nyw2IEBACiAgICAgICogdGhlIHtAY29kZSBPYmplY3R9IGNsYXNzLCBhIHByaW1pdGl2ZSB0eXBlLCBhbiBpbnRlcmZhY2Ugb3Igdm9pZCB0aGVuIHRoZQogICAgICAqIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4gSWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYXJyYXkKICAgICAgKiBjbGFzcyB0aGVuIHRoZSB7QGNvZGUgT2JqZWN0fSBjbGFzcyBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIENsYXNzPD8gc3VwZXIgVD4gZ2V0U3VwZXJjbGFzcygpOwogCkBAIC0xMTQ1LDkgKzk5NCw2IEBACiAgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHtAY29kZSBUeXBlVmFyaWFibGV9IG9iamVjdHMgZm9yIHR5cGUKICAgICAgKiB2YXJpYWJsZXMgZGVjbGFyZWQgYnkgdGhlIGdlbmVyaWMgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUKICAgICAgKiBDbGFzc30uIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNsYXNzIGlzIG5vdCBnZW5lcmljLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSB3aXRoIHRoZSB0eXBlIHZhcmlhYmxlcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAgICAqICAgICAgICAgY2xhc3MuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBUeXBlVmFyaWFibGU8Q2xhc3M8VD4+W10gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CkBAIC0xMTU3LDEwICsxMDAzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIGNsYXNzLgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbgotICAgICAqICAgICAgICAgY2xhc3M7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbiBjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb24oKSB7CiAgICAgICAgIGZpbmFsIGludCBBQ0NfQU5OT1RBVElPTiA9IDB4MjAwMDsgIC8vIG5vdCBwdWJsaWMgaW4gcmVmbGVjdC5Nb2RpZmllcnMKQEAgLTExODksNTkgKzEwMzIsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzCi0gICAgICogYW5vbnltb3VzbHkgZGVjbGFyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzCi0gICAgICogICAgICAgICBhbm9ueW1vdXM7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcworICAgICAqIGFub255bW91cy4KICAgICAgKi8KICAgICBuYXRpdmUgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXNDbGFzcygpOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbiBhcnJheQotICAgICAqIGNsYXNzLgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbgotICAgICAqICAgICAgICAgYXJyYXkgY2xhc3M7IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbiBhcnJheSBjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewogICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpICE9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIGNsYXNzCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gY2xhc3MgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBjbGFzcwogICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4gQ29udmVyc2lvbiBtYXkgYmUgZG9uZSB2aWEgYW4gaWRlbnRpdHkKICAgICAgKiBjb252ZXJzaW9uIG9yIGEgd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24gKGlmIGVpdGhlciB0aGUgcmVjZWl2ZXIgb3IKICAgICAgKiB0aGUgYXJndW1lbnQgcmVwcmVzZW50IHByaW1pdGl2ZSB0eXBlcywgb25seSB0aGUgaWRlbnRpdHkgY29udmVyc2lvbgogICAgICAqIGFwcGxpZXMpLgogICAgICAqCi0gICAgICogQHBhcmFtIGNscwotICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjbHN9IGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIGNsYXNzCi0gICAgICogICAgICAgICByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc307IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY2xzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGN9IGlzIHtAY29kZSBudWxsfS4KICAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShDbGFzczw/PiBjbHMpOworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzPD8+IGMpOwogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhbgogICAgICAqIHtAY29kZSBlbnVtfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMgYW4KLSAgICAgKiAgICAgICAgIHtAY29kZSBlbnVtfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbnVtKCkgewogICAgICAgICByZXR1cm4gKChnZXRNb2RpZmllcnMoKSAmIDB4NDAwMCkgIT0gMCkgJiYgKGdldFN1cGVyY2xhc3MoKSA9PSBFbnVtLmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBjYW4gYmUgY2FzdCB0byB0aGUgY2xhc3MKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGNhc3QgdG8gdGhlIGNsYXNzCiAgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9LiBUaGlzIGlzIHRoZSBydW50aW1lIHZlcnNpb24gb2YgdGhlCiAgICAgICoge0Bjb2RlIGluc3RhbmNlb2Z9IG9wZXJhdG9yLgogICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjaGVjay4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgb2JqZWN0fSBjYW4gYmUgY2FzdCB0byB0aGUgdHlwZQogICAgICAqICAgICAgICAgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9OyB7QGNvZGUgZmFsc2V9IGlmIHtAY29kZQogICAgICAqICAgICAgICAgb2JqZWN0fSBpcyB7QGNvZGUgbnVsbH0gb3IgY2Fubm90IGJlIGNhc3QuCkBAIC0xMjQ5LDE5ICsxMDc2LDEzIEBACiAgICAgcHVibGljIG5hdGl2ZSBib29sZWFuIGlzSW5zdGFuY2UoT2JqZWN0IG9iamVjdCk7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhbiBpbnRlcmZhY2U7Ci0gICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGFuIGludGVyZmFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMgZGVmaW5lZAorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfSBpcyBkZWZpbmVkCiAgICAgICogbG9jYWxseS4KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30gaXMKLSAgICAgKiAgICAgICAgIGRlZmluZWQgbG9jYWxseTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMb2NhbENsYXNzKCkgewogICAgICAgICBib29sZWFuIGVuY2xvc2VkID0gKGdldEVuY2xvc2luZ01ldGhvZCgpICE9IG51bGwgfHwKQEAgLTEyNzAsMjkgKzEwOTEsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzIGEgbWVtYmVyCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzIGEgbWVtYmVyCiAgICAgICogY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgQ2xhc3N9IGlzIGEKLSAgICAgKiAgICAgICAgIG1lbWJlciBjbGFzczsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNZW1iZXJDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIGdldERlY2xhcmluZ0NsYXNzKCkgIT0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlLgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZTsKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ2xhc3N9IHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNQcmltaXRpdmUoKTsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMge0Bjb2RlIENsYXNzfSByZXByZXNlbnRzIGEgc3ludGhldGljIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhIHN5bnRoZXRpYyB0eXBlOwotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogVGVzdHMgd2hldGhlciB0aGlzIHtAY29kZSBDbGFzc30gcmVwcmVzZW50cyBhIHN5bnRoZXRpYyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgewogICAgICAgICBmaW5hbCBpbnQgQUNDX1NZTlRIRVRJQyA9IDB4MTAwMDsgICAvLyBub3QgcHVibGljIGluIHJlZmxlY3QuTW9kaWZpZXJzCkBAIC0xMzA5LDcgKzExMjEsNiBAQAogICAgICAqIGNvbnN0cnVjdG9yIGV4aXN0cyBidXQgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY29udGV4dCB3aGVyZSB0aGlzCiAgICAgICogbWV0aG9kIGlzIGludm9rZWQsIGFuIHtAY29kZSBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDbGFzc30uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IHZpc2libGUuCiAgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCkBAIC0xMzM0LDkgKzExNDUsNiBAQAogICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBQYWNrYWdlfSBvZiB3aGljaCB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcwogICAgICAqIHtAY29kZSBDbGFzc30gaXMgYSBtZW1iZXIuIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIG5vIHtAY29kZSBQYWNrYWdlfQogICAgICAqIG9iamVjdCB3YXMgY3JlYXRlZCBieSB0aGUgY2xhc3MgbG9hZGVyIG9mIHRoZSBjbGFzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUGFja2FnZSB0aGUge0Bjb2RlIFBhY2thZ2V9IG9mIHdoaWNoIHRoaXMge0Bjb2RlIENsYXNzfSBpcyBhCi0gICAgICogICAgICAgICBtZW1iZXIgb3Ige0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIHB1YmxpYyBQYWNrYWdlIGdldFBhY2thZ2UoKSB7CiAgICAgICAgIC8vIFRPRE8gVGhpcyBtaWdodCBiZSBhIGhhY2ssIGJ1dCB0aGUgVk0gZG9lc24ndCBoYXZlIHRoZSBuZWNlc3NhcnkgaW5mby4KQEAgLTEzNTMsNDIgKzExNjEsMzMgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBhc3NlcnRpb24gc3RhdHVzIGZvciB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUKICAgICAgKiBDbGFzc30uIEFzc2VydGlvbiBpcyBlbmFibGVkIC8gZGlzYWJsZWQgYmFzZWQgb24gdGhlIGNsYXNzIGxvYWRlciwKICAgICAgKiBwYWNrYWdlIG9yIGNsYXNzIGRlZmF1bHQgYXQgcnVudGltZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFzc2VydGlvbiBzdGF0dXMgZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZQotICAgICAqICAgICAgICAgQ2xhc3N9LgogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBkZXNpcmVkQXNzZXJ0aW9uU3RhdHVzKCk7CiAKICAgICAvKioKLSAgICAgKiBDYXN0cyB0aGlzIHtAY29kZSBDbGFzc30gdG8gcmVwcmVzZW50IGEgc3ViY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgKiBDYXN0cyB0aGlzIHtAY29kZSBDbGFzc30gdG8gcmVwcmVzZW50IGEgc3ViY2xhc3Mgb2YgdGhlIGdpdmVuIGNsYXNzLgogICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoaXMge0Bjb2RlIENsYXNzfSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlIGEge0Bjb2RlCiAgICAgICogQ2xhc3NDYXN0RXhjZXB0aW9ufSBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1aXJlZCB0eXBlLgotICAgICAqIEByZXR1cm4gdGhpcyB7QGNvZGUgQ2xhc3N9IGNhc3QgYXMgYSBzdWJjbGFzcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMge0Bjb2RlIENsYXNzfSBjYW5ub3QgYmUgY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IGNhbm5vdCBiZSBjYXN0IHRvIHRoZSBnaXZlbiB0eXBlLgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8VT4gQ2xhc3M8PyBleHRlbmRzIFU+IGFzU3ViY2xhc3MoQ2xhc3M8VT4gY2xhenopIHsKLSAgICAgICAgaWYgKGNsYXp6LmlzQXNzaWduYWJsZUZyb20odGhpcykpIHsKKyAgICBwdWJsaWMgPFU+IENsYXNzPD8gZXh0ZW5kcyBVPiBhc1N1YmNsYXNzKENsYXNzPFU+IGMpIHsKKyAgICAgICAgaWYgKGMuaXNBc3NpZ25hYmxlRnJvbSh0aGlzKSkgewogICAgICAgICAgICAgcmV0dXJuIChDbGFzczw/IGV4dGVuZHMgVT4pdGhpczsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgYWN0dWFsQ2xhc3NOYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBkZXNpcmVkQ2xhc3NOYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgZGVzaXJlZENsYXNzTmFtZSA9IGMuZ2V0TmFtZSgpOwogICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGFjdHVhbENsYXNzTmFtZSArICIgY2Fubm90IGJlIGNhc3QgdG8gIiArIGRlc2lyZWRDbGFzc05hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhc3RzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KKyAgICAgKiBDYXN0cyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENsYXNzfS4KICAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIHtAY29kZSBudWxsfSB0aGVuIHRoZSByZXN1bHQgaXMgYWxzbyB7QGNvZGUgbnVsbH0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNhc3QuCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IHRoYXQgaGFzIGJlZW4gY2FzdC4KICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGNhc3QgdG8gdGhlIGdpdmVuIHR5cGUuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIFQgY2FzdChPYmplY3Qgb2JqKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL01hdGguamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTWF0aC5qYXZhCmluZGV4IDIyYzg5Y2UuLmY4ZDIyZWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTWF0aC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvTWF0aC5qYXZhCkBAIC0yMDAsNyArMjAwLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IG5lZ2F0aXZlIChjbG9zZXN0IHRvIG5lZ2F0aXZlCi0gICAgICogaW5maW5pdHkpIGludGVnZXIgdmFsdWUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICAgKiBpbmZpbml0eSkgaW50ZWdlciB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgogICAgICAqIDxwPgogICAgICAqIFNwZWNpYWwgY2FzZXM6CiAgICAgICogPHVsPgpAQCAtMjExLDEwICsyMTEsNiBAQAogICAgICAqIDxsaT57QGNvZGUgY2VpbCgtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CiAgICAgICogPGxpPntAY29kZSBjZWlsKE5hTikgPSBOYU59PC9saT4KICAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBjbG9zZXN0IGludGVnZXIgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgotICAgICAqIEByZXR1cm4gdGhlIGNlaWxpbmcgb2YgdGhlIGFyZ3VtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjZWlsKGRvdWJsZSBkKTsKIApAQCAtMzAxLDcgKzI5Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgY29udmVyc2lvbiBvZiB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0byBwb3NpdGl2ZQotICAgICAqIGluZmluaXR5KSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgICogaW5maW5pdHkpIGludGVnZXIgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KICAgICAgKiA8cD4KICAgICAgKiBTcGVjaWFsIGNhc2VzOgogICAgICAqIDx1bD4KQEAgLTMxMSwxMCArMzA3LDYgQEAKICAgICAgKiA8bGk+e0Bjb2RlIGZsb29yKC1pbmZpbml0eSkgPSAtaW5maW5pdHl9PC9saT4KICAgICAgKiA8bGk+e0Bjb2RlIGZsb29yKE5hTikgPSBOYU59PC9saT4KICAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBjbG9zZXN0IGludGVnZXIgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgotICAgICAqIEByZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZmxvb3IoZG91YmxlIGQpOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1BhY2thZ2UuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUGFja2FnZS5qYXZhCmluZGV4IDAwY2M4MWMuLjdlMzA4ODMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUGFja2FnZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUGFja2FnZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYW5ub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHR5cGUgYW5kCisgICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHR5cGUgYW5kCiAgICAgICogdGhpcyBwYWNrYWdlLCBpZiBwcmVzZW50LgogICAgICAqCiAgICAgICogQHBhcmFtIGFubm90YXRpb25UeXBlCkBAIC05MiwxNyArOTIsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5LiBQYWNrYWdlIGFubm90YXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIEFuZHJvaWQuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGlzIHBhY2thZ2UncyBhbm5vdGF0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgewotICAgICAgICByZXR1cm4gTk9fQU5OT1RBVElPTlM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzczw/PiBjID0gQ2xhc3MuZm9yTmFtZShnZXROYW1lKCkgKyAiLnBhY2thZ2UtaW5mbyIpOworICAgICAgICAgICAgcmV0dXJuIGMuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fQU5OT1RBVElPTlM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5LiBQYWNrYWdlIGFubm90YXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIEFuZHJvaWQuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGlzIHBhY2thZ2UncyBkZWNsYXJlZCBhbm5vdGF0aW9ucy4gUGFja2FnZSBhbm5vdGF0aW9ucyBhcmVuJ3QKKyAgICAgKiBpbmhlcml0ZWQsIHNvIHRoaXMgaXMgZXF1aXZhbGVudCB0byB7QGxpbmsgI2dldEFubm90YXRpb25zfS4KICAgICAgKi8KICAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBOT19BTk5PVEFUSU9OUzsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1J1bnRpbWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZS5qYXZhCmluZGV4IGEyZGViZmQuLjVkZWQ5ODEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvUnVudGltZS5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nOwogCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5CYXNlRGV4Q2xhc3NMb2FkZXI7CiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTURlYnVnOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1TdGFjazsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00NCw4ICs0NSw5IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGxpYmNvcmUuaW8uSW9VdGlsczsKIGltcG9ydCBsaWJjb3JlLmlvLkxpYmNvcmU7Ci1pbXBvcnQgc3RhdGljIGxpYmNvcmUuaW8uT3NDb25zdGFudHMuX1NDX05QUk9DRVNTT1JTX09OTE47CitpbXBvcnQgc3RhdGljIGxpYmNvcmUuaW8uT3NDb25zdGFudHMuX1NDX05QUk9DRVNTT1JTX0NPTkY7CiAKIC8qKgogICogQWxsb3dzIEphdmEgYXBwbGljYXRpb25zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGV5IGFyZQpAQCAtOTAsNyArOTIsNyBAQAogICAgIC8qKgogICAgICAqIFByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIFJ1bnRpbWUoKXsKKyAgICBwcml2YXRlIFJ1bnRpbWUoKSB7CiAgICAgICAgIFN0cmluZyBwYXRoTGlzdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5saWJyYXJ5LnBhdGgiLCAiLiIpOwogICAgICAgICBTdHJpbmcgcGF0aFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiLCAiOiIpOwogICAgICAgICBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiLCAiLyIpOwpAQCAtMjQyLDE0ICsyNDQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYXVzZXMgdGhlIFZNIHRvIHN0b3AgcnVubmluZyBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4gSWYKLSAgICAgKiB7QGxpbmsgI3J1bkZpbmFsaXplcnNPbkV4aXQoYm9vbGVhbil9IGhhcyBiZWVuIHByZXZpb3VzbHkgaW52b2tlZCB3aXRoIGEKKyAgICAgKiBDYXVzZXMgdGhlIFZNIHRvIHN0b3AgcnVubmluZyBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4KKyAgICAgKiBJZiB7QGxpbmsgI3J1bkZpbmFsaXplcnNPbkV4aXQoYm9vbGVhbil9IGhhcyBiZWVuIHByZXZpb3VzbHkgaW52b2tlZCB3aXRoIGEKICAgICAgKiB7QGNvZGUgdHJ1ZX0gYXJndW1lbnQsIHRoZW4gYWxsIG9iamVjdHMgd2lsbCBiZSBwcm9wZXJseQogICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIGFuZCBmaW5hbGl6ZWQgZmlyc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiBjb2RlLiBCeSBjb252ZW50aW9uLCBub24temVybyByZXR1cm4gY29kZXMgaW5kaWNhdGUKLSAgICAgKiAgICAgICAgICAgIGFibm9ybWFsIHRlcm1pbmF0aW9ucy4KKyAgICAgKiBVc2UgMCB0byBzaWduYWwgc3VjY2VzcyB0byB0aGUgY2FsbGluZyBwcm9jZXNzIGFuZCAxIHRvIHNpZ25hbCBmYWlsdXJlLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVubGlrZWx5IHRvIGJlIHVzZWZ1bCB0byBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4aXQoaW50IGNvZGUpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0aGlzIHNldmVyYWwgdGltZXMKQEAgLTI5MCwxNCArMjkwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZnJlZSBtZW1vcnkgcmVzb3VyY2VzIHdoaWNoIGFyZSBhdmFpbGFibGUgdG8gdGhlCi0gICAgICogcnVubmluZyBwcm9ncmFtLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIGZyZWUgbWVtb3J5LCBtZWFzdXJlZCBpbiBieXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIGxvbmcgZnJlZU1lbW9yeSgpOwotCi0gICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRvIHRoZSBWTSB0aGF0IGl0IHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJ1biB0aGUKICAgICAgKiBnYXJiYWdlIGNvbGxlY3Rvci4gTm90ZSB0aGF0IHRoaXMgaXMgYSBoaW50IG9ubHkuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQogICAgICAqIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgYWN0dWFsbHkgYmUgcnVuLgpAQCAtMzA1LDkgKzI5Nyw3IEBACiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdjKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGUge0Bjb2RlIFJ1bnRpbWV9IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUge0Bjb2RlIFJ1bnRpbWV9IG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24uCisgICAgICogUmV0dXJucyB0aGUgc2luZ2xlIHtAY29kZSBSdW50aW1lfSBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBSdW50aW1lIGdldFJ1bnRpbWUoKSB7CiAgICAgICAgIHJldHVybiBtUnVudGltZTsKQEAgLTMyOSwxMyArMzE5LDEzIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBMb2FkcyBhbmQgbGlua3MgYSBsaWJyYXJ5IHdpdGhvdXQgc2VjdXJpdHkgY2hlY2tzLgorICAgICAqIExvYWRzIGFuZCBsaW5rcyB0aGUgZ2l2ZW4gbGlicmFyeSB3aXRob3V0IHNlY3VyaXR5IGNoZWNrcy4KICAgICAgKi8KICAgICB2b2lkIGxvYWQoU3RyaW5nIHBhdGhOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKICAgICAgICAgaWYgKHBhdGhOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGF0aE5hbWUgPT0gbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IG5hdGl2ZUxvYWQocGF0aE5hbWUsIGxvYWRlcik7CisgICAgICAgIFN0cmluZyBlcnJvciA9IGRvTG9hZChwYXRoTmFtZSwgbG9hZGVyKTsKICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbnNhdGlzZmllZExpbmtFcnJvcihlcnJvcik7CiAgICAgICAgIH0KQEAgLTM1NiwxNyArMzQ2LDE3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBMb2FkcyBhbmQgbGlua3MgYSBsaWJyYXJ5IHdpdGhvdXQgc2VjdXJpdHkgY2hlY2tzLgorICAgICAqIFNlYXJjaGVzIGZvciBhIGxpYnJhcnksIHRoZW4gbG9hZHMgYW5kIGxpbmtzIGl0IHdpdGhvdXQgc2VjdXJpdHkgY2hlY2tzLgogICAgICAqLwogICAgIHZvaWQgbG9hZExpYnJhcnkoU3RyaW5nIGxpYnJhcnlOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBsb2FkZXIuZmluZExpYnJhcnkobGlicmFyeU5hbWUpOwogICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zYXRpc2ZpZWRMaW5rRXJyb3IoIkNvdWxkbid0IGxvYWQgIiArIGxpYnJhcnlOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIGxvYWRlciAiICsgbG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogZmluZExpYnJhcnkgcmV0dXJuZWQgbnVsbCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnNhdGlzZmllZExpbmtFcnJvcigiQ291bGRuJ3QgbG9hZCAiICsgbGlicmFyeU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gbG9hZGVyICIgKyBsb2FkZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBmaW5kTGlicmFyeSByZXR1cm5lZCBudWxsIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBuYXRpdmVMb2FkKGZpbGVuYW1lLCBsb2FkZXIpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gZG9Mb2FkKGZpbGVuYW1lLCBsb2FkZXIpOwogICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zYXRpc2ZpZWRMaW5rRXJyb3IoZXJyb3IpOwogICAgICAgICAgICAgfQpAQCAtMzc5LDggKzM2OSw5IEBACiAgICAgICAgIGZvciAoU3RyaW5nIGRpcmVjdG9yeSA6IG1MaWJQYXRocykgewogICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IGRpcmVjdG9yeSArIGZpbGVuYW1lOwogICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoY2FuZGlkYXRlKTsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShjYW5kaWRhdGUpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gbmF0aXZlTG9hZChjYW5kaWRhdGUsIGxvYWRlcik7CisKKyAgICAgICAgICAgIGlmIChJb1V0aWxzLmNhbk9wZW5SZWFkT25seShjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gZG9Mb2FkKGNhbmRpZGF0ZSwgbG9hZGVyKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFdlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIGxpYnJhcnkuIEpvYiBkb25lLgogICAgICAgICAgICAgICAgIH0KQEAgLTM5Niw3ICszODcsNDAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUV4aXQoaW50IGNvZGUpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBuYXRpdmVMb2FkKFN0cmluZyBmaWxlbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKTsKKyAgICBwcml2YXRlIFN0cmluZyBkb0xvYWQoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAvLyBBbmRyb2lkIGFwcHMgYXJlIGZvcmtlZCBmcm9tIHRoZSB6eWdvdGUsIHNvIHRoZXkgY2FuJ3QgaGF2ZSBhIGN1c3RvbSBMRF9MSUJSQVJZX1BBVEgsCisgICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgYnkgZGVmYXVsdCBhbiBhcHAncyBzaGFyZWQgbGlicmFyeSBkaXJlY3RvcnkgaXNuJ3Qgb24gTERfTElCUkFSWV9QQVRILgorCisgICAgICAgIC8vIFRoZSBQYXRoQ2xhc3NMb2FkZXIgc2V0IHVwIGJ5IGZyYW1ld29ya3MvYmFzZSBrbm93cyB0aGUgYXBwcm9wcmlhdGUgcGF0aCwgc28gd2UgY2FuIGxvYWQKKyAgICAgICAgLy8gbGlicmFyaWVzIHdpdGggbm8gZGVwZW5kZW5jaWVzIGp1c3QgZmluZSwgYnV0IGFuIGFwcCB0aGF0IGhhcyBtdWx0aXBsZSBsaWJyYXJpZXMgdGhhdAorICAgICAgICAvLyBkZXBlbmQgb24gZWFjaCBvdGhlciBuZWVkZWQgdG8gbG9hZCB0aGVtIGluIG1vc3QtZGVwZW5kZW50LWZpcnN0IG9yZGVyLgorCisgICAgICAgIC8vIFdlIGFkZGVkIEFQSSB0byBBbmRyb2lkJ3MgZHluYW1pYyBsaW5rZXIgc28gd2UgY2FuIHVwZGF0ZSB0aGUgbGlicmFyeSBwYXRoIHVzZWQgZm9yCisgICAgICAgIC8vIHRoZSBjdXJyZW50bHktcnVubmluZyBwcm9jZXNzLiBXZSBwdWxsIHRoZSBkZXNpcmVkIHBhdGggb3V0IG9mIHRoZSBDbGFzc0xvYWRlciBoZXJlCisgICAgICAgIC8vIGFuZCBwYXNzIGl0IHRvIG5hdGl2ZUxvYWQgc28gdGhhdCBpdCBjYW4gY2FsbCB0aGUgcHJpdmF0ZSBkeW5hbWljIGxpbmtlciBBUEkuCisKKyAgICAgICAgLy8gV2UgZGlkbid0IGp1c3QgY2hhbmdlIGZyYW1ld29ya3MvYmFzZSB0byB1cGRhdGUgdGhlIExEX0xJQlJBUllfUEFUSCBvbmNlIGF0IHRoZQorICAgICAgICAvLyBiZWdpbm5pbmcgYmVjYXVzZSBtdWx0aXBsZSBhcGtzIGNhbiBydW4gaW4gdGhlIHNhbWUgcHJvY2VzcyBhbmQgdGhpcmQgcGFydHkgY29kZSBjYW4KKyAgICAgICAgLy8gdXNlIGl0cyBvd24gQmFzZURleENsYXNzTG9hZGVyLgorCisgICAgICAgIC8vIFdlIGRpZG4ndCBqdXN0IGFkZCBhIGRsb3Blbl93aXRoX2N1c3RvbV9MRF9MSUJSQVJZX1BBVEggY2FsbCBiZWNhdXNlIHdlIHdhbnRlZCBhbnkKKyAgICAgICAgLy8gZGxvcGVuKDMpIGNhbGxzIG1hZGUgZnJvbSBhIC5zbydzIEpOSV9PbkxvYWQgdG8gd29yayB0b28uCisKKyAgICAgICAgLy8gU28sIGZpbmQgb3V0IHdoYXQgdGhlIG5hdGl2ZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGlzIGZvciB0aGUgQ2xhc3NMb2FkZXIgaW4gcXVlc3Rpb24uLi4KKyAgICAgICAgU3RyaW5nIGxkTGlicmFyeVBhdGggPSBudWxsOworICAgICAgICBpZiAobG9hZGVyICE9IG51bGwgJiYgbG9hZGVyIGluc3RhbmNlb2YgQmFzZURleENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICBsZExpYnJhcnlQYXRoID0gKChCYXNlRGV4Q2xhc3NMb2FkZXIpIGxvYWRlcikuZ2V0TGRMaWJyYXJ5UGF0aCgpOworICAgICAgICB9CisgICAgICAgIC8vIG5hdGl2ZUxvYWQgc2hvdWxkIGJlIHN5bmNocm9uaXplZCBzbyB0aGVyZSdzIG9ubHkgb25lIExEX0xJQlJBUllfUEFUSCBpbiB1c2UgcmVnYXJkbGVzcworICAgICAgICAvLyBvZiBob3cgbWFueSBDbGFzc0xvYWRlcnMgYXJlIGluIHRoZSBzeXN0ZW0sIGJ1dCBkYWx2aWsgZG9lc24ndCBzdXBwb3J0IHN5bmNocm9uaXplZAorICAgICAgICAvLyBpbnRlcm5hbCBuYXRpdmVzLgorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVMb2FkKG5hbWUsIGxvYWRlciwgbGRMaWJyYXJ5UGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBzaG91bGQgYmUgc3luY2hyb25pemVkLCBidXQgZGFsdmlrIGRvZXNuJ3Qgc3VwcG9ydCBzeW5jaHJvbml6ZWQgaW50ZXJuYWwgbmF0aXZlcy4KKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUxvYWQoU3RyaW5nIGZpbGVuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBsZExpYnJhcnlQYXRoKTsKIAogICAgIC8qKgogICAgICAqIFByb3ZpZGVzIGEgaGludCB0byB0aGUgVk0gdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gYXR0ZW1wdApAQCAtNDI3LDMwICs0NTEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIGlzIGF2YWlsYWJsZSB0byB0aGUgcnVubmluZwotICAgICAqIHByb2dyYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5LCBtZWFzdXJlZCBpbiBieXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIGxvbmcgdG90YWxNZW1vcnkoKTsKLQotICAgIC8qKgogICAgICAqIFN3aXRjaGVzIHRoZSBvdXRwdXQgb2YgZGVidWcgaW5mb3JtYXRpb24gZm9yIGluc3RydWN0aW9ucyBvbiBvciBvZmYuCiAgICAgICogT24gQW5kcm9pZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZQotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHN3aXRjaCB0cmFjaW5nIG9uLCB7QGNvZGUgZmFsc2V9IHRvIHN3aXRjaCBpdAotICAgICAqICAgICAgICAgICAgb2ZmLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYWNlSW5zdHJ1Y3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU3dpdGNoZXMgdGhlIG91dHB1dCBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kcyBvbiBvciBvZmYuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlCi0gICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gc3dpdGNoIHRyYWNpbmcgb24sIHtAY29kZSBmYWxzZX0gdG8gc3dpdGNoIGl0Ci0gICAgICogICAgICAgICAgICBvZmYuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhY2VNZXRob2RDYWxscyhib29sZWFuIGVuYWJsZSkgewogICAgICAgICBpZiAoZW5hYmxlICE9IHRyYWNpbmdNZXRob2RzKSB7CkBAIC01ODQsMTUgKzU5MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgVk0gdG8gc3RvcCBydW5uaW5nLCBhbmQgdGhlIHByb2dyYW0gdG8gZXhpdC4KLSAgICAgKiBOZWl0aGVyIHNodXRkb3duIGhvb2tzIG5vciBmaW5hbGl6ZXJzIGFyZSBydW4gYmVmb3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gY29kZS4gQnkgY29udmVudGlvbiwgbm9uLXplcm8gcmV0dXJuIGNvZGVzIGluZGljYXRlCi0gICAgICogICAgICAgICAgICBhYm5vcm1hbCB0ZXJtaW5hdGlvbnMuCi0gICAgICogQHNlZSAjYWRkU2h1dGRvd25Ib29rKFRocmVhZCkKLSAgICAgKiBAc2VlICNyZW1vdmVTaHV0ZG93bkhvb2soVGhyZWFkKQotICAgICAqIEBzZWUgI3J1bkZpbmFsaXplcnNPbkV4aXQoYm9vbGVhbikKKyAgICAgKiBDYXVzZXMgdGhlIFZNIHRvIHN0b3AgcnVubmluZywgYW5kIHRoZSBwcm9ncmFtIHRvIGV4aXQgd2l0aCB0aGUgZ2l2ZW4gcmV0dXJuIGNvZGUuCisgICAgICogVXNlIDAgdG8gc2lnbmFsIHN1Y2Nlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhbmQgMSB0byBzaWduYWwgZmFpbHVyZS4KKyAgICAgKiBOZWl0aGVyIHNodXRkb3duIGhvb2tzIG5vciBmaW5hbGl6ZXJzIGFyZSBydW4gYmVmb3JlIGV4aXRpbmcuCisgICAgICogVGhpcyBtZXRob2QgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsIHRvIGFuIEFuZHJvaWQgYXBwbGljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFsdChpbnQgY29kZSkgewogICAgICAgICAvLyBHZXQgb3V0IG9mIGhlcmUuLi4KQEAgLTYwMCwxOCArNjAzLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIHRvIHRoZSBWTSwgYXQgbGVhc3QgMS4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIGF2YWlsYWJsZSB0byB0aGUgVk0sIGF0IGxlYXN0IDEuCisgICAgICogVHJhZGl0aW9uYWxseSB0aGlzIHJldHVybmVkIHRoZSBudW1iZXIgY3VycmVudGx5IG9ubGluZSwKKyAgICAgKiBidXQgbWFueSBtb2JpbGUgZGV2aWNlcyBhcmUgYWJsZSB0byB0YWtlIHVudXNlZCBjb3JlcyBvZmZsaW5lIHRvCisgICAgICogc2F2ZSBwb3dlciwgc28gcmVsZWFzZXMgbmV3ZXIgdGhhbiBBbmRyb2lkIDQuMiAoSmVsbHkgQmVhbikgcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAqIGNvcmVzIHRoYXQgY291bGQgYmUgbWFkZSBhdmFpbGFibGUgaWYgdGhlcmUgd2VyZSBubyBwb3dlciBvciBoZWF0CisgICAgICogY29uc3RyYWludHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBhdmFpbGFibGVQcm9jZXNzb3JzKCkgewotICAgICAgICByZXR1cm4gKGludCkgTGliY29yZS5vcy5zeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIExpYmNvcmUub3Muc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgbWF5IGJlIHVzZWQgYnkgdGhlIHZpcnR1YWwKLSAgICAgKiBtYWNoaW5lLCBvciB7QGNvZGUgTG9uZy5NQVhfVkFMVUV9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggbGltaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdGhhdCB0aGUgVk0gd2lsbCB0cnkgdG8KLSAgICAgKiAgICAgICAgIGFsbG9jYXRlLCBtZWFzdXJlZCBpbiBieXRlcy4KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGF2YWlsYWJsZSBvbiB0aGUgaGVhcCB3aXRob3V0IGV4cGFuZGluZyB0aGUgaGVhcC4gU2VlCisgICAgICoge0BsaW5rICN0b3RhbE1lbW9yeX0gZm9yIHRoZSBoZWFwJ3MgY3VycmVudCBzaXplLiBXaGVuIHRoZXNlIGJ5dGVzIGFyZSBleGhhdXN0ZWQsIHRoZSBoZWFwCisgICAgICogbWF5IGV4cGFuZC4gU2VlIHtAbGluayAjbWF4TWVtb3J5fSBmb3IgdGhhdCBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIGxvbmcgZnJlZU1lbW9yeSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIGJ5IHRoZSBoZWFwIGF0IGl0cyBjdXJyZW50IHNpemUuIFRoZSBoZWFwIG1heSBleHBhbmQgb3IKKyAgICAgKiBjb250cmFjdCBvdmVyIHRpbWUsIGFzIHRoZSBudW1iZXIgb2YgbGl2ZSBvYmplY3RzIGluY3JlYXNlcyBvciBkZWNyZWFzZXMuIFNlZQorICAgICAqIHtAbGluayAjbWF4TWVtb3J5fSBmb3IgdGhlIG1heGltdW0gaGVhcCBzaXplLCBhbmQge0BsaW5rICNmcmVlTWVtb3J5fSBmb3IgYW4gaWRlYSBvZiBob3cgbXVjaAorICAgICAqIHRoZSBoZWFwIGNvdWxkIGN1cnJlbnRseSBjb250cmFjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIGxvbmcgdG90YWxNZW1vcnkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoZSBoZWFwIGNhbiBleHBhbmQgdG8uIFNlZSB7QGxpbmsgI3RvdGFsTWVtb3J5fSBmb3IgdGhlCisgICAgICogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgdGFrZW4gYnkgdGhlIGhlYXAsIGFuZCB7QGxpbmsgI2ZyZWVNZW1vcnl9IGZvciB0aGUgY3VycmVudCBudW1iZXIgb2YKKyAgICAgKiB0aG9zZSBieXRlcyBhY3R1YWxseSB1c2VkIGJ5IGxpdmUgb2JqZWN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGxvbmcgbWF4TWVtb3J5KCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N0cmljdE1hdGguamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaWN0TWF0aC5qYXZhCmluZGV4IDY1NzFiMmQuLmY0MDljMDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaWN0TWF0aC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3RyaWN0TWF0aC5qYXZhCkBAIC0yMTUsNyArMjE1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRvdWJsZSBjb252ZXJzaW9uIG9mIHRoZSBtb3N0IG5lZ2F0aXZlIChjbG9zZXN0IHRvIG5lZ2F0aXZlCi0gICAgICogaW5maW5pdHkpIGludGVnZXIgdmFsdWUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICAgKiBpbmZpbml0eSkgaW50ZWdlciB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgogICAgICAqIDxwPgogICAgICAqIFNwZWNpYWwgY2FzZXM6CiAgICAgICogPHVsPgpAQCAtMjI2LDEwICsyMjYsNiBAQAogICAgICAqIDxsaT57QGNvZGUgY2VpbCgtaW5maW5pdHkpID0gLWluZmluaXR5fTwvbGk+CiAgICAgICogPGxpPntAY29kZSBjZWlsKE5hTikgPSBOYU59PC9saT4KICAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aG9zZSBjbG9zZXN0IGludGVnZXIgdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkLgotICAgICAqIEByZXR1cm4gdGhlIGNlaWxpbmcgb2YgdGhlIGFyZ3VtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjZWlsKGRvdWJsZSBkKTsKIApAQCAtMzA5LDcgKzMwNSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgY29udmVyc2lvbiBvZiB0aGUgbW9zdCBwb3NpdGl2ZSAoY2xvc2VzdCB0bwotICAgICAqIHBvc2l0aXZlIGluZmluaXR5KSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgICogcG9zaXRpdmUgaW5maW5pdHkpIGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KICAgICAgKiA8cD4KICAgICAgKiBTcGVjaWFsIGNhc2VzOgogICAgICAqIDx1bD4KQEAgLTMxOSw5ICszMTUsNiBAQAogICAgICAqIDxsaT57QGNvZGUgZmxvb3IoLWluZmluaXR5KSA9IC1pbmZpbml0eX08L2xpPgogICAgICAqIDxsaT57QGNvZGUgZmxvb3IoTmFOKSA9IE5hTn08L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZCB0aGUgdmFsdWUgd2hvc2UgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgYXJndW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGZsb29yKGRvdWJsZSBkKTsKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TeXN0ZW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvU3lzdGVtLmphdmEKaW5kZXggZGY4NGM2MS4uOThjZTZjYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9TeXN0ZW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1N5c3RlbS5qYXZhCkBAIC0xMzUsNiArMTM1LDExIEBACiAgICAgICogc3RhcnRpbmcgYXQgb2Zmc2V0IHtAY29kZSBzcmNQb3N9LCBpbnRvIHRoZSBhcnJheSB7QGNvZGUgZHN0fSwKICAgICAgKiBzdGFydGluZyBhdCBvZmZzZXQge0Bjb2RlIGRzdFBvc30uCiAgICAgICoKKyAgICAgKiA8cD5UaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcnJheXMgY2FuIGJlIHRoZSBzYW1lIGFycmF5LAorICAgICAqIGluIHdoaWNoIGNhc2UgY29weWluZyBpcyBwZXJmb3JtZWQgYXMgaWYgdGhlIHNvdXJjZSBlbGVtZW50cworICAgICAqIGFyZSBmaXJzdCBjb3BpZWQgaW50byBhIHRlbXBvcmFyeSBhcnJheSBhbmQgdGhlbiBpbnRvIHRoZQorICAgICAqIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAqCiAgICAgICogQHBhcmFtIHNyYwogICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheSB0byBjb3B5IHRoZSBjb250ZW50LgogICAgICAqIEBwYXJhbSBzcmNQb3MKQEAgLTE0OSwyMiArMTU0LDI3IEBACiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWNvcHkoT2JqZWN0IHNyYywgaW50IHNyY1BvcywgT2JqZWN0IGRzdCwgaW50IGRzdFBvcywgaW50IGxlbmd0aCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAKLSAgICAgKiAwMDowMDowMCBVVEMuIFRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSB1c2VkIGZvciBtZWFzdXJpbmcgdGltZW91dHMgb3IKLSAgICAgKiBvdGhlciBlbGFwc2VkIHRpbWUgbWVhc3VyZW1lbnRzLCBhcyBjaGFuZ2luZyB0aGUgc3lzdGVtIHRpbWUgY2FuIGFmZmVjdAotICAgICAqIHRoZSByZXN1bHRzLgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIDAwOjAwOjAwLjAgVVRDLgogICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIFVUQyB0aW1lcywgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgdGltZSB6b25lLgorICAgICAqIFRoaXMgaXMgb2Z0ZW4gY2FsbGVkICJVbml4IHRpbWUiIG9yICJlcG9jaCB0aW1lIi4KKyAgICAgKiBVc2UgYSB7QGxpbmsgamF2YS50ZXh0LkRhdGVGb3JtYXR9IGluc3RhbmNlIHRvIGZvcm1hdCB0aGlzIHRpbWUgZm9yIGRpc3BsYXkgdG8gYSBodW1hbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSB1c2VkIGZvciBtZWFzdXJpbmcgdGltZW91dHMgb3IKKyAgICAgKiBvdGhlciBlbGFwc2VkIHRpbWUgbWVhc3VyZW1lbnRzLCBhcyBjaGFuZ2luZyB0aGUgc3lzdGVtIHRpbWUgY2FuIGFmZmVjdAorICAgICAqIHRoZSByZXN1bHRzLiBVc2Uge0BsaW5rICNuYW5vVGltZX0gZm9yIHRoYXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBjdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcHJlY2lzZSB0aW1lciBhdmFpbGFibGUgb24gdGhlCi0gICAgICogbG9jYWwgc3lzdGVtLiBUaGlzIHRpbWVzdGFtcCBjYW4gb25seSBiZSB1c2VkIHRvIG1lYXN1cmUgYW4gZWxhcHNlZAotICAgICAqIHBlcmlvZCBieSBjb21wYXJpbmcgaXQgYWdhaW5zdCBhbm90aGVyIHRpbWVzdGFtcC4gSXQgY2Fubm90IGJlIHVzZWQgYXMgYQotICAgICAqIHZlcnkgZXhhY3Qgc3lzdGVtIHRpbWUgZXhwcmVzc2lvbi4KKyAgICAgKiBsb2NhbCBzeXN0ZW0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgKiA8cD5UaGlzIHRpbWVzdGFtcCBzaG91bGQgb25seSBiZSB1c2VkIHRvIG1lYXN1cmUgYSBkdXJhdGlvbiBieSBjb21wYXJpbmcgaXQKKyAgICAgKiBhZ2FpbnN0IGFub3RoZXIgdGltZXN0YW1wIGZyb20gdGhlIHNhbWUgcHJvY2VzcyBvbiB0aGUgc2FtZSBkZXZpY2UuCisgICAgICogVmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBjb3JyZXNwb25kZW5jZSB0bworICAgICAqIHdhbGwgY2xvY2sgdGltZXM7IHRoZSB6ZXJvIHZhbHVlIGlzIHR5cGljYWxseSB3aGVuZXZlciB0aGUgZGV2aWNlIGxhc3QgYm9vdGVkLgorICAgICAqIFVzZSB7QGxpbmsgI2N1cnJlbnRUaW1lTWlsbGlzfSBpZiB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGltZSBpdCBpcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIG5hbm9UaW1lKCk7CiAKQEAgLTIxMSwxMyArMjIxLDYgQEAKICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlOwogICAgIH0KIAotICAgIC8qCi0gICAgICogUmV0dXJucyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTm8gc2VjdXJpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIHZhciB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRFbnZCeU5hbWUoU3RyaW5nIG5hbWUpOwotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIGFsbCBhdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgogICAgICAqCkBAIC0zMjEsNiArMzI0LDcgQEAKICAgICAgICAgLy8gVW5kb2N1bWVudGVkIEFuZHJvaWQtb25seSBwcm9wZXJ0aWVzLgogICAgICAgICBwLnB1dCgiYW5kcm9pZC5pY3UubGlicmFyeS52ZXJzaW9uIiwgSUNVLmdldEljdVZlcnNpb24oKSk7CiAgICAgICAgIHAucHV0KCJhbmRyb2lkLmljdS51bmljb2RlLnZlcnNpb24iLCBJQ1UuZ2V0VW5pY29kZVZlcnNpb24oKSk7CisgICAgICAgIHAucHV0KCJhbmRyb2lkLmljdS5jbGRyLnZlcnNpb24iLCBJQ1UuZ2V0Q2xkclZlcnNpb24oKSk7CiAgICAgICAgIC8vIFRPRE86IGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGlzIGJ1dCBjdXJyZW50bHkgaXQgY2F1c2VzIGNpcmN1bGFyaXR5LgogICAgICAgICAvLyBwLnB1dCgiYW5kcm9pZC50emRhdGEudmVyc2lvbiIsIFpvbmVJbmZvREIuZ2V0VmVyc2lvbigpKTsKICAgICAgICAgcGFyc2VQcm9wZXJ0eUFzc2lnbm1lbnRzKHAsIHNwZWNpYWxQcm9wZXJ0aWVzKCkpOwpAQCAtNDA5LDU4ICs0MTMsNDQgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgc3lzdGVtIHByb3BlcnR5LiBUaGUge0Bjb2RlCiAgICAgICogZGVmYXVsdFZhbHVlfSB3aWxsIGJlIHJldHVybmVkIGlmIG5vIHN1Y2ggcHJvcGVydHkgaGFzIGJlZW4gZm91bmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcAotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0byBsb29rIHVwLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIHN5c3RlbSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN5c3RlbSBwcm9wZXJ0eSBvciB0aGUge0Bjb2RlCi0gICAgICogICAgICAgICBkZWZhdWx0VmFsdWV9IGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBpZiAocHJvcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KHByb3AsIGRlZmF1bHRWYWx1ZSk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgY2hlY2tQcm9wZXJ0eU5hbWUobmFtZSk7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkobmFtZSwgZGVmYXVsdFZhbHVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgc3lzdGVtIHByb3BlcnR5LgogICAgICAqCi0gICAgICogQHBhcmFtIHByb3AKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgdG8gYmUgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkge0Bjb2RlIHByb3B9LgogICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eQogICAgICAqICAgICAgICAgZGlkbid0IGV4aXN0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBwcm9wLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHByb3AuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjaGVja1Byb3BlcnR5TmFtZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhIHNwZWNpZmljIHN5c3RlbSBwcm9wZXJ0eS4KICAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgdG8gYmUgcmVtb3ZlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGRpZG4ndCBleGlzdC4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IHtAY29kZSBrZXl9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgaXMge0Bjb2RlIG51bGx9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IHtAY29kZSBrZXl9IGlzIGVtcHR5LgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBpcyBlbXB0eS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhclByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSA9PSBudWxsIik7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYXJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBjaGVja1Byb3BlcnR5TmFtZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFByb3BlcnRpZXMoKS5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1Byb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5hbWUgPT0gbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBpcyBlbXB0eSIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKGtleSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9UaHJlYWQuamF2YQppbmRleCAyMTBiOTBjLi5jYzA5NzVmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL1RocmVhZC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvVGhyZWFkLmphdmEKQEAgLTQxLDMzICs0MSwyMCBAQAogCiAvKioKICAqIEEge0Bjb2RlIFRocmVhZH0gaXMgYSBjb25jdXJyZW50IHVuaXQgb2YgZXhlY3V0aW9uLiBJdCBoYXMgaXRzIG93biBjYWxsIHN0YWNrCi0gKiBmb3IgbWV0aG9kcyBiZWluZyBpbnZva2VkLCB0aGVpciBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcy4gRWFjaCB2aXJ0dWFsCi0gKiBtYWNoaW5lIGluc3RhbmNlIGhhcyBhdCBsZWFzdCBvbmUgbWFpbiB7QGNvZGUgVGhyZWFkfSBydW5uaW5nIHdoZW4gaXQgaXMKLSAqIHN0YXJ0ZWQ7IHR5cGljYWxseSwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXJzIGZvciBob3VzZWtlZXBpbmcuIFRoZQotICogYXBwbGljYXRpb24gbWlnaHQgZGVjaWRlIHRvIGxhdW5jaCBhZGRpdGlvbmFsIHtAY29kZSBUaHJlYWR9cyBmb3Igc3BlY2lmaWMKLSAqIHB1cnBvc2VzLgotICogPHA+Ci0gKiB7QGNvZGUgVGhyZWFkfXMgaW4gdGhlIHNhbWUgVk0gaW50ZXJhY3QgYW5kIHN5bmNocm9uaXplIGJ5IHRoZSB1c2Ugb2Ygc2hhcmVkCi0gKiBvYmplY3RzIGFuZCBtb25pdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlc2Ugb2JqZWN0cy4gU3luY2hyb25pemVkIG1ldGhvZHMgYW5kCi0gKiBwYXJ0IG9mIHRoZSBBUEkgaW4ge0BsaW5rIE9iamVjdH0gYWxzbyBhbGxvdyB7QGNvZGUgVGhyZWFkfXMgdG8gY29vcGVyYXRlLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgYmFzaWNhbGx5IHR3byBtYWluIHdheXMgb2YgaGF2aW5nIGEge0Bjb2RlIFRocmVhZH0gZXhlY3V0ZQotICogYXBwbGljYXRpb24gY29kZS4gT25lIGlzIHByb3ZpZGluZyBhIG5ldyBjbGFzcyB0aGF0IGV4dGVuZHMge0Bjb2RlIFRocmVhZH0KLSAqIGFuZCBvdmVycmlkaW5nIGl0cyB7QGxpbmsgI3J1bigpfSBtZXRob2QuIFRoZSBvdGhlciBpcyBwcm92aWRpbmcgYSBuZXcKLSAqIHtAY29kZSBUaHJlYWR9IGluc3RhbmNlIHdpdGggYSB7QGxpbmsgUnVubmFibGV9IG9iamVjdCBkdXJpbmcgaXRzIGNyZWF0aW9uLgotICogSW4gYm90aCBjYXNlcywgdGhlIHtAbGluayAjc3RhcnQoKX0gbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvIGFjdHVhbGx5IGV4ZWN1dGUKKyAqIGZvciBtZXRob2RzIGJlaW5nIGludm9rZWQsIHRoZWlyIGFyZ3VtZW50cyBhbmQgbG9jYWwgdmFyaWFibGVzLiBFYWNoIGFwcGxpY2F0aW9uCisgKiBoYXMgYXQgbGVhc3Qgb25lIHRocmVhZCBydW5uaW5nIHdoZW4gaXQgaXMgc3RhcnRlZCwgdGhlIG1haW4gdGhyZWFkLCBpbiB0aGUgbWFpbgorICoge0BsaW5rIFRocmVhZEdyb3VwfS4gVGhlIHJ1bnRpbWUga2VlcHMgaXRzIG93biB0aHJlYWRzIGluIHRoZSBzeXN0ZW0gdGhyZWFkCisgKiBncm91cC4KKyAqCisgKiA8cD5UaGVyZSBhcmUgdHdvIHdheXMgdG8gZXhlY3V0ZSBjb2RlIGluIGEgbmV3IHRocmVhZC4KKyAqIFlvdSBjYW4gZWl0aGVyIHN1YmNsYXNzIHtAY29kZSBUaHJlYWR9IGFuZCBvdmVycmlkaW5nIGl0cyB7QGxpbmsgI3J1bigpfSBtZXRob2QsCisgKiBvciBjb25zdHJ1Y3QgYSBuZXcge0Bjb2RlIFRocmVhZH0gYW5kIHBhc3MgYSB7QGxpbmsgUnVubmFibGV9IHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqIEluIGVpdGhlciBjYXNlLCB0aGUge0BsaW5rICNzdGFydCgpfSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgdG8gYWN0dWFsbHkgZXhlY3V0ZQogICogdGhlIG5ldyB7QGNvZGUgVGhyZWFkfS4KLSAqIDxwPgotICogRWFjaCB7QGNvZGUgVGhyZWFkfSBoYXMgYW4gaW50ZWdlciBwcmlvcml0eSB0aGF0IGJhc2ljYWxseSBkZXRlcm1pbmVzIHRoZQotICogYW1vdW50IG9mIENQVSB0aW1lIHRoZSB7QGNvZGUgVGhyZWFkfSBnZXRzLiBJdCBjYW4gYmUgc2V0IHVzaW5nIHRoZQotICoge0BsaW5rICNzZXRQcmlvcml0eShpbnQpfSBtZXRob2QuIEEge0Bjb2RlIFRocmVhZH0gY2FuIGFsc28gYmUgbWFkZSBhIGRhZW1vbiwKLSAqIHdoaWNoIG1ha2VzIGl0IHJ1biBpbiB0aGUgYmFja2dyb3VuZC4gVGhlIGxhdHRlciBhbHNvIGFmZmVjdHMgVk0gdGVybWluYXRpb24KLSAqIGJlaGF2aW9yOiB0aGUgVk0gZG9lcyBub3QgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgYXMgbG9uZyBhcyB0aGVyZSBhcmUKLSAqIG5vbi1kYWVtb24gdGhyZWFkcyBydW5uaW5nLgogICoKLSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdAotICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkR3JvdXAKLSAqCisgKiA8cD5FYWNoIHtAY29kZSBUaHJlYWR9IGhhcyBhbiBpbnRlZ2VyIHByaW9yaXR5IHRoYXQgYWZmZWN0IGhvdyB0aGUgdGhyZWFkIGlzCisgKiBzY2hlZHVsZWQgYnkgdGhlIE9TLiBBIG5ldyB0aHJlYWQgaW5oZXJpdHMgdGhlIHByaW9yaXR5IG9mIGl0cyBwYXJlbnQuCisgKiBBIHRocmVhZCdzIHByaW9yaXR5IGNhbiBiZSBzZXQgdXNpbmcgdGhlIHtAbGluayAjc2V0UHJpb3JpdHkoaW50KX0gbWV0aG9kLgogICovCiBwdWJsaWMgY2xhc3MgVGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU5PU19QRVJfTUlMTEkgPSAxMDAwMDAwOwpAQCAtMTE3LDE2ICsxMDQsMjMgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIGFsbG93ZWQgZm9yIGEgdGhyZWFkLgorICAgICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gKGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzKQorICAgICAqIHtAY29kZSBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZfS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUFJJT1JJVFkgPSAxMDsKIAogICAgIC8qKgogICAgICAqIFRoZSBtaW5pbXVtIHByaW9yaXR5IHZhbHVlIGFsbG93ZWQgZm9yIGEgdGhyZWFkLgorICAgICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gKGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzKQorICAgICAqIHtAY29kZSBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0xPV0VTVH0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1BSSU9SSVRZID0gMTsKIAogICAgIC8qKgotICAgICAqIFRoZSBub3JtYWwgKGRlZmF1bHQpIHByaW9yaXR5IHZhbHVlIGFzc2lnbmVkIHRvIHRocmVhZHMuCisgICAgICogVGhlIG5vcm1hbCAoZGVmYXVsdCkgcHJpb3JpdHkgdmFsdWUgYXNzaWduZWQgdG8gdGhlIG1haW4gdGhyZWFkLgorICAgICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gKGJ1dCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzKQorICAgICAqIHtAY29kZSBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFR9LgorCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STV9QUklPUklUWSA9IDU7CiAKQEAgLTQ3NywxMyArNDcxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVzdHJveXMgdGhlIHJlY2VpdmVyIHdpdGhvdXQgYW55IG1vbml0b3IgY2xlYW51cC4KLSAgICAgKgorICAgICAqIFRocm93cyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgogICAgICAqIEBkZXByZWNhdGVkIE5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvcigiVGhyZWFkLmRlc3Ryb3koKSIpOyAvLyBUT0RPIEV4dGVybmFsaXplPz8/CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTY3LDggKzU2MCw2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBUaHJlYWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBUaHJlYWQncyBuYW1lCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKQEAgLTU3Niw5ICs1NjcsNiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgdGhlIFRocmVhZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFRocmVhZCdzIHByaW9yaXR5Ci0gICAgICogQHNlZSBUaHJlYWQjc2V0UHJpb3JpdHkKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFByaW9yaXR5KCkgewogICAgICAgICByZXR1cm4gcHJpb3JpdHk7CkBAIC02NjksMTYgKzY1NywxOSBAQAogICAgICAqIEBzZWUgVGhyZWFkI2lzSW50ZXJydXB0ZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnRlcnJ1cHQoKSB7CisgICAgICAgIC8vIEludGVycnVwdCB0aGlzIHRocmVhZCBiZWZvcmUgcnVubmluZyBhY3Rpb25zIHNvIHRoYXQgb3RoZXIKKyAgICAgICAgLy8gdGhyZWFkcyB0aGF0IG9ic2VydmUgdGhlIGludGVycnVwdCBhcyBhIHJlc3VsdCBvZiBhbiBhY3Rpb24KKyAgICAgICAgLy8gd2lsbCBzZWUgdGhhdCB0aGlzIHRocmVhZCBpcyBpbiB0aGUgaW50ZXJydXB0ZWQgc3RhdGUuCisgICAgICAgIFZNVGhyZWFkIHZtdCA9IHRoaXMudm1UaHJlYWQ7CisgICAgICAgIGlmICh2bXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdm10LmludGVycnVwdCgpOworICAgICAgICB9CisKICAgICAgICAgc3luY2hyb25pemVkIChpbnRlcnJ1cHRBY3Rpb25zKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gaW50ZXJydXB0QWN0aW9ucy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgIGludGVycnVwdEFjdGlvbnMuZ2V0KGkpLnJ1bigpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgVk1UaHJlYWQgdm10ID0gdGhpcy52bVRocmVhZDsKLSAgICAgICAgaWYgKHZtdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2bXQuaW50ZXJydXB0KCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTcxMCwxNCArNzAxLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVjZWl2ZXIgaXMgYQotICAgICAqIGRhZW1vbiBUaHJlYWQgKDxjb2RlPnRydWU8L2NvZGU+KSBvciBub3QgKDxjb2RlPmZhbHNlPC9jb2RlPikgQQotICAgICAqIGRhZW1vbiBUaHJlYWQgb25seSBydW5zIGFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vbi1kYWVtb24gVGhyZWFkcyBydW5uaW5nLgotICAgICAqIFdoZW4gdGhlIGxhc3Qgbm9uLWRhZW1vbiBUaHJlYWQgZW5kcywgdGhlIHdob2xlIHByb2dyYW0gZW5kcyBubyBtYXR0ZXIgaWYKLSAgICAgKiBpdCBoYWQgZGFlbW9uIFRocmVhZHMgc3RpbGwgcnVubmluZyBvciBub3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBUaHJlYWQgaXMgYSBkYWVtb24KLSAgICAgKiBAc2VlIFRocmVhZCNzZXREYWVtb24KKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgYSBkYWVtb24gdGhyZWFkLgorICAgICAqIEEgZGFlbW9uIHRocmVhZCBvbmx5IHJ1bnMgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm9uLWRhZW1vbiB0aHJlYWRzIHJ1bm5pbmcuCisgICAgICogV2hlbiB0aGUgbGFzdCBub24tZGFlbW9uIHRocmVhZCBlbmRzLCB0aGUgcnVudGltZSB3aWxsIGV4aXQuIFRoaXMgaXMgbm90CisgICAgICogbm9ybWFsbHkgcmVsZXZhbnQgdG8gYXBwbGljYXRpb25zIHdpdGggYSBVSS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RhZW1vbigpIHsKICAgICAgICAgcmV0dXJuIGRhZW1vbjsKQEAgLTc5Miw3ICs3NzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGpvaW4obG9uZyBtaWxsaXMsIGludCBuYW5vcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1pbGxpcyA8IDAgfHwgbmFub3MgPCAwIHx8IG5hbm9zID49IE5BTk9TX1BFUl9NSUxMSSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIHRpbWVvdXQ6IG1pbGxpcz0iICsgbWlsbGlzICsgIixuYW5vcz0iICsgbmFub3MpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gYXZvaWQgb3ZlcmZsb3c6IGlmIHRvdGFsID4gMjkyLDI3NyB5ZWFycywganVzdCB3YWl0IGZvcmV2ZXIKQEAgLTgzNiw5ICs4MjMsNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhyb3dzIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiBAc2VlIFRocmVhZCNzdXNwZW5kKCkKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2VkIHdpdGggZGVwcmVjYXRlZCBtZXRob2Qge0BsaW5rIFRocmVhZCNzdXNwZW5kfQorICAgICAqIEBkZXByZWNhdGVkIE9ubHkgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggZGVwcmVjYXRlZCBtZXRob2Qge0BsaW5rIFRocmVhZCNzdXNwZW5kfS4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlc3VtZSgpIHsKQEAgLTg2OCwyMyArODUzLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGlmIHRoZSByZWNlaXZlciBpcyBhIGRhZW1vbiBUaHJlYWQgb3Igbm90LiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUKLSAgICAgKiBiZWZvcmUgdGhlIFRocmVhZCBzdGFydHMgcnVubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpc0RhZW1vbgotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRocmVhZCBzaG91bGQgYmUgZGFlbW9uIG9yIG5vdAotICAgICAqIEBzZWUgVGhyZWFkI2lzRGFlbW9uCisgICAgICogTWFya3MgdGhpcyB0aHJlYWQgYXMgYSBkYWVtb24gdGhyZWFkLgorICAgICAqIEEgZGFlbW9uIHRocmVhZCBvbmx5IHJ1bnMgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm9uLWRhZW1vbiB0aHJlYWRzIHJ1bm5pbmcuCisgICAgICogV2hlbiB0aGUgbGFzdCBub24tZGFlbW9uIHRocmVhZCBlbmRzLCB0aGUgcnVudGltZSB3aWxsIGV4aXQuIFRoaXMgaXMgbm90CisgICAgICogbm9ybWFsbHkgcmVsZXZhbnQgdG8gYXBwbGljYXRpb25zIHdpdGggYSBVSS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiAtIGlmIHRoaXMgdGhyZWFkIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGFlbW9uKGJvb2xlYW4gaXNEYWVtb24pIHsKLSAgICAgICAgaWYgKGhhc0JlZW5TdGFydGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uKCJUaHJlYWQgYWxyZWFkeSBzdGFydGVkLiIpOyAvLyBUT0RPIEV4dGVybmFsaXplPwotICAgICAgICB9Ci0KKyAgICAgICAgY2hlY2tOb3RTdGFydGVkKCk7CiAgICAgICAgIGlmICh2bVRocmVhZCA9PSBudWxsKSB7CiAgICAgICAgICAgICBkYWVtb24gPSBpc0RhZW1vbjsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjaGVja05vdFN0YXJ0ZWQoKSB7CisgICAgICAgIGlmIChoYXNCZWVuU3RhcnRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGVmYXVsdCB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGludm9rZWQgaW4KICAgICAgKiBjYXNlIGFueSBUaHJlYWQgZGllcyBkdWUgdG8gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KQEAgLTk1NSwyMSArOTQyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJpb3JpdHkgb2YgdGhlIFRocmVhZC4gTm90ZSB0aGF0IHRoZSBmaW5hbCBwcmlvcml0eSBzZXQgbWF5IG5vdAotICAgICAqIGJlIHRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIC0gaXQgd2lsbCBkZXBlbmQgb24gdGhlIHJlY2VpdmVyJ3MKLSAgICAgKiBUaHJlYWRHcm91cC4gVGhlIHByaW9yaXR5IGNhbm5vdCBiZSBzZXQgdG8gYmUgaGlnaGVyIHRoYW4gdGhlIHJlY2VpdmVyJ3MKLSAgICAgKiBUaHJlYWRHcm91cCdzIG1heFByaW9yaXR5KCkuCisgICAgICogU2V0cyB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0aHJlYWQuIElmIHRoZSByZXF1ZXN0ZWQgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgICAqIHBhcmVudCB0aHJlYWQgZ3JvdXAncyB7QGxpbmsgamF2YS5sYW5nLlRocmVhZEdyb3VwI2dldE1heFByaW9yaXR5fSwgdGhlIGdyb3VwJ3MgbWF4aW11bQorICAgICAqIHByaW9yaXR5IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgogICAgICAqCi0gICAgICogQHBhcmFtIHByaW9yaXR5Ci0gICAgICogICAgICAgICAgICBuZXcgcHJpb3JpdHkgZm9yIHRoZSBUaHJlYWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIFRocmVhZC5NQVhfUFJJT1JJVFkgb3IKLSAgICAgKiAgICAgICAgICAgICBsZXNzIHRoYW4gVGhyZWFkLk1JTl9QUklPUklUWQotICAgICAqIEBzZWUgVGhyZWFkI2dldFByaW9yaXR5CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSBpZiB0aGUgbmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiB7QGxpbmsgI01BWF9QUklPUklUWX0KKyAgICAgKiAgICAgb3IgbGVzcyB0aGFuIHtAbGluayAjTUlOX1BSSU9SSVRZfQogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByaW9yaXR5KGludCBwcmlvcml0eSkgewogICAgICAgICBpZiAocHJpb3JpdHkgPCBUaHJlYWQuTUlOX1BSSU9SSVRZIHx8IHByaW9yaXR5ID4gVGhyZWFkLk1BWF9QUklPUklUWSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJpb3JpdHkgb3V0IG9mIHJhbmdlIik7IC8vIFRPRE8gRXh0ZXJuYWxpemU/CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcmlvcml0eSBvdXQgb2YgcmFuZ2U6ICIgKyBwcmlvcml0eSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHJpb3JpdHkgPiBncm91cC5nZXRNYXhQcmlvcml0eSgpKSB7CkBAIC0xMDM2LDE0ICsxMDE4LDExIEBACiAgICAgICogdGhlIHJlY2VpdmVyIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSByZWNlaXZlciBUaHJlYWQgaXRzZWxmIChhbmQgbm90IHRoZQogICAgICAqIFRocmVhZCBjYWxsaW5nIDxjb2RlPnN0YXJ0KCk8L2NvZGU+KS4KICAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUaHJlYWQgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUKLSAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIC0gaWYgdGhpcyB0aHJlYWQgaGFzIGFscmVhZHkgc3RhcnRlZC4KICAgICAgKiBAc2VlIFRocmVhZCNydW4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmIChoYXNCZWVuU3RhcnRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkIGFscmVhZHkgc3RhcnRlZC4iKTsgLy8gVE9ETyBFeHRlcm5hbGl6ZT8KLSAgICAgICAgfQorICAgICAgICBjaGVja05vdFN0YXJ0ZWQoKTsKIAogICAgICAgICBoYXNCZWVuU3RhcnRlZCA9IHRydWU7CiAKQEAgLTEwNjUsOSArMTA0NCw2IEBACiAKICAgICAvKioKICAgICAgKiBUaHJvd3Mge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+dGhyb3dhYmxlKCk8L2NvZGU+IGlzCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqIEBkZXByZWNhdGVkIGJlY2F1c2Ugc3RvcHBpbmcgYSB0aHJlYWQgaW4gdGhpcyBtYW5uZXIgaXMgdW5zYWZlIGFuZCBjYW4KICAgICAgKiBsZWF2ZSB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgVk0gaW4gYW4gdW5wcmVkaWN0YWJsZSBzdGF0ZS4KICAgICAgKi8KQEAgLTEwNzgsOCArMTA1NCw2IEBACiAKICAgICAvKioKICAgICAgKiBUaHJvd3Mge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEBzZWUgVGhyZWFkI3Jlc3VtZSgpCiAgICAgICogQGRlcHJlY2F0ZWQgTWF5IGNhdXNlIGRlYWRsb2Nrcy4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvUmVmZXJlbmNlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2UuamF2YQppbmRleCA5Y2Y0OWE3Li5iZDYzNTM1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2UuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9SZWZlcmVuY2UuamF2YQpAQCAtMzksNiArMzksNjEgQEAKICAqIGFsc28gbm90IGRlc2lyYWJsZSB0byBkbyBzbywgc2luY2UgcmVmZXJlbmNlcyByZXF1aXJlIHZlcnkgY2xvc2UgY29vcGVyYXRpb24KICAqIHdpdGggdGhlIHN5c3RlbSdzIGdhcmJhZ2UgY29sbGVjdG9yLiBUaGUgZXhpc3RpbmcsIHNwZWNpYWxpemVkIHJlZmVyZW5jZQogICogY2xhc3NlcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICoKKyAqIDxwPlRocmVlIGRpZmZlcmVudCB0eXBlIG9mIHJlZmVyZW5jZXMgZXhpc3QsIGVhY2ggYmVpbmcgd2Vha2VyIHRoYW4gdGhlIHByZWNlZGluZyBvbmU6CisgKiB7QGxpbmsgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlfSwge0BsaW5rIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZX0sIGFuZAorICoge0BsaW5rIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZX0uICJXZWFrbmVzcyIgaGVyZSBtZWFucyB0aGF0IGxlc3MgcmVzdHJpY3Rpb25zIGFyZQorICogYmVpbmcgaW1wb3NlZCBvbiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgYXMgdG8gd2hlbiBpdCBpcyBhbGxvd2VkIHRvCisgKiBhY3R1YWxseSBnYXJiYWdlLWNvbGxlY3QgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LgorICoKKyAqIDxwPkluIG9yZGVyIHRvIHVzZSByZWZlcmVuY2Ugb2JqZWN0cyBwcm9wZXJseSBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZAorICogdGhlIGRpZmZlcmVudCB0eXBlcyBvZiByZWFjaGFiaWxpdHkgdGhhdCB0cmlnZ2VyIHRoZWlyIGNsZWFyaW5nIGFuZAorICogZW5xdWV1ZWluZy4gVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGVzZSwgZnJvbSBzdHJvbmdlc3QgdG8gd2Vha2VzdC4KKyAqIEZvciBlYWNoIHJvdywgYW4gb2JqZWN0IGlzIHNhaWQgdG8gaGF2ZSB0aGUgcmVhY2hhYmlsaXR5IG9uIHRoZSBsZWZ0IHNpZGUKKyAqIGlmIChhbmQgb25seSBpZikgaXQgZnVsZmlsbHMgYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHJpZ2h0IHNpZGUuIEluCisgKiBhbGwgcm93cywgY29uc2lkZXIgdGhlIDxlbT5yb290IHNldDwvZW0+IHRvIGJlIGEgc2V0IG9mIHJlZmVyZW5jZXMgdGhhdAorICogYXJlICJyZXNpc3RhbnQiIHRvIGdhcmJhZ2UgY29sbGVjdGlvbiAodGhhdCBpcywgcnVubmluZyB0aHJlYWRzLCBtZXRob2QKKyAqIHBhcmFtZXRlcnMsIGxvY2FsIHZhcmlhYmxlcywgc3RhdGljIGZpZWxkcyBhbmQgdGhlIGxpa2UpLgorICoKKyAqIDxwPjx0YWJsZT4KKyAqIDx0cj4KKyAqIDx0ZD5TdHJvbmdseSByZWFjaGFibGU8L3RkPgorICogPHRkPiA8dWw+CisgKiA8bGk+VGhlcmUgZXhpc3RzIGF0IGxlYXN0IG9uZSBwYXRoIGZyb20gdGhlIHJvb3Qgc2V0IHRvIHRoZSBvYmplY3QgdGhhdCBkb2VzIG5vdCB0cmF2ZXJzZSBhbnkKKyAqIGluc3RhbmNlIG9mIGEge0Bjb2RlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlfSBzdWJjbGFzcy4KKyAqIDwvbGk+CisgKiA8L3VsPiA8L3RkPgorICogPC90cj4KKyAqCisgKiA8dHI+CisgKiA8dGQ+U29mdGx5IHJlYWNoYWJsZTwvdGQ+CisgKiA8dGQ+IDx1bD4KKyAqIDxsaT5UaGUgb2JqZWN0IGlzIG5vdCBzdHJvbmdseSByZWFjaGFibGUuPC9saT4KKyAqIDxsaT5UaGVyZSBleGlzdHMgYXQgbGVhc3Qgb25lIHBhdGggZnJvbSB0aGUgcm9vdCBzZXQgdG8gdGhlIG9iamVjdCB0aGF0IGRvZXMgdHJhdmVyc2UKKyAqIGEge0Bjb2RlIGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZX0gaW5zdGFuY2UsIGJ1dCBubyB7QGNvZGUgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlfQorICogb3Ige0Bjb2RlIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZX0gaW5zdGFuY2VzLjwvbGk+CisgKiA8L3VsPiA8L3RkPgorICogPC90cj4KKyAqCisgKiA8dHI+CisgKiA8dGQ+V2Vha2x5IHJlYWNoYWJsZTwvdGQ+CisgKiA8dGQ+IDx1bD4KKyAqIDxsaT5UaGUgb2JqZWN0IGlzIG5laXRoZXIgc3Ryb25nbHkgbm9yIHNvZnRseSByZWFjaGFibGUuPC9saT4KKyAqIDxsaT5UaGVyZSBleGlzdHMgYXQgbGVhc3Qgb25lIHBhdGggZnJvbSB0aGUgcm9vdCBzZXQgdG8gdGhlIG9iamVjdCB0aGF0IGRvZXMgdHJhdmVyc2UgYQorICoge0Bjb2RlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZX0gaW5zdGFuY2UsIGJ1dCBubyB7QGNvZGUgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlfQorICogaW5zdGFuY2VzLjwvbGk+CisgKiA8L3VsPiA8L3RkPgorICogPC90cj4KKyAqCisgKiA8dHI+CisgKiA8dGQ+UGhhbnRvbS1yZWFjaGFibGU8L3RkPgorICogPHRkPiA8dWw+CisgKiA8bGk+VGhlIG9iamVjdCBpcyBuZWl0aGVyIHN0cm9uZ2x5LCBzb2Z0bHksIG5vciB3ZWFrbHkgcmVhY2hhYmxlLjwvbGk+CisgKiA8bGk+VGhlIG9iamVjdCBpcyByZWZlcmVuY2VkIGJ5IGEge0Bjb2RlIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZX0gaW5zdGFuY2UuPC9saT4KKyAqIDxsaT5UaGUgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gZmluYWxpemVkLjwvbGk+CisgKiA8L3VsPiA8L3RkPgorICogPC90cj4KKyAqIDwvdGFibGU+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2U8VD4gewogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDhlOGIuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWYvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPGh0bWw+Ci0gIDxib2R5PgotICAgIDxwPgotICAgICAgUHJvdmlkZXMgdGhlIHN5c3RlbSdzIHtAbGluayBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlfSBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsIGFzCi0gICAgICBkaWZmZXJlbnQgZm9ybXMgb2YgcmVmZXJlbmNlIG9iamVjdHMgd2hpY2ggaW1wb3NlIHNwZWNpYWwgYmVoYXZpb3Igb24gdGhlCi0gICAgICBnYXJiYWdlIGNvbGxlY3Rvci4gVGhlIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHR5cGUgb2Yge0BsaW5rIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlfQotICAgICAgYmVpbmcgdXNlZC4gVGhyZWUgZGlmZmVyZW50IHR5cGUgb2YgcmVmZXJlbmNlcyBleGlzdCwgZWFjaCBiZWluZyB3ZWFrZXIKLSAgICAgIHRoYW4gdGhlIHByZWNlZGluZyBvbmU6IHtAbGluayBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2V9LCB7QGxpbmsgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlfSwgYW5kCi0gICAgICB7QGxpbmsgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlfS4gIldlYWtuZXNzIiBoZXJlIG1lYW5zIHRoYXQgbGVzcyByZXN0cmljdGlvbnMgYXJlCi0gICAgICBiZWluZyBpbXBvc2VkIG9uIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBhcyB0byB3aGVuIGl0IGlzIGFsbG93ZWQgdG8KLSAgICAgIGFjdHVhbGx5IGdhcmJhZ2UtY29sbGVjdCB0aGUgcmVmZXJlbmNlZCBvYmplY3QuCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgSW4gb3JkZXIgdG8gdXNlIHJlZmVyZW5jZSBvYmplY3RzIHByb3Blcmx5IGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kCi0gICAgICB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHJlYWNoYWJpbGl0eSB0aGF0IHRyaWdnZXIgdGhlaXIgY2xlYXJpbmcgYW5kCi0gICAgICBlbnF1ZXVlaW5nLiBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZXNlLCBmcm9tIHN0cm9uZ2VzdCB0byB3ZWFrZXN0LgotICAgICAgRm9yIGVhY2ggcm93LCBhbiBvYmplY3QgaXMgc2FpZCB0byBoYXZlIHRoZSByZWFjaGFiaWxpdHkgb24gdGhlIGxlZnQgc2lkZQotICAgICAgaWYgKGFuZCBvbmx5IGlmKSBpdCBmdWxmaWxscyBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgcmlnaHQgc2lkZS4gSW4KLSAgICAgIGFsbCByb3dzLCBjb25zaWRlciB0aGUgPGVtPnJvb3Qgc2V0PC9lbT4gdG8gYmUgYSBzZXQgb2YgcmVmZXJlbmNlcyB0aGF0Ci0gICAgICBhcmUgInJlc2lzdGFudCIgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uICh0aGF0IGlzLCBydW5uaW5nIHRocmVhZHMsIG1ldGhvZAotICAgICAgcGFyYW1ldGVycywgbG9jYWwgdmFyaWFibGVzLCBzdGF0aWMgZmllbGRzIGFuZCB0aGUgbGlrZSkuICAKLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8YSBuYW1lPSJkZWZpbml0aW9ucyI+PC9hPiAKLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIFN0cm9uZ2x5IHJlYWNoYWJsZQotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgVGhlcmUgZXhpc3RzIGF0IGxlYXN0IG9uZSBwYXRoIGZyb20gdGhlIHJvb3Qgc2V0IHRvIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICB0aGF0IGRvZXMgbm90IHRyYXZlcnNlIGFueSBpbnN0YW5jZSBvZiBhIHtAbGluayBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZX0KLSAgICAgICAgICAgICAgICBzdWJjbGFzcy4KLSAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgU29mdGx5IHJlYWNoYWJsZQotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgVGhlIG9iamVjdCBpcyBub3Qgc3Ryb25nbHkgcmVhY2hhYmxlLgotICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgVGhlcmUgZXhpc3RzIGF0IGxlYXN0IG9uZSBwYXRoIGZyb20gdGhlIHJvb3Qgc2V0IHRvIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICB0aGF0IGRvZXMgdHJhdmVyc2UgYSB7QGxpbmsgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlfSBpbnN0YW5jZSwgYnV0IG5vCi0gICAgICAgICAgICAgICAge0BsaW5rIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZX0gb3Ige0BsaW5rIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZX0gaW5zdGFuY2VzLgotICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBXZWFrbHkgcmVhY2hhYmxlCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICBUaGUgb2JqZWN0IGlzIG5laXRoZXIgc3Ryb25nbHkgbm9yIHNvZnRseSByZWFjaGFibGUuCi0gICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICBUaGVyZSBleGlzdHMgYXQgbGVhc3Qgb25lIHBhdGggZnJvbSB0aGUgcm9vdCBzZXQgdG8gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgIHRoYXQgZG9lcyB0cmF2ZXJzZSBhIHtAbGluayBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2V9IGluc3RhbmNlLCBidXQgbm8KLSAgICAgICAgICAgICAgICB7QGxpbmsgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlfSBpbnN0YW5jZXMuCi0gICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBQaGFudG9tLXJlYWNoYWJsZQotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgVGhlIG9iamVjdCBpcyBuZWl0aGVyIHN0cm9uZ2x5LCBzb2Z0bHkgbm9yIHdlYWtseSByZWFjaGFibGUuCi0gICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICBUaGUgb2JqZWN0IGlzIHJlZmVyZW5jZWQgYnkgYSB7QGxpbmsgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlfSBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIFRoZSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQuCi0gICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01ldGhvZC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbGFuZy9yZWZsZWN0L01ldGhvZC5qYXZhCmluZGV4IDA0NGRiZmYuLmIyZjk3MGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIHBhY2thZ2UgamF2YS5sYW5nLnJlZmxlY3Q7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgbGliY29yZS51dGlsLkVtcHR5QXJyYXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5TdHJpbmdVdGlsczsKQEAgLTM3OSw3ICszODAsMjAgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kICYmIHRvU3RyaW5nKCkuZXF1YWxzKG9iamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBNZXRob2QpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTWV0aG9kIHJocyA9IChNZXRob2QpIG9iamVjdDsKKyAgICAgICAgLy8gV2UgZG9uJ3QgY29tcGFyZSBleGNlcHRpb25UeXBlcyBiZWNhdXNlIHR3byBtZXRob2RzCisgICAgICAgIC8vIGNhbid0IGRpZmZlciBvbmx5IGJ5IHRoZWlyIGRlY2xhcmVkIGV4Y2VwdGlvbnMuCisgICAgICAgIHJldHVybiBkZWNsYXJpbmdDbGFzcy5lcXVhbHMocmhzLmRlY2xhcmluZ0NsYXNzKSAmJgorICAgICAgICAgICAgbmFtZS5lcXVhbHMocmhzLm5hbWUpICYmCisgICAgICAgICAgICBnZXRNb2RpZmllcnMoKSA9PSByaHMuZ2V0TW9kaWZpZXJzKCkgJiYKKyAgICAgICAgICAgIHJldHVyblR5cGUuZXF1YWxzKHJocy5yZXR1cm5UeXBlKSAmJgorICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhwYXJhbWV0ZXJUeXBlcywgcmhzLnBhcmFtZXRlclR5cGVzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL21hdGgvQmlnRGVjaW1hbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaWdEZWNpbWFsLmphdmEKaW5kZXggMzM1ZTNiYy4uNmI3MTZiYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaWdEZWNpbWFsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbWF0aC9CaWdEZWNpbWFsLmphdmEKQEAgLTM1MiwxMCArMzUyLDYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNldFVuc2NhbGVkVmFsdWUobmV3IEJpZ0ludGVnZXIodW5zY2FsZWRCdWZmZXIudG9TdHJpbmcoKSkpOwogICAgICAgICB9Ci0gICAgICAgIHByZWNpc2lvbiA9IHVuc2NhbGVkQnVmZmVyLmxlbmd0aCgpIC0gY291bnRlcjsKLSAgICAgICAgaWYgKHVuc2NhbGVkQnVmZmVyLmNoYXJBdCgwKSA9PSAnLScpIHsKLSAgICAgICAgICAgIHByZWNpc2lvbiAtLTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTgyNSwxMyArMTgyMSwxMSBAQAogICAgICAqIEByZXR1cm4gdGhlIHByZWNpc2lvbiBvZiB0aGlzIHtAY29kZSBCaWdEZWNpbWFsfS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IHByZWNpc2lvbigpIHsKLSAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHByZWNpc2lvbiBhbHJlYWR5IHdhcyBjYWxjdWxhdGVkCi0gICAgICAgIGlmIChwcmVjaXNpb24gPiAwKSB7CisgICAgICAgIC8vIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlIGlmIHdlIGhhdmUgb25lLgorICAgICAgICBpZiAocHJlY2lzaW9uICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiBwcmVjaXNpb247CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYml0TGVuZ3RoID0gdGhpcy5iaXRMZW5ndGg7Ci0KICAgICAgICAgaWYgKGJpdExlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICBwcmVjaXNpb24gPSAxOwogICAgICAgICB9IGVsc2UgaWYgKGJpdExlbmd0aCA8IDY0KSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldC5qYXZhCmluZGV4IGMwMWYzYWYuLjc5MGViYzkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9EYXRhZ3JhbVNvY2tldC5qYXZhCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoaW50IHZhbHVlKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tPcGVuKCk7CiAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAyNTUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIGRvZXNuJ3QgZml0IGluIGFuIHVuc2lnbmVkIGJ5dGU6ICIgKyB2YWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaW1wbC5zZXRPcHRpb24oU29ja2V0T3B0aW9ucy5JUF9UT1MsIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwQ29va2llLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvSHR0cENvb2tpZS5qYXZhCmluZGV4IDA1N2FmZWYuLmNlMWE4ZDIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9IdHRwQ29va2llLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L0h0dHBDb29raWUuamF2YQpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgICAgcHVibGljIEh0dHBDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgICAgICBTdHJpbmcgbnRyaW0gPSBuYW1lLnRyaW0oKTsgLy8gZXJhc2UgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgICBpZiAoIWlzVmFsaWROYW1lKG50cmltKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBuYW1lOiAiICsgbmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLm5hbWUgPSBudHJpbTsKQEAgLTY1MCwxMSArNjUwLDExIEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB2IGlzIG5laXRoZXIgMCBub3IgMQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHYpIHsKLSAgICAgICAgaWYgKHYgIT0gMCAmJiB2ICE9IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCBuZXdWZXJzaW9uKSB7CisgICAgICAgIGlmIChuZXdWZXJzaW9uICE9IDAgJiYgbmV3VmVyc2lvbiAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgdmVyc2lvbjogIiArIG5ld1ZlcnNpb24pOwogICAgICAgICB9Ci0gICAgICAgIHZlcnNpb24gPSB2OworICAgICAgICB2ZXJzaW9uID0gbmV3VmVyc2lvbjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9Tb2NrZXQuamF2YQppbmRleCA3NjYxZjI4Li5hOWUwYmMzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvU29ja2V0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1NvY2tldC5qYXZhCkBAIC05MDksNyArOTA5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoaW50IHZhbHVlKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tPcGVuQW5kQ3JlYXRlKHRydWUpOwogICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBkb2Vzbid0IGZpdCBpbiBhbiB1bnNpZ25lZCBieXRlOiAiICsgdmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGltcGwuc2V0T3B0aW9uKFNvY2tldE9wdGlvbnMuSVBfVE9TLCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uLmphdmEKaW5kZXggOTU3ZWEzMS4uNzBmZTZhMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb24uamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluZGV4IDwgLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBpbmRleDogIiArIGluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxEZWNvZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uZXQvVVJMRGVjb2Rlci5qYXZhCmluZGV4IDE3NTE3NWQuLmYyMWRlN2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25ldC9VUkxEZWNvZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmV0L1VSTERlY29kZXIuamF2YQpAQCAtNDcsMjMgKzQ3LDE2IEBACiAKICAgICAvKioKICAgICAgKiBEZWNvZGVzIHRoZSBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlIHtAY29kZQotICAgICAqIHgtd3d3LWZvcm0tdXJsZW5jb2RlZH0gTUlNRSBjb250ZW50IHR5cGUgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZwotICAgICAqIHNjaGVtZS4KLSAgICAgKiA8cD4KLSAgICAgKicrJyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzcGFjZSwgJyUnIGFuZCB0d28gZm9sbG93aW5nIGhleCBkaWdpdAorICAgICAqIHgtd3d3LWZvcm0tdXJsZW5jb2RlZH0gTUlNRSBjb250ZW50IHR5cGUsIGFzc3VtaW5nIHRoZSBnaXZlbiB7QGNvZGUgY2hhcnNldE5hbWV9LgorICAgICAqCisgICAgIConPHA+Kycgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3BhY2UsICclJyBhbmQgdHdvIGZvbGxvd2luZyBoZXggZGlnaXQKICAgICAgKiBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2YWxlbnQgYnl0ZSB2YWx1ZS4gQWxsIG90aGVyCiAgICAgICogY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2ggdW5tb2RpZmllZC4gRm9yIGV4YW1wbGUgIkErQitDICUyNCUyNSIgLT4KICAgICAgKiAiQSBCIEMgJCUiLgogICAgICAqCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGVkIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZyBzY2hlbWUgdG8gYmUgdXNlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGNsZWFyLXRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHNjaGVtZSBpcyBpbnZhbGlkLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB7QGNvZGUgY2hhcnNldE5hbWV9IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFVyaUNvZGVjLmRlY29kZShzLCB0cnVlLCBDaGFyc2V0LmZvck5hbWUoZW5jb2RpbmcpLCB0cnVlKTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMsIFN0cmluZyBjaGFyc2V0TmFtZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gVXJpQ29kZWMuZGVjb2RlKHMsIHRydWUsIENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSksIHRydWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9EYXRhZ3JhbUNoYW5uZWxJbXBsLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRGF0YWdyYW1DaGFubmVsSW1wbC5qYXZhCmluZGV4IDRkMmZjNWEuLmEyMzAxMGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9EYXRhZ3JhbUNoYW5uZWxJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0RhdGFncmFtQ2hhbm5lbEltcGwuamF2YQpAQCAtMjUzLDcgKzI1Myw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNDb25uZWN0ZWQoKSAmJiAhY29ubmVjdEFkZHJlc3MuZXF1YWxzKGlzYSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbm5lY3RlZCB0byAiICsgY29ubmVjdEFkZHJlc3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3QgIiArIHNvY2tldEFkZHJlc3MpOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkICh3cml0ZUxvY2spIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9GaWxlQ2hhbm5lbEltcGwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9GaWxlQ2hhbm5lbEltcGwuamF2YQppbmRleCAwNzUyNDNhLi45OGJlNzQ4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uaW8vRmlsZUNoYW5uZWxJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvbmlvL0ZpbGVDaGFubmVsSW1wbC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIGltcG9ydCBsaWJjb3JlLmlvLkVycm5vRXhjZXB0aW9uOwotaW1wb3J0IGxpYmNvcmUuaW8uSW9VdGlsczsKIGltcG9ydCBsaWJjb3JlLmlvLkxpYmNvcmU7CiBpbXBvcnQgbGliY29yZS5pby5TdHJ1Y3RGbG9jazsKIGltcG9ydCBsaWJjb3JlLnV0aWwuTXV0YWJsZUxvbmc7CkBAIC0yMzYsNyArMjM1LDEzIEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIExpYmNvcmUub3MuZnRydW5jYXRlKGZkLCBwb3NpdGlvbiArIHNpemUpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXJybm9FeGNlcHRpb24gZXJybm9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlcnJub0V4Y2VwdGlvbi5yZXRocm93QXNJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIC8vIEVJTlZBTCBjYW4gYmUgdGhyb3duIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBub24tcmVndWxhcgorICAgICAgICAgICAgICAgIC8vIGZpbGVzLCBmb3IgZXhhbXBsZSwgY2hhcmFjdGVyIGRldmljZXMgc3VjaCBhcyAvZGV2L3plcm8uCisgICAgICAgICAgICAgICAgLy8gSW4gdGhvc2UgY2FzZXMsIHdlIGlnbm9yZSB0aGUgZmFpbGVkIHRydW5jYXRpb24gYW5kCisgICAgICAgICAgICAgICAgLy8gY29udGludWUgb24uCisgICAgICAgICAgICAgICAgaWYgKGVycm5vRXhjZXB0aW9uLmVycm5vICE9IEVJTlZBTCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJub0V4Y2VwdGlvbi5yZXRocm93QXNJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBsb25nIGFsaWdubWVudCA9IHBvc2l0aW9uIC0gcG9zaXRpb24gJSBMaWJjb3JlLm9zLnN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbC5qYXZhCmluZGV4IGFiNzZlOGUuLjFjN2UxOTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL25pby9jaGFubmVscy9zcGkvQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbC5qYXZhCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCEoKGludGVyZXN0U2V0ICYgfnZhbGlkT3BzKCkpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyB2YWxpZCBvcHMgaW4gaW50ZXJlc3Qgc2V0OiAiICsgaW50ZXJlc3RTZXQpOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChibG9ja2luZ0xvY2spIHsKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHRocm93IE5QRSBleGFjdGx5IHRvIGtlZXAgY29uc2lzdGVuY3kKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInNlbGVjdG9yIG5vdCBvcGVuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0ga2V5Rm9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuamF2YQppbmRleCAzZWRjMTY3Li42MTU0OGQ3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IuamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyBBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVyID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxnb3JpdGhtID09IG51bGwiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnkuamF2YQppbmRleCA4ZDM5MDAzLi4zYmQwNWI5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeS5qYXZhCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIEtleUZhY3RvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVyID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxnb3JpdGhtID09IG51bGwiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IuamF2YQppbmRleCA1YzE3ZDc5Li44YTcxM2QwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvci5qYXZhCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIEtleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwKICAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVyID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxnb3JpdGhtID09IG51bGwiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9LZXlTdG9yZS5qYXZhCmluZGV4IDNkODU2ZjcuLmIwZTQ5NDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVuZ2luZSBFTkdJTkUgPSBuZXcgRW5naW5lKFNFUlZJQ0UpOwogCiAgICAgLy8gIFN0b3JlIEtleVN0b3JlIHByb3BlcnR5IG5hbWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlOQU1FID0gImtleXN0b3JlLnR5cGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImtleXN0b3JlLnR5cGUiOwogCiAgICAgLy8gIFN0b3JlIGRlZmF1bHQgS2V5U3RvcmUgdHlwZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0tFWVNUT1JFX1RZUEUgPSAiamtzIjsKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgS2V5U3RvcmUgZ2V0SW5zdGFuY2UoU3RyaW5nIHR5cGUsIFByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24gewogICAgICAgICAvLyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlciA9PSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlID09IG51bGwiKTsKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdHlwZSBmb3Ige0Bjb2RlIEtleVN0b3JlfSBpbnN0YW5jZXMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIGR0ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlOQU1FKTsKKyAgICAgICAgU3RyaW5nIGR0ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSk7CiAgICAgICAgIHJldHVybiAoZHQgPT0gbnVsbCA/IERFRkFVTFRfS0VZU1RPUkVfVFlQRSA6IGR0KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QuamF2YQppbmRleCA2ZjFiZjIxLi42NThiNDFmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdC5qYXZhCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VEaWdlc3QgZ2V0SW5zdGFuY2UoU3RyaW5nIGFsZ29yaXRobSwgUHJvdmlkZXIgcHJvdmlkZXIpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVyID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxnb3JpdGhtID09IG51bGwiKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tLmphdmEKaW5kZXggNmVkNjMxYy4uMjgxODg1YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tLmphdmEKQEAgLTI4LDIwICsyOCwyNiBAQAogLyoqCiAgKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvLXJhbmRvbSBudW1iZXJzLgogICoKLSAqIDxoMz5TdXBwb3J0ZWQgQWxnb3JpdGhtczwvaDM+Ci0gKiA8dWw+Ci0gKiAgIDxsaT48c3Ryb25nPlNIQTFQUk5HPC9zdHJvbmc+OiBCYXNlZCBvbiA8YQotICogICAgIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU0hBLTEiPlNIQS0xPC9hPi4gTm90IGd1YXJhbnRlZWQgdG8gYmUKLSAqICAgICBjb21wYXRpYmxlIHdpdGggdGhlIFNIQTFQUk5HIGFsZ29yaXRobSBvbiB0aGUgcmVmZXJlbmNlCi0gKiAgICAgaW1wbGVtZW50YXRpb24uPC9saT4KLSAqIDwvdWw+CisgKiBJdCBpcyBiZXN0IHRvIGludm9rZSB7QGNvZGUgU2VjdXJlUmFuZG9tfSB1c2luZyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAqIFRoaXMgd2lsbCBwcm92aWRlIGFuIGluc3RhbmNlIG9mIHRoZSBtb3N0IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZworICogcHJvdmlkZXIgYXZhaWxhYmxlOgorICoKKyAqIDxwcmU+U2VjdXJlUmFuZG9tIHNyID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICogYnl0ZVtdIG91dHB1dCA9IG5ldyBieXRlWzE2XTsKKyAqIHNyLm5leHRCeXRlcyhvdXRwdXQpOzwvcHJlPgogICoKICAqIDxwPlRoZSBkZWZhdWx0IGFsZ29yaXRobSBpcyBkZWZpbmVkIGJ5IHRoZSBmaXJzdCB7QGNvZGUgU2VjdXJlUmFuZG9tU3BpfQotICogcHJvdmlkZXIgZm91bmQgaW4gdGhlIFZNJ3MgaW5zdGFsbGVkIHNlY3VyaXR5IHByb3ZpZGVycy4gVXNlIHtAbGluawotICogU2VjdXJpdHl9IHRvIGluc3RhbGwgY3VzdG9tIHtAbGluayBTZWN1cmVSYW5kb21TcGl9IHByb3ZpZGVycy4KKyAqIHByb3ZpZGVyIGZvdW5kIGluIHRoZSBpbnN0YWxsZWQgc2VjdXJpdHkgcHJvdmlkZXJzLiBVc2Uge0BsaW5rIFNlY3VyaXR5fQorICogdG8gaW5zdGFsbCBjdXN0b20ge0BsaW5rIFNlY3VyZVJhbmRvbVNwaX0gcHJvdmlkZXJzLgogICoKLSAqIDxhIG5hbWU9Imluc2VjdXJlX3NlZWQiPjxoMz5TZWVkaW5nIHtAY29kZSBTZWN1cmVSYW5kb219IG1heSBiZQotICogaW5zZWN1cmU8L2gzPjwvYT4KKyAqIDxwPk5vdGUgdGhhdCB0aGUgb3V0cHV0IG9mIGEge0Bjb2RlIFNlY3VyZVJhbmRvbX0gaW5zdGFuY2Ugc2hvdWxkIG5ldmVyCisgKiBiZSByZWxpZWQgdXBvbiB0byBiZSBkZXRlcm1pbmlzdGljLiBGb3IgZGV0ZXJtaW5pc3RpYyBvdXRwdXQgZnJvbSBhIGdpdmVuCisgKiBpbnB1dCwgc2VlIHtAbGluayBNZXNzYWdlRGlnZXN0fSB3aGljaCBwcm92aWRlcyBvbmUtd2F5IGhhc2ggZnVuY3Rpb25zLgorICogRm9yIGRlcml2aW5nIGtleXMgZnJvbSBwYXNzd29yZHMsIHNlZQorICoge0BsaW5rIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5fS4KKyAqCisgKiA8aDM+PGEgbmFtZT0iaW5zZWN1cmVfc2VlZCI+U2VlZGluZyB7QGNvZGUgU2VjdXJlUmFuZG9tfSBtYXkgYmUKKyAqIGluc2VjdXJlPC9hPjwvaDM+CiAgKiBBIHNlZWQgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgdXNlZCB0byBib290c3RyYXAgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLgogICogVG8gcHJvZHVjZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIG51bWJlcnMsIGJvdGggdGhlIHNlZWQgYW5kIHRoZQogICogYWxnb3JpdGhtIG11c3QgYmUgc2VjdXJlLgpAQCAtNTAsMTkgKzU2LDExIEBACiAgKiBhbiBpbnRlcm5hbCBlbnRyb3B5IHNvdXJjZSwgc3VjaCBhcyB7QGNvZGUgL2Rldi91cmFuZG9tfS4gVGhpcyBzZWVkIGlzCiAgKiB1bnByZWRpY3RhYmxlIGFuZCBhcHByb3ByaWF0ZSBmb3Igc2VjdXJlIHVzZS4KICAqCi0gKiA8cD5Zb3UgbWF5IGFsdGVybmF0aXZlbHkgc3BlY2lmeSB0aGUgaW5pdGlhbCBzZWVkIGV4cGxpY2l0bHkgd2l0aCB0aGUKLSAqIHtAbGluayAjU2VjdXJlUmFuZG9tKGJ5dGVbXSkgc2VlZGVkIGNvbnN0cnVjdG9yfSBvciBieSBjYWxsaW5nIHtAbGluawotICogI3NldFNlZWR9IGJlZm9yZSBhbnkgcmFuZG9tIG51bWJlcnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4gU3BlY2lmeWluZyBhIGZpeGVkCi0gKiBzZWVkIHdpbGwgY2F1c2UgdGhlIGluc3RhbmNlIHRvIHJldHVybiBhIHByZWRpY3RhYmxlIHNlcXVlbmNlIG9mIG51bWJlcnMuCi0gKiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHRlc3RpbmcgYnV0IGl0IGlzIG5vdCBhcHByb3ByaWF0ZSBmb3Igc2VjdXJlIHVzZS4KLSAqCi0gKiA8cD5JdCBpcyBkYW5nZXJvdXMgdG8gc2VlZCB7QGNvZGUgU2VjdXJlUmFuZG9tfSB3aXRoIHRoZSBjdXJyZW50IHRpbWUgYmVjYXVzZQotICogdGhhdCB2YWx1ZSBpcyBtb3JlIHByZWRpY3RhYmxlIHRvIGFuIGF0dGFja2VyIHRoYW4gdGhlIGRlZmF1bHQgc2VlZC4KLSAqCi0gKiA8cD5DYWxsaW5nIHtAbGluayAjc2V0U2VlZH0gb24gYSB7QGNvZGUgU2VjdXJlUmFuZG9tfSA8aT5hZnRlcjwvaT4gaXQgaGFzCi0gKiBiZWVuIHVzZWQgdG8gZ2VuZXJhdGUgcmFuZG9tIG51bWJlcnMgKGllLiBjYWxsaW5nIHtAbGluayAjbmV4dEJ5dGVzfSkgd2lsbAotICogc3VwcGxlbWVudCB0aGUgZXhpc3Rpbmcgc2VlZC4gVGhpcyBkb2VzIG5vdCBjYXVzZSB0aGUgaW5zdGFuY2UgdG8gcmV0dXJuIGEKLSAqIHByZWRpY3RhYmxlIG51bWJlcnMsIG5vciBkb2VzIGl0IGhhcm0gdGhlIHNlY3VyaXR5IG9mIHRoZSBudW1iZXJzIGdlbmVyYXRlZC4KKyAqIDxwPlVzaW5nIHRoZSB7QGxpbmsgI1NlY3VyZVJhbmRvbShieXRlW10pIHNlZWRlZCBjb25zdHJ1Y3Rvcn0gb3IgY2FsbGluZworICoge0BsaW5rICNzZXRTZWVkfSBtYXkgY29tcGxldGVseSByZXBsYWNlIHRoZSBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcKKyAqIGRlZmF1bHQgc2VlZCBjYXVzaW5nIHRoZSBpbnN0YW5jZSB0byByZXR1cm4gYSBwcmVkaWN0YWJsZSBzZXF1ZW5jZSBvZgorICogbnVtYmVycyB1bmZpdCBmb3Igc2VjdXJlIHVzZS4gRHVlIHRvIHZhcmlhdGlvbnMgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMKKyAqIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2Uge0Bjb2RlIHNldFNlZWR9IGF0IGFsbC4KICAqLwogcHVibGljIGNsYXNzIFNlY3VyZVJhbmRvbSBleHRlbmRzIFJhbmRvbSB7CiAKQEAgLTIwOSw3ICsyMDcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgU2VjdXJlUmFuZG9tIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sIFByb3ZpZGVyIHByb3ZpZGVyKQogICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlciA9PSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFsZ29yaXRobSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFsZ29yaXRobSA9PSBudWxsIik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9TaWduYXR1cmUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZS5qYXZhCmluZGV4IGJlODk2NTQuLmIyYmQxMjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZS5qYXZhCkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxnb3JpdGhtID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicHJvdmlkZXIgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRTaWduYXR1cmVJbnN0YW5jZShhbGdvcml0aG0sIHByb3ZpZGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoLmphdmEKaW5kZXggZDI0N2QzMC4uNWM1YjY3ZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGguamF2YQpAQCAtMTQ1LDE2ICsxNDUsMTMgQEAKICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVuY29kaW5nIG9mIHRoZSB7QGNvZGUgQ2VydFBhdGh9IHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCisgICAgICogUmV0dXJucyBhbiBlbmNvZGluZyBvZiB0aGlzIHtAY29kZSBDZXJ0UGF0aH0gdXNpbmcgdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIGVuY29kaW5nfSBmcm9tIHtAbGluayAjZ2V0RW5jb2RpbmdzKCl9LgogICAgICAqCi0gICAgICogQHBhcmFtIGVuY29kaW5nCi0gICAgICogICAgICAgICAgICBlbmNvZGluZyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQuCi0gICAgICogQHJldHVybiBkZWZhdWx0IGVuY29kaW5nIG9mIHRoZSB7QGNvZGUgQ2VydFBhdGh9LgogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbmNvZGluZyBmYWlscy4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoU3RyaW5nIGVuY29kaW5nKQotICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEl0ZXJhdG9yfSBvdmVyIHRoZSBzdXBwb3J0ZWQgZW5jb2RpbmdzIGZvciBhCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXIuamF2YQppbmRleCA0MjAyOWU1Li4wODE3ZmMwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyLmphdmEKQEAgLTM3LDExICszNywxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVuZ2luZSBFTkdJTkUgPSBuZXcgRW5naW5lKFNFUlZJQ0UpOwogCiAgICAgLy8gU3RvcmUgZGVmYXVsdCBwcm9wZXJ0eSBuYW1lCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZTkFNRSA9ICJjZXJ0cGF0aGJ1aWxkZXIudHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAiY2VydHBhdGhidWlsZGVyLnR5cGUiOwogCi0gICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBDZXJ0UGF0aEJ1aWxkZXIgdHlwZS4gSXQgcmV0dXJucyBpZiBjZXJ0cGF0aGJ1aWxkLnR5cGUKLSAgICAvLyBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBpbiBqYXZhLnNlY3VyaXR5IGZpbGUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVFBST1BFUlRZID0gIlBLSVgiOworICAgIC8vIERlZmF1bHQgdmFsdWUgb2YgQ2VydFBhdGhCdWlsZGVyIHR5cGUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJPUEVSVFkgPSAiUEtJWCI7CiAKICAgICAvLyBTdG9yZSB1c2VkIHByb3ZpZGVyCiAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlciBwcm92aWRlcjsKQEAgLTE5Miw3ICsxOTEsNyBAQAogICAgICAqICAgICAgICAgZGV0ZXJtaW5lZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRUeXBlID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlOQU1FKTsKLSAgICAgICAgcmV0dXJuIChkZWZhdWx0VHlwZSAhPSBudWxsID8gZGVmYXVsdFR5cGUgOiBERUZBVUxUUFJPUEVSVFkpOworICAgICAgICBTdHJpbmcgZGVmYXVsdFR5cGUgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShQUk9QRVJUWV9OQU1FKTsKKyAgICAgICAgcmV0dXJuIChkZWZhdWx0VHlwZSAhPSBudWxsID8gZGVmYXVsdFR5cGUgOiBERUZBVUxUX1BST1BFUlRZKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yLmphdmEKaW5kZXggZGRmNzhiZi4uYTNhNjY2YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3IuamF2YQpAQCAtMzcsMTEgKzM3LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW5naW5lIEVOR0lORSA9IG5ldyBFbmdpbmUoU0VSVklDRSk7CiAKICAgICAvLyBTdG9yZSBkZWZhdWx0IHByb3BlcnR5IG5hbWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlOQU1FID0gImNlcnRwYXRodmFsaWRhdG9yLnR5cGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImNlcnRwYXRodmFsaWRhdG9yLnR5cGUiOwogCiAgICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBDZXJ0UGF0aEJ1aWxkZXIgdHlwZS4gSXQgcmV0dXJucyBpZiBjZXJ0cGF0aGJ1aWxkLnR5cGUKICAgICAvLyBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBpbiBqYXZhLnNlY3VyaXR5IGZpbGUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVFBST1BFUlRZID0gIlBLSVgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST1BFUlRZID0gIlBLSVgiOwogCiAgICAgLy8gU3RvcmUgdXNlZCBwcm92aWRlcgogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXIgcHJvdmlkZXI7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIENlcnRQYXRoVmFsaWRhdG9yIGdldEluc3RhbmNlKFN0cmluZyBhbGdvcml0aG0sCiAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlcikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlciA9PSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFsZ29yaXRobSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFsZ29yaXRobSA9PSBudWxsIik7CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgKiAgICAgICAgIGRldGVybWluZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0VHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KFBST1BFUlRZTkFNRSk7Ci0gICAgICAgIHJldHVybiAoZGVmYXVsdFR5cGUgIT0gbnVsbCA/IGRlZmF1bHRUeXBlIDogREVGQVVMVFBST1BFUlRZKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRUeXBlID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSk7CisgICAgICAgIHJldHVybiAoZGVmYXVsdFR5cGUgIT0gbnVsbCA/IGRlZmF1bHRUeXBlIDogREVGQVVMVF9QUk9QRVJUWSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlLmphdmEKaW5kZXggMmUyODgyOC4uNzJkMzU2ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZS5qYXZhCkBAIC0zOSwxMSArMzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbmdpbmUgRU5HSU5FID0gbmV3IEVuZ2luZShTRVJWSUNFKTsKIAogICAgIC8vIFN0b3JlIGRlZmF1bHQgcHJvcGVydHkgbmFtZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWU5BTUUgPSAiY2VydHN0b3JlLnR5cGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImNlcnRzdG9yZS50eXBlIjsKIAogICAgIC8vIERlZmF1bHQgdmFsdWUgb2YgQ2VydFN0b3JlIHR5cGUuIEl0IHJldHVybnMgaWYgY2VydHBhdGhidWlsZC50eXBlCiAgICAgLy8gcHJvcGVydHkgaXMgbm90IGRlZmluZWQgaW4gamF2YS5zZWN1cml0eSBmaWxlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRQUk9QRVJUWSA9ICJMREFQIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9QRVJUWSA9ICJMREFQIjsKIAogICAgIC8vIFN0b3JlIHVzZWQgcHJvdmlkZXIKICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyIHByb3ZpZGVyOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgICogICAgICAgICBkZXRlcm1pbmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRUeXBlKCkgewotICAgICAgICBTdHJpbmcgZGVmYXVsdFR5cGUgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShQUk9QRVJUWU5BTUUpOwotICAgICAgICByZXR1cm4gKGRlZmF1bHRUeXBlID09IG51bGwgPyBERUZBVUxUUFJPUEVSVFkgOiBkZWZhdWx0VHlwZSk7CisgICAgICAgIFN0cmluZyBkZWZhdWx0VHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KFBST1BFUlRZX05BTUUpOworICAgICAgICByZXR1cm4gKGRlZmF1bHRUeXBlID09IG51bGwgPyBERUZBVUxUX1BST1BFUlRZIDogZGVmYXVsdFR5cGUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeS5qYXZhCmluZGV4IDgzZDQwZDMuLmY4ODJkNTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkuamF2YQpAQCAtMjI1LDIzICsyMjUsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSB7QGNvZGUgQ2VydFBhdGh9IChhIGNlcnRpZmljYXRlIGNoYWluKSBmcm9tIHRoZSBwcm92aWRlZAotICAgICAqIHtAY29kZSBJbnB1dFN0cmVhbX0gYW5kIHRoZSBzcGVjaWZpZWQgZW5jb2Rpbmcgc2NoZW1lLgorICAgICAqIEdlbmVyYXRlcyBhIHtAY29kZSBDZXJ0UGF0aH0gKGEgY2VydGlmaWNhdGUgY2hhaW4pIGZyb20gdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIGlucHV0U3RyZWFtfSwgYXNzdW1pbmcgdGhlIGdpdmVuIHtAY29kZSBlbmNvZGluZ30gZnJvbQorICAgICAqIHtAbGluayAjZ2V0Q2VydFBhdGhFbmNvZGluZ3MoKX0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBwYXRoIGRhdGEgaW4KLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIGVuY29kaW5nIG9mIHRoZSBkYXRhIGluIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgICogQHJldHVybiBhIHtAY29kZSBDZXJ0UGF0aH0gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YS4KICAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIENlcnRQYXRoIGdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBlbmNvZGluZykKKyAgICBwdWJsaWMgZmluYWwgQ2VydFBhdGggZ2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHNwaUltcGwuZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChpblN0cmVhbSwgZW5jb2RpbmcpOworICAgICAgICByZXR1cm4gc3BpSW1wbC5lbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKGlucHV0U3RyZWFtLCBlbmNvZGluZyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnlTcGkuamF2YQppbmRleCAzMjFhZmE3Li45NWM2NmUzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKQEAgLTEwNSwyMSArMTA1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEge0Bjb2RlIENlcnRQYXRofSBmcm9tIHRoZSBwcm92aWRlZCB7QGNvZGUKLSAgICAgKiBJbnB1dFN0cmVhbX0gaW4gdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KKyAgICAgKiBHZW5lcmF0ZXMgYSB7QGNvZGUgQ2VydFBhdGh9IChhIGNlcnRpZmljYXRlIGNoYWluKSBmcm9tIHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBpbnB1dFN0cmVhbX0sIGFzc3VtaW5nIHRoZSBnaXZlbiB7QGNvZGUgY2hhcnNldE5hbWV9LgogICAgICAqCi0gICAgICogQHBhcmFtIGluU3RyZWFtCi0gICAgICogICAgICAgICAgICBhbiBpbnB1dCBzdHJlYW0gY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBwYXRoIGRhdGEgaW4gc3BlY2lmaWVkCi0gICAgICogICAgICAgICAgICBlbmNvZGluZy4KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmNvZGluZyBvZiB0aGUgZGF0YSBpbiB0aGUgaW5wdXQgc3RyZWFtLgotICAgICAqIEByZXR1cm4gYSB7QGNvZGUgQ2VydFBhdGh9IGluaXRpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIGRhdGEKICAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgcGFyc2luZyBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCiAgICAgICovCi0gICAgcHVibGljIENlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBlbmNvZGluZykKKyAgICBwdWJsaWMgQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aChJbnB1dFN0cmVhbSBpblN0cmVhbSwgU3RyaW5nIGNoYXJzZXROYW1lKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlLmphdmEKaW5kZXggOTA3MzdkNy4uYWM0YmUxOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZS5qYXZhCkBAIC0zNjQsOSArMzY0LDExIEBACiAgICAgICogUmV0dXJucyB0aGUgcGF0aCBsZW5ndGggb2YgdGhlIGNlcnRpZmljYXRlIGNvbnN0cmFpbnRzIGZyb20gdGhlIHtAY29kZQogICAgICAqIEJhc2ljQ29udHJhaW50c30gZXh0ZW5zaW9uLgogICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcGF0aCBsZW5ndGggb2YgdGhlIGNlcnRpZmljYXRlIGNvbnN0cmFpbnRzIGlmIHRoZSBleHRlbnNpb24KLSAgICAgKiAgICAgICAgIGlzIHByZXNlbnQgb3Ige0Bjb2RlIC0xfSBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBwcmVzZW50LiB7QGNvZGUKLSAgICAgKiAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFfSBpZiB0aGVyZSdzIG5vdCBsaW1pdC4KKyAgICAgKiBJZiB0aGUgY2VydGlmaWNhdGUgaGFzIG5vIGJhc2ljIGNvbnN0cmFpbnRzIG9yIGlzIG5vdCBhCisgICAgICogY2VydGlmaWNhdGUgYXV0aG9yaXR5LCB7QGNvZGUgLTF9IGlzIHJldHVybmVkLiBJZiB0aGUKKyAgICAgKiBjZXJ0aWZpY2F0ZSBpcyBhIGNlcnRpZmljYXRlIGF1dGhvcml0eSB3aXRob3V0IGEgcGF0aCBsZW5ndGgsCisgICAgICoge0Bjb2RlIEludGVnZXIuTUFYX1ZBTFVFfSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgKiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkncyBwYXRoIGxlbmd0aCBpcyByZXR1cm5lZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJhc2ljQ29uc3RyYWludHMoKTsKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvcGFja2FnZS5odG1sIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvcGFja2FnZS5odG1sCmluZGV4IGIyZTdlMDguLmEwYTA5ZjQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3BhY2thZ2UuaHRtbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9wYWNrYWdlLmh0bWwKQEAgLTQsOSArNCwxMiBAQAogPC9oZWFkPgogPGh0bWw+CiA8Ym9keT4KLTxwPlRoaXMgcGFja2FnZSBpcyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBsZWdhY3kgY29kZSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIG9yIGV4cGVjdGVkIHRvIGRvCi1hbnl0aGluZyB1c2VmdWwuCis8cD4KK0V4dGVuc2libGUgY3J5cHRvZ3JhcGhpYyA8aT5zZXJ2aWNlIHByb3ZpZGVyIGluZnJhc3RydWN0dXJlPC9pPiAoU1BJKSBmb3IgdXNpbmcKK2FuZCBkZWZpbmluZyBzZXJ2aWNlcyBzdWNoIGFzIHtAbGluayBqYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlIENlcnRpZmljYXRlc30sCit7QGxpbmsgamF2YS5zZWN1cml0eS5LZXkgS2V5c30sIHtAbGluayBqYXZhLnNlY3VyaXR5LktleVN0b3JlIEtleVN0b3Jlc30sIHtAbGluaworamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IE1lc3NhZ2VEaWdlc3RzfSwgYW5kIHtAbGluayBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZQorU2lnbmF0dXJlc30uCiA8L3A+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zZWN1cml0eS5wcm9wZXJ0aWVzIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc2VjdXJpdHkucHJvcGVydGllcwppbmRleCAzNjFlMmFkLi5iMTI0MjcxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zZWN1cml0eS5wcm9wZXJ0aWVzCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NlY3VyaXR5LnByb3BlcnRpZXMKQEAgLTU1LDggKzU1LDggQEAKICMgU2VlIHNwZWNpZmljYXRpb24gZm9yCiAjIGphdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkuaHRtbCNnZXREZWZhdWx0QWxnb3JpdGhtKCkKICMgamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5Lmh0bWwjZ2V0RGVmYXVsdEFsZ29yaXRobSgpCi1zc2wuS2V5TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtPVg1MDkKLXNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobT1YNTA5Citzc2wuS2V5TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtPVBLSVgKK3NzbC5UcnVzdE1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobT1QS0lYCiAKICMgc3lzdGVtLnNjb3BlIGlzIHVzZWQgdG8gc3BlY2lmeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiBJZGVudGl0eVNjb3BlCiBzeXN0ZW0uc2NvcGU9b3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LlN5c3RlbVNjb3BlCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUGFyYW1ldGVyU3BlYy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc2VjdXJpdHkvc3BlYy9FQ1BhcmFtZXRlclNwZWMuamF2YQppbmRleCA2YTAzM2U0Li45ODYwYWMwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zZWN1cml0eS9zcGVjL0VDUGFyYW1ldGVyU3BlYy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NlY3VyaXR5L3NwZWMvRUNQYXJhbWV0ZXJTcGVjLmphdmEKQEAgLTMxLDYgKzMxLDggQEAKICAgICBwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgb3JkZXI7CiAgICAgLy8gQ29mYWN0b3IKICAgICBwcml2YXRlIGZpbmFsIGludCBjb2ZhY3RvcjsKKyAgICAvLyBOYW1lIG9mIGN1cnZlIGlmIGF2YWlsYWJsZS4KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjdXJ2ZU5hbWU7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBFQ1BhcmFtZXRlclNwZWN9IHdpdGggdGhlIHNwZWNpZmllZCBlbGxpcHRpYyBjdXJ2ZSwKQEAgLTUwLDEwICs1MiwyMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBFQ1BhcmFtZXRlclNwZWMoRWxsaXB0aWNDdXJ2ZSBjdXJ2ZSwgRUNQb2ludCBnZW5lcmF0b3IsCiAgICAgICAgICAgICBCaWdJbnRlZ2VyIG9yZGVyLCBpbnQgY29mYWN0b3IpIHsKKyAgICAgICAgdGhpcyhjdXJ2ZSwgZ2VuZXJhdG9yLCBvcmRlciwgY29mYWN0b3IsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIEVDUGFyYW1ldGVyU3BlY30gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVkIGN1cnZlCisgICAgICogYW5kIGFsbCBvZiBpdHMgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBzZWUgI0VDUGFyYW1ldGVyU3BlYyhFbGxpcHRpY0N1cnZlLCBFQ1BvaW50LCBCaWdJbnRlZ2VyLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRUNQYXJhbWV0ZXJTcGVjKEVsbGlwdGljQ3VydmUgY3VydmUsIEVDUG9pbnQgZ2VuZXJhdG9yLAorICAgICAgICAgICAgQmlnSW50ZWdlciBvcmRlciwgaW50IGNvZmFjdG9yLCBTdHJpbmcgY3VydmVOYW1lKSB7CiAgICAgICAgIHRoaXMuY3VydmUgPSBjdXJ2ZTsKICAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CiAgICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjsKICAgICAgICAgdGhpcy5jb2ZhY3RvciA9IGNvZmFjdG9yOworICAgICAgICB0aGlzLmN1cnZlTmFtZSA9IGN1cnZlTmFtZTsKICAgICAgICAgLy8gdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgY3VydmUsIGdlbmVyYXRvciBvciBvcmRlciBpcyBudWxsCiAgICAgICAgIGlmICh0aGlzLmN1cnZlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY3VydmUgPT0gbnVsbCIpOwpAQCAtMTA4LDQgKzEyMywxNCBAQAogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9yZGVyKCkgewogICAgICAgICByZXR1cm4gb3JkZXI7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VydmUgaWYgdGhpcyBpcyBhIG5hbWVkIGN1cnZlLiBSZXR1cm5zCisgICAgICoge0Bjb2RlIG51bGx9IGlmIHRoaXMgaXMgbm90IGtub3duIHRvIGJlIGEgbmFtZWQgY3VydmUuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VydmVOYW1lKCkgeworICAgICAgICByZXR1cm4gY3VydmVOYW1lOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9EYXRlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRGF0ZS5qYXZhCmluZGV4IDI0MzRmYmQuLjM0Y2E1YmQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9EYXRlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RhdGUuamF2YQpAQCAtODEsNyArODEsNyBAQAogICAgIEBEZXByZWNhdGVkCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRIb3VycygpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NCw3ICs5NCw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldE1pbnV0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFNlY29uZHMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRIb3VycyhpbnQgdGhlSG91cnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldE1pbnV0ZXMoaW50IHRoZU1pbnV0ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoaW50IHRoZVNlY29uZHMpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERhdGUgdmFsdWVPZihTdHJpbmcgZGF0ZVN0cmluZykgewogICAgICAgICBpZiAoZGF0ZVN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRlU3RyaW5nID09IG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBpbnQgZmlyc3RJbmRleCA9IGRhdGVTdHJpbmcuaW5kZXhPZignLScpOwogICAgICAgICBpbnQgc2Vjb25kSW5kZXggPSBkYXRlU3RyaW5nLmluZGV4T2YoJy0nLCBmaXJzdEluZGV4ICsgMSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyLmphdmEKaW5kZXggNDFjYTg2My4uZmMzNWEzMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RyaXZlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Ecml2ZXIuamF2YQpAQCAtMjAsMTcgKzIwLDEzIEBACiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIC8qKgotICogQW4gaW50ZXJmYWNlIHRvIGEgSkRCQyBkcml2ZXIuCi0gKiA8cD4KLSAqIFRoZSBKREJDIGRyaXZlciB1c2VzIFVSTHMgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2Ygc3BlY2lmaWMgZGF0YS4gVVJMCisgKiBBbiBpbnRlcmZhY2UgdG8gYSBKREJDIGRyaXZlci4gSW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSB7QGxpbmsgRHJpdmVyTWFuYWdlcn0uCisgKgorICogPHA+VGhlIEpEQkMgZHJpdmVyIHVzZXMgVVJMcyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBzcGVjaWZpYyBkYXRhLiBVUkwKICAqIGZvcm1hdCB0eXBpY2FsbHkgdGFrZXMgdGhlIGZvcm0gIiB7QGNvZGUgeHh4eDp5eXl5OlNwZWNpZmljRGF0YX0iLCB3aGVyZSAiCiAgKiB7QGNvZGUgeHh4eDp5eXl5fSIgaXMgcmVmZXJyZWQgdG8gYXMgdGhlIDxpPnN1YnByb3RvY29sPC9pPiBhbmQgaXMgbm9ybWFsbHkKICAqIHRoZSBzYW1lIGZvciBhbGwgb2YgYSBwYXJ0aWN1bGFyIGRyaXZlci4gIiB7QGNvZGUgU3BlY2lmaWNEYXRhfSIgaXMgYSBzdHJpbmcKICAqIHdoaWNoIGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgZGF0YSBzb3VyY2UgdGhhdCB0aGUgZHJpdmVyIHNob3VsZCB1c2UuCi0gKiA8cD4KLSAqIEEgZHJpdmVyIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBhIHtAbGluayBEcml2ZXJNYW5hZ2VyfS4gSXQgaXMKLSAqIHJlZ2lzdGVyZWQgYW5kIGluc3RhbnRpYXRlZCBieSBjYWxsaW5nIHtAY29kZSBDbGFzcy5mb3JOYW1lKCJEcml2ZXJVUkwiKX0KLSAqIHdpdGggdGhlIFVSTCBzdHJpbmcgYXMgYXJndW1lbnQuCiAgKgogICogQHNlZSBEcml2ZXJNYW5hZ2VyCiAgKi8KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvRHJpdmVyTWFuYWdlci5qYXZhCmluZGV4IGM1NDc1ODUuLjU1MGNjYWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL0RyaXZlck1hbmFnZXIuamF2YQpAQCAtMjgsOSArMjgsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAogLyoqCi0gKiBQcm92aWRlcyBmYWNpbGl0aWVzIGZvciBtYW5hZ2luZyBKREJDIGRyaXZlcnMuCi0gKiA8cD4KLSAqIFRoZSB7QGNvZGUgRHJpdmVyTWFuYWdlcn0gY2xhc3MgbG9hZHMgSkRCQyBkcml2ZXJzIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24sCisgKiBQcm92aWRlcyBmYWNpbGl0aWVzIGZvciBtYW5hZ2luZyBKREJDIGRyaXZlcnMuIFRoZSA8Y29kZT5hbmRyb2lkLmRhdGFiYXNlPC9jb2RlPiBhbmQKKyAqIDxjb2RlPmFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlPC9jb2RlPiBwYWNrYWdlcyBvZmZlciBhIGhpZ2hlci1wZXJmb3JtYW5jZSBhbHRlcm5hdGl2ZSBmb3IgbmV3CisgKiBjb2RlLgorICoKKyAqIDxwPk5vdGUgdGhhdCBBbmRyb2lkIGRvZXMgbm90IGluY2x1ZGUgYW55IEpEQkMgZHJpdmVycyBieSBkZWZhdWx0OyB5b3UgbXVzdCBwcm92aWRlIHlvdXIgb3duLgorICoKKyAqIDxwPlRoZSB7QGNvZGUgRHJpdmVyTWFuYWdlcn0gY2xhc3MgbG9hZHMgSkRCQyBkcml2ZXJzIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24sCiAgKiBmcm9tIHRoZSBsaXN0IG9mIGRyaXZlcnMgcmVmZXJlbmNlZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZQogICogImpkYmMuZHJpdmVycyJ9LgogICovCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvVGltZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWUuamF2YQppbmRleCBiY2NjZTY4Li45MTMzNzljIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvVGltZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UaW1lLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKICAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RGF0ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MCw3ICs5MCw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldERheSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TW9udGgoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFllYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREYXRlKGludCBpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgaSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuaW1wbGVtZW50ZWQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIEBEZXByZWNhdGVkCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0WWVhcihpbnQgaSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuaW1wbGVtZW50ZWQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVGltZSB2YWx1ZU9mKFN0cmluZyB0aW1lU3RyaW5nKSB7CiAgICAgICAgIGlmICh0aW1lU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWVTdHJpbmcgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIGludCBmaXJzdEluZGV4ID0gdGltZVN0cmluZy5pbmRleE9mKCc6Jyk7CiAgICAgICAgIGludCBzZWNvbmRJbmRleCA9IHRpbWVTdHJpbmcuaW5kZXhPZignOicsIGZpcnN0SW5kZXggKyAxKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UaW1lc3RhbXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9UaW1lc3RhbXAuamF2YQppbmRleCA0NjNlYThiLi4yZTZkM2Q5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvVGltZXN0YW1wLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvc3FsL1RpbWVzdGFtcC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCkBAIC04Miw3ICs4Myw3IEBACiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIodGhlWWVhciwgdGhlTW9udGgsIHRoZURhdGUsIHRoZUhvdXIsIHRoZU1pbnV0ZSwgdGhlU2Vjb25kKTsKICAgICAgICAgaWYgKHRoZU5hbm8gPCAwIHx8IHRoZU5hbm8gPiA5OTk5OTk5OTkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5zIG91dCBvZiByYW5nZTogIiArIHRoZU5hbm8pOwogICAgICAgICB9CiAgICAgICAgIG5hbm9zID0gdGhlTmFubzsKICAgICB9CkBAIC00MTMsNyArNDE0LDcgQEAKICAgICAgICAgICAgIHRocm93IGJhZFRpbWVzdGFtcFN0cmluZyhzKTsKICAgICAgICAgfQogCi0gICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyIpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MiLCBMb2NhbGUuVVMpOwogICAgICAgICBQYXJzZVBvc2l0aW9uIHBwID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7CiAKICAgICAgICAgLyoKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS9zcWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmI3Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3NxbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPHA+UHJvdmlkZXMgYSBjb21wYXRpYmlsaXR5IGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIFNRTC1iYXNlZCBkYXRhYmFzZXMuCi1UaGUgPGNvZGU+YW5kcm9pZC5kYXRhYmFzZTwvY29kZT4gYW5kIDxjb2RlPmFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlPC9jb2RlPgotcGFja2FnZXMgb2ZmZXIgYSBoaWdoZXItcGVyZm9ybWFuY2UgYWx0ZXJuYXRpdmUgd2hlcmUgc291cmNlIGNvbXBhdGliaWxpdHkKLWlzIG5vdCBhbiBpc3N1ZS48L3A+Ci0KLTxwPk5vdGUgdGhhdCB5b3UgbXVzdCBwcm92aWRlIHlvdXIgb3duIEpEQkMgZHJpdmVyLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nLmphdmEKaW5kZXggZDY3OTI4My4uMjg5YWQ2ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nLmphdmEKQEAgLTU3Nyw4ICs1NzcsOCBAQAogICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYXR0cmlidXRlID09IG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmICh0ZXh0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGV4dCBpcyBlbXB0eSIpOwogICAgICAgICB9CiAKICAgICAgICAgTGlzdDxSYW5nZT4gcmFuZ2VzID0gYXR0cmlidXRlTWFwLmdldChhdHRyaWJ1dGUpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9CcmVha0l0ZXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3IuamF2YQppbmRleCA1YmM3ZjBjLi5iMTQ2NDdjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3IuamF2YQpAQCAtMzg1LDYgKzM4NSw5IEBACiAgICAgICogICAgICAgICAgICB0aGUgbmV3IHRleHQgc3RyaW5nIHRvIGJlIGFuYWx5emVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKKyAgICAgICAgaWYgKG5ld1RleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZXdUZXh0ID09IG51bGwiKTsKKyAgICAgICAgfQogICAgICAgICB3cmFwcGVkLnNldFRleHQobmV3VGV4dCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Nob2ljZUZvcm1hdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9DaG9pY2VGb3JtYXQuamF2YQppbmRleCBlMGExMjM5Li4wMTRiOGM3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0Nob2ljZUZvcm1hdC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ2hvaWNlRm9ybWF0LmphdmEKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0RG91YmxlKHZhbHVlLmRvdWJsZVZhbHVlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjaGFyYWN0ZXIgJyIgKyBjaCArICInIGluIHRlbXBsYXRlOiAiICsgdGVtcGxhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxpbWl0Q291bnQgPiAwICYmIG5leHQgPD0gbGltaXRzW2xpbWl0Q291bnQgLSAxXSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgdGVtcGxhdGU6ICIgKyB0ZW1wbGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXIuc2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgcG9zaXRpb24uc2V0SW5kZXgoaW5kZXgpOwpAQCAtNDI2LDcgKzQyNiw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlcyhkb3VibGVbXSBsaW1pdHMsIFN0cmluZ1tdIGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGxpbWl0cy5sZW5ndGggIT0gZm9ybWF0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpbWl0cy5sZW5ndGggIT0gZm9ybWF0cy5sZW5ndGg6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMubGVuZ3RoICsgIiAhPSAiICsgZm9ybWF0cy5sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGNob2ljZUxpbWl0cyA9IGxpbWl0czsKICAgICAgICAgY2hvaWNlRm9ybWF0cyA9IGZvcm1hdHM7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NvbGxhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0NvbGxhdG9yLmphdmEKaW5kZXggMmRkYjUxNi4uNThkNzA0NyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9Db2xsYXRvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvQ29sbGF0b3IuamF2YQpAQCAtMzM5LDcgKzMzOSw3IEBACiAgICAgICAgIGNhc2UgQ29sbGF0b3IuTk9fREVDT01QT1NJVElPTjoKICAgICAgICAgICAgIHJldHVybiBSdWxlQmFzZWRDb2xsYXRvcklDVS5WQUxVRV9PRkY7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgbW9kZTogIiArIG1vZGUpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGRlY29tcG9zaXRpb25Nb2RlX0lDVV9KYXZhKGludCBtb2RlKSB7CkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgICAgY2FzZSBDb2xsYXRvci5JREVOVElDQUw6CiAgICAgICAgICAgICByZXR1cm4gUnVsZUJhc2VkQ29sbGF0b3JJQ1UuVkFMVUVfSURFTlRJQ0FMOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHN0cmVuZ3RoOiAiICsgdmFsdWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IHN0cmVuZ3RoX0lDVV9KYXZhKGludCB2YWx1ZSkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EYXRlRm9ybWF0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXQuamF2YQppbmRleCBiNDVlNjk5Li5hYzY0ZWVkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXQuamF2YQpAQCAtMjcsMTAyICsyNywzOSBAQAogaW1wb3J0IGxpYmNvcmUuaWN1LkxvY2FsZURhdGE7CiAKIC8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGUvdGltZSBmb3JtYXR0aW5nIHN1YmNsYXNzZXMgd2hpY2ggZm9ybWF0cyBhbmQKLSAqIHBhcnNlcyBkYXRlcyBvciB0aW1lIGluIGEgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgbWFubmVyLiBUaGUgZGF0ZS90aW1lCi0gKiBmb3JtYXR0aW5nIHN1YmNsYXNzLCBzdWNoIGFzIHtAbGluayBTaW1wbGVEYXRlRm9ybWF0fSwgYWxsb3dzIGZvciBmb3JtYXR0aW5nCi0gKiAoaS5lLiwgZGF0ZSAtPiB0ZXh0KSwgcGFyc2luZyAodGV4dCAtPiBkYXRlKSwgYW5kIG5vcm1hbGl6YXRpb24uIFRoZSBkYXRlIGlzCi0gKiByZXByZXNlbnRlZCBhcyBhIHtAY29kZSBEYXRlfSBvYmplY3Qgb3IgYXMgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsCi0gKiAxOTcwLCAwMDowMDowMCBHTVQuCi0gKiA8cD4KLSAqIERhdGVGb3JtYXQgcHJvdmlkZXMgbWFueSBjbGFzcyBtZXRob2RzIGZvciBvYnRhaW5pbmcgZGVmYXVsdCBkYXRlL3RpbWUKLSAqIGZvcm1hdHRlcnMgYmFzZWQgb24gdGhlIGRlZmF1bHQgb3IgYSBnaXZlbiBsb2NhbGUgYW5kIGEgbnVtYmVyIG9mIGZvcm1hdHRpbmcKLSAqIHN0eWxlcy4gVGhlIGZvcm1hdHRpbmcgc3R5bGVzIGluY2x1ZGUgRlVMTCwgTE9ORywgTUVESVVNLCBhbmQgU0hPUlQuIE1vcmUKLSAqIGRldGFpbHMgYW5kIGV4YW1wbGVzIGZvciB1c2luZyB0aGVzZSBzdHlsZXMgYXJlIHByb3ZpZGVkIGluIHRoZSBtZXRob2QKLSAqIGRlc2NyaXB0aW9ucy4KLSAqIDxwPgotICoge0Bjb2RlIERhdGVGb3JtYXR9IGhlbHBzIHlvdSB0byBmb3JtYXQgYW5kIHBhcnNlIGRhdGVzIGZvciBhbnkgbG9jYWxlLiBZb3VyCi0gKiBjb2RlIGNhbiBiZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZSBsb2NhbGUgY29udmVudGlvbnMgZm9yIG1vbnRocywgZGF5cwotICogb2YgdGhlIHdlZWssIG9yIGV2ZW4gdGhlIGNhbGVuZGFyIGZvcm1hdDogbHVuYXIgdnMuIHNvbGFyLgotICogPHA+Ci0gKiBUbyBmb3JtYXQgYSBkYXRlIGZvciB0aGUgY3VycmVudCBMb2NhbGUsIHVzZSBvbmUgb2YgdGhlIHN0YXRpYyBmYWN0b3J5Ci0gKiBtZXRob2RzOgotICogPGJsb2NrcXVvdGU+CisgKiBGb3JtYXRzIG9yIHBhcnNlcyBkYXRlcyBhbmQgdGltZXMuCiAgKgorICogPHA+VGhpcyBjbGFzcyBwcm92aWRlcyBmYWN0b3JpZXMgZm9yIG9idGFpbmluZyBpbnN0YW5jZXMgY29uZmlndXJlZCBmb3IgYSBzcGVjaWZpYyBsb2NhbGUuCisgKiBUaGUgbW9zdCBjb21tb24gc3ViY2xhc3MgaXMge0BsaW5rIFNpbXBsZURhdGVGb3JtYXR9LgorICoKKyAqIDxoND5TYW1wbGUgQ29kZTwvaDQ+CisgKiA8cD5UaGlzIGNvZGU6CiAgKiA8cHJlPgotICogbXlTdHJpbmcgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdChteURhdGUpOwotICogPC9wcmU+Ci0gKgotICogPC9ibG9ja3F1b3RlPgotICogPHA+Ci0gKiBJZiB5b3UgYXJlIGZvcm1hdHRpbmcgbXVsdGlwbGUgZGF0ZXMsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGdldCB0aGUgZm9ybWF0Ci0gKiBhbmQgdXNlIGl0IG11bHRpcGxlIHRpbWVzIHNvIHRoYXQgdGhlIHN5c3RlbSBkb2Vzbid0IGhhdmUgdG8gZmV0Y2ggdGhlCi0gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29udmVudGlvbnMgbXVsdGlwbGUgdGltZXMuCi0gKiA8YmxvY2txdW90ZT4KLSAqCi0gKiA8cHJlPgotICogRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7Ci0gKiBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGEubGVuZ3RoOyArK2kpIHsKLSAqICAgICBvdXRwdXQucHJpbnRsbihkZi5mb3JtYXQobXlEYXRlW2ldKSArICZxdW90OzsgJnF1b3Q7KTsKKyAqIERhdGVGb3JtYXRbXSBmb3JtYXRzID0gbmV3IERhdGVGb3JtYXRbXSB7CisgKiAgIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCksCisgKiAgIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpLAorICogICBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLAorICogfTsKKyAqIGZvciAoRGF0ZUZvcm1hdCBkZiA6IGZvcm1hdHMpIHsKKyAqICAgU3lzdGVtLm91dC5wcmludGxuKGRmLmZvcm1hdChuZXcgRGF0ZSgwKSkpOworICogICBkZi5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworICogICBTeXN0ZW0ub3V0LnByaW50bG4oZGYuZm9ybWF0KG5ldyBEYXRlKDApKSk7CiAgKiB9CiAgKiA8L3ByZT4KICAqCi0gKiA8L2Jsb2NrcXVvdGU+Ci0gKiA8cD4KLSAqIFRvIGZvcm1hdCBhIG51bWJlciBmb3IgYSBkaWZmZXJlbnQgbG9jYWxlLCBzcGVjaWZ5IGl0IGluIHRoZSBjYWxsIHRvCi0gKiB7QGNvZGUgZ2V0RGF0ZUluc3RhbmNlfToKLSAqIDxibG9ja3F1b3RlPgotICoKKyAqIDxwPlByb2R1Y2VzIHRoaXMgb3V0cHV0IHdoZW4gcnVuIG9uIGFuIHtAY29kZSBlbl9VU30gZGV2aWNlIGluIHRoZSBBbWVyaWNhL0xvc19BbmdlbGVzIHRpbWUgem9uZToKICAqIDxwcmU+Ci0gKiBEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5MT05HLCBMb2NhbGUuRlJBTkNFKTsKKyAqIERlYyAzMSwgMTk2OQorICogSmFuIDEsIDE5NzAKKyAqIERlYyAzMSwgMTk2OSA0OjAwOjAwIFBNCisgKiBKYW4gMSwgMTk3MCAxMjowMDowMCBBTQorICogNDowMDowMCBQTQorICogMTI6MDA6MDAgQU0KICAqIDwvcHJlPgotICoKLSAqIDwvYmxvY2txdW90ZT4KLSAqIDxwPgotICoge0Bjb2RlIERhdGVGb3JtYXR9IGNhbiBhbHNvIGJlIHVzZWQgdG8gcGFyc2Ugc3RyaW5nczoKLSAqIDxibG9ja3F1b3RlPgotICoKLSAqIDxwcmU+Ci0gKiBteURhdGUgPSBkZi5wYXJzZShteVN0cmluZyk7Ci0gKiA8L3ByZT4KLSAqCi0gKiA8L2Jsb2NrcXVvdGU+Ci0gKiA8cD4KLSAqIFVzZSB7QGNvZGUgZ2V0RGF0ZUluc3RhbmNlfSB0byBnZXQgdGhlIG5vcm1hbCBkYXRlIGZvcm1hdCBmb3IgYSBjb3VudHJ5LgotICogT3RoZXIgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBhcmUgYXZhaWxhYmxlOiBVc2Uge0Bjb2RlIGdldFRpbWVJbnN0YW5jZX0gdG8KLSAqIGdldCB0aGUgdGltZSBmb3JtYXQgZm9yIGEgY291bnRyeS4gVXNlIHtAY29kZSBnZXREYXRlVGltZUluc3RhbmNlfSB0byBnZXQgdGhlCi0gKiBkYXRlIGFuZCB0aW1lIGZvcm1hdC4gWW91IGNhbiBwYXNzIGluIGRpZmZlcmVudCBvcHRpb25zIHRvIHRoZXNlIGZhY3RvcnkKLSAqIG1ldGhvZHMgdG8gY29udHJvbCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQ7IGZyb20gU0hPUlQgdG8gTUVESVVNIHRvIExPTkcgdG8KLSAqIEZVTEwuIFRoZSBleGFjdCByZXN1bHQgZGVwZW5kcyBvbiB0aGUgbG9jYWxlLCBidXQgZ2VuZXJhbGx5OgotICogPHVsPgotICogPGxpPlNIT1JUIGlzIGNvbXBsZXRlbHkgbnVtZXJpYywgc3VjaCBhcyAxMi4xMy41MiBvciAzOjMwcG0KLSAqIDxsaT5NRURJVU0gaXMgbG9uZ2VyLCBzdWNoIGFzIEphbiAxMiwgMTk1MgotICogPGxpPkxPTkcgaXMgbG9uZ2VyLCBzdWNoIGFzIEphbnVhcnkgMTIsIDE5NTIgb3IgMzozMDozMnBtCi0gKiA8bGk+RlVMTCBpcyBwcmV0dHkgY29tcGxldGVseSBzcGVjaWZpZWQsIHN1Y2ggYXMgVHVlc2RheSwgQXByaWwgMTIsIDE5NTIgQUQKLSAqIG9yIDM6MzA6NDJwbSBQU1QuCi0gKiA8L3VsPgotICogPHA+Ci0gKiBJZiBuZWVkZWQsIHRoZSB0aW1lIHpvbmUgY2FuIGJlIHNldCBvbiB0aGUgZm9ybWF0LiBGb3IgZXZlbiBncmVhdGVyIGNvbnRyb2wKLSAqIG92ZXIgdGhlIGZvcm1hdHRpbmcgb3IgcGFyc2luZywgdHJ5IGNhc3RpbmcgdGhlIHtAY29kZSBEYXRlRm9ybWF0fSB5b3UgZ2V0Ci0gKiBmcm9tIHRoZSBmYWN0b3J5IG1ldGhvZHMgdG8gYSB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdH0uIFRoaXMgd2lsbCB3b3JrIGZvcgotICogdGhlIG1ham9yaXR5IG9mIGNvdW50cmllczsganVzdCByZW1lbWJlciB0byBwdXQgaXQgaW4gYSB0cnkgYmxvY2sgaW4gY2FzZSB5b3UKLSAqIGVuY291bnRlciBhbiB1bnVzdWFsIG9uZS4KLSAqIDxwPgotICogVGhlcmUgYXJlIHZlcnNpb25zIG9mIHRoZSBwYXJzZSBhbmQgZm9ybWF0IG1ldGhvZHMgd2hpY2ggdXNlCi0gKiB7QGNvZGUgUGFyc2VQb3NpdGlvbn0gYW5kIHtAY29kZSBGaWVsZFBvc2l0aW9ufSB0byBhbGxvdyB5b3UgdG8KLSAqIDx1bD4KLSAqIDxsaT5wcm9ncmVzc2l2ZWx5IHBhcnNlIHRocm91Z2ggcGllY2VzIG9mIGEgc3RyaW5nOwotICogPGxpPmFsaWduIGFueSBwYXJ0aWN1bGFyIGZpZWxkLgotICogPC91bD4KLSAqIDxoND5TeW5jaHJvbml6YXRpb248L2g0PgotICogPHA+Ci0gKiBEYXRlIGZvcm1hdHMgYXJlIG5vdCBzeW5jaHJvbml6ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSBzZXBhcmF0ZQotICogZm9ybWF0IGluc3RhbmNlcyBmb3IgZWFjaCB0aHJlYWQuIElmIG11bHRpcGxlIHRocmVhZHMgYWNjZXNzIGEgZm9ybWF0Ci0gKiBjb25jdXJyZW50bHksIGl0IG11c3QgYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuCi0gKgotICogQHNlZSBOdW1iZXJGb3JtYXQKLSAqIEBzZWUgU2ltcGxlRGF0ZUZvcm1hdAotICogQHNlZSBDYWxlbmRhcgotICogQHNlZSBUaW1lWm9uZQorICogQW5kIHdpbGwgcHJvZHVjZSBzaW1pbGFybHkgYXBwcm9wcmlhdGUgbG9jYWxpemVkIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBvbiBhbnkgdXNlcidzIHN5c3RlbS4KKyAqIE5vdGljZSBob3cgdGhlIHNhbWUgcG9pbnQgaW4gdGltZSB3aGVuIGZvcm1hdHRlZCBjYW4gYXBwZWFyIHRvIGJlIGEgZGlmZmVyZW50IHRpbWUgd2hlbiByZW5kZXJlZAorICogZm9yIGEgZGlmZmVyZW50IHRpbWUgem9uZS4gVGhpcyBpcyBvbmUgcmVhc29uIHdoeSBmb3JtYXR0aW5nIHNob3VsZCBiZSBsZWZ0IHVudGlsIHRoZSBkYXRhIHdpbGwKKyAqIG9ubHkgYmUgcHJlc2VudGVkIHRvIGEgaHVtYW4uIE1hY2hpbmVzIHNob3VsZCBpbnRlcmNoYW5nZSAiVW5peCB0aW1lIiBpbnRlZ2Vycy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGVGb3JtYXQgZXh0ZW5kcyBGb3JtYXQgewogCkBAIC0zNDksMTYgKzI4NiwxNCBAQAogICAgICAqICAgICAgICAgICAge0Bjb2RlIE51bWJlcn0gaW5zdGFuY2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGQpIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChPYmplY3Qgb2JqZWN0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBGaWVsZFBvc2l0aW9uIGZpZWxkKSB7CiAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KChEYXRlKSBvYmplY3QsIGJ1ZmZlciwgZmllbGQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXQobmV3IERhdGUoKChOdW1iZXIpIG9iamVjdCkubG9uZ1ZhbHVlKCkpLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQobmV3IERhdGUoKChOdW1iZXIpIG9iamVjdCkubG9uZ1ZhbHVlKCkpLCBidWZmZXIsIGZpZWxkKTsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjbGFzczogIiArIG9iamVjdC5nZXRDbGFzcygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM2OSw4ICszMDQsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXQoRGF0ZSBkYXRlKSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkKLSAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdChkYXRlLCBuZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzkxLDggKzMyNSw3IEBACiAgICAgICogICAgICAgICAgICBvZiB0aGUgYWxpZ25tZW50IGZpZWxkIGluIHRoZSBmb3JtYXR0ZWQgdGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYnVmZmVyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgZm9ybWF0KERhdGUgZGF0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGQpOworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgZm9ybWF0KERhdGUgZGF0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgRmllbGRQb3NpdGlvbiBmaWVsZCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxvY2FsZXMgZm9yIHdoaWNoIGN1c3RvbSB7QGNvZGUgRGF0ZUZvcm1hdH0gaW5zdGFuY2VzCkBAIC04NzQsOSArODA3LDggQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgRmllbGQgb2ZDYWxlbmRhckZpZWxkKGludCBjYWxlbmRhckZpZWxkKSB7CiAgICAgICAgICAgICBpZiAoY2FsZW5kYXJGaWVsZCA8IDAgfHwgY2FsZW5kYXJGaWVsZCA+PSBDYWxlbmRhci5GSUVMRF9DT1VOVCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBvdXQgb2YgcmFuZ2U6ICIgKyBjYWxlbmRhckZpZWxkKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChJbnRlZ2VyLnZhbHVlT2YoY2FsZW5kYXJGaWVsZCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtODg0LDE0ICs4MTYsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRGF0ZVN0eWxlKGludCBzdHlsZSkgewogICAgICAgICBpZiAoIShzdHlsZSA9PSBTSE9SVCB8fCBzdHlsZSA9PSBNRURJVU0gfHwgc3R5bGUgPT0gTE9ORwogICAgICAgICAgICAgICAgIHx8IHN0eWxlID09IEZVTEwgfHwgc3R5bGUgPT0gREVGQVVMVCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgZGF0ZSBzdHlsZSAiICsgc3R5bGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBkYXRlIHN0eWxlOiAiICsgc3R5bGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1RpbWVTdHlsZShpbnQgc3R5bGUpIHsKICAgICAgICAgaWYgKCEoc3R5bGUgPT0gU0hPUlQgfHwgc3R5bGUgPT0gTUVESVVNIHx8IHN0eWxlID09IExPTkcKICAgICAgICAgICAgICAgICB8fCBzdHlsZSA9PSBGVUxMIHx8IHN0eWxlID09IERFRkFVTFQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHRpbWUgc3R5bGUgIiArIHN0eWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgdGltZSBzdHlsZTogIiArIHN0eWxlKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHMuamF2YQppbmRleCBlMmEyMzQ1Li5lNzViODJjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9scy5qYXZhCkBAIC0yMyw5ICsyMywxMCBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiBpbXBvcnQgbGliY29yZS5pY3UuSUNVOwogaW1wb3J0IGxpYmNvcmUuaWN1LkxvY2FsZURhdGE7Ci1pbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVzOworaW1wb3J0IGxpYmNvcmUuaWN1LlRpbWVab25lTmFtZXM7CiAKIC8qKgogICogRW5jYXBzdWxhdGVzIGxvY2FsaXplZCBkYXRlLXRpbWUgZm9ybWF0dGluZyBkYXRhLCBzdWNoIGFzIHRoZSBuYW1lcyBvZiB0aGUKQEAgLTU3LDExICs1OCw4IEBACiAKICAgICBTdHJpbmdbXSBhbXBtcywgZXJhcywgbW9udGhzLCBzaG9ydE1vbnRocywgc2hvcnRXZWVrZGF5cywgd2Vla2RheXM7CiAKLSAgICAvLyBUaGVzZSBhcmUgdXNlZCB0byBpbXBsZW1lbnQgSUNVL0FuZHJvaWQgZXh0ZW5zaW9ucy4KLSAgICB0cmFuc2llbnQgU3RyaW5nW10gbG9uZ1N0YW5kQWxvbmVNb250aHM7Ci0gICAgdHJhbnNpZW50IFN0cmluZ1tdIHNob3J0U3RhbmRBbG9uZU1vbnRoczsKLSAgICB0cmFuc2llbnQgU3RyaW5nW10gbG9uZ1N0YW5kQWxvbmVXZWVrZGF5czsKLSAgICB0cmFuc2llbnQgU3RyaW5nW10gc2hvcnRTdGFuZEFsb25lV2Vla2RheXM7CisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBwYXJ0cyBvZiBVbmljb2RlIFVUUyAjMzUgbm90IGhpc3RvcmljYWxseSBzdXBwb3J0ZWQuCisgICAgdHJhbnNpZW50IExvY2FsZURhdGEgbG9jYWxlRGF0YTsKIAogICAgIC8vIExvY2FsaXplZCBkaXNwbGF5IG5hbWVzLgogICAgIFN0cmluZ1tdW10gem9uZVN0cmluZ3M7CkBAIC04Miw3ICs4MCw3IEBACiAgICAgICovCiAgICAgc3luY2hyb25pemVkIFN0cmluZ1tdW10gaW50ZXJuYWxab25lU3RyaW5ncygpIHsKICAgICAgICAgaWYgKHpvbmVTdHJpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHpvbmVTdHJpbmdzID0gVGltZVpvbmVzLmdldFpvbmVTdHJpbmdzKGxvY2FsZSk7CisgICAgICAgICAgICB6b25lU3RyaW5ncyA9IFRpbWVab25lTmFtZXMuZ2V0Wm9uZVN0cmluZ3MobG9jYWxlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gem9uZVN0cmluZ3M7CiAgICAgfQpAQCAtMTA2LDE5ICsxMDQsMTQgQEAKICAgICBwdWJsaWMgRGF0ZUZvcm1hdFN5bWJvbHMoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKICAgICAgICAgdGhpcy5sb2NhbFBhdHRlcm5DaGFycyA9IFNpbXBsZURhdGVGb3JtYXQuUEFUVEVSTl9DSEFSUzsKLSAgICAgICAgTG9jYWxlRGF0YSBsb2NhbGVEYXRhID0gTG9jYWxlRGF0YS5nZXQobG9jYWxlKTsKKworICAgICAgICB0aGlzLmxvY2FsZURhdGEgPSBMb2NhbGVEYXRhLmdldChsb2NhbGUpOwogICAgICAgICB0aGlzLmFtcG1zID0gbG9jYWxlRGF0YS5hbVBtOwogICAgICAgICB0aGlzLmVyYXMgPSBsb2NhbGVEYXRhLmVyYXM7CiAgICAgICAgIHRoaXMubW9udGhzID0gbG9jYWxlRGF0YS5sb25nTW9udGhOYW1lczsKICAgICAgICAgdGhpcy5zaG9ydE1vbnRocyA9IGxvY2FsZURhdGEuc2hvcnRNb250aE5hbWVzOwogICAgICAgICB0aGlzLndlZWtkYXlzID0gbG9jYWxlRGF0YS5sb25nV2Vla2RheU5hbWVzOwogICAgICAgICB0aGlzLnNob3J0V2Vla2RheXMgPSBsb2NhbGVEYXRhLnNob3J0V2Vla2RheU5hbWVzOwotCi0gICAgICAgIC8vIElDVS9BbmRyb2lkIGV4dGVuc2lvbnMuCi0gICAgICAgIHRoaXMubG9uZ1N0YW5kQWxvbmVNb250aHMgPSBsb2NhbGVEYXRhLmxvbmdTdGFuZEFsb25lTW9udGhOYW1lczsKLSAgICAgICAgdGhpcy5zaG9ydFN0YW5kQWxvbmVNb250aHMgPSBsb2NhbGVEYXRhLnNob3J0U3RhbmRBbG9uZU1vbnRoTmFtZXM7Ci0gICAgICAgIHRoaXMubG9uZ1N0YW5kQWxvbmVXZWVrZGF5cyA9IGxvY2FsZURhdGEubG9uZ1N0YW5kQWxvbmVXZWVrZGF5TmFtZXM7Ci0gICAgICAgIHRoaXMuc2hvcnRTdGFuZEFsb25lV2Vla2RheXMgPSBsb2NhbGVEYXRhLnNob3J0U3RhbmRBbG9uZVdlZWtkYXlOYW1lczsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OSwxMiArMTUyLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIG9pcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgb2lzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gVGhlIFJJIGRvZXNuJ3QgaGF2ZSB0aGVzZSBmaWVsZHMsIHNvIHdlJ2xsIGhhdmUgdG8gZmFsbCBiYWNrIGFuZCBkbyB0aGUgYmVzdCB3ZSBjYW4uCi0gICAgICAgIGxvbmdTdGFuZEFsb25lTW9udGhzID0gbW9udGhzOwotICAgICAgICBzaG9ydFN0YW5kQWxvbmVNb250aHMgPSBzaG9ydE1vbnRoczsKLSAgICAgICAgbG9uZ1N0YW5kQWxvbmVXZWVrZGF5cyA9IHdlZWtkYXlzOwotICAgICAgICBzaG9ydFN0YW5kQWxvbmVXZWVrZGF5cyA9IHNob3J0V2Vla2RheXM7CisgICAgICAgIHRoaXMubG9jYWxlRGF0YSA9IExvY2FsZURhdGEuZ2V0KGxvY2FsZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zMzEsNyArMzE5LDI1IEBACiAgICAgICogPC91bD4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW11bXSBnZXRab25lU3RyaW5ncygpIHsKLSAgICAgICAgcmV0dXJuIGNsb25lMmRTdHJpbmdBcnJheShpbnRlcm5hbFpvbmVTdHJpbmdzKCkpOworICAgICAgICBTdHJpbmdbXVtdIHJlc3VsdCA9IGNsb25lMmRTdHJpbmdBcnJheShpbnRlcm5hbFpvbmVTdHJpbmdzKCkpOworICAgICAgICAvLyBJZiBpY3U0YyBkb2Vzbid0IGhhdmUgYSBuYW1lLCBvdXIgYXJyYXkgY29udGFpbnMgYSBudWxsLiBUaW1lWm9uZS5nZXREaXNwbGF5TmFtZQorICAgICAgICAvLyBrbm93cyBob3cgdG8gZm9ybWF0IEdNVCBvZmZzZXRzIChhbmQsIHVubGlrZSBpY3U0YywgaGFzIGFjY3VyYXRlIGRhdGEpLiBodHRwOi8vYi84MTI4NDYwLgorICAgICAgICBmb3IgKFN0cmluZ1tdIHpvbmUgOiByZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IHpvbmVbMF07CisgICAgICAgICAgICBpZiAoem9uZVsxXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgem9uZVsxXSA9IFRpbWVab25lLmdldFRpbWVab25lKGlkKS5nZXREaXNwbGF5TmFtZShmYWxzZSwgVGltZVpvbmUuTE9ORywgbG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh6b25lWzJdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB6b25lWzJdID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoaWQpLmdldERpc3BsYXlOYW1lKGZhbHNlLCBUaW1lWm9uZS5TSE9SVCwgbG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh6b25lWzNdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB6b25lWzNdID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoaWQpLmdldERpc3BsYXlOYW1lKHRydWUsIFRpbWVab25lLkxPTkcsIGxvY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoem9uZVs0XSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgem9uZVs0XSA9IFRpbWVab25lLmdldFRpbWVab25lKGlkKS5nZXREaXNwbGF5TmFtZSh0cnVlLCBUaW1lWm9uZS5TSE9SVCwgbG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gY2xvbmUyZFN0cmluZ0FycmF5KFN0cmluZ1tdW10gYXJyYXkpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvTnVtYmVyRm9ybWF0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L051bWJlckZvcm1hdC5qYXZhCmluZGV4IGMyODVlM2QuLjM2ZmRkMGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvTnVtYmVyRm9ybWF0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9OdW1iZXJGb3JtYXQuamF2YQpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICBkb3VibGUgZHYgPSAoKE51bWJlcikgb2JqZWN0KS5kb3VibGVWYWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIGZvcm1hdChkdiwgYnVmZmVyLCBmaWVsZCk7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY2xhc3M6ICIgKyBvYmplY3QuZ2V0Q2xhc3MoKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS90ZXh0L1J1bGVCYXNlZEJyZWFrSXRlcmF0b3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUnVsZUJhc2VkQnJlYWtJdGVyYXRvci5qYXZhCmluZGV4IDg0OTA4MzMuLmExNjk2OGUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUnVsZUJhc2VkQnJlYWtJdGVyYXRvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvUnVsZUJhc2VkQnJlYWtJdGVyYXRvci5qYXZhCkBAIC00MCwxNCArNDAsMTQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBmb2xsb3dpbmcoaW50IG9mZnNldCkgewotICAgICAgICB2YWxpZGF0ZU9mZnNldChvZmZzZXQpOworICAgICAgICBjaGVja09mZnNldChvZmZzZXQpOwogICAgICAgICByZXR1cm4gd3JhcHBlZC5mb2xsb3dpbmcob2Zmc2V0KTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIGNoZWNrIHRoZSBvZmZzZXQsIHRocm93IGV4Y2VwdGlvbiBpZiBpdCBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBpZiAoIXdyYXBwZWQuaGFzVGV4dCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCcmVha0l0ZXJhdG9yIGhhcyBubyB0ZXh0Iik7CisgICAgICAgIH0KICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXQgPSB3cmFwcGVkLmdldFRleHQoKTsKICAgICAgICAgaWYgKG9mZnNldCA8IGl0LmdldEJlZ2luSW5kZXgoKSB8fCBvZmZzZXQgPiBpdC5nZXRFbmRJbmRleCgpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJWYWxpZCByYW5nZSBpcyBbIiArIGl0LmdldEJlZ2luSW5kZXgoKSArICIgIiArIGl0LmdldEVuZEluZGV4KCkgKyAiXSI7CkBAIC03NiwxOCArNzYsMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciBuZXdUZXh0KSB7Ci0gICAgICAgIC8vIGNhbGwgYSBtZXRob2QgdG8gY2hlY2sgaWYgbnVsbCBwb2ludGVyCisgICAgICAgIGlmIChuZXdUZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmV3VGV4dCA9PSBudWxsIik7CisgICAgICAgIH0KICAgICAgICAgbmV3VGV4dC5jdXJyZW50KCk7CiAgICAgICAgIHdyYXBwZWQuc2V0VGV4dChuZXdUZXh0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gaXNCb3VuZGFyeShpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHZhbGlkYXRlT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCk7CiAgICAgICAgIHJldHVybiB3cmFwcGVkLmlzQm91bmRhcnkob2Zmc2V0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBwcmVjZWRpbmcoaW50IG9mZnNldCkgewotICAgICAgICB2YWxpZGF0ZU9mZnNldChvZmZzZXQpOworICAgICAgICBjaGVja09mZnNldChvZmZzZXQpOwogICAgICAgICByZXR1cm4gd3JhcHBlZC5wcmVjZWRpbmcob2Zmc2V0KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0LmphdmEKaW5kZXggZjY4MmMwYi4uMDY2ODdmYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0LmphdmEKQEAgLTMwLDE1ICszMCwxNSBAQAogaW1wb3J0IGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiBpbXBvcnQgbGliY29yZS5pY3UuTG9jYWxlRGF0YTsKLWltcG9ydCBsaWJjb3JlLmljdS5UaW1lWm9uZXM7CitpbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVOYW1lczsKIAogLyoqCi0gKiBBIGNvbmNyZXRlIGNsYXNzIGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGRhdGVzIGluIGEgbG9jYWxlLXNlbnNpdGl2ZQotICogbWFubmVyLiBGb3JtYXR0aW5nIHR1cm5zIGEge0BsaW5rIERhdGV9IGludG8gYSB7QGxpbmsgU3RyaW5nfSwgYW5kIHBhcnNpbmcgdHVybnMgYQotICoge0Bjb2RlIFN0cmluZ30gaW50byBhIHtAY29kZSBEYXRlfS4KKyAqIEZvcm1hdHMgYW5kIHBhcnNlcyBkYXRlcyBpbiBhIGxvY2FsZS1zZW5zaXRpdmUgbWFubmVyLiBGb3JtYXR0aW5nIHR1cm5zIGEge0BsaW5rIERhdGV9IGludG8KKyAqIGEge0BsaW5rIFN0cmluZ30sIGFuZCBwYXJzaW5nIHR1cm5zIGEge0Bjb2RlIFN0cmluZ30gaW50byBhIHtAY29kZSBEYXRlfS4KICAqCiAgKiA8aDQ+VGltZSBQYXR0ZXJuIFN5bnRheDwvaDQ+Ci0gKiA8cD5Zb3UgY2FuIHN1cHBseSBhIHBhdHRlcm4gZGVzY3JpYmluZyB3aGF0IHN0cmluZ3MgYXJlIHByb2R1Y2VkL2FjY2VwdGVkLCBidXQgYWxtb3N0IGFsbAorICogPHA+WW91IGNhbiBzdXBwbHkgYSBVbmljb2RlIDxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1LyNEYXRlX0Zvcm1hdF9QYXR0ZXJucyI+VVRTICMzNTwvYT4KKyAqIHBhdHRlcm4gZGVzY3JpYmluZyB3aGF0IHN0cmluZ3MgYXJlIHByb2R1Y2VkL2FjY2VwdGVkLCBidXQgYWxtb3N0IGFsbAogICogY2FsbGVycyBzaG91bGQgdXNlIHtAbGluayBEYXRlRm9ybWF0I2dldERhdGVJbnN0YW5jZX0sIHtAbGluayBEYXRlRm9ybWF0I2dldERhdGVUaW1lSW5zdGFuY2V9LAogICogb3Ige0BsaW5rIERhdGVGb3JtYXQjZ2V0VGltZUluc3RhbmNlfSB0byBnZXQgYSByZWFkeS1tYWRlIGluc3RhbmNlIHN1aXRhYmxlIGZvciB0aGUgdXNlcidzCiAgKiBsb2NhbGUuCkBAIC01Nyw2MSArNTcsNDYgQEAKICAqIG9mIHRoZSBBU0NJSSBsZXR0ZXJzIGlzIGdpdmVuIGluIHRoZSB0YWJsZSBiZWxvdy4gQVNDSUkgbGV0dGVycyBub3QgYXBwZWFyaW5nIGluIHRoZSB0YWJsZSBhcmUKICAqIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBhbmQgaXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byB1c2UgdGhlbS4KICAqCisgKiA8cD5UaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGNvcGllcyAodGhlICJjb3VudCIpIG9mIGEgcGF0dGVybiBjaGFyYWN0ZXIgZnVydGhlciBpbmZsdWVuY2VzCisgKiB0aGUgZm9ybWF0LCBhcyBzaG93biBpbiB0aGUgdGFibGUuIEZvciBmaWVsZHMgb2Yga2luZCAibnVtYmVyIiwgdGhlIGNvdW50IGlzIHRoZSBtaW5pbXVtIG51bWJlcgorICogb2YgZGlnaXRzOyBzaG9ydGVyIHZhbHVlcyBhcmUgemVyby1wYWRkZWQgdG8gdGhlIGdpdmVuIHdpZHRoIGFuZCBsb25nZXIgdmFsdWVzIG92ZXJmbG93IGl0LgorICoKICAqIDxwPjx0YWJsZSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+CiAgKiA8dHIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLSAqICAgICAgPHRkPjxCPlN5bWJvbDwvQj48L3RkPiA8dGQ+PEI+TWVhbmluZzwvQj48L3RkPiA8dGQ+PEI+UHJlc2VudGF0aW9uPC9CPjwvdGQ+IDx0ZD48Qj5FeGFtcGxlPC9CPjwvdGQ+IDwvdHI+CisgKiAgICAgIDx0ZD48Qj5TeW1ib2w8L0I+PC90ZD4gPHRkPjxCPk1lYW5pbmc8L0I+PC90ZD4gPHRkPjxCPktpbmQ8L0I+PC90ZD4gPHRkPjxCPkV4YW1wbGU8L0I+PC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBEfTwvdGQ+IDx0ZD5kYXkgaW4geWVhcjwvdGQ+ICAgICAgICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjE4OTwvdGQ+IDwvdHI+Ci0gKiA8dHI+IDx0ZD57QGNvZGUgRX08L3RkPiA8dGQ+ZGF5IG9mIHdlZWs8L3RkPiAgICAgICAgICAgICA8dGQ+KFRleHQpPC90ZD4gICAgICAgIDx0ZD5UdWVzZGF5PC90ZD4gPC90cj4KKyAqIDx0cj4gPHRkPntAY29kZSBFfTwvdGQ+IDx0ZD5kYXkgb2Ygd2VlazwvdGQ+ICAgICAgICAgICAgIDx0ZD4oVGV4dCk8L3RkPiAgICAgICAgPHRkPntAY29kZSBFfS97QGNvZGUgRUV9L3tAY29kZSBFRUV9OlR1ZSwge0Bjb2RlIEVFRUV9OlR1ZXNkYXksIHtAY29kZSBFRUVFRX06VDwvdGQ+IDwvdHI+CiAgKiA8dHI+IDx0ZD57QGNvZGUgRn08L3RkPiA8dGQ+ZGF5IG9mIHdlZWsgaW4gbW9udGg8L3RkPiAgICA8dGQ+KE51bWJlcik8L3RkPiAgICAgIDx0ZD4yIDxpPigybmQgV2VkIGluIEp1bHkpPC9pPjwvdGQ+IDwvdHI+CiAgKiA8dHI+IDx0ZD57QGNvZGUgR308L3RkPiA8dGQ+ZXJhIGRlc2lnbmF0b3I8L3RkPiAgICAgICAgICA8dGQ+KFRleHQpPC90ZD4gICAgICAgIDx0ZD5BRDwvdGQ+IDwvdHI+CiAgKiA8dHI+IDx0ZD57QGNvZGUgSH08L3RkPiA8dGQ+aG91ciBpbiBkYXkgKDAtMjMpPC90ZD4gICAgICA8dGQ+KE51bWJlcik8L3RkPiAgICAgIDx0ZD4wPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBLfTwvdGQ+IDx0ZD5ob3VyIGluIGFtL3BtICgwLTExKTwvdGQ+ICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjA8L3RkPiA8L3RyPgotICogPHRyPiA8dGQ+e0Bjb2RlIEx9PC90ZD4gPHRkPnN0YW5kLWFsb25lIG1vbnRoPC90ZD4gICAgICAgPHRkPihUZXh0L051bWJlcik8L3RkPiA8dGQ+SnVseSAvIDA3PC90ZD4gPC90cj4KLSAqIDx0cj4gPHRkPntAY29kZSBNfTwvdGQ+IDx0ZD5tb250aCBpbiB5ZWFyPC90ZD4gICAgICAgICAgIDx0ZD4oVGV4dC9OdW1iZXIpPC90ZD4gPHRkPkp1bHkgLyAwNzwvdGQ+IDwvdHI+CisgKiA8dHI+IDx0ZD57QGNvZGUgTH08L3RkPiA8dGQ+c3RhbmQtYWxvbmUgbW9udGg8L3RkPiAgICAgICA8dGQ+KFRleHQpPC90ZD4gICAgICAgIDx0ZD57QGNvZGUgTH06MSB7QGNvZGUgTEx9OjAxIHtAY29kZSBMTEx9OkphbiB7QGNvZGUgTExMTH06SmFudWFyeSB7QGNvZGUgTExMTEx9Oko8L3RkPiA8L3RyPgorICogPHRyPiA8dGQ+e0Bjb2RlIE19PC90ZD4gPHRkPm1vbnRoIGluIHllYXI8L3RkPiAgICAgICAgICAgPHRkPihUZXh0KTwvdGQ+ICAgICAgICA8dGQ+e0Bjb2RlIE19OjEge0Bjb2RlIE1NfTowMSB7QGNvZGUgTU1NfTpKYW4ge0Bjb2RlIE1NTU19OkphbnVhcnkge0Bjb2RlIE1NTU1NfTpKPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBTfTwvdGQ+IDx0ZD5mcmFjdGlvbmFsIHNlY29uZHM8L3RkPiAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjk3ODwvdGQ+IDwvdHI+CiAgKiA8dHI+IDx0ZD57QGNvZGUgV308L3RkPiA8dGQ+d2VlayBpbiBtb250aDwvdGQ+ICAgICAgICAgICA8dGQ+KE51bWJlcik8L3RkPiAgICAgIDx0ZD4yPC90ZD4gPC90cj4KLSAqIDx0cj4gPHRkPntAY29kZSBafTwvdGQ+IDx0ZD50aW1lIHpvbmUgKFJGQyA4MjIpPC90ZD4gICAgIDx0ZD4oVGltZXpvbmUpPC90ZD4gICAgPHRkPi0wODAwPC90ZD4gPC90cj4KKyAqIDx0cj4gPHRkPntAY29kZSBafTwvdGQ+IDx0ZD50aW1lIHpvbmUgKFJGQyA4MjIpPC90ZD4gICAgIDx0ZD4oVGltZSBab25lKTwvdGQ+ICAgPHRkPntAY29kZSBafS97QGNvZGUgWlp9L3tAY29kZSBaWlp9Oi0wODAwIHtAY29kZSBaWlpafTpHTVQtMDg6MDAge0Bjb2RlIFpaWlpafTotMDg6MDA8L3RkPiA8L3RyPgogICogPHRyPiA8dGQ+e0Bjb2RlIGF9PC90ZD4gPHRkPmFtL3BtIG1hcmtlcjwvdGQ+ICAgICAgICAgICAgPHRkPihUZXh0KTwvdGQ+ICAgICAgICA8dGQ+UE08L3RkPiA8L3RyPgotICogPHRyPiA8dGQ+e0Bjb2RlIGN9PC90ZD4gPHRkPnN0YW5kLWFsb25lIGRheSBvZiB3ZWVrPC90ZD4gPHRkPihUZXh0L051bWJlcik8L3RkPiA8dGQ+VHVlc2RheSAvIDI8L3RkPiA8L3RyPgorICogPHRyPiA8dGQ+e0Bjb2RlIGN9PC90ZD4gPHRkPnN0YW5kLWFsb25lIGRheSBvZiB3ZWVrPC90ZD4gPHRkPihUZXh0KTwvdGQ+ICAgICAgICA8dGQ+e0Bjb2RlIGN9L3tAY29kZSBjY30ve0Bjb2RlIGNjY306VHVlLCB7QGNvZGUgY2NjY306VHVlc2RheSwge0Bjb2RlIGNjY2NjfTpUPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBkfTwvdGQ+IDx0ZD5kYXkgaW4gbW9udGg8L3RkPiAgICAgICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjEwPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBofTwvdGQ+IDx0ZD5ob3VyIGluIGFtL3BtICgxLTEyKTwvdGQ+ICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjEyPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBrfTwvdGQ+IDx0ZD5ob3VyIGluIGRheSAoMS0yNCk8L3RkPiAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjI0PC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBtfTwvdGQ+IDx0ZD5taW51dGUgaW4gaG91cjwvdGQ+ICAgICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjMwPC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSBzfTwvdGQ+IDx0ZD5zZWNvbmQgaW4gbWludXRlPC90ZD4gICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjU1PC90ZD4gPC90cj4KICAqIDx0cj4gPHRkPntAY29kZSB3fTwvdGQ+IDx0ZD53ZWVrIGluIHllYXI8L3RkPiAgICAgICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjI3PC90ZD4gPC90cj4KLSAqIDx0cj4gPHRkPntAY29kZSB5fTwvdGQ+IDx0ZD55ZWFyPC90ZD4gICAgICAgICAgICAgICAgICAgIDx0ZD4oTnVtYmVyKTwvdGQ+ICAgICAgPHRkPjIwMTA8L3RkPiA8L3RyPgotICogPHRyPiA8dGQ+e0Bjb2RlIHp9PC90ZD4gPHRkPnRpbWUgem9uZTwvdGQ+ICAgICAgICAgICAgICAgPHRkPihUaW1lem9uZSk8L3RkPiAgICA8dGQ+UGFjaWZpYyBTdGFuZGFyZCBUaW1lPC90ZD4gPC90cj4KLSAqIDx0cj4gPHRkPntAY29kZSAnfTwvdGQ+IDx0ZD5lc2NhcGUgZm9yIHRleHQ8L3RkPiAgICAgICAgIDx0ZD4oRGVsaW1pdGVyKTwvdGQ+ICAgPHRkPidEYXRlPSc8L3RkPiA8L3RyPgotICogPHRyPiA8dGQ+e0Bjb2RlICcnfTwvdGQ+IDx0ZD5zaW5nbGUgcXVvdGU8L3RkPiAgICAgICAgICAgPHRkPihMaXRlcmFsKTwvdGQ+ICAgICA8dGQ+J28nJ2Nsb2NrJzwvdGQ+IDwvdHI+CisgKiA8dHI+IDx0ZD57QGNvZGUgeX08L3RkPiA8dGQ+eWVhcjwvdGQ+ICAgICAgICAgICAgICAgICAgICA8dGQ+KE51bWJlcik8L3RkPiAgICAgIDx0ZD57QGNvZGUgeXl9OjEwIHtAY29kZSB5fS97QGNvZGUgeXl5fS97QGNvZGUgeXl5eX06MjAxMDwvdGQ+IDwvdHI+CisgKiA8dHI+IDx0ZD57QGNvZGUgen08L3RkPiA8dGQ+dGltZSB6b25lPC90ZD4gICAgICAgICAgICAgICA8dGQ+KFRpbWUgWm9uZSk8L3RkPiAgIDx0ZD57QGNvZGUgen0ve0Bjb2RlIHp6fS97QGNvZGUgenp6fTpQU1Qge0Bjb2RlIFpaWlp9OlBhY2lmaWMgU3RhbmRhcmQgVGltZTwvdGQ+IDwvdHI+CisgKiA8dHI+IDx0ZD57QGNvZGUgJ308L3RkPiA8dGQ+ZXNjYXBlIGZvciB0ZXh0PC90ZD4gICAgICAgICA8dGQ+KERlbGltaXRlcik8L3RkPiAgIDx0ZD57QGNvZGUgJ0RhdGU9J306RGF0ZT08L3RkPiA8L3RyPgorICogPHRyPiA8dGQ+e0Bjb2RlICcnfTwvdGQ+IDx0ZD5zaW5nbGUgcXVvdGU8L3RkPiAgICAgICAgICAgPHRkPihMaXRlcmFsKTwvdGQ+ICAgICA8dGQ+e0Bjb2RlICdvJydjbG9jayd9Om8nY2xvY2s8L3RkPiA8L3RyPgogICogPC90YWJsZT4KICAqCi0gKiA8cD5UaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGNvcGllcyAodGhlICJjb3VudCIpIG9mIGEgcGF0dGVybiBjaGFyYWN0ZXIgZnVydGhlciBpbmZsdWVuY2VzCi0gKiB0aGUgZm9ybWF0LgotICogPHVsPgotICogPGxpPjxiPlRleHQ8L2I+IGlmIHRoZSBjb3VudCBpcyA0IG9yIG1vcmUsIHVzZSB0aGUgZnVsbCBmb3JtOyBvdGhlcndpc2UgdXNlIGEgc2hvcnQgb3IKLSAqIGFiYnJldmlhdGVkIGZvcm0gaWYgb25lIGV4aXN0cy4gU28ge0Bjb2RlIHp6enp9IG1pZ2h0IGdpdmUge0Bjb2RlIFBhY2lmaWMgU3RhbmRhcmQgVGltZX0KLSAqIHdoZXJlYXMge0Bjb2RlIHp9IG1pZ2h0IGdpdmUge0Bjb2RlIFBTVH0uIE5vdGUgdGhhdCB0aGUgY291bnQgZG9lcyA8aT5ub3Q8L2k+IHNwZWNpZnkgdGhlCi0gKiBleGFjdCB3aWR0aCBvZiB0aGUgZmllbGQuCi0gKgotICogPGxpPjxiPk51bWJlcjwvYj4gdGhlIGNvdW50IGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMuIFNob3J0ZXIgdmFsdWVzIGFyZQotICogemVyby1wYWRkZWQgdG8gdGhpcyB3aWR0aCwgbG9uZ2VyIHZhbHVlcyBvdmVyZmxvdyB0aGlzIHdpZHRoLgotICoKLSAqIDxwPlllYXJzIGFyZSBoYW5kbGVkIHNwZWNpYWxseToge0Bjb2RlIHl5fSB0cnVuY2F0ZXMgdG8gdGhlIGxhc3QgMiBkaWdpdHMsIGJ1dCBhbnkKLSAqIG90aGVyIG51bWJlciBvZiBjb25zZWN1dGl2ZSB7QGNvZGUgeX1zIGRvZXMgbm90IHRydW5jYXRlLiBTbyB3aGVyZSB7QGNvZGUgeXl5eX0gb3IKLSAqIHtAY29kZSB5fSBtaWdodCBnaXZlIHtAY29kZSAyMDEwfSwge0Bjb2RlIHl5fSB3b3VsZCBnaXZlIHtAY29kZSAxMH0uCi0gKgotICogPHA+RnJhY3Rpb25hbCBzZWNvbmRzIGFyZSBhbHNvIGhhbmRsZWQgc3BlY2lhbGx5OiB0aGV5J3JlIHplcm8tcGFkZGVkIG9uIHRoZQotICogPGk+cmlnaHQ8L2k+LgotICoKLSAqIDxsaT48Yj5UZXh0L051bWJlcjwvYj46IGlmIHRoZSBjb3VudCBpcyAzIG9yIG1vcmUsIHVzZSB0ZXh0OyBvdGhlcndpc2UgdXNlIGEgbnVtYmVyLgotICogU28ge0Bjb2RlIE1NfSBtaWdodCBnaXZlIHtAY29kZSAwN30gd2hpbGUge0Bjb2RlIE1NTX0gZ2l2ZXMge0Bjb2RlIEp1bHl9LgotICogPC91bD4KKyAqIDxwPkZyYWN0aW9uYWwgc2Vjb25kcyBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6IHRoZXkncmUgemVyby1wYWRkZWQgb24gdGhlIDxpPnJpZ2h0PC9pPi4KICAqCiAgKiA8cD5UaGUgdHdvIHBhdHRlcm4gY2hhcmFjdGVycyB7QGNvZGUgTH0gYW5kIHtAY29kZSBjfSBhcmUgSUNVLWNvbXBhdGlibGUgZXh0ZW5zaW9ucywgbm90Ci0gKiBhdmFpbGFibGUgaW4gdGhlIFJJLiBUaGVzZSBhcmUgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IGxvY2FsaXphdGlvbiBpbiBsYW5ndWFnZXMgc3VjaCBhcyBSdXNzaWFuCisgKiBhdmFpbGFibGUgaW4gdGhlIFJJIG9yIGluIEFuZHJvaWQgYmVmb3JlIEFuZHJvaWQgMi4zICJHaW5nZXJicmVhZCIgKEFQSSBsZXZlbCA5KS4gVGhlc2UKKyAqIGV4dGVuc2lvbnMgYXJlIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBsb2NhbGl6YXRpb24gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgUnVzc2lhbgogICogdGhhdCBkaXN0aW5ndWlzaCBiZXR3ZWVuLCBzYXksICJKdW5lIiBhbmQgIkp1bmUgMjAxMCIuCiAgKgotICogPHA+V2hlbiBudW1lcmljIGZpZWxkcyBhcmUgYWRqYWNlbnQgZGlyZWN0bHksIHdpdGggbm8gaW50ZXJ2ZW5pbmcgZGVsaW1pdGVyCisgKiA8cD5XaGVuIHR3byBudW1lcmljIGZpZWxkcyBhcmUgZGlyZWN0bHkgYWRqYWNlbnQgd2l0aCBubyBpbnRlcnZlbmluZyBkZWxpbWl0ZXIKICAqIGNoYXJhY3RlcnMsIHRoZXkgY29uc3RpdHV0ZSBhIHJ1biBvZiBhZGphY2VudCBudW1lcmljIGZpZWxkcy4gU3VjaCBydW5zIGFyZQogICogcGFyc2VkIHNwZWNpYWxseS4gRm9yIGV4YW1wbGUsIHRoZSBmb3JtYXQgIkhIbW1zcyIgcGFyc2VzIHRoZSBpbnB1dCB0ZXh0CiAgKiAiMTIzNDU2IiB0byAxMjozNDo1NiwgcGFyc2VzIHRoZSBpbnB1dCB0ZXh0ICIxMjM0NSIgdG8gMToyMzo0NSwgYW5kIGZhaWxzIHRvCkBAIC0xMzQsMTEgKzExOSwxMSBAQAogICogICBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLAogICogfTsKICAqIGZvciAoRGF0ZUZvcm1hdCBkZiA6IGZvcm1hdHMpIHsKLSAqICAgU3lzdGVtLmVyci5wcmludGxuKGRmLmZvcm1hdChuZXcgRGF0ZSgwKSkpOworICogICBTeXN0ZW0ub3V0LnByaW50bG4oZGYuZm9ybWF0KG5ldyBEYXRlKDApKSk7CiAgKiB9CiAgKiA8L3ByZT4KICAqCi0gKiA8cD5Qcm9kdWNlcyB0aGlzIG91dHB1dCB3aGVuIHJ1biBvbiBhbiB7QGNvZGUgZW5fVVN9IGRldmljZSBpbiB0aGUgUERUIHRpbWUgem9uZToKKyAqIDxwPlByb2R1Y2VzIHRoaXMgb3V0cHV0IHdoZW4gcnVuIG9uIGFuIHtAY29kZSBlbl9VU30gZGV2aWNlIGluIHRoZSBBbWVyaWNhL0xvc19BbmdlbGVzIHRpbWUgem9uZToKICAqIDxwcmU+CiAgKiBEZWMgMzEsIDE5NjkKICAqIERlYyAzMSwgMTk2OSA0OjAwOjAwIFBNCkBAIC0xNTcsMTMgKzE0MiwxMyBAQAogICogfTsKICAqIGZvciAoU3RyaW5nIGZvcm1hdCA6IGZvcm1hdHMpIHsKICAqICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQsIExvY2FsZS5VUyk7Ci0gKiAgIFN5c3RlbS5lcnIuZm9ybWF0KCIlMzBzICVzXG4iLCBmb3JtYXQsIHNkZi5mb3JtYXQobmV3IERhdGUoMCkpKTsKKyAqICAgU3lzdGVtLm91dC5mb3JtYXQoIiUzMHMgJXNcbiIsIGZvcm1hdCwgc2RmLmZvcm1hdChuZXcgRGF0ZSgwKSkpOwogICogICBzZGYuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKLSAqICAgU3lzdGVtLmVyci5mb3JtYXQoIiUzMHMgJXNcbiIsIGZvcm1hdCwgc2RmLmZvcm1hdChuZXcgRGF0ZSgwKSkpOworICogICBTeXN0ZW0ub3V0LmZvcm1hdCgiJTMwcyAlc1xuIiwgZm9ybWF0LCBzZGYuZm9ybWF0KG5ldyBEYXRlKDApKSk7CiAgKiB9CiAgKiA8L3ByZT4KICAqCi0gKiA8cD5XaGljaCBwcm9kdWNlcyB0aGlzIG91dHB1dCB3aGVuIHJ1biBpbiB0aGUgUERUIHRpbWUgem9uZToKKyAqIDxwPldoaWNoIHByb2R1Y2VzIHRoaXMgb3V0cHV0IHdoZW4gcnVuIGluIHRoZSBBbWVyaWNhL0xvc19BbmdlbGVzIHRpbWUgem9uZToKICAqIDxwcmU+CiAgKiAgICAgICAgICAgICAgICAgICAgIHl5eXktTU0tZGQgMTk2OS0xMi0zMQogICogICAgICAgICAgICAgICAgICAgICB5eXl5LU1NLWRkIDE5NzAtMDEtMDEKQEAgLTE4Nyw3ICsxNzIsMTAgQEAKICAqIHRoZSBvcmlnaW5hbCB7QGNvZGUgRGF0ZX0uIEZvciB0aGlzCiAgKiByZWFzb24gaXQgaXMgYWxtb3N0IGFsd2F5cyBuZWNlc3NhcnkgYW5kIGRlc2lyYWJsZSB0byBpbmNsdWRlIHRoZSB0aW1lem9uZSBpbiB0aGUgb3V0cHV0LgogICogSXQgbWF5IGFsc28gYmUgZGVzaXJhYmxlIHRvIHNldCB0aGUgZm9ybWF0dGVyJ3MgdGltZSB6b25lIHRvIFVUQyAodG8gZWFzZSBjb21wYXJpc29uLCBvciB0bwotICogbWFrZSBsb2dzIG1vcmUgcmVhZGFibGUsIGZvciBleGFtcGxlKS4KKyAqIG1ha2UgbG9ncyBtb3JlIHJlYWRhYmxlLCBmb3IgZXhhbXBsZSkuIEl0IGlzIG9mdGVuIGJlc3QgdG8gYXZvaWQgZm9ybWF0dGluZyBjb21wbGV0ZWx5IHdoZW4KKyAqIHdyaXRpbmcgZGF0ZXMvdGltZXMgaW4gbWFjaGluZS1yZWFkYWJsZSBmb3JtLiBTaW1wbHkgc2VuZGluZyB0aGUgIlVuaXggdGltZSIgYXMgYSB7QGNvZGUgbG9uZ30KKyAqIG9yIGFzIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgbG9uZyBpcyBjaGVhcGVyIGFuZCB1bmFtYmlndW91cywgYW5kIGNhbiBiZSBmb3JtYXR0ZWQgYW55CisgKiB3YXkgdGhlIHJlY2lwaWVudCBkZWVtcyBhcHByb3ByaWF0ZS4KICAqCiAgKiA8aDQ+U3luY2hyb25pemF0aW9uPC9oND4KICAqIHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0fSBpcyBub3QgdGhyZWFkLXNhZmUuIFVzZXJzIHNob3VsZCBjcmVhdGUgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IKQEAgLTQ3Niw4ICs0NjQsNyBAQAogICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvckltcGwobmV3IERhdGUoKChOdW1iZXIpIG9iamVjdCkubG9uZ1ZhbHVlKCkpKTsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNsYXNzOiAiICsgb2JqZWN0LmdldENsYXNzKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3JJbXBsKERhdGUgZGF0ZSkgewpAQCAtNTI2LDggKzUxMyw3IEBACiAgICAgICogICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBGb3JtYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZm9ybWF0SW1wbChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICBGaWVsZFBvc2l0aW9uIGZpZWxkLCBMaXN0PEZpZWxkUG9zaXRpb24+IGZpZWxkcykgewotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFBvc2l0aW9uIGZpZWxkLCBMaXN0PEZpZWxkUG9zaXRpb24+IGZpZWxkcykgewogICAgICAgICBib29sZWFuIHF1b3RlID0gZmFsc2U7CiAgICAgICAgIGludCBuZXh0LCBsYXN0ID0gLTEsIGNvdW50ID0gMDsKICAgICAgICAgY2FsZW5kYXIuc2V0VGltZShkYXRlKTsKQEAgLTYwNywyNCArNTkzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE51bWJlcihidWZmZXIsIGNvdW50LCB5ZWFyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUQU5EX0FMT05FX01PTlRIX0ZJRUxEOiAvLyBMCisgICAgICAgICAgICBjYXNlIFNUQU5EX0FMT05FX01PTlRIX0ZJRUxEOiAvLyAnTCcKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5NT05USDsKLSAgICAgICAgICAgICAgICBhcHBlbmRNb250aChidWZmZXIsIGNvdW50LCBmb3JtYXREYXRhLmxvbmdTdGFuZEFsb25lTW9udGhzLCBmb3JtYXREYXRhLnNob3J0U3RhbmRBbG9uZU1vbnRocyk7CisgICAgICAgICAgICAgICAgYXBwZW5kTW9udGgoYnVmZmVyLCBjb3VudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PTlRIX0ZJRUxEOiAvLyBNCisgICAgICAgICAgICBjYXNlIE1PTlRIX0ZJRUxEOiAvLyAnTScKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5NT05USDsKLSAgICAgICAgICAgICAgICBhcHBlbmRNb250aChidWZmZXIsIGNvdW50LCBmb3JtYXREYXRhLm1vbnRocywgZm9ybWF0RGF0YS5zaG9ydE1vbnRocyk7CisgICAgICAgICAgICAgICAgYXBwZW5kTW9udGgoYnVmZmVyLCBjb3VudCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBEQVRFX0ZJRUxEOgogICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRGaWVsZCA9IEZpZWxkLkRBWV9PRl9NT05USDsKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkRBVEU7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhPVVJfT0ZfREFZMV9GSUVMRDogLy8gaworICAgICAgICAgICAgY2FzZSBIT1VSX09GX0RBWTFfRklFTEQ6IC8vICdrJwogICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRGaWVsZCA9IEZpZWxkLkhPVVJfT0ZfREFZMTsKICAgICAgICAgICAgICAgICBpbnQgaG91ciA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CiAgICAgICAgICAgICAgICAgYXBwZW5kTnVtYmVyKGJ1ZmZlciwgY291bnQsIGhvdXIgPT0gMCA/IDI0IDogaG91cik7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhPVVJfT0ZfREFZMF9GSUVMRDogLy8gSAorICAgICAgICAgICAgY2FzZSBIT1VSX09GX0RBWTBfRklFTEQ6IC8vICdIJwogICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRGaWVsZCA9IEZpZWxkLkhPVVJfT0ZfREFZMDsKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkhPVVJfT0ZfREFZOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjQzLDExICs2MjksMTEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RBTkRfQUxPTkVfREFZX09GX1dFRUtfRklFTEQ6CiAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdEZpZWxkID0gRmllbGQuREFZX09GX1dFRUs7Ci0gICAgICAgICAgICAgICAgYXBwZW5kRGF5T2ZXZWVrKGJ1ZmZlciwgY291bnQsIGZvcm1hdERhdGEubG9uZ1N0YW5kQWxvbmVXZWVrZGF5cywgZm9ybWF0RGF0YS5zaG9ydFN0YW5kQWxvbmVXZWVrZGF5cyk7CisgICAgICAgICAgICAgICAgYXBwZW5kRGF5T2ZXZWVrKGJ1ZmZlciwgY291bnQsIHRydWUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBEQVlfT0ZfV0VFS19GSUVMRDoKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5EQVlfT0ZfV0VFSzsKLSAgICAgICAgICAgICAgICBhcHBlbmREYXlPZldlZWsoYnVmZmVyLCBjb3VudCwgZm9ybWF0RGF0YS53ZWVrZGF5cywgZm9ybWF0RGF0YS5zaG9ydFdlZWtkYXlzKTsKKyAgICAgICAgICAgICAgICBhcHBlbmREYXlPZldlZWsoYnVmZmVyLCBjb3VudCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBEQVlfT0ZfWUVBUl9GSUVMRDoKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5EQVlfT0ZfWUVBUjsKQEAgLTY2OSwyMiArNjU1LDIyIEBACiAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdEZpZWxkID0gRmllbGQuQU1fUE07CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmb3JtYXREYXRhLmFtcG1zW2NhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSldKTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSE9VUjFfRklFTEQ6IC8vIGgKKyAgICAgICAgICAgIGNhc2UgSE9VUjFfRklFTEQ6IC8vICdoJwogICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRGaWVsZCA9IEZpZWxkLkhPVVIxOwogICAgICAgICAgICAgICAgIGhvdXIgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUik7CiAgICAgICAgICAgICAgICAgYXBwZW5kTnVtYmVyKGJ1ZmZlciwgY291bnQsIGhvdXIgPT0gMCA/IDEyIDogaG91cik7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhPVVIwX0ZJRUxEOiAvLyBLCisgICAgICAgICAgICBjYXNlIEhPVVIwX0ZJRUxEOiAvLyAnSycKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5IT1VSMDsKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkhPVVI7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRJTUVaT05FX0ZJRUxEOiAvLyB6CisgICAgICAgICAgICBjYXNlIFRJTUVaT05FX0ZJRUxEOiAvLyAneicKICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0RmllbGQgPSBGaWVsZC5USU1FX1pPTkU7CiAgICAgICAgICAgICAgICAgYXBwZW5kVGltZVpvbmUoYnVmZmVyLCBjb3VudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJGQ184MjJfVElNRVpPTkVfRklFTEQ6IC8vIFoKKyAgICAgICAgICAgIGNhc2UgUkZDXzgyMl9USU1FWk9ORV9GSUVMRDogLy8gJ1onCiAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdEZpZWxkID0gRmllbGQuVElNRV9aT05FOwotICAgICAgICAgICAgICAgIGFwcGVuZE51bWVyaWNUaW1lWm9uZShidWZmZXIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmROdW1lcmljVGltZVpvbmUoYnVmZmVyLCBjb3VudCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWVsZCAhPSAtMSkgewpAQCAtNzA3LDIyICs2OTMsMzggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhcHBlbmREYXlPZldlZWsoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGNvdW50LCBTdHJpbmdbXSBsb25ncywgU3RyaW5nW10gc2hvcnRzKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNMb25nID0gKGNvdW50ID4gMyk7Ci0gICAgICAgIFN0cmluZ1tdIGRheXMgPSBpc0xvbmcgPyBsb25ncyA6IHNob3J0czsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChkYXlzW2NhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyldKTsKKyAgICAvLyBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvI0RhdGVfRm9ybWF0X1BhdHRlcm5zIGZvciB0aGUgZGlmZmVyZW50IGNvdW50cy4KKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kRGF5T2ZXZWVrKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBjb3VudCwgYm9vbGVhbiBzdGFuZEFsb25lKSB7CisgICAgICBTdHJpbmdbXSBkYXlzOworICAgICAgTG9jYWxlRGF0YSBsZCA9IGZvcm1hdERhdGEubG9jYWxlRGF0YTsKKyAgICAgIGlmIChjb3VudCA9PSA0KSB7CisgICAgICAgIGRheXMgPSBzdGFuZEFsb25lID8gbGQubG9uZ1N0YW5kQWxvbmVXZWVrZGF5TmFtZXMgOiBmb3JtYXREYXRhLndlZWtkYXlzOworICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA1KSB7CisgICAgICAgIGRheXMgPSBzdGFuZEFsb25lID8gbGQudGlueVN0YW5kQWxvbmVXZWVrZGF5TmFtZXMgOiBmb3JtYXREYXRhLmxvY2FsZURhdGEudGlueVdlZWtkYXlOYW1lczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRheXMgPSBzdGFuZEFsb25lID8gbGQuc2hvcnRTdGFuZEFsb25lV2Vla2RheU5hbWVzIDogZm9ybWF0RGF0YS5zaG9ydFdlZWtkYXlzOworICAgICAgfQorICAgICAgYnVmZmVyLmFwcGVuZChkYXlzW2NhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyldKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kTW9udGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGNvdW50LCBTdHJpbmdbXSBsb25ncywgU3RyaW5nW10gc2hvcnRzKSB7Ci0gICAgICAgIGludCBtb250aCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIGlmIChjb3VudCA8PSAyKSB7Ci0gICAgICAgICAgICBhcHBlbmROdW1iZXIoYnVmZmVyLCBjb3VudCwgbW9udGggKyAxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIC8vIFNlZSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jRGF0ZV9Gb3JtYXRfUGF0dGVybnMgZm9yIHRoZSBkaWZmZXJlbnQgY291bnRzLgorICAgIHByaXZhdGUgdm9pZCBhcHBlbmRNb250aChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY291bnQsIGJvb2xlYW4gc3RhbmRBbG9uZSkgeworICAgICAgaW50IG1vbnRoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKTsKKyAgICAgIGlmIChjb3VudCA8PSAyKSB7CisgICAgICAgIGFwcGVuZE51bWJlcihidWZmZXIsIGNvdW50LCBtb250aCArIDEpOworICAgICAgICByZXR1cm47CisgICAgICB9CiAKLSAgICAgICAgYm9vbGVhbiBpc0xvbmcgPSAoY291bnQgPiAzKTsKLSAgICAgICAgU3RyaW5nW10gbW9udGhzID0gaXNMb25nID8gbG9uZ3MgOiBzaG9ydHM7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobW9udGhzW21vbnRoXSk7CisgICAgICBTdHJpbmdbXSBtb250aHM7CisgICAgICBMb2NhbGVEYXRhIGxkID0gZm9ybWF0RGF0YS5sb2NhbGVEYXRhOworICAgICAgaWYgKGNvdW50ID09IDQpIHsKKyAgICAgICAgbW9udGhzID0gc3RhbmRBbG9uZSA/IGxkLmxvbmdTdGFuZEFsb25lTW9udGhOYW1lcyA6IGZvcm1hdERhdGEubW9udGhzOworICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA1KSB7CisgICAgICAgIG1vbnRocyA9IHN0YW5kQWxvbmUgPyBsZC50aW55U3RhbmRBbG9uZU1vbnRoTmFtZXMgOiBsZC50aW55TW9udGhOYW1lczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1vbnRocyA9IHN0YW5kQWxvbmUgPyBsZC5zaG9ydFN0YW5kQWxvbmVNb250aE5hbWVzIDogZm9ybWF0RGF0YS5zaG9ydE1vbnRoczsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci5hcHBlbmQobW9udGhzW21vbnRoXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NDUsMzIgKzc0NywzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBUaW1lWm9uZS5nZXREaXNwbGF5TmFtZSgpIGJlY2F1c2UgaXQgd291bGQgbm90IHVzZQogICAgICAgICAgICAgLy8gdGhlIGN1c3RvbSBEYXRlRm9ybWF0U3ltYm9scyBvZiB0aGlzIFNpbXBsZURhdGVGb3JtYXQuCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tID0gVGltZVpvbmVzLmdldERpc3BsYXlOYW1lKGZvcm1hdERhdGEuem9uZVN0cmluZ3MsIHR6LmdldElEKCksIGRheWxpZ2h0LCBzdHlsZSk7CisgICAgICAgICAgICBTdHJpbmcgY3VzdG9tID0gVGltZVpvbmVOYW1lcy5nZXREaXNwbGF5TmFtZShmb3JtYXREYXRhLnpvbmVTdHJpbmdzLCB0ei5nZXRJRCgpLCBkYXlsaWdodCwgc3R5bGUpOwogICAgICAgICAgICAgaWYgKGN1c3RvbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjdXN0b20pOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3IsIHNvIGRlZmF1bHQgdG8gYSBudW1lcmljIHRpbWUgem9uZS4KLSAgICAgICAgYXBwZW5kTnVtZXJpY1RpbWVab25lKGJ1ZmZlciwgZ2VuZXJhbFRpbWVab25lKTsKKyAgICAgICAgYXBwZW5kTnVtZXJpY1RpbWVab25lKGJ1ZmZlciwgY291bnQsIGdlbmVyYWxUaW1lWm9uZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdlbmVyYWxUaW1lWm9uZSAiR01ULTA4OjAwIiByYXRoZXIgdGhhbiAiLTA4MDAiLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmROdW1lcmljVGltZVpvbmUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBnZW5lcmFsVGltZVpvbmUpIHsKKyAgICAvLyBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvI0RhdGVfRm9ybWF0X1BhdHRlcm5zIGZvciB0aGUgZGlmZmVyZW50IGNvdW50cy4KKyAgICAvLyBAcGFyYW0gZ2VuZXJhbFRpbWVab25lICJHTVQtMDg6MDAiIHJhdGhlciB0aGFuICItMDgwMCIuCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZE51bWVyaWNUaW1lWm9uZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY291bnQsIGJvb2xlYW4gZ2VuZXJhbFRpbWVab25lKSB7CiAgICAgICAgIGludCBvZmZzZXQgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOwogICAgICAgICBjaGFyIHNpZ24gPSAnKyc7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICBzaWduID0gJy0nOwogICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKICAgICAgICAgfQotICAgICAgICBpZiAoZ2VuZXJhbFRpbWVab25lKSB7CisgICAgICAgIGlmIChnZW5lcmFsVGltZVpvbmUgfHwgY291bnQgPT0gNCkgewogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiR01UIik7CiAgICAgICAgIH0KICAgICAgICAgYnVmZmVyLmFwcGVuZChzaWduKTsKICAgICAgICAgYXBwZW5kTnVtYmVyKGJ1ZmZlciwgMiwgb2Zmc2V0IC8gMzYwMDAwMCk7Ci0gICAgICAgIGlmIChnZW5lcmFsVGltZVpvbmUpIHsKKyAgICAgICAgaWYgKGdlbmVyYWxUaW1lWm9uZSB8fCBjb3VudCA+PSA0KSB7CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc6Jyk7CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kTnVtYmVyKGJ1ZmZlciwgMiwgKG9mZnNldCAlIDM2MDAwMDApIC8gNjAwMDApOwpAQCAtODc2LDE2ICs4NzcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmdldEluZGV4KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFORF9BTE9ORV9NT05USF9GSUVMRDogLy8gTAotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZU1vbnRoKHN0cmluZywgb2Zmc2V0LCBjb3VudCwgYWJzb2x1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXREYXRhLmxvbmdTdGFuZEFsb25lTW9udGhzLCBmb3JtYXREYXRhLnNob3J0U3RhbmRBbG9uZU1vbnRocyk7Ci0gICAgICAgICAgICBjYXNlIE1PTlRIX0ZJRUxEOiAvLyBNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlTW9udGgoc3RyaW5nLCBvZmZzZXQsIGNvdW50LCBhYnNvbHV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGEubW9udGhzLCBmb3JtYXREYXRhLnNob3J0TW9udGhzKTsKKyAgICAgICAgICAgIGNhc2UgU1RBTkRfQUxPTkVfTU9OVEhfRklFTEQ6IC8vICdMJworICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZU1vbnRoKHN0cmluZywgb2Zmc2V0LCBjb3VudCwgYWJzb2x1dGUsIHRydWUpOworICAgICAgICAgICAgY2FzZSBNT05USF9GSUVMRDogLy8gJ00nCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlTW9udGgoc3RyaW5nLCBvZmZzZXQsIGNvdW50LCBhYnNvbHV0ZSwgZmFsc2UpOwogICAgICAgICAgICAgY2FzZSBEQVRFX0ZJRUxEOgogICAgICAgICAgICAgICAgIGZpZWxkID0gQ2FsZW5kYXIuREFURTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSE9VUl9PRl9EQVkxX0ZJRUxEOiAvLyBrCisgICAgICAgICAgICBjYXNlIEhPVVJfT0ZfREFZMV9GSUVMRDogLy8gJ2snCiAgICAgICAgICAgICAgICAgUGFyc2VQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQYXJzZVBvc2l0aW9uKG9mZnNldCk7CiAgICAgICAgICAgICAgICAgTnVtYmVyIHJlc3VsdCA9IHBhcnNlTnVtYmVyKGFic29sdXRlLCBzdHJpbmcsIHBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKQEAgLTg5Nyw3ICs4OTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpOwogICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbi5nZXRJbmRleCgpOwotICAgICAgICAgICAgY2FzZSBIT1VSX09GX0RBWTBfRklFTEQ6IC8vIEgKKyAgICAgICAgICAgIGNhc2UgSE9VUl9PRl9EQVkwX0ZJRUxEOiAvLyAnSCcKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkhPVVJfT0ZfREFZOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNSU5VVEVfRklFTEQ6CkBAIC05MTAsOSArOTA5LDkgQEAKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLk1JTExJU0VDT05EOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFORF9BTE9ORV9EQVlfT0ZfV0VFS19GSUVMRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VEYXlPZldlZWsoc3RyaW5nLCBvZmZzZXQsIGZvcm1hdERhdGEubG9uZ1N0YW5kQWxvbmVXZWVrZGF5cywgZm9ybWF0RGF0YS5zaG9ydFN0YW5kQWxvbmVXZWVrZGF5cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRGF5T2ZXZWVrKHN0cmluZywgb2Zmc2V0LCB0cnVlKTsKICAgICAgICAgICAgIGNhc2UgREFZX09GX1dFRUtfRklFTEQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRGF5T2ZXZWVrKHN0cmluZywgb2Zmc2V0LCBmb3JtYXREYXRhLndlZWtkYXlzLCBmb3JtYXREYXRhLnNob3J0V2Vla2RheXMpOworICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZURheU9mV2VlayhzdHJpbmcsIG9mZnNldCwgZmFsc2UpOwogICAgICAgICAgICAgY2FzZSBEQVlfT0ZfWUVBUl9GSUVMRDoKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkRBWV9PRl9ZRUFSOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTI3LDcgKzkyNiw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFNX1BNX0ZJRUxEOgogICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVRleHQoc3RyaW5nLCBvZmZzZXQsIGZvcm1hdERhdGEuYW1wbXMsIENhbGVuZGFyLkFNX1BNKTsKLSAgICAgICAgICAgIGNhc2UgSE9VUjFfRklFTEQ6IC8vIGgKKyAgICAgICAgICAgIGNhc2UgSE9VUjFfRklFTEQ6IC8vICdoJwogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbmV3IFBhcnNlUG9zaXRpb24ob2Zmc2V0KTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJzZU51bWJlcihhYnNvbHV0ZSwgc3RyaW5nLCBwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CkBAIC05MzksMTIgKzkzOCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuSE9VUiwgaG91cik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmdldEluZGV4KCk7Ci0gICAgICAgICAgICBjYXNlIEhPVVIwX0ZJRUxEOiAvLyBLCisgICAgICAgICAgICBjYXNlIEhPVVIwX0ZJRUxEOiAvLyAnSycKICAgICAgICAgICAgICAgICBmaWVsZCA9IENhbGVuZGFyLkhPVVI7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRJTUVaT05FX0ZJRUxEOiAvLyB6CisgICAgICAgICAgICBjYXNlIFRJTUVaT05FX0ZJRUxEOiAvLyAneicKICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUaW1lWm9uZShzdHJpbmcsIG9mZnNldCk7Ci0gICAgICAgICAgICBjYXNlIFJGQ184MjJfVElNRVpPTkVfRklFTEQ6IC8vIFoKKyAgICAgICAgICAgIGNhc2UgUkZDXzgyMl9USU1FWk9ORV9GSUVMRDogLy8gJ1onCiAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZVpvbmUoc3RyaW5nLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWVsZCAhPSAtMSkgewpAQCAtOTUzLDIzICs5NTIsMzMgQEAKICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBwYXJzZURheU9mV2VlayhTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0LCBTdHJpbmdbXSBsb25ncywgU3RyaW5nW10gc2hvcnRzKSB7Ci0gICAgICAgIGludCBpbmRleCA9IHBhcnNlVGV4dChzdHJpbmcsIG9mZnNldCwgbG9uZ3MsIENhbGVuZGFyLkRBWV9PRl9XRUVLKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgaW5kZXggPSBwYXJzZVRleHQoc3RyaW5nLCBvZmZzZXQsIHNob3J0cywgQ2FsZW5kYXIuREFZX09GX1dFRUspOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKKyAgICBwcml2YXRlIGludCBwYXJzZURheU9mV2VlayhTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHN0YW5kQWxvbmUpIHsKKyAgICAgIExvY2FsZURhdGEgbGQgPSBmb3JtYXREYXRhLmxvY2FsZURhdGE7CisgICAgICBpbnQgaW5kZXggPSBwYXJzZVRleHQoc3RyaW5nLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRBbG9uZSA/IGxkLmxvbmdTdGFuZEFsb25lV2Vla2RheU5hbWVzIDogZm9ybWF0RGF0YS53ZWVrZGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGluZGV4ID0gcGFyc2VUZXh0KHN0cmluZywgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZEFsb25lID8gbGQuc2hvcnRTdGFuZEFsb25lV2Vla2RheU5hbWVzIDogZm9ybWF0RGF0YS5zaG9ydFdlZWtkYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisgICAgICB9CisgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgcGFyc2VNb250aChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIGludCBhYnNvbHV0ZSwgU3RyaW5nW10gbG9uZ3MsIFN0cmluZ1tdIHNob3J0cykgewotICAgICAgICBpZiAoY291bnQgPD0gMikgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyKGFic29sdXRlLCBzdHJpbmcsIG9mZnNldCwgQ2FsZW5kYXIuTU9OVEgsIC0xKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBwYXJzZVRleHQoc3RyaW5nLCBvZmZzZXQsIGxvbmdzLCBDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gcGFyc2VUZXh0KHN0cmluZywgb2Zmc2V0LCBzaG9ydHMsIENhbGVuZGFyLk1PTlRIKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgcHJpdmF0ZSBpbnQgcGFyc2VNb250aChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIGludCBhYnNvbHV0ZSwgYm9vbGVhbiBzdGFuZEFsb25lKSB7CisgICAgICBpZiAoY291bnQgPD0gMikgeworICAgICAgICByZXR1cm4gcGFyc2VOdW1iZXIoYWJzb2x1dGUsIHN0cmluZywgb2Zmc2V0LCBDYWxlbmRhci5NT05USCwgLTEpOworICAgICAgfQorICAgICAgTG9jYWxlRGF0YSBsZCA9IGZvcm1hdERhdGEubG9jYWxlRGF0YTsKKyAgICAgIGludCBpbmRleCA9IHBhcnNlVGV4dChzdHJpbmcsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZEFsb25lID8gbGQubG9uZ1N0YW5kQWxvbmVNb250aE5hbWVzIDogZm9ybWF0RGF0YS5tb250aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIuTU9OVEgpOworICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpbmRleCA9IHBhcnNlVGV4dChzdHJpbmcsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRBbG9uZSA/IGxkLnNob3J0U3RhbmRBbG9uZU1vbnRoTmFtZXMgOiBmb3JtYXREYXRhLnNob3J0TW9udGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5NT05USCk7CisgICAgICB9CisgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTQ4LDggKzExNTcsNyBAQAogICAgICAgICAgICAgb2Zmc2V0ICs9IDM7CiAgICAgICAgIH0KICAgICAgICAgY2hhciBzaWduOwotICAgICAgICBpZiAob2Zmc2V0IDwgc3RyaW5nLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgJiYgKChzaWduID0gc3RyaW5nLmNoYXJBdChvZmZzZXQpKSA9PSAnKycgfHwgc2lnbiA9PSAnLScpKSB7CisgICAgICAgIGlmIChvZmZzZXQgPCBzdHJpbmcubGVuZ3RoKCkgJiYgKChzaWduID0gc3RyaW5nLmNoYXJBdChvZmZzZXQpKSA9PSAnKycgfHwgc2lnbiA9PSAnLScpKSB7CiAgICAgICAgICAgICBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBhcnNlUG9zaXRpb24ob2Zmc2V0ICsgMSk7CiAgICAgICAgICAgICBOdW1iZXIgcmVzdWx0ID0gbnVtYmVyRm9ybWF0LnBhcnNlKHN0cmluZywgcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CkBAIC0xMTc5LDE2ICsxMTg3LDIxIEBACiAgICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwogICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdbXVtdIHpvbmVzID0gZm9ybWF0RGF0YS5pbnRlcm5hbFpvbmVTdHJpbmdzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nW10gZWxlbWVudCA6IHpvbmVzKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gVGltZVpvbmVzLkxPTkdfTkFNRTsgaiA8IFRpbWVab25lcy5OQU1FX0NPVU5UOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLnJlZ2lvbk1hdGNoZXModHJ1ZSwgb2Zmc2V0LCBlbGVtZW50W2pdLCAwLCBlbGVtZW50W2pdLmxlbmd0aCgpKSkgewotICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZSB6b25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoZWxlbWVudFtUaW1lWm9uZXMuT0xTT05fTkFNRV0pOworICAgICAgICBmb3IgKFN0cmluZ1tdIHJvdyA6IGZvcm1hdERhdGEuaW50ZXJuYWxab25lU3RyaW5ncygpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gVGltZVpvbmVOYW1lcy5MT05HX05BTUU7IGkgPCBUaW1lWm9uZU5hbWVzLk5BTUVfQ09VTlQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChyb3dbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpY3U0YyBkb2Vzbid0IGhhdmUgYSBuYW1lLCBvdXIgYXJyYXkgY29udGFpbnMgYSBudWxsLiBOb3JtYWxseSB3ZSdkCisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmsgb3V0IHRoZSBjb3JyZWN0IEdNVCBvZmZzZXQsIGJ1dCB3ZSBhbHJlYWR5IGhhbmRsZWQgcGFyc2luZyBHTVQgb2Zmc2V0cworICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSwgc28gd2UgY2FuIGp1c3QgaWdub3JlIHRoZXNlIGNhc2VzLiBodHRwOi8vYi84MTI4NDYwLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5yZWdpb25NYXRjaGVzKHRydWUsIG9mZnNldCwgcm93W2ldLCAwLCByb3dbaV0ubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFRpbWVab25lIHpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShyb3dbVGltZVpvbmVOYW1lcy5PTFNPTl9OQU1FXSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh6b25lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtb2Zmc2V0IC0gMTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnQgcmF3ID0gem9uZS5nZXRSYXdPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gVGltZVpvbmVzLkxPTkdfTkFNRV9EU1QgfHwgaiA9PSBUaW1lWm9uZXMuU0hPUlRfTkFNRV9EU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gVGltZVpvbmVOYW1lcy5MT05HX05BTUVfRFNUIHx8IGkgPT0gVGltZVpvbmVOYW1lcy5TSE9SVF9OQU1FX0RTVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFsbCB0aW1lIHpvbmVzIHVzZSBhIG9uZS1ob3VyIGRpZmZlcmVuY2UsIHNvIHdlIG5lZWQgdG8gcXVlcnkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBUaW1lWm9uZS4gKEF1c3RyYWxpYS9Mb3JkX0hvd2UgaXMgdGhlIHVzdWFsIGV4YW1wbGUgb2YgdGhpcy4pCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0U2F2aW5ncyA9IHpvbmUuZ2V0RFNUU2F2aW5ncygpOwpAQCAtMTIwMyw3ICsxMjE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJhdyArPSBkc3RTYXZpbmdzOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyLnNldFRpbWVab25lKG5ldyBTaW1wbGVUaW1lWm9uZShyYXcsICIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBlbGVtZW50W2pdLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgcm93W2ldLmxlbmd0aCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uLmphdmEKaW5kZXggN2NiZGNjMC4uYzliNGY4ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbi5qYXZhCkBAIC0zMzYsMjkgKzMzNiwyMCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOwogCiAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIGludCBzaXplID0gc2l6ZSgpLCBpbmRleCA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gaXRlcmF0b3IoKTsKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBuZXcgT2JqZWN0W3NpemVdOwotICAgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7Ci0gICAgICAgICAgICBhcnJheVtpbmRleCsrXSA9IGl0Lm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgIHJldHVybiB0b0FycmF5TGlzdCgpLnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBjb250ZW50cykgeworICAgICAgICByZXR1cm4gdG9BcnJheUxpc3QoKS50b0FycmF5KGNvbnRlbnRzKTsKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBjb250ZW50cykgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKSwgaW5kZXggPSAwOwotICAgICAgICBpZiAoc2l6ZSA+IGNvbnRlbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgQ2xhc3M8Pz4gY3QgPSBjb250ZW50cy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGNvbnRlbnRzID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2UoY3QsIHNpemUpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8T2JqZWN0PiB0b0FycmF5TGlzdCgpIHsKKyAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHNpemUoKSk7CiAgICAgICAgIGZvciAoRSBlbnRyeSA6IHRoaXMpIHsKLSAgICAgICAgICAgIGNvbnRlbnRzW2luZGV4KytdID0gKFQpIGVudHJ5OworICAgICAgICAgICAgcmVzdWx0LmFkZChlbnRyeSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4IDwgY29udGVudHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250ZW50c1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQWJzdHJhY3RNYXAuamF2YQppbmRleCBjY2ZhZWZlLi4zM2VhYmIzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Fic3RyYWN0TWFwLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BYnN0cmFjdE1hcC5qYXZhCkBAIC0zMywxMCArMzMsMTAgQEAKICAqIEBzaW5jZSAxLjIKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKLQotICAgIC8vIExhemlseSBpbml0aWFsaXplZCBrZXkgc2V0LgorICAgIC8vIExhemlseS1pbml0aWFsaXplZCBrZXkgc2V0IChmb3IgaW1wbGVtZW50aW5nIHtAbGluayAja2V5U2V0fSkuCiAgICAgU2V0PEs+IGtleVNldDsKIAorICAgIC8vIExhemlseS1pbml0aWFsaXplZCB2YWx1ZXMgY29sbGVjdGlvbiAoZm9yIGltcGxlbWVudGluZyB7QGxpbmsgI3ZhbHVlc30pLgogICAgIENvbGxlY3Rpb248Vj4gdmFsdWVzQ29sbGVjdGlvbjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheURlcXVlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5RGVxdWUuamF2YQppbmRleCA1ZWUzZjgxLi5jNGZlZjg5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5RGVxdWUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5RGVxdWUuamF2YQpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICogd2hlbiBoZWFkIGFuZCB0YWlsIGhhdmUgd3JhcHBlZCBhcm91bmQgdG8gYmVjb21lIGVxdWFsLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBkb3VibGVDYXBhY2l0eSgpIHsKLSAgICAgICAgYXNzZXJ0IGhlYWQgPT0gdGFpbDsKKyAgICAgICAgLy8gYXNzZXJ0IGhlYWQgPT0gdGFpbDsKICAgICAgICAgaW50IHAgPSBoZWFkOwogICAgICAgICBpbnQgbiA9IGVsZW1lbnRzLmxlbmd0aDsKICAgICAgICAgaW50IHIgPSBuIC0gcDsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRoZSByaWdodCBvZiBwCkBAIC00ODQsMTEgKzQ4NCwxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja0ludmFyaWFudHMoKSB7Ci0gICAgICAgIGFzc2VydCBlbGVtZW50c1t0YWlsXSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgaGVhZCA9PSB0YWlsID8gZWxlbWVudHNbaGVhZF0gPT0gbnVsbCA6Ci0gICAgICAgICAgICAoZWxlbWVudHNbaGVhZF0gIT0gbnVsbCAmJgotICAgICAgICAgICAgIGVsZW1lbnRzWyh0YWlsIC0gMSkgJiAoZWxlbWVudHMubGVuZ3RoIC0gMSldICE9IG51bGwpOwotICAgICAgICBhc3NlcnQgZWxlbWVudHNbKGhlYWQgLSAxKSAmIChlbGVtZW50cy5sZW5ndGggLSAxKV0gPT0gbnVsbDsKKyAgICAgICAgLy8gYXNzZXJ0IGVsZW1lbnRzW3RhaWxdID09IG51bGw7CisgICAgICAgIC8vIGFzc2VydCBoZWFkID09IHRhaWwgPyBlbGVtZW50c1toZWFkXSA9PSBudWxsIDoKKyAgICAgICAgLy8gICAgIChlbGVtZW50c1toZWFkXSAhPSBudWxsICYmCisgICAgICAgIC8vICAgICAgZWxlbWVudHNbKHRhaWwgLSAxKSAmIChlbGVtZW50cy5sZW5ndGggLSAxKV0gIT0gbnVsbCk7CisgICAgICAgIC8vIGFzc2VydCBlbGVtZW50c1soaGVhZCAtIDEpICYgKGVsZW1lbnRzLmxlbmd0aCAtIDEpXSA9PSBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTAyLDcgKzUwMiw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnRzIG1vdmVkIGJhY2t3YXJkcwogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGUoaW50IGkpIHsKLSAgICAgICAgY2hlY2tJbnZhcmlhbnRzKCk7CisgICAgICAgIC8vY2hlY2tJbnZhcmlhbnRzKCk7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50czsKICAgICAgICAgZmluYWwgaW50IG1hc2sgPSBlbGVtZW50cy5sZW5ndGggLSAxOwogICAgICAgICBmaW5hbCBpbnQgaCA9IGhlYWQ7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5TGlzdC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheUxpc3QuamF2YQppbmRleCBkYzdiMTk4Li44YTMyMThkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5TGlzdC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQXJyYXlMaXN0LmphdmEKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQXJyYXlMaXN0KGludCBjYXBhY2l0eSkgewogICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXBhY2l0eSA8IDA6ICIgKyBjYXBhY2l0eSk7CiAgICAgICAgIH0KICAgICAgICAgYXJyYXkgPSAoY2FwYWNpdHkgPT0gMCA/IEVtcHR5QXJyYXkuT0JKRUNUIDogbmV3IE9iamVjdFtjYXBhY2l0eV0pOwogICAgIH0KQEAgLTkwLDYgKzkwLDEwIEBACiAgICAgICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyB0byBhZGQuCiAgICAgICovCiAgICAgcHVibGljIEFycmF5TGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29sbGVjdGlvbiA9PSBudWxsIik7CisgICAgICAgIH0KKwogICAgICAgICBPYmplY3RbXSBhID0gY29sbGVjdGlvbi50b0FycmF5KCk7CiAgICAgICAgIGlmIChhLmdldENsYXNzKCkgIT0gT2JqZWN0W10uY2xhc3MpIHsKICAgICAgICAgICAgIE9iamVjdFtdIG5ld0FycmF5ID0gbmV3IE9iamVjdFthLmxlbmd0aF07CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5cy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9BcnJheXMuamF2YQppbmRleCA0YTE0OWI3Li5jMWIyNzI3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0FycmF5cy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQXJyYXlzLmphdmEKQEAgLTI0MDAsNyArMjQwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGlzIGFuIE9iamVjdFtdLCBzbyB3ZSBhc3NlcnQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGVsZW0gaW5zdGFuY2VvZiBPYmplY3RbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydCBlbGVtIGluc3RhbmNlb2YgT2JqZWN0W107CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFRvU3RyaW5nSW1wbENvbnRhaW5zKG9yaWdBcnJheXMsIGVsZW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbLi4uXSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ2FsZW5kYXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ2FsZW5kYXIuamF2YQppbmRleCA4MWQwMWZiLi5hZWRkYzE4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NhbGVuZGFyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9DYWxlbmRhci5qYXZhCkBAIC03MTIsMTIgKzcxMiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBDYWxlbmRhcn0gaW5zdGFuY2UgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgVGltZVpvbmV9IGFuZCB7QGNvZGUgTG9jYWxlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgdGhlIHRpbWV6b25lLgotICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCisgICAgICogQ29uc3RydWN0cyBhIHtAY29kZSBDYWxlbmRhcn0gaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIHtAY29kZSBUaW1lWm9uZX0gYW5kIHtAY29kZSBMb2NhbGV9LgogICAgICAqLwogICAgIHByb3RlY3RlZCBDYWxlbmRhcihUaW1lWm9uZSB0aW1lem9uZSwgTG9jYWxlIGxvY2FsZSkgewogICAgICAgICB0aGlzKHRpbWV6b25lKTsKQEAgLTcyOCw3ICs3MjMsNyBAQAogCiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYW1vdW50IHRvIGEge0Bjb2RlIENhbGVuZGFyfSBmaWVsZC4KKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBhbW91bnQgdG8gYSB7QGNvZGUgQ2FsZW5kYXJ9IGZpZWxkLgogICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIENhbGVuZGFyfSBmaWVsZCB0byBtb2RpZnkuCkBAIC03NDEsOCArNzM2LDggQEAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGQoaW50IGZpZWxkLCBpbnQgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB7QGNvZGUgRGF0ZX0gc3BlY2lmaWVkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSBpcyBhZnRlciB0aGUge0Bjb2RlIERhdGV9Ci0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIuIFRoZSBjb21wYXJpc29uIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIHRpbWUKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHtAY29kZSBEYXRlfSByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDYWxlbmRhcn0gaW5zdGFuY2UgaXMgYWZ0ZXIgdGhlIHtAY29kZSBEYXRlfQorICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJhbWV0ZXIuIFRoZSBjb21wYXJpc29uIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIHRpbWUKICAgICAgKiB6b25lcyBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjYWxlbmRhcgpAQCAtNzYwLDggKzc1NSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB7QGNvZGUgRGF0ZX0gc3BlY2lmaWVkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSBpcyBiZWZvcmUgdGhlCi0gICAgICoge0Bjb2RlIERhdGV9IHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyLiBUaGUgY29tcGFyaXNvbiBpcyBub3QgZGVwZW5kZW50IG9uIHRoZQorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUge0Bjb2RlIERhdGV9IHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfSBpbnN0YW5jZSBpcyBiZWZvcmUgdGhlCisgICAgICoge0Bjb2RlIERhdGV9IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJhbWV0ZXIuIFRoZSBjb21wYXJpc29uIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlCiAgICAgICogdGltZSB6b25lcyBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjYWxlbmRhcgpAQCAtNzkxLDEwICs3ODYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIGZpZWxkIHRvIHplcm8gYW5kIHNldHMgdGhlIGlzU2V0IGZsYWcgdG8ge0Bjb2RlIGZhbHNlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIGNsZWFyLgorICAgICAqIENsZWFycyB0aGUgZ2l2ZW4gZmllbGQgdG8gemVybyBhbmQgc2V0cyB0aGUgaXNTZXQgZmxhZyB0byB7QGNvZGUgZmFsc2V9LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKGludCBmaWVsZCkgewogICAgICAgICBmaWVsZHNbZmllbGRdID0gMDsKQEAgLTgwMywxMSArNzk1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBDYWxlbmRhcn0gd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCi0gICAgICoKLSAgICAgKiBAc2VlIGphdmEubGFuZy5DbG9uZWFibGUKKyAgICAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfSB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKQEAgLTg1NiwxMyArODQ0LDExIEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29tcHV0ZVRpbWUoKTsKIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoaXMge0Bjb2RlIENhbGVuZGFyfSBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZXkgYXJlCisgICAgICogQ29tcGFyZXMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGlzIHtAY29kZSBDYWxlbmRhcn0gYW5kIHJldHVybnMgd2hldGhlciB0aGV5IGFyZQogICAgICAqIGVxdWFsLiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIENhbGVuZGFyfSBhbmQgaGF2ZSB0aGUgc2FtZQogICAgICAqIHByb3BlcnRpZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHtAY29kZSBDYWxlbmRhcn0sIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMge0Bjb2RlIENhbGVuZGFyfSwge0Bjb2RlIGZhbHNlfQogICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtODgyLDEzICs4NjgsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgYWZ0ZXIgY29tcHV0aW5nIHRoZSBmaWVsZCB2YWx1ZXMgYnkKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgYWZ0ZXIgY29tcHV0aW5nIHRoZSBmaWVsZCB2YWx1ZXMgYnkKICAgICAgKiBjYWxsaW5nIHtAY29kZSBjb21wbGV0ZSgpfSBmaXJzdC4KICAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIGdldC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotICAgICAqCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmllbGRzIGFyZSBub3Qgc2V0LCB0aGUgdGltZSBpcyBub3Qgc2V0LCBhbmQgdGhlCiAgICAgICogICAgICAgICAgICAgICAgdGltZSBjYW5ub3QgYmUgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZXMuCkBAIC05MDIsNyArODg0LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgZm9yIHRoZSBjdXJyZW50IGRhdGUuCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgZm9yIHRoZSBjdXJyZW50IGRhdGUuCiAgICAgICogRm9yIGV4YW1wbGUsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QWN0dWFsTWF4aW11bShpbnQgZmllbGQpIHsKQEAgLTkyNCwxMSArOTA2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgZm9yIHRoZSBjdXJyZW50IGRhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCisgICAgICogUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgZm9yIHRoZSBjdXJyZW50IGRhdGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRBY3R1YWxNaW5pbXVtKGludCBmaWVsZCkgewogICAgICAgICBpbnQgdmFsdWUsIG5leHQ7CkBAIC05NTgsMzEgKzkzNiwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBmb3IgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBmb3IgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3REYXlPZldlZWsoKSB7CiAgICAgICAgIHJldHVybiBmaXJzdERheU9mV2VlazsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncmVhdGVzdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuIFRoaXMgaXMgdGhlCisgICAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuIFRoaXMgaXMgdGhlCiAgICAgICogYmlnZ2VzdCB2YWx1ZSB0aGF0IHtAY29kZSBnZXRBY3R1YWxNaW5pbXVtfSBjYW4gcmV0dXJuIGZvciBhbnkgcG9zc2libGUKICAgICAgKiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQuCi0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0R3JlYXRlc3RNaW5pbXVtKGludCBmaWVsZCk7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB7QGNvZGUgQ2FsZW5kYXJ9IHN1YmNsYXNzIGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICAgKiBkZWZhdWx0IHtAY29kZSBMb2NhbGV9LgotICAgICAqCi0gICAgICogQHJldHVybiBhIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgaW5zdGFuY2Ugc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4KLSAgICAgKiAgICAgICAgIHRoZSBkZWZhdWx0IHtAY29kZSBUaW1lem9uZX0uCisgICAgICogZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSBhbmQgZGVmYXVsdCB7QGNvZGUgVGltZVpvbmV9LCBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYWxlbmRhciBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwpAQCAtOTkwLDExICs5NTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIHtAY29kZSBMb2NhbGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSB0byB1c2UuCi0gICAgICogQHJldHVybiBhIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgaW5zdGFuY2Ugc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCisgICAgICogZ2l2ZW4ge0Bjb2RlIExvY2FsZX0gYW5kIGRlZmF1bHQge0Bjb2RlIFRpbWVab25lfSwgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ2FsZW5kYXIgZ2V0SW5zdGFuY2UoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICByZXR1cm4gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKGxvY2FsZSk7CkBAIC0xMDAyLDEyICs5NjcsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0Bjb2RlIENhbGVuZGFyfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICogZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSwgdXNpbmcgdGhlIHNwZWNpZmllZCB7QGNvZGUgVGltZVpvbmV9LgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWV6b25lCi0gICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIFRpbWVab25lfSB0byB1c2UuCi0gICAgICogQHJldHVybiBhIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgaW5zdGFuY2Ugc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4KLSAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCisgICAgICogZGVmYXVsdCB7QGNvZGUgTG9jYWxlfSBhbmQgZ2l2ZW4ge0Bjb2RlIFRpbWVab25lfSwgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ2FsZW5kYXIgZ2V0SW5zdGFuY2UoVGltZVpvbmUgdGltZXpvbmUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBHcmVnb3JpYW5DYWxlbmRhcih0aW1lem9uZSk7CkBAIC0xMDE1LDYzICs5NzUsNDAgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCB7QGNvZGUgTG9jYWxlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lem9uZQotICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBUaW1lWm9uZX0gdG8gdXNlLgotICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgTG9jYWxlfSB0byB1c2UuCi0gICAgICogQHJldHVybiBhIHtAY29kZSBDYWxlbmRhcn0gc3ViY2xhc3MgaW5zdGFuY2Ugc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4KLSAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCisgICAgICogZ2l2ZW4ge0Bjb2RlIExvY2FsZX0gYW5kIGdpdmVuIHtAY29kZSBUaW1lWm9uZX0sIHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENhbGVuZGFyIGdldEluc3RhbmNlKFRpbWVab25lIHRpbWV6b25lLCBMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHJldHVybiBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIodGltZXpvbmUsIGxvY2FsZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLiBUaGlzIGlzIHRoZQorICAgICAqIFJldHVybnMgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLiBUaGlzIGlzIHRoZQogICAgICAqIHNtYWxsZXN0IHZhbHVlIHRoYXQge0Bjb2RlIGdldEFjdHVhbE1heGltdW0oKX0gY2FuIHJldHVybiBmb3IgYW55CiAgICAgICogcG9zc2libGUgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRMZWFzdE1heGltdW0oaW50IGZpZWxkKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGdyZWF0ZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gVGhpcyByZXR1cm5zIHRoZQotICAgICAqIGJpZ2dlc3QgdmFsdWUgdGhhdCB7QGNvZGUgZ2V0fSBjYW4gcmV0dXJuIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQuCi0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3QgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IG1heGltdW0gdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLiBUaGlzIHJldHVybnMgdGhlCisgICAgICogYmlnZ2VzdCB2YWx1ZSB0aGF0IHtAY29kZSBnZXR9IGNhbiByZXR1cm4gZm9yIHRoZSBnaXZlbiBmaWVsZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heGltdW0oaW50IGZpZWxkKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbmltYWwgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1pbmltYWwgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci4KKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCkgewogICAgICAgICByZXR1cm4gbWluaW1hbERheXNJbkZpcnN0V2VlazsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzbWFsbGVzdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuIHRoaXMgcmV0dXJucyB0aGUKLSAgICAgKiBzbWFsbGVzdCB2YWx1ZSB0aGV0IHtAY29kZSBnZXR9IGNhbiByZXR1cm4gZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCBudW1iZXIuCi0gICAgICogQHJldHVybiB0aGUgc21hbGxlc3QgbWluaW11bSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgorICAgICAqIFJldHVybnMgdGhlIHNtYWxsZXN0IG1pbmltdW0gdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLiB0aGlzIHJldHVybnMgdGhlCisgICAgICogc21hbGxlc3QgdmFsdWUgdGhhdCB7QGNvZGUgZ2V0fSBjYW4gcmV0dXJuIGZvciB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRNaW5pbXVtKGludCBmaWVsZCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIG9mIHRoaXMge0Bjb2RlIENhbGVuZGFyfSBhcyBhIHtAY29kZSBEYXRlfSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBEYXRlfSBpbml0aWFsaXplZCB0byB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCisgICAgICogUmV0dXJucyB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0gYXMgYSB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgdGltZSBpcyBub3Qgc2V0IGFuZCB0aGUgdGltZSBjYW5ub3QgYmUgY29tcHV0ZWQKQEAgLTEwODIsOSArMTAxOSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHRpbWUgZnJvbSB0aGUgZmllbGRzIGlmIHJlcXVpcmVkIGFuZCByZXR1cm5zIHRoZSB0aW1lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCisgICAgICogUmV0dXJucyB0aGUgdGltZSByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBDYWxlbmRhcn0sIHJlY29tcHV0aW5nIHRoZSB0aW1lIGZyb20gaXRzCisgICAgICogZmllbGRzIGlmIG5lY2Vzc2FyeS4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIHRpbWUgaXMgbm90IHNldCBhbmQgdGhlIHRpbWUgY2Fubm90IGJlIGNvbXB1dGVkCkBAIC0xMDk5LDIyICsxMDM1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXpvbmUgb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRpbWVab25lfSB1c2VkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfS4KKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHpvbmUgdXNlZCBieSB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICovCiAgICAgcHVibGljIFRpbWVab25lIGdldFRpbWVab25lKCkgewogICAgICAgICByZXR1cm4gem9uZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIE9iamVjdHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICogcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvciB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaC4KLSAgICAgKgotICAgICAqIEBzZWUgI2VxdWFscwotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiAoaXNMZW5pZW50KCkgPyAxMjM3IDogMTIzMSkgKyBnZXRGaXJzdERheU9mV2VlaygpCkBAIC0xMTIyLDI4ICsxMDQ4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZCB3aXRob3V0IHJlY29tcHV0aW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICB0aGUgZmllbGQuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgd2l0aG91dCByZWNvbXB1dGluZy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGludGVybmFsR2V0KGludCBmaWVsZCkgewogICAgICAgICByZXR1cm4gZmllbGRzW2ZpZWxkXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMge0Bjb2RlIENhbGVuZGFyfSBhY2NlcHRzIGZpZWxkIHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgdmFsaWQKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIENhbGVuZGFyfSBhY2NlcHRzIGZpZWxkIHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgdmFsaWQKICAgICAgKiByYW5nZSBmb3IgdGhlIGZpZWxkLgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9IGlzIGxlbmllbnQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzTGVuaWVudCgpIHsKICAgICAgICAgcmV0dXJuIGxlbmllbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgc2V0LiBOb3RlIHRoYXQgdGhlIGludGVycHJldGF0aW9uIG9mICJpcyBzZXQiIGlzCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZmllbGQgaXMgc2V0LiBOb3RlIHRoYXQgdGhlIGludGVycHJldGF0aW9uIG9mICJpcyBzZXQiIGlzCiAgICAgICogc29tZXdoYXQgdGVjaG5pY2FsLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIDxpPm5vdDwvaT4gbWVhbiB0aGF0IHRoZSBmaWVsZCdzIHZhbHVlIGlzIHVwCiAgICAgICogdG8gZGF0ZS4gSWYgeW91IHdhbnQgdG8ga25vdyB3aGV0aGVyIGEgZmllbGQgY29udGFpbnMgYW4gdXAtdG8tZGF0ZSB2YWx1ZSwgeW91IG11c3QgYWxzbwogICAgICAqIGNoZWNrIHtAY29kZSBhcmVGaWVsZHNTZXR9LCBtYWtpbmcgdGhpcyBtZXRob2Qgc29tZXdoYXQgdXNlbGVzcyB1bmxlc3MgeW91J3JlIGEgc3ViY2xhc3MsCkBAIC0xMTUzLDI1ICsxMDczLDE2IEBACiAgICAgICogb2YgdGhlIHtAY29kZSBjbGVhcn0gbWV0aG9kcy4gVGh1cyAic2V0IiBkb2VzIG5vdCBtZWFuICJ2YWxpZCIuIFlvdSBwcm9iYWJseSB3YW50IHRvIGNhbGwKICAgICAgKiB7QGNvZGUgZ2V0fSAtLSB3aGljaCB3aWxsIHVwZGF0ZSBmaWVsZHMgYXMgbmVjZXNzYXJ5IC0tIHJhdGhlciB0aGFuIHRyeSB0byBtYWtlIHVzZSBvZgogICAgICAqIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogICAgICAgICAgICBhIHtAY29kZSBDYWxlbmRhcn0gZmllbGQgbnVtYmVyLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgc2V0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NldChpbnQgZmllbGQpIHsKICAgICAgICAgcmV0dXJuIGlzU2V0W2ZpZWxkXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYW1vdW50IHRvIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHdyYXBzIHRoZSB2YWx1ZSBvZgorICAgICAqIEFkZHMgdGhlIGdpdmVuIGFtb3VudCB0byB0aGUgZ2l2ZW4gZmllbGQgYW5kIHdyYXBzIHRoZSB2YWx1ZSBvZgogICAgICAqIHRoZSBmaWVsZCB3aGVuIGl0IGdvZXMgYmV5b25kIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWUgZm9yIHRoZQogICAgICAqIGN1cnJlbnQgZGF0ZS4gT3RoZXIgZmllbGRzIHdpbGwgYmUgYWRqdXN0ZWQgYXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYQogICAgICAqIGNvbnNpc3RlbnQgZGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIHRvIHJvbGwuCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgYW1vdW50IHRvIGFkZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByb2xsKGludCBmaWVsZCwgaW50IHZhbHVlKSB7CiAgICAgICAgIGJvb2xlYW4gaW5jcmVtZW50ID0gdmFsdWUgPj0gMDsKQEAgLTExODIsMjUgKzEwOTMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHdyYXAgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIEluY3JlbWVudCBvciBkZWNyZW1lbnQgdGhlIGdpdmVuIGZpZWxkIGFuZCB3cmFwIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgKiBmaWVsZCB3aGVuIGl0IGdvZXMgYmV5b25kIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBjdXJyZW50CiAgICAgICogZGF0ZS4gT3RoZXIgZmllbGRzIHdpbGwgYmUgYWRqdXN0ZWQgYXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50CiAgICAgICogZGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBmaWVsZCB0byByb2xsLgotICAgICAqIEBwYXJhbSBpbmNyZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBpbmNyZW1lbnQgdGhlIGZpZWxkLCB7QGNvZGUgZmFsc2V9IHRvIGRlY3JlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByb2xsKGludCBmaWVsZCwgYm9vbGVhbiBpbmNyZW1lbnQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGZpZWxkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIGluZGljYXRpbmcgdGhlIHtAY29kZSBDYWxlbmRhcn0gZmllbGQgdG8gbW9kaWZ5LgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlLgorICAgICAqIFNldHMgdGhlIGdpdmVuIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGZpZWxkLCBpbnQgdmFsdWUpIHsKICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IHZhbHVlOwpAQCAtMTIxOCwxNSArMTExOSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgeWVhciwgbW9udGggYW5kIGRheSBvZiB0aGUgbW9udGggZmllbGRzLiBPdGhlciBmaWVsZHMgYXJlIG5vdAotICAgICAqIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geWVhcgotICAgICAqICAgICAgICAgICAgdGhlIHllYXIuCi0gICAgICogQHBhcmFtIG1vbnRoCi0gICAgICogICAgICAgICAgICB0aGUgbW9udGguCi0gICAgICogQHBhcmFtIGRheQotICAgICAqICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgbW9udGguCisgICAgICogU2V0cyB0aGUgeWVhciwgbW9udGgsIGFuZCBkYXkgb2YgdGhlIG1vbnRoIGZpZWxkcy4KKyAgICAgKiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjaGFuZ2VkOyBjYWxsIHtAbGluayAjY2xlYXJ9IGZpcnN0IGlmIHRoaXMgaXMgbm90IGRlc2lyZWQuCisgICAgICogVGhlIG1vbnRoIHZhbHVlIGlzIDAtYmFzZWQsIHNvIGl0IG1heSBiZSBjbGVhcmVyIHRvIHVzZSBhIGNvbnN0YW50IGxpa2Uge0Bjb2RlIEpBTlVBUll9LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KSB7CiAgICAgICAgIHNldChZRUFSLCB5ZWFyKTsKQEAgLTEyMzUsNjYgKzExMzAsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB5ZWFyLCBtb250aCwgZGF5IG9mIHRoZSBtb250aCwgaG91ciBvZiBkYXkgYW5kIG1pbnV0ZSBmaWVsZHMuCi0gICAgICogT3RoZXIgZmllbGRzIGFyZSBub3QgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhci4KLSAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KLSAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aC4KLSAgICAgKiBAcGFyYW0gaG91ck9mRGF5Ci0gICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiBkYXkuCi0gICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZS4KKyAgICAgKiBTZXRzIHRoZSB5ZWFyLCBtb250aCwgZGF5IG9mIHRoZSBtb250aCwgaG91ciBvZiBkYXksIGFuZCBtaW51dGUgZmllbGRzLgorICAgICAqIE90aGVyIGZpZWxkcyBhcmUgbm90IGNoYW5nZWQ7IGNhbGwge0BsaW5rICNjbGVhcn0gZmlyc3QgaWYgdGhpcyBpcyBub3QgZGVzaXJlZC4KKyAgICAgKiBUaGUgbW9udGggdmFsdWUgaXMgMC1iYXNlZCwgc28gaXQgbWF5IGJlIGNsZWFyZXIgdG8gdXNlIGEgY29uc3RhbnQgbGlrZSB7QGNvZGUgSkFOVUFSWX0uCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyT2ZEYXksCi0gICAgICAgICAgICBpbnQgbWludXRlKSB7CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyT2ZEYXksIGludCBtaW51dGUpIHsKICAgICAgICAgc2V0KHllYXIsIG1vbnRoLCBkYXkpOwogICAgICAgICBzZXQoSE9VUl9PRl9EQVksIGhvdXJPZkRheSk7CiAgICAgICAgIHNldChNSU5VVEUsIG1pbnV0ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgeWVhciwgbW9udGgsIGRheSBvZiB0aGUgbW9udGgsIGhvdXIgb2YgZGF5LCBtaW51dGUgYW5kIHNlY29uZAotICAgICAqIGZpZWxkcy4gT3RoZXIgZmllbGRzIGFyZSBub3QgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB5ZWFyCi0gICAgICogICAgICAgICAgICB0aGUgeWVhci4KLSAgICAgKiBAcGFyYW0gbW9udGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBtb250aC4KLSAgICAgKiBAcGFyYW0gZGF5Ci0gICAgICogICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSBtb250aC4KLSAgICAgKiBAcGFyYW0gaG91ck9mRGF5Ci0gICAgICogICAgICAgICAgICB0aGUgaG91ciBvZiBkYXkuCi0gICAgICogQHBhcmFtIG1pbnV0ZQotICAgICAqICAgICAgICAgICAgdGhlIG1pbnV0ZS4KLSAgICAgKiBAcGFyYW0gc2Vjb25kCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kLgorICAgICAqIFNldHMgdGhlIHllYXIsIG1vbnRoLCBkYXkgb2YgdGhlIG1vbnRoLCBob3VyIG9mIGRheSwgbWludXRlLCBhbmQgc2Vjb25kIGZpZWxkcy4KKyAgICAgKiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjaGFuZ2VkOyBjYWxsIHtAbGluayAjY2xlYXJ9IGZpcnN0IGlmIHRoaXMgaXMgbm90IGRlc2lyZWQuCisgICAgICogVGhlIG1vbnRoIHZhbHVlIGlzIDAtYmFzZWQsIHNvIGl0IG1heSBiZSBjbGVhcmVyIHRvIHVzZSBhIGNvbnN0YW50IGxpa2Uge0Bjb2RlIEpBTlVBUll9LgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ck9mRGF5LAotICAgICAgICAgICAgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkgeworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ck9mRGF5LCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKSB7CiAgICAgICAgIHNldCh5ZWFyLCBtb250aCwgZGF5LCBob3VyT2ZEYXksIG1pbnV0ZSk7CiAgICAgICAgIHNldChTRUNPTkQsIHNlY29uZCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGZvciB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIGEge0Bjb2RlIENhbGVuZGFyfSBkYXkgb2YgdGhlIHdlZWsuCisgICAgICogVGhlIHZhbHVlIHNob3VsZCBiZSBhIGRheSBvZiB0aGUgd2VlayBzdWNoIGFzIHtAY29kZSBNT05EQVl9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0RGF5T2ZXZWVrKGludCB2YWx1ZSkgewogICAgICAgICBmaXJzdERheU9mV2VlayA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9IHRvIGFjY2VwdCBmaWVsZCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIHZhbGlkCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMge0Bjb2RlIENhbGVuZGFyfSBhY2NlcHRzIGZpZWxkIHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgdmFsaWQKICAgICAgKiByYW5nZSBmb3IgdGhlIGZpZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGVuaWVudChib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGxlbmllbnQgPSB2YWx1ZTsKQEAgLTEzMDIsOSArMTE2OCw2IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbWFsIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWluaW1hbERheXNJbkZpcnN0V2VlayhpbnQgdmFsdWUpIHsKICAgICAgICAgbWluaW1hbERheXNJbkZpcnN0V2VlayA9IHZhbHVlOwpAQCAtMTMxMiwxOSArMTE3NSwxNCBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgRGF0ZX0gb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRpbWUoRGF0ZSBkYXRlKSB7CiAgICAgICAgIHNldFRpbWVJbk1pbGxpcyhkYXRlLmdldFRpbWUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW4uIDEsIDE5NzAuCisgICAgICogU2V0cyB0aGUgdGltZSBvZiB0aGlzIHtAY29kZSBDYWxlbmRhcn0gdG8gdGhlIGdpdmVuIFVuaXggdGltZS4gU2VlIHtAbGluayBEYXRlfSBmb3IgbW9yZQorICAgICAqIGFib3V0IHdoYXQgdGhpcyBtZWFucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lSW5NaWxsaXMobG9uZyBtaWxsaXNlY29uZHMpIHsKICAgICAgICAgaWYgKCFpc1RpbWVTZXQgfHwgIWFyZUZpZWxkc1NldCB8fCB0aW1lICE9IG1pbGxpc2Vjb25kcykgewpAQCAtMTMzNyw5ICsxMTk1LDYgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHtAY29kZSBUaW1lWm9uZX0gdXNlZCBieSB0aGlzIENhbGVuZGFyLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWV6b25lCi0gICAgICogICAgICAgICAgICBhIHtAY29kZSBUaW1lWm9uZX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoVGltZVpvbmUgdGltZXpvbmUpIHsKICAgICAgICAgem9uZSA9IHRpbWV6b25lOwpAQCAtMTM0Nyw3ICsxMjAyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9LCBzaG93aW5nIHdoaWNoIGZpZWxkcyBhcmUgc2V0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xMzczLDExICsxMjI4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdGltZXMgb2YgdGhlIHR3byB7QGNvZGUgQ2FsZW5kYXJ9LCB3aGljaCByZXByZXNlbnQgdGhlIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIEphbnVhcnkgMSwgMTk3MCAwMDowMDowMC4wMDAgR01UIChHcmVnb3JpYW4pLgorICAgICAqIENvbXBhcmVzIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMge0Bjb2RlIENhbGVuZGFyfSB0byB0aGF0IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorICAgICAqIHtAY29kZSBDYWxlbmRhcn0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gYW5vdGhlckNhbGVuZGFyCi0gICAgICogICAgICAgICAgICBhbm90aGVyIGNhbGVuZGFyIHRoYXQgdGhpcyBvbmUgaXMgY29tcGFyZWQgd2l0aC4KICAgICAgKiBAcmV0dXJuIDAgaWYgdGhlIHRpbWVzIG9mIHRoZSB0d28ge0Bjb2RlIENhbGVuZGFyfXMgYXJlIGVxdWFsLCAtMSBpZiB0aGUgdGltZSBvZgogICAgICAqICAgICAgICAgdGhpcyB7QGNvZGUgQ2FsZW5kYXJ9IGlzIGJlZm9yZSB0aGUgb3RoZXIgb25lLCAxIGlmIHRoZSB0aW1lIG9mIHRoaXMKICAgICAgKiAgICAgICAgIHtAY29kZSBDYWxlbmRhcn0gaXMgYWZ0ZXIgdGhlIG90aGVyIG9uZS4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbnMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvQ29sbGVjdGlvbnMuamF2YQppbmRleCBkNDljYTg1Li40YmQxNDUzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0NvbGxlY3Rpb25zLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Db2xsZWN0aW9ucy5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAKICAgICAgICAgQ29waWVzTGlzdChpbnQgbGVuZ3RoLCBFIG9iamVjdCkgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoIDwgMDogIiArIGxlbmd0aCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuID0gbGVuZ3RoOwogICAgICAgICAgICAgZWxlbWVudCA9IG9iamVjdDsKQEAgLTI2NDgsNyArMjY0OCw3IEBACiAgICAgICAgIGlmIChtYXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNldEZyb21NYXA8RT4obWFwKTsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1hcCBub3QgZW1wdHkiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzOTksNCArMzM5OSw1OSBAQAogICAgICAgICAgICAgcmV0dXJuIHNtLmxhc3RLZXkoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIGEgaGFzaCBjb2RlIGFuZCBhcHBsaWVzIGEgc3VwcGxlbWVudGFsIGhhc2ggZnVuY3Rpb24gdG8gZGVmZW5kCisgICAgICogYWdhaW5zdCBwb29yIHF1YWxpdHkgaGFzaCBmdW5jdGlvbnMuIFRoaXMgaXMgY3JpdGljYWwgYmVjYXVzZSBIYXNoTWFwCisgICAgICogdXNlcyBwb3dlci1vZi10d28gbGVuZ3RoIGhhc2ggdGFibGVzLCB0aGF0IG90aGVyd2lzZSBlbmNvdW50ZXIgY29sbGlzaW9ucworICAgICAqIGZvciBoYXNoIGNvZGVzIHRoYXQgZG8gbm90IGRpZmZlciBpbiBsb3dlciBvciB1cHBlciBiaXRzLgorICAgICAqIFJvdXRpbmUgdGFrZW4gZnJvbSBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcC5oYXNoKGludCkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzZWNvbmRhcnlIYXNoKE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZGFyeUhhc2goa2V5Lmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIGFuIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgYXBwbGllcyBhIHN1cHBsZW1lbnRhbCBoYXNoIGZ1bmN0aW9uIHRvIGRlZmVuZAorICAgICAqIGFnYWluc3QgcG9vciBxdWFsaXR5IGhhc2ggZnVuY3Rpb25zLiBUaGlzIGlzIGNyaXRpY2FsIGJlY2F1c2UgaWRlbnRpdHkgaGFzaCBjb2RlcworICAgICAqIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgb2JqZWN0IGFkZHJlc3Nlcywgd2hpY2ggd2lsbCBoYXZlIGJlZW4gYWxpZ25lZCBieSB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBhbGxvY2F0b3IgY2F1c2luZyBhbGwgaGFzaCBjb2RlcyB0byBoYXZlIHRoZSBzYW1lIGJvdHRvbSBiaXRzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2Vjb25kYXJ5SWRlbnRpdHlIYXNoKE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZGFyeUhhc2goU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoa2V5KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlY29uZGFyeUhhc2goaW50IGgpIHsKKyAgICAgICAgLy8gU3ByZWFkIGJpdHMgdG8gcmVndWxhcml6ZSBib3RoIHNlZ21lbnQgYW5kIGluZGV4IGxvY2F0aW9ucywKKyAgICAgICAgLy8gdXNpbmcgdmFyaWFudCBvZiBzaW5nbGUtd29yZCBXYW5nL0plbmtpbnMgaGFzaC4KKyAgICAgICAgaCArPSAoaCA8PCAgMTUpIF4gMHhmZmZmY2Q3ZDsKKyAgICAgICAgaCBePSAoaCA+Pj4gMTApOworICAgICAgICBoICs9IChoIDw8ICAgMyk7CisgICAgICAgIGggXj0gKGggPj4+ICA2KTsKKyAgICAgICAgaCArPSAoaCA8PCAgIDIpICsgKGggPDwgMTQpOworICAgICAgICByZXR1cm4gaCBeIChoID4+PiAxNik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvID49IGl0cyBhcmd1bWVudCwgd2l0aCBzZXZlcmFsIGNhdmVhdHM6CisgICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIGJ1dCBub3QgSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QgcmV0dXJucworICAgICAqIHplcm8uIElmIHRoZSBhcmd1bWVudCBpcyA+IDJeMzAgb3IgZXF1YWwgdG8gSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QKKyAgICAgKiByZXR1cm5zIEludGVnZXIuTUlOX1ZBTFVFLiBJZiB0aGUgYXJndW1lbnQgaXMgemVybywgdGhlIG1ldGhvZCByZXR1cm5zCisgICAgICogemVyby4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJvdW5kVXBUb1Bvd2VyT2ZUd28oaW50IGkpIHsKKyAgICAgICAgaS0tOyAvLyBJZiBpbnB1dCBpcyBhIHBvd2VyIG9mIHR3bywgc2hpZnQgaXRzIGhpZ2gtb3JkZXIgYml0IHJpZ2h0LgorCisgICAgICAgIC8vICJTbWVhciIgdGhlIGhpZ2gtb3JkZXIgYml0IGFsbCB0aGUgd2F5IHRvIHRoZSByaWdodC4KKyAgICAgICAgaSB8PSBpID4+PiAgMTsKKyAgICAgICAgaSB8PSBpID4+PiAgMjsKKyAgICAgICAgaSB8PSBpID4+PiAgNDsKKyAgICAgICAgaSB8PSBpID4+PiAgODsKKyAgICAgICAgaSB8PSBpID4+PiAxNjsKKworICAgICAgICByZXR1cm4gaSArIDE7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9EYXRlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RhdGUuamF2YQppbmRleCAwZWFiOGRjLi5kYTlmMjk2IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RhdGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0RhdGUuamF2YQpAQCAtMjcsMjAgKzI3LDI3IEBACiBpbXBvcnQgbGliY29yZS5pY3UuTG9jYWxlRGF0YTsKIAogLyoqCi0gKiB7QGNvZGUgRGF0ZX0gcmVwcmVzZW50cyBhIHNwZWNpZmljIG1vbWVudCBpbiB0aW1lLCB0byB0aGUgbWlsbGlzZWNvbmQuCisgKiBBIHNwZWNpZmljIG1vbWVudCBpbiB0aW1lLCB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi4gVmFsdWVzIHR5cGljYWxseSBjb21lCisgKiBmcm9tIHtAbGluayBTeXN0ZW0jY3VycmVudFRpbWVNaWxsaXN9LCBhbmQgYXJlIGFsd2F5cyBVVEMsIHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiBzeXN0ZW0ncyB0aW1lIHpvbmUuIFRoaXMgaXMgb2Z0ZW4gY2FsbGVkICJVbml4IHRpbWUiIG9yICJlcG9jaCB0aW1lIi4KICAqCi0gKiBAc2VlIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcwotICogQHNlZSBDYWxlbmRhcgotICogQHNlZSBHcmVnb3JpYW5DYWxlbmRhcgotICogQHNlZSBTaW1wbGVUaW1lWm9uZQotICogQHNlZSBUaW1lWm9uZQorICogPHA+SW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHN1aXRhYmxlIGZvciBjb21wYXJpc29uLCBidXQgbGl0dGxlIGVsc2UuCisgKiBVc2Uge0BsaW5rIGphdmEudGV4dC5EYXRlRm9ybWF0fSB0byBmb3JtYXQgYSB7QGNvZGUgRGF0ZX0gZm9yIGRpc3BsYXkgdG8gYSBodW1hbi4KKyAqIFVzZSB7QGxpbmsgQ2FsZW5kYXJ9IHRvIGJyZWFrIGRvd24gYSB7QGNvZGUgRGF0ZX0gaWYgeW91IG5lZWQgdG8gZXh0cmFjdCBmaWVsZHMgc3VjaAorICogYXMgdGhlIGN1cnJlbnQgbW9udGggb3IgZGF5IG9mIHdlZWssIG9yIHRvIGNvbnN0cnVjdCBhIHtAY29kZSBEYXRlfSBmcm9tIGEgYnJva2VuLWRvd24KKyAqIHRpbWUuIFRoYXQgaXM6IHRoaXMgY2xhc3MnIGRlcHJlY2F0ZWQgZGlzcGxheS1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaXMgbm93IHByb3ZpZGVkCisgKiBieSB7QGNvZGUgRGF0ZUZvcm1hdH0sIGFuZCB0aGlzIGNsYXNzJyBkZXByZWNhdGVkIGNvbXB1dGF0aW9uYWwgZnVuY3Rpb25hbGl0eSBpcworICogbm93IHByb3ZpZGVkIGJ5IHtAY29kZSBDYWxlbmRhcn0uIEJvdGggb2YgdGhlc2Ugb3RoZXIgY2xhc3NlcyAoYW5kIHRoZWlyIHN1YmNsYXNzZXMpCisgKiBhbGxvdyB5b3UgdG8gaW50ZXJwcmV0IGEge0Bjb2RlIERhdGV9IGluIGEgZ2l2ZW4gdGltZSB6b25lLgorICoKKyAqIDxwPk5vdGUgdGhhdCwgc3VycHJpc2luZ2x5LCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgbXV0YWJsZS4KICAqLwogcHVibGljIGNsYXNzIERhdGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxEYXRlPiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NTIzOTY3OTcwMDM0OTM4OTA1TDsKIAogICAgIC8vIFVzZWQgYnkgcGFyc2UoKQotICAgIHByaXZhdGUgc3RhdGljIGludCBjcmVhdGlvblllYXIgPSBuZXcgRGF0ZSgpLmdldFllYXIoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRJT05fWUVBUiA9IG5ldyBEYXRlKCkuZ2V0WWVhcigpOwogCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBtaWxsaXNlY29uZHM7CiAKQEAgLTM1Niw2ICszNjMsMTAgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBwYXJzZUVycm9yKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyc2UgZXJyb3I6ICIgKyBzdHJpbmcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1pbGxpc2Vjb25kIHZhbHVlIG9mIHRoZSBkYXRlIGFuZCB0aW1lIHBhcnNlZCBmcm9tIHRoZQogICAgICAqIHNwZWNpZmllZCB7QGNvZGUgU3RyaW5nfS4gTWFueSBkYXRlL3RpbWUgZm9ybWF0cyBhcmUgcmVjb2duaXplZCwgaW5jbHVkaW5nIElFVEYKQEAgLTQwNiw3ICs0MTcsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICgnMCcgPD0gbmV4dCAmJiBuZXh0IDw9ICc5JykgewogICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IE5VTUJFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNTcGFjZShuZXh0KSAmJiAiLCstOi8iLmluZGV4T2YobmV4dCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFcnJvcihzdHJpbmcpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTlVNQkVSUyAmJiBuZXh0U3RhdGUgIT0gTlVNQkVSUykgewpAQCAtNDI2LDcgKzQzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB6b25lT2Zmc2V0ID0gc2lnbiA9PSAnLScgPyAtZGlnaXQgOiBkaWdpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFcnJvcihzdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdCA+PSA3MCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoeWVhciA9PSAtMQpAQCAtNDM0LDcgKzQ0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBuZXh0ID09ICcvJyB8fCBuZXh0ID09ICdccicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGlnaXQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUVycm9yKHN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJzonKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChob3VyID09IC0xKSB7CkBAIC00NDIsNyArNDUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9IGRpZ2l0OwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFcnJvcihzdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICcvJykgewogICAgICAgICAgICAgICAgICAgICBpZiAobW9udGggPT0gLTEpIHsKQEAgLTQ1MCw3ICs0NjEsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGUgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSBkaWdpdDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXJyb3Ioc3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzU3BhY2UobmV4dCkgfHwgbmV4dCA9PSAnLCcKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5leHQgPT0gJy0nIHx8IG5leHQgPT0gJ1xyJykgewpAQCAtNDYzLDMwICs0NzQsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ZWFyID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGlnaXQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUVycm9yKHN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHllYXIgPT0gLTEgJiYgbW9udGggIT0gLTEgJiYgZGF0ZSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGlnaXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUVycm9yKHN0cmluZyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBMRVRURVJTICYmIG5leHRTdGF0ZSAhPSBMRVRURVJTKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBidWZmZXIudG9TdHJpbmcoKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwogICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXJyb3Ioc3RyaW5nKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHRleHQuZXF1YWxzKCJBTSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChob3VyID09IDEyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMSB8fCBob3VyID4gMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXJyb3Ioc3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5lcXVhbHMoIlBNIikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxIHx8IGhvdXIgPiAxMikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFcnJvcihzdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUwMyw3ICs1MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgem9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB6b25lT2Zmc2V0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUVycm9yKHN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC01MzEsNyArNTQyLDcgQEAKICAgICAgICAgICAgIGlmIChzZWNvbmQgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBzZWNvbmQgPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHllYXIgPCAoY3JlYXRpb25ZZWFyIC0gODApKSB7CisgICAgICAgICAgICBpZiAoeWVhciA8IChDUkVBVElPTl9ZRUFSIC0gODApKSB7CiAgICAgICAgICAgICAgICAgeWVhciArPSAyMDAwOwogICAgICAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDwgMTAwKSB7CiAgICAgICAgICAgICAgICAgeWVhciArPSAxOTAwOwpAQCAtNTQ5LDcgKzU2MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciAtIDE5MDAsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCkKICAgICAgICAgICAgICAgICAgICAgLmdldFRpbWUoKTsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IHBhcnNlRXJyb3Ioc3RyaW5nKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRW51bU1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKaW5kZXggYTcyMWVlMy4uODI3ZmI1MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtTWFwLmphdmEKQEAgLTQzNiw4ICs0MzYsOCBAQAogICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgRW51bU1hcCkgewogICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24oKEVudW1NYXA8SywgVj4pIG1hcCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKG1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXAgaXMgZW1wdHkiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEl0ZXJhdG9yPEs+IGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIEsgZW51bUtleSA9IGl0ZXIubmV4dCgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FbnVtU2V0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VudW1TZXQuamF2YQppbmRleCBjYzg5NjllLi4yMGJlNmY3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VudW1TZXQuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0VudW1TZXQuamF2YQpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gY29weU9mKChFbnVtU2V0PEU+KSBjKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVtcHR5IGNvbGxlY3Rpb24iKTsKICAgICAgICAgfQogICAgICAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IGMuaXRlcmF0b3IoKTsKICAgICAgICAgRSBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IEVudW1TZXQ8RT4gcmFuZ2UoRSBzdGFydCwgRSBlbmQpIHsKICAgICAgICAgaWYgKHN0YXJ0LmNvbXBhcmVUbyhlbmQpID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhcnQgaXMgYmVoaW5kIGVuZCIpOwogICAgICAgICB9CiAgICAgICAgIEVudW1TZXQ8RT4gc2V0ID0gRW51bVNldC5ub25lT2Yoc3RhcnQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CiAgICAgICAgIHNldC5zZXRSYW5nZShzdGFydCwgZW5kKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRXZlbnRPYmplY3QuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRXZlbnRPYmplY3QuamF2YQppbmRleCAwNThlN2U4Li4wZmM5MmJiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0V2ZW50T2JqZWN0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9FdmVudE9iamVjdC5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICovCiAgICAgcHVibGljIEV2ZW50T2JqZWN0KE9iamVjdCBzb3VyY2UpIHsKICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2UgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0Zvcm1hdHRlci5qYXZhCmluZGV4IDAyMWRhMDguLjZjYTg3MzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvRm9ybWF0dGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Gb3JtYXR0ZXIuamF2YQpAQCAtMjk3LDkgKzI5Nyw5IEBACiAgKiA8L3RyPgogICogPC90YWJsZT4KICAqIDxwPgotICogSXQncyBhbHNvIHBvc3NpYmxlIHRvIGZvcm1hdCBkYXRlcyBhbmQgdGltZXMgd2l0aCB7QGNvZGUgRm9ybWF0dGVyfSwgdGhvdWdoIHlvdSBzaG91bGQgc2VyaW91c2x5Ci0gKiBjb25zaWRlciB1c2luZyB7QGxpbmsgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXR9IHZpYSB0aGUgZmFjdG9yeSBtZXRob2RzIGluCi0gKiB7QGxpbmsgamF2YS50ZXh0LkRhdGVGb3JtYXR9IGluc3RlYWQuCisgKiBJdCdzIGFsc28gcG9zc2libGUgdG8gZm9ybWF0IGRhdGVzIGFuZCB0aW1lcyB3aXRoIHtAY29kZSBGb3JtYXR0ZXJ9LCB0aG91Z2ggeW91IHNob3VsZAorICogdXNlIHtAbGluayBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdH0gKHByb2JhYmx5IHZpYSB0aGUgZmFjdG9yeSBtZXRob2RzIGluCisgKiB7QGxpbmsgamF2YS50ZXh0LkRhdGVGb3JtYXR9KSBpbnN0ZWFkLgogICogVGhlIGZhY2lsaXRpZXMgb2ZmZXJlZCBieSB7QGNvZGUgRm9ybWF0dGVyfSBhcmUgbG93LWxldmVsIGFuZCBwbGFjZSB0aGUgYnVyZGVuIG9mIGxvY2FsaXphdGlvbgogICogb24gdGhlIGRldmVsb3Blci4gVXNpbmcge0BsaW5rIGphdmEudGV4dC5EYXRlRm9ybWF0I2dldERhdGVJbnN0YW5jZX0sCiAgKiB7QGxpbmsgamF2YS50ZXh0LkRhdGVGb3JtYXQjZ2V0VGltZUluc3RhbmNlfSwgYW5kCkBAIC0zMTAsMTEgKzMxMCw4IEBACiAgKiB3aGljaCB5b3UgY2FuIGdldCB3aXRoIHtAY29kZSAiJXRGIn0gKDIwMTAtMDEtMjIpLCB7QGNvZGUgIiV0RiAldFIifSAoMjAxMC0wMS0yMiAxMzozOSksCiAgKiB7QGNvZGUgIiV0RiAldFQifSAoMjAxMC0wMS0yMiAxMzozOToxNSksIG9yIHtAY29kZSAiJXRGICV0VCV6In0gKDIwMTAtMDEtMjIgMTM6Mzk6MTUtMDgwMCkuCiAgKiA8cD4KLSAqIEFzIHdpdGggdGhlIG90aGVyIGNvbnZlcnNpb25zLCBkYXRlL3RpbWUgY29udmVyc2lvbiBoYXMgYW4gdXBwZXJjYXNlIGZvcm1hdC4gUmVwbGFjaW5nCi0gKiB7QGNvZGUgJXR9IHdpdGgge0Bjb2RlICVUfSB3aWxsIHVwcGVyY2FzZSB0aGUgZmllbGQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgZm9ybWF0dGVyJ3MKLSAqIGxvY2FsZS4KLSAqIDxwPgotICogVGhpcyB0YWJsZSBzaG93cyB0aGUgZGF0ZS90aW1lIGNvbnZlcnNpb25zOgorICogVGhpcyB0YWJsZSBzaG93cyB0aGUgZGF0ZS90aW1lIGNvbnZlcnNpb25zLCBidXQgeW91IHNob3VsZCB1c2Uge0BsaW5rIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0fQorICogaW5zdGVhZDoKICAqIDx0YWJsZSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+CiAgKiA8dHIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KICAqIDxURCBDT0xTUEFOPTQ+PEI+RGF0ZS90aW1lIGNvbnZlcnNpb25zPC9CPgpAQCAtMzQ5LDcgKzM0Niw3IEBACiAgKiA8L3RyPgogICogPHRyPgogICogPHRkIHdpZHRoPSI1JSI+e0Bjb2RlIHRjfTwvdGQ+Ci0gKiA8dGQgd2lkdGg9IjI1JSI+TG9jYWxlLXByZWZlcnJlZCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGF0aW9uLiAoU2VlIHtAbGluayBqYXZhLnRleHQuRGF0ZUZvcm1hdH0gZm9yIG1vcmUgdmFyaWF0aW9ucy4pPC90ZD4KKyAqIDx0ZCB3aWR0aD0iMjUlIj5DIGxpYnJhcnkgPGk+YXNjdGltZSgzKTwvaT4tbGlrZSBvdXRwdXQuIERvIG5vdCB1c2UuPC90ZD4KICAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgZm9ybWF0KCIldGMiLCBjYWwpO308L3RkPgogICogPHRkIHdpZHRoPSIzMCUiPntAY29kZSBUdWUgQXByIDAxIDE2OjE5OjE3IENFU1QgMjAwOH08L3RkPgogICogPC90cj4KQEAgLTUxMCw2ICs1MDcsMTAgQEAKICAqIDx0ZCB3aWR0aD0iMzAlIj57QGNvZGUgQ0VTVH08L3RkPgogICogPC90cj4KICAqIDwvdGFibGU+CisgKiA8cD4KKyAqIEFzIHdpdGggdGhlIG90aGVyIGNvbnZlcnNpb25zLCBkYXRlL3RpbWUgY29udmVyc2lvbiBoYXMgYW4gdXBwZXJjYXNlIGZvcm1hdC4gUmVwbGFjaW5nCisgKiB7QGNvZGUgJXR9IHdpdGgge0Bjb2RlICVUfSB3aWxsIHVwcGVyY2FzZSB0aGUgZmllbGQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgZm9ybWF0dGVyJ3MKKyAqIGxvY2FsZS4KICAqIDxwPjxpPk51bWJlciBsb2NhbGl6YXRpb248L2k+LiBTb21lIGNvbnZlcnNpb25zIHVzZSBsb2NhbGl6ZWQgZGVjaW1hbCBkaWdpdHMgcmF0aGVyIHRoYW4gdGhlCiAgKiB1c3VhbCBBU0NJSSBkaWdpdHMuIFNvIGZvcm1hdHRpbmcge0Bjb2RlIDEyM30gd2l0aCB7QGNvZGUgJWR9IHdpbGwgZ2l2ZSAxMjMgaW4gRW5nbGlzaCBsb2NhbGVzCiAgKiBidXQgJiN4MDY2MTsmI3gwNjYyOyYjeDA2NjM7IGluIGFwcHJvcHJpYXRlIEFyYWJpYyBsb2NhbGVzLCBmb3IgZXhhbXBsZS4gVGhpcyBudW1iZXIgbG9jYWxpemF0aW9uCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0hhc2hNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCmluZGV4IDFiMjQzOGIuLjgwZmJkMGMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaE1hcC5qYXZhCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChjYXBhY2l0eSA+IE1BWElNVU1fQ0FQQUNJVFkpIHsKICAgICAgICAgICAgIGNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhcGFjaXR5ID0gcm91bmRVcFRvUG93ZXJPZlR3byhjYXBhY2l0eSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IENvbGxlY3Rpb25zLnJvdW5kVXBUb1Bvd2VyT2ZUd28oY2FwYWNpdHkpOwogICAgICAgICB9CiAgICAgICAgIG1ha2VUYWJsZShjYXBhY2l0eSk7CiAgICAgfQpAQCAtMjAyLDYgKzIwMiw5IEBACiAgICAgICogcmVhZE9iamVjdCkuIEFsc28gdXNlZCBieSBMaW5rZWRIYXNoTWFwLgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgY29uc3RydWN0b3JQdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CisgICAgICAgIGlmICh0YWJsZSA9PSBFTVBUWV9UQUJMRSkgeworICAgICAgICAgICAgZG91YmxlQ2FwYWNpdHkoKTsgLy8gRG9uJ3QgZG8gdW5jaGVja2VkIHB1dHMgdG8gYSBzaGFyZWQgdGFibGUuCisgICAgICAgIH0KICAgICAgICAgZm9yIChFbnRyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGUgOiBtYXAuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgY29uc3RydWN0b3JQdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfQpAQCAtMjk0LDcgKzI5Nyw4IEBACiAgICAgICAgICAgICByZXR1cm4gZSA9PSBudWxsID8gbnVsbCA6IGUudmFsdWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBEb3VnIExlYSdzIHN1cHBsZW1lbnRhbCBzZWNvbmRhcnlIYXNoIGZ1bmN0aW9uIChpbmxpbmVkKQorICAgICAgICAvLyBEb3VnIExlYSdzIHN1cHBsZW1lbnRhbCBzZWNvbmRhcnlIYXNoIGZ1bmN0aW9uIChpbmxpbmVkKS4KKyAgICAgICAgLy8gUmVwbGFjZSB3aXRoIENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2ggd2hlbiB0aGUgVk0gaXMgZmFzdCBlbm91Z2ggKGh0dHA6Ly9iLzgyOTA1OTApLgogICAgICAgICBpbnQgaGFzaCA9IGtleS5oYXNoQ29kZSgpOwogICAgICAgICBoYXNoIF49IChoYXNoID4+PiAyMCkgXiAoaGFzaCA+Pj4gMTIpOwogICAgICAgICBoYXNoIF49IChoYXNoID4+PiA3KSBeIChoYXNoID4+PiA0KTsKQEAgLTMyMyw3ICszMjcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGVudHJ5Rm9yTnVsbEtleSAhPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gRG91ZyBMZWEncyBzdXBwbGVtZW50YWwgc2Vjb25kYXJ5SGFzaCBmdW5jdGlvbiAoaW5saW5lZCkKKyAgICAgICAgLy8gRG91ZyBMZWEncyBzdXBwbGVtZW50YWwgc2Vjb25kYXJ5SGFzaCBmdW5jdGlvbiAoaW5saW5lZCkuCisgICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBDb2xsZWN0aW9ucy5zZWNvbmRhcnlIYXNoIHdoZW4gdGhlIFZNIGlzIGZhc3QgZW5vdWdoIChodHRwOi8vYi84MjkwNTkwKS4KICAgICAgICAgaW50IGhhc2ggPSBrZXkuaGFzaENvZGUoKTsKICAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gMjApIF4gKGhhc2ggPj4+IDEyKTsKICAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gNykgXiAoaGFzaCA+Pj4gNCk7CkBAIC0zMzksNiArMzQ0LDE1IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBEb3VnIExlYSdzIHN1cHBsZW1lbnRhbCBzZWNvbmRhcnlIYXNoIGZ1bmN0aW9uIChub24taW5saW5lZCkuCisgICAgLy8gUmVwbGFjZSB3aXRoIENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2ggd2hlbiB0aGUgVk0gaXMgZmFzdCBlbm91Z2ggKGh0dHA6Ly9iLzgyOTA1OTApLgorICAgIHN0YXRpYyBpbnQgc2Vjb25kYXJ5SGFzaChPYmplY3Qga2V5KSB7CisgICAgICAgIGludCBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgIGhhc2ggXj0gKGhhc2ggPj4+IDIwKSBeIChoYXNoID4+PiAxMik7CisgICAgICAgIGhhc2ggXj0gKGhhc2ggPj4+IDcpIF4gKGhhc2ggPj4+IDQpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgKgpAQCAtMzg3LDcgKzQwMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gcHV0VmFsdWVGb3JOdWxsS2V5KHZhbHVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNoTWFwRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7CiAgICAgICAgIGZvciAoSGFzaE1hcEVudHJ5PEssIFY+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKQEAgLTQ1MCw3ICs0NjQsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGhhc2ggPSBzZWNvbmRhcnlIYXNoKGtleS5oYXNoQ29kZSgpKTsKKyAgICAgICAgaW50IGhhc2ggPSBzZWNvbmRhcnlIYXNoKGtleSk7CiAgICAgICAgIEhhc2hNYXBFbnRyeTxLLCBWPltdIHRhYiA9IHRhYmxlOwogICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGggLSAxKTsKICAgICAgICAgSGFzaE1hcEVudHJ5PEssIFY+IGZpcnN0ID0gdGFiW2luZGV4XTsKQEAgLTUxOSw3ICs1MzMsNyBAQAogICAgICAqICA8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBieSBwdXRBbGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBudW1NYXBwaW5ncykgewotICAgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSByb3VuZFVwVG9Qb3dlck9mVHdvKGNhcGFjaXR5Rm9ySW5pdFNpemUobnVtTWFwcGluZ3MpKTsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5ID0gQ29sbGVjdGlvbnMucm91bmRVcFRvUG93ZXJPZlR3byhjYXBhY2l0eUZvckluaXRTaXplKG51bU1hcHBpbmdzKSk7CiAgICAgICAgIEhhc2hNYXBFbnRyeTxLLCBWPltdIG9sZFRhYmxlID0gdGFibGU7CiAgICAgICAgIGludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKICAgICAgICAgaWYgKG5ld0NhcGFjaXR5IDw9IG9sZENhcGFjaXR5KSB7CkBAIC02MTgsNyArNjMyLDcgQEAKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlTnVsbEtleSgpOwogICAgICAgICB9Ci0gICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNoTWFwRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7CiAgICAgICAgIGZvciAoSGFzaE1hcEVudHJ5PEssIFY+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsKQEAgLTgzOCw3ICs4NTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGUgIT0gbnVsbCAmJiBPYmplY3RzLmVxdWFsKHZhbHVlLCBlLnZhbHVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNoTWFwRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7CiAgICAgICAgIGZvciAoSGFzaE1hcEVudHJ5PEssIFY+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKQEAgLTg2Niw3ICs4ODAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgaGFzaCA9IHNlY29uZGFyeUhhc2goa2V5Lmhhc2hDb2RlKCkpOworICAgICAgICBpbnQgaGFzaCA9IHNlY29uZGFyeUhhc2goa2V5KTsKICAgICAgICAgSGFzaE1hcEVudHJ5PEssIFY+W10gdGFiID0gdGFibGU7CiAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aCAtIDEpOwogICAgICAgICBmb3IgKEhhc2hNYXBFbnRyeTxLLCBWPiBlID0gdGFiW2luZGV4XSwgcHJldiA9IG51bGw7CkBAIC05NjIsMzggKzk3Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIGEgc3VwcGxlbWVudGFsIGhhc2ggZnVuY3Rpb24gdG8gYSBnaXZlbiBoYXNoQ29kZSwgd2hpY2ggZGVmZW5kcwotICAgICAqIGFnYWluc3QgcG9vciBxdWFsaXR5IGhhc2ggZnVuY3Rpb25zLiBUaGlzIGlzIGNyaXRpY2FsIGJlY2F1c2UgSGFzaE1hcAotICAgICAqIHVzZXMgcG93ZXItb2YtdHdvIGxlbmd0aCBoYXNoIHRhYmxlcywgdGhhdCBvdGhlcndpc2UgZW5jb3VudGVyIGNvbGxpc2lvbnMKLSAgICAgKiBmb3IgaGFzaENvZGVzIHRoYXQgZG8gbm90IGRpZmZlciBpbiBsb3dlciBvciB1cHBlciBiaXRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBzZWNvbmRhcnlIYXNoKGludCBoKSB7Ci0gICAgICAgIC8vIERvdWcgTGVhJ3Mgc3VwcGxlbWVudGFsIGhhc2ggZnVuY3Rpb24KLSAgICAgICAgaCBePSAoaCA+Pj4gMjApIF4gKGggPj4+IDEyKTsKLSAgICAgICAgcmV0dXJuIGggXiAoaCA+Pj4gNykgXiAoaCA+Pj4gNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvID49IGl0cyBhcmd1bWVudCwgd2l0aCBzZXZlcmFsIGNhdmVhdHM6Ci0gICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIGJ1dCBub3QgSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QgcmV0dXJucwotICAgICAqIHplcm8uIElmIHRoZSBhcmd1bWVudCBpcyA+IDJeMzAgb3IgZXF1YWwgdG8gSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QKLSAgICAgKiByZXR1cm5zIEludGVnZXIuTUlOX1ZBTFVFLiBJZiB0aGUgYXJndW1lbnQgaXMgemVybywgdGhlIG1ldGhvZCByZXR1cm5zCi0gICAgICogemVyby4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcm91bmRVcFRvUG93ZXJPZlR3byhpbnQgaSkgewotICAgICAgICBpLS07IC8vIElmIGlucHV0IGlzIGEgcG93ZXIgb2YgdHdvLCBzaGlmdCBpdHMgaGlnaC1vcmRlciBiaXQgcmlnaHQKLQotICAgICAgICAvLyAiU21lYXIiIHRoZSBoaWdoLW9yZGVyIGJpdCBhbGwgdGhlIHdheSB0byB0aGUgcmlnaHQKLSAgICAgICAgaSB8PSBpID4+PiAgMTsKLSAgICAgICAgaSB8PSBpID4+PiAgMjsKLSAgICAgICAgaSB8PSBpID4+PiAgNDsKLSAgICAgICAgaSB8PSBpID4+PiAgODsKLSAgICAgICAgaSB8PSBpID4+PiAxNjsKLQotICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYyNDk4ODIwNzYzMTgxMjY1TDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHsKQEAgLTEwMjYsNyArMTAwOCw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoY2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKSB7CiAgICAgICAgICAgICBjYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYXBhY2l0eSA9IHJvdW5kVXBUb1Bvd2VyT2ZUd28oY2FwYWNpdHkpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBDb2xsZWN0aW9ucy5yb3VuZFVwVG9Qb3dlck9mVHdvKGNhcGFjaXR5KTsKICAgICAgICAgfQogICAgICAgICBtYWtlVGFibGUoY2FwYWNpdHkpOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0hhc2h0YWJsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9IYXNodGFibGUuamF2YQppbmRleCBhNGUyNGJjLi5iYWM1Njg5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0hhc2h0YWJsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSGFzaHRhYmxlLmphdmEKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewogICAgICAgICAgICAgY2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FwYWNpdHkgPSByb3VuZFVwVG9Qb3dlck9mVHdvKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0gQ29sbGVjdGlvbnMucm91bmRVcFRvUG93ZXJPZlR3byhjYXBhY2l0eSk7CiAgICAgICAgIH0KICAgICAgICAgbWFrZVRhYmxlKGNhcGFjaXR5KTsKICAgICB9CkBAIC0xNzgsNiArMTc4LDkgQEAKICAgICAgKiByZWFkT2JqZWN0KS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29uc3RydWN0b3JQdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CisgICAgICAgIGlmICh0YWJsZSA9PSBFTVBUWV9UQUJMRSkgeworICAgICAgICAgICAgZG91YmxlQ2FwYWNpdHkoKTsgLy8gRG9uJ3QgZG8gdW5jaGVja2VkIHB1dHMgdG8gYSBzaGFyZWQgdGFibGUuCisgICAgICAgIH0KICAgICAgICAgZm9yIChFbnRyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGUgOiBtYXAuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgY29uc3RydWN0b3JQdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfQpAQCAtMjU5LDExICsyNjIsNyBAQAogICAgICAqIEBzZWUgI3B1dAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgViBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBEb3VnIExlYSdzIHN1cHBsZW1lbnRhbCBzZWNvbmRhcnlIYXNoIGZ1bmN0aW9uIChpbmxpbmVkKQotICAgICAgICBpbnQgaGFzaCA9IGtleS5oYXNoQ29kZSgpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiAyMCkgXiAoaGFzaCA+Pj4gMTIpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiA3KSBeIChoYXNoID4+PiA0KTsKLQorICAgICAgICBpbnQgaGFzaCA9IENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KTsKICAgICAgICAgSGFzaHRhYmxlRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgZm9yIChIYXNodGFibGVFbnRyeTxLLCBWPiBlID0gdGFiW2hhc2ggJiAodGFiLmxlbmd0aCAtIDEpXTsKICAgICAgICAgICAgICAgICBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKQEAgLTI4NywxMSArMjg2LDcgQEAKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gRG91ZyBMZWEncyBzdXBwbGVtZW50YWwgc2Vjb25kYXJ5SGFzaCBmdW5jdGlvbiAoaW5saW5lZCkKLSAgICAgICAgaW50IGhhc2ggPSBrZXkuaGFzaENvZGUoKTsKLSAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gMjApIF4gKGhhc2ggPj4+IDEyKTsKLSAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gNykgXiAoaGFzaCA+Pj4gNCk7Ci0KKyAgICAgICAgaW50IGhhc2ggPSBDb2xsZWN0aW9ucy5zZWNvbmRhcnlIYXNoKGtleSk7CiAgICAgICAgIEhhc2h0YWJsZUVudHJ5PEssIFY+W10gdGFiID0gdGFibGU7CiAgICAgICAgIGZvciAoSGFzaHRhYmxlRW50cnk8SywgVj4gZSA9IHRhYltoYXNoICYgKHRhYi5sZW5ndGggLSAxKV07CiAgICAgICAgICAgICAgICAgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CkBAIC0zNjYsNyArMzYxLDcgQEAKICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlID09IG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpbnQgaGFzaCA9IHNlY29uZGFyeUhhc2goa2V5Lmhhc2hDb2RlKCkpOworICAgICAgICBpbnQgaGFzaCA9IENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KTsKICAgICAgICAgSGFzaHRhYmxlRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7CiAgICAgICAgIEhhc2h0YWJsZUVudHJ5PEssIFY+IGZpcnN0ID0gdGFiW2luZGV4XTsKQEAgLTQwMiw3ICszOTcsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgPT0gbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBoYXNoID0gQ29sbGVjdGlvbnMuc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNodGFibGVFbnRyeTxLLCBWPltdIHRhYiA9IHRhYmxlOwogICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGggLSAxKTsKICAgICAgICAgSGFzaHRhYmxlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJbaW5kZXhdOwpAQCAtNDQyLDcgKzQzNyw3IEBACiAgICAgICogIDxwPlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGJ5IHB1dEFsbC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG51bU1hcHBpbmdzKSB7Ci0gICAgICAgIGludCBuZXdDYXBhY2l0eSA9IHJvdW5kVXBUb1Bvd2VyT2ZUd28oY2FwYWNpdHlGb3JJbml0U2l6ZShudW1NYXBwaW5ncykpOworICAgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBDb2xsZWN0aW9ucy5yb3VuZFVwVG9Qb3dlck9mVHdvKGNhcGFjaXR5Rm9ySW5pdFNpemUobnVtTWFwcGluZ3MpKTsKICAgICAgICAgSGFzaHRhYmxlRW50cnk8SywgVj5bXSBvbGRUYWJsZSA9IHRhYmxlOwogICAgICAgICBpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7CiAgICAgICAgIGlmIChuZXdDYXBhY2l0eSA8PSBvbGRDYXBhY2l0eSkgewpAQCAtNTU1LDcgKzU1MCw3IEBACiAgICAgICogQHNlZSAjcHV0CiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBWIHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBoYXNoID0gQ29sbGVjdGlvbnMuc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNodGFibGVFbnRyeTxLLCBWPltdIHRhYiA9IHRhYmxlOwogICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGggLSAxKTsKICAgICAgICAgZm9yIChIYXNodGFibGVFbnRyeTxLLCBWPiBlID0gdGFiW2luZGV4XSwgcHJldiA9IG51bGw7CkBAIC03OTksNyArNzk0LDcgQEAKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBtYXBwaW5nLgogICAgICAqLwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNNYXBwaW5nKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnQgaGFzaCA9IHNlY29uZGFyeUhhc2goa2V5Lmhhc2hDb2RlKCkpOworICAgICAgICBpbnQgaGFzaCA9IENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KTsKICAgICAgICAgSGFzaHRhYmxlRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7CiAgICAgICAgIGZvciAoSGFzaHRhYmxlRW50cnk8SywgVj4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewpAQCAtODE1LDcgKzgxMCw3IEBACiAgICAgICogZXhpc3RzOyBvdGhlcndpc2UsIHJldHVybnMgZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIGZhbHNlLgogICAgICAqLwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlTWFwcGluZyhPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW50IGhhc2ggPSBzZWNvbmRhcnlIYXNoKGtleS5oYXNoQ29kZSgpKTsKKyAgICAgICAgaW50IGhhc2ggPSBDb2xsZWN0aW9ucy5zZWNvbmRhcnlIYXNoKGtleSk7CiAgICAgICAgIEhhc2h0YWJsZUVudHJ5PEssIFY+W10gdGFiID0gdGFibGU7CiAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aCAtIDEpOwogICAgICAgICBmb3IgKEhhc2h0YWJsZUVudHJ5PEssIFY+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsKQEAgLTEwNjIsMzggKzEwNTcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQXBwbGllcyBhIHN1cHBsZW1lbnRhbCBoYXNoIGZ1bmN0aW9uIHRvIGEgZ2l2ZW4gaGFzaENvZGUsIHdoaWNoIGRlZmVuZHMKLSAgICAgKiBhZ2FpbnN0IHBvb3IgcXVhbGl0eSBoYXNoIGZ1bmN0aW9ucy4gVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIEhhc2h0YWJsZQotICAgICAqIHVzZXMgcG93ZXItb2YtdHdvIGxlbmd0aCBoYXNoIHRhYmxlcywgdGhhdCBvdGhlcndpc2UgZW5jb3VudGVyIGNvbGxpc2lvbnMKLSAgICAgKiBmb3IgaGFzaENvZGVzIHRoYXQgZG8gbm90IGRpZmZlciBpbiBsb3dlciBvciB1cHBlciBiaXRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBzZWNvbmRhcnlIYXNoKGludCBoKSB7Ci0gICAgICAgIC8vIERvdWcgTGVhJ3Mgc3VwcGxlbWVudGFsIGhhc2ggZnVuY3Rpb24KLSAgICAgICAgaCBePSAoaCA+Pj4gMjApIF4gKGggPj4+IDEyKTsKLSAgICAgICAgcmV0dXJuIGggXiAoaCA+Pj4gNykgXiAoaCA+Pj4gNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvID49IGl0cyBhcmd1bWVudCwgd2l0aCBzZXZlcmFsIGNhdmVhdHM6Ci0gICAgICogSWYgdGhlIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIGJ1dCBub3QgSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QgcmV0dXJucwotICAgICAqIHplcm8uIElmIHRoZSBhcmd1bWVudCBpcyA+IDJeMzAgb3IgZXF1YWwgdG8gSW50ZWdlci5NSU5fVkFMVUUsIHRoZSBtZXRob2QKLSAgICAgKiByZXR1cm5zIEludGVnZXIuTUlOX1ZBTFVFLiBJZiB0aGUgYXJndW1lbnQgaXMgemVybywgdGhlIG1ldGhvZCByZXR1cm5zCi0gICAgICogemVyby4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcm91bmRVcFRvUG93ZXJPZlR3byhpbnQgaSkgewotICAgICAgICBpLS07IC8vIElmIGlucHV0IGlzIGEgcG93ZXIgb2YgdHdvLCBzaGlmdCBpdHMgaGlnaC1vcmRlciBiaXQgcmlnaHQKLQotICAgICAgICAvLyAiU21lYXIiIHRoZSBoaWdoLW9yZGVyIGJpdCBhbGwgdGhlIHdheSB0byB0aGUgcmlnaHQKLSAgICAgICAgaSB8PSBpID4+PiAgMTsKLSAgICAgICAgaSB8PSBpID4+PiAgMjsKLSAgICAgICAgaSB8PSBpID4+PiAgNDsKLSAgICAgICAgaSB8PSBpID4+PiAgODsKLSAgICAgICAgaSB8PSBpID4+PiAxNjsKLQotICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQyMTc0Njc1OTUxMjI4NjM5Mkw7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7CkBAIC0xMTI5LDcgKzEwOTIsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewogICAgICAgICAgICAgY2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FwYWNpdHkgPSByb3VuZFVwVG9Qb3dlck9mVHdvKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0gQ29sbGVjdGlvbnMucm91bmRVcFRvUG93ZXJPZlR3byhjYXBhY2l0eSk7CiAgICAgICAgIH0KICAgICAgICAgbWFrZVRhYmxlKGNhcGFjaXR5KTsKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwLmphdmEKaW5kZXggZTY5M2Y3ZC4uZWRhMmQ3YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcC5qYXZhCkBAIC0yNjEsMTMgKzI2MSwxMiBAQAogICAgICAqICAgICAgICAgICAgdGhpcyBtYXAuCiAgICAgICovCiAgICAgcHVibGljIElkZW50aXR5SGFzaE1hcChpbnQgbWF4U2l6ZSkgewotICAgICAgICBpZiAobWF4U2l6ZSA+PSAwKSB7Ci0gICAgICAgICAgICB0aGlzLnNpemUgPSAwOwotICAgICAgICAgICAgdGhyZXNob2xkID0gZ2V0VGhyZXNob2xkKG1heFNpemUpOwotICAgICAgICAgICAgZWxlbWVudERhdGEgPSBuZXdFbGVtZW50QXJyYXkoY29tcHV0ZUVsZW1lbnRBcnJheVNpemUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChtYXhTaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWF4U2l6ZSA8IDA6ICIgKyBtYXhTaXplKTsKICAgICAgICAgfQorICAgICAgICBzaXplID0gMDsKKyAgICAgICAgdGhyZXNob2xkID0gZ2V0VGhyZXNob2xkKG1heFNpemUpOworICAgICAgICBlbGVtZW50RGF0YSA9IG5ld0VsZW1lbnRBcnJheShjb21wdXRlRWxlbWVudEFycmF5U2l6ZSgpKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRUaHJlc2hvbGQoaW50IG1heFNpemUpIHsKQEAgLTQ0Miw3ICs0NDEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE1vZHVsb0hhc2goT2JqZWN0IGtleSwgaW50IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gKChTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShrZXkpICYgMHg3RkZGRkZGRikgJSAobGVuZ3RoIC8gMikpICogMjsKKyAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbnMuc2Vjb25kYXJ5SWRlbnRpdHlIYXNoKGtleSkgJiAweDdGRkZGRkZGKSAlIChsZW5ndGggLyAyKSkgKiAyOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaW5rZWRIYXNoTWFwLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpbmtlZEhhc2hNYXAuamF2YQppbmRleCBkOGZjMDJkLi5lNjFiMGY5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpbmtlZEhhc2hNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpbmtlZEhhc2hNYXAuamF2YQpAQCAtMjQ3LDExICsyNDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBEb3VnIExlYSdzIHN1cHBsZW1lbnRhbCBzZWNvbmRhcnlIYXNoIGZ1bmN0aW9uIChpbmxpbmVkKQotICAgICAgICBpbnQgaGFzaCA9IGtleS5oYXNoQ29kZSgpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiAyMCkgXiAoaGFzaCA+Pj4gMTIpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiA3KSBeIChoYXNoID4+PiA0KTsKLQorICAgICAgICAvLyBSZXBsYWNlIHdpdGggQ29sbGVjdGlvbnMuc2Vjb25kYXJ5SGFzaCB3aGVuIHRoZSBWTSBpcyBmYXN0IGVub3VnaCAoaHR0cDovL2IvODI5MDU5MCkuCisgICAgICAgIGludCBoYXNoID0gc2Vjb25kYXJ5SGFzaChrZXkpOwogICAgICAgICBIYXNoTWFwRW50cnk8SywgVj5bXSB0YWIgPSB0YWJsZTsKICAgICAgICAgZm9yIChIYXNoTWFwRW50cnk8SywgVj4gZSA9IHRhYltoYXNoICYgKHRhYi5sZW5ndGggLSAxKV07CiAgICAgICAgICAgICAgICAgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3RSZXNvdXJjZUJ1bmRsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9MaXN0UmVzb3VyY2VCdW5kbGUuamF2YQppbmRleCBmYzZhYjk3Li43ODA5YjlhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xpc3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTGlzdFJlc291cmNlQnVuZGxlLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAgICAgdGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oY29udGVudHMubGVuZ3RoIC8gMyAqIDQgKyAzKTsKICAgICAgICAgICAgIGZvciAoT2JqZWN0W10gY29udGVudCA6IGNvbnRlbnRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT0gbnVsbCB8fCBjb250ZW50WzFdID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBlbnRyeSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0YWJsZS5wdXQoKFN0cmluZykgY29udGVudFswXSwgY29udGVudFsxXSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xvY2FsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9Mb2NhbGUuamF2YQppbmRleCAwZmJlMmY1Li5kNTEzYmQ3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL0xvY2FsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvTG9jYWxlLmphdmEKQEAgLTY2LDExICs2NiwxMiBAQAogICogPHA+SGVyZSBhcmUgdGhlIHZlcnNpb25zIG9mIElDVSAoYW5kIHRoZSBjb3JyZXNwb25kaW5nIENMRFIgYW5kIFVuaWNvZGUgdmVyc2lvbnMpIHVzZWQgaW4KICAqIHZhcmlvdXMgQW5kcm9pZCByZWxlYXNlczoKICAqIDx0YWJsZSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci0gKiA8dHI+PHRkPmN1cGNha2UvZG9udXQvZWNsYWlyPC90ZD4gPHRkPklDVSAzLjg8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS01Ij5DTERSIDEuNTwvYT48L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4wLjAvIj5Vbmljb2RlIDUuMDwvYT48L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPmZyb3lvPC90ZD4gICAgICAgICAgICAgICAgPHRkPklDVSA0LjI8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS03Ij5DTERSIDEuNzwvYT48L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4xLjAvIj5Vbmljb2RlIDUuMTwvYT48L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPmdpbmdlcmJyZWFkL2hvbmV5Y29tYjwvdGQ+PHRkPklDVSA0LjQ8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS04Ij5DTERSIDEuODwvYT48L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4yLjAvIj5Vbmljb2RlIDUuMjwvYT48L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPmljZSBjcmVhbSBzYW5kd2ljaDwvdGQ+ICAgPHRkPklDVSA0LjY8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS05Ij5DTERSIDEuOTwvYT48L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNi4wLjAvIj5Vbmljb2RlIDYuMDwvYT48L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPmplbGx5IGJlYW48L3RkPiAgICAgICAgICAgPHRkPklDVSA0Ljg8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMi0wIj5DTERSIDIuMDwvYT48L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNi4wLjAvIj5Vbmljb2RlIDYuMDwvYT48L3RkPjwvdHI+CisgKiA8dHI+PHRkPmN1cGNha2UvZG9udXQvZWNsYWlyPC90ZD4gPHRkPklDVSAzLjg8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS01Ij5DTERSIDEuNTwvYT48L3RkPiAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTUuMC4wLyI+VW5pY29kZSA1LjA8L2E+PC90ZD48L3RyPgorICogPHRyPjx0ZD5mcm95bzwvdGQ+ICAgICAgICAgICAgICAgIDx0ZD5JQ1UgNC4yPC90ZD4gPHRkPjxhIGhyZWY9Imh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL2luZGV4L2Rvd25sb2Fkcy9jbGRyLTEtNyI+Q0xEUiAxLjc8L2E+PC90ZD4gIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGU1LjEuMC8iPlVuaWNvZGUgNS4xPC9hPjwvdGQ+PC90cj4KKyAqIDx0cj48dGQ+Z2luZ2VyYnJlYWQvaG9uZXljb21iPC90ZD48dGQ+SUNVIDQuNDwvdGQ+IDx0ZD48YSBocmVmPSJodHRwOi8vY2xkci51bmljb2RlLm9yZy9pbmRleC9kb3dubG9hZHMvY2xkci0xLTgiPkNMRFIgMS44PC9hPjwvdGQ+ICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4yLjAvIj5Vbmljb2RlIDUuMjwvYT48L3RkPjwvdHI+CisgKiA8dHI+PHRkPmljZSBjcmVhbSBzYW5kd2ljaDwvdGQ+ICAgPHRkPklDVSA0LjY8L3RkPiA8dGQ+PGEgaHJlZj0iaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvZG93bmxvYWRzL2NsZHItMS05Ij5DTERSIDEuOTwvYT48L3RkPiAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTYuMC4wLyI+VW5pY29kZSA2LjA8L2E+PC90ZD48L3RyPgorICogPHRyPjx0ZD5qZWxseSBiZWFuPC90ZD4gICAgICAgICAgIDx0ZD5JQ1UgNC44PC90ZD4gPHRkPjxhIGhyZWY9Imh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL2luZGV4L2Rvd25sb2Fkcy9jbGRyLTItMCI+Q0xEUiAyLjA8L2E+PC90ZD4gIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGU2LjAuMC8iPlVuaWNvZGUgNi4wPC9hPjwvdGQ+PC90cj4KKyAqIDx0cj48dGQ+bGF0ZXI8L3RkPiAgICAgICAgICAgICAgICA8dGQ+SUNVIDQ5PC90ZD4gIDx0ZD48YSBocmVmPSJodHRwOi8vY2xkci51bmljb2RlLm9yZy9pbmRleC9kb3dubG9hZHMvY2xkci0yMSI+Q0xEUiAyMS4wPC9hPjwvdGQ+IDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGU2LjEuMC8iPlVuaWNvZGUgNi4xPC9hPjwvdGQ+PC90cj4KICAqIDwvdGFibGU+CiAgKgogICogPGEgbmFtZT0iZGVmYXVsdF9sb2NhbGUiPjxoMz5CZSB3YXJ5IG9mIHRoZSBkZWZhdWx0IGxvY2FsZTwvaDM+PC9hPgpAQCAtMjcwLDcgKzI3MSw5IEBACiAgICAgICovCiAgICAgcHVibGljIExvY2FsZShTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgdmFyaWFudCkgewogICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBjb3VudHJ5ID09IG51bGwgfHwgdmFyaWFudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibGFuZ3VhZ2U9IiArIGxhbmd1YWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNvdW50cnk9IiArIGNvdW50cnkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsdmFyaWFudD0iICsgdmFyaWFudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxhbmd1YWdlLmlzRW1wdHkoKSAmJiBjb3VudHJ5LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbGFuZ3VhZ2VDb2RlID0gIiI7CkBAIC0zOTcsMTkgKzQwMCwxNyBAQAogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gTGFzdC1taW51dGUgd29ya2Fyb3VuZCBmb3IgaHR0cDovL2IvNzI5MTM1NSBpbiBqYi1tcjEuCi0gICAgICAgIC8vIFRoaXMgaXNuJ3QgcmlnaHQgZm9yIGFsbCBsYW5ndWFnZXMsIGJ1dCBpdCdzIHJpZ2h0IGZvciBlbiBhbmQgdGwuCi0gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIG1vcmUgQ0xEUiBkYXRhIGluIGEgZnV0dXJlIHJlbGVhc2UsIGJ1dCB3ZSdsbCBzdGlsbAotICAgICAgICAvLyBwcm9iYWJseSB3YW50IHRvIGhhdmUgZnJhbWV3b3Jrcy9iYXNlIHRyYW5zbGF0ZSB0aGUgb2Jzb2xldGUgdGwgYW5kCi0gICAgICAgIC8vIHRsLXJQSCBsb2NhbGVzIHRvIGZpbCBhbmQgZmlsLXJQSCBhdCBydW50aW1lLCBhdCB3aGljaCBwb2ludAotICAgICAgICAvLyBsaWJjb3JlIGFuZCBpY3U0YyB3aWxsIGp1c3QgZG8gdGhlIHJpZ2h0IHRoaW5nLgorICAgICAgICAvLyBodHRwOi8vYi84MDQ5NTA3IC0tLSBmcmFtZXdvcmtzL2Jhc2Ugc2hvdWxkIHVzZSBmaWxfUEggaW5zdGVhZCBvZiB0bF9QSC4KKyAgICAgICAgLy8gVW50aWwgdGhlbiwgd2UncmUgc3R1Y2sgY292ZXJpbmcgdGhlaXIgdHJhY2tzLCBtYWtpbmcgaXQgbG9vayBsaWtlIHRoZXkncmUKKyAgICAgICAgLy8gdXNpbmcgImZpbCIgd2hlbiB0aGV5J3JlIG5vdC4KKyAgICAgICAgU3RyaW5nIGxvY2FsZVN0cmluZyA9IHRvU3RyaW5nKCk7CiAgICAgICAgIGlmIChsYW5ndWFnZUNvZGUuZXF1YWxzKCJ0bCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkZpbGlwaW5vIjsKKyAgICAgICAgICAgIGxvY2FsZVN0cmluZyA9IHRvTmV3U3RyaW5nKCJmaWwiLCBjb3VudHJ5Q29kZSwgdmFyaWFudENvZGUpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IElDVS5nZXREaXNwbGF5TGFuZ3VhZ2VOYXRpdmUodG9TdHJpbmcoKSwgbG9jYWxlLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gSUNVLmdldERpc3BsYXlMYW5ndWFnZU5hdGl2ZShsb2NhbGVTdHJpbmcsIGxvY2FsZS50b1N0cmluZygpKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7IC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gZG8gdGhpcywgb3IgZG9lcyBJQ1UgZG8gaXQgZm9yIHVzPwotICAgICAgICAgICAgcmVzdWx0ID0gSUNVLmdldERpc3BsYXlMYW5ndWFnZU5hdGl2ZSh0b1N0cmluZygpLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmVzdWx0ID0gSUNVLmdldERpc3BsYXlMYW5ndWFnZU5hdGl2ZShsb2NhbGVTdHJpbmcsIExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01NjMsNyArNTY0LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJsb2NhbGUgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgfQpAQCAtNTgyLDEwICs1ODMsMTMgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVkVG9TdHJpbmdSZXN1bHQ7Ci0gICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gKGNhY2hlZFRvU3RyaW5nUmVzdWx0ID0gdG9OZXdTdHJpbmcoKSkgOiByZXN1bHQ7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gY2FjaGVkVG9TdHJpbmdSZXN1bHQgPSB0b05ld1N0cmluZyhsYW5ndWFnZUNvZGUsIGNvdW50cnlDb2RlLCB2YXJpYW50Q29kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyB0b05ld1N0cmluZygpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9OZXdTdHJpbmcoU3RyaW5nIGxhbmd1YWdlQ29kZSwgU3RyaW5nIGNvdW50cnlDb2RlLCBTdHJpbmcgdmFyaWFudENvZGUpIHsKICAgICAgICAgLy8gVGhlIHN0cmluZyBmb3JtIG9mIGEgbG9jYWxlIHRoYXQgb25seSBoYXMgYSB2YXJpYW50IGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICAgICAgIGlmIChsYW5ndWFnZUNvZGUubGVuZ3RoKCkgPT0gMCAmJiBjb3VudHJ5Q29kZS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1ByaW9yaXR5UXVldWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCmluZGV4IGUwOWViMDUuLmNjOWJmZTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZS5qYXZhCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIFByaW9yaXR5UXVldWUoaW50IGluaXRpYWxDYXBhY2l0eSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKICAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluaXRpYWxDYXBhY2l0eSA8IDE6ICIgKyBpbml0aWFsQ2FwYWNpdHkpOwogICAgICAgICB9CiAgICAgICAgIGVsZW1lbnRzID0gbmV3RWxlbWVudEFycmF5KGluaXRpYWxDYXBhY2l0eSk7CiAgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9SYW5kb20uamF2YQppbmRleCBiMGE5MmZmLi40YTY3MjQ0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1JhbmRvbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvUmFuZG9tLmphdmEKQEAgLTE3MSwxOCArMTcxLDE4IEBACiAgICAgICogaW4gdGhlIGhhbGYtb3BlbiByYW5nZSBbMCwgbikuCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0SW50KGludCBuKSB7Ci0gICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgaWYgKChuICYgLW4pID09IG4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKChuICogKGxvbmcpIG5leHQoMzEpKSA+PiAzMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYml0cywgdmFsOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGJpdHMgPSBuZXh0KDMxKTsKLSAgICAgICAgICAgICAgICB2YWwgPSBiaXRzICUgbjsKLSAgICAgICAgICAgIH0gd2hpbGUgKGJpdHMgLSB2YWwgKyAobiAtIDEpIDwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuIDw9IDA6ICIgKyBuKTsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmICgobiAmIC1uKSA9PSBuKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKChuICogKGxvbmcpIG5leHQoMzEpKSA+PiAzMSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGJpdHMsIHZhbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYml0cyA9IG5leHQoMzEpOworICAgICAgICAgICAgdmFsID0gYml0cyAlIG47CisgICAgICAgIH0gd2hpbGUgKGJpdHMgLSB2YWwgKyAobiAtIDEpIDwgMCk7CisgICAgICAgIHJldHVybiB2YWw7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NpbXBsZVRpbWVab25lLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1NpbXBsZVRpbWVab25lLmphdmEKaW5kZXggOTNkYzg4ZS4uMDY3NTQ4MCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9TaW1wbGVUaW1lWm9uZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvU2ltcGxlVGltZVpvbmUuamF2YQpAQCAtNTQ2LDExICs1NDYsMTAgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBkYXlsaWdodCBzYXZpbmdzIG9mZnNldCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RFNUU2F2aW5ncyhpbnQgbWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgIGlmIChtaWxsaXNlY29uZHMgPiAwKSB7Ci0gICAgICAgICAgICBkc3RTYXZpbmdzID0gbWlsbGlzZWNvbmRzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAobWlsbGlzZWNvbmRzIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbGxpc2Vjb25kcyA8PSAwOiAiICsgbWlsbGlzZWNvbmRzKTsKICAgICAgICAgfQorICAgICAgICBkc3RTYXZpbmdzID0gbWlsbGlzZWNvbmRzOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja1JhbmdlKGludCBtb250aCwgaW50IGRheU9mV2VlaywgaW50IHRpbWUpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZVpvbmUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZVpvbmUuamF2YQppbmRleCA4NTAxMWJjLi44NDhlYmJiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVab25lLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lWm9uZS5qYXZhCkBAIC0yMSw3ICsyMSw3IEBACiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVzOworaW1wb3J0IGxpYmNvcmUuaWN1LlRpbWVab25lTmFtZXM7CiBpbXBvcnQgbGliY29yZS51dGlsLlpvbmVJbmZvREI7CiAKIC8qKgpAQCAtNTUsMTQgKzU1LDExIEBACiAgKgogICogPHA+Tm90ZSB0aGUgdHlwZSByZXR1cm5lZCBieSB0aGUgZmFjdG9yeSBtZXRob2RzIHtAbGluayAjZ2V0RGVmYXVsdH0gYW5kIHtAbGluayAjZ2V0VGltZVpvbmV9IGlzCiAgKiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIFRoaXMgbWF5IGludHJvZHVjZSBzZXJpYWxpemF0aW9uIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMgYmV0d2VlbgotICogZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucy4gQW5kcm9pZCByZXR1cm5zIGluc3RhbmNlcyBvZiB7QGxpbmsgU2ltcGxlVGltZVpvbmV9IHNvIHRoYXQKLSAqIHRoZSBieXRlcyBzZXJpYWxpemVkIGJ5IEFuZHJvaWQgY2FuIGJlIGRlc2VyaWFsaXplZCBzdWNjZXNzZnVsbHkgb24gb3RoZXIKLSAqIGltcGxlbWVudGF0aW9ucywgYnV0IHRoZSByZXZlcnNlIGNvbXBhdGliaWxpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQuCisgKiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zLCBvciBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQW5kcm9pZC4KICAqCiAgKiBAc2VlIENhbGVuZGFyCiAgKiBAc2VlIEdyZWdvcmlhbkNhbGVuZGFyCiAgKiBAc2VlIFNpbXBsZURhdGVGb3JtYXQKLSAqIEBzZWUgU2ltcGxlVGltZVpvbmUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVab25lIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM1ODE0NjMzNjkxNjY5MjQ5NjFMOwpAQCAtMTcxLDIxICsxNjgsMjggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKGJvb2xlYW4gZGF5bGlnaHRUaW1lLCBpbnQgc3R5bGUsIExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgaWYgKHN0eWxlICE9IFNIT1JUICYmIHN0eWxlICE9IExPTkcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBzdHlsZTogIiArIHN0eWxlKTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gdXNlRGF5bGlnaHQgPSBkYXlsaWdodFRpbWUgJiYgdXNlRGF5bGlnaHRUaW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nW11bXSB6b25lU3RyaW5ncyA9IFRpbWVab25lcy5nZXRab25lU3RyaW5ncyhsb2NhbGUpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVGltZVpvbmVzLmdldERpc3BsYXlOYW1lKHpvbmVTdHJpbmdzLCBnZXRJRCgpLCBkYXlsaWdodFRpbWUsIHN0eWxlKTsKKyAgICAgICAgU3RyaW5nW11bXSB6b25lU3RyaW5ncyA9IFRpbWVab25lTmFtZXMuZ2V0Wm9uZVN0cmluZ3MobG9jYWxlKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFRpbWVab25lTmFtZXMuZ2V0RGlzcGxheU5hbWUoem9uZVN0cmluZ3MsIGdldElEKCksIGRheWxpZ2h0VGltZSwgc3R5bGUpOwogICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUT0RPOiBkbyB3ZSBldmVyIGdldCBoZXJlPworICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgaXQncyBiZWNhdXNlIGljdTRjIGhhcyBub3RoaW5nIGZvciB1cy4gTW9zdCBjb21tb25seSwgdGhpcyBpcyBpbiB0aGUKKyAgICAgICAgLy8gY2FzZSBvZiBzaG9ydCBuYW1lcy4gRm9yIFBhY2lmaWMvRmlqaSwgZm9yIGV4YW1wbGUsIGljdTRjIGhhcyBub3RoaW5nIGJldHRlciB0byBvZmZlcgorICAgICAgICAvLyB0aGFuICJHTVQrMTI6MDAiLiBXaHkgZG8gd2UgcmUtZG8gdGhpcyB3b3JrIG91cnNlbHZlcz8gQmVjYXVzZSB3ZSBoYXZlIHVwLXRvLWRhdGUKKyAgICAgICAgLy8gdGltZSB6b25lIHRyYW5zaXRpb24gZGF0YSwgd2hpY2ggaWN1NGMgX2RvZXNuJ3RfIHVzZSAtLS0gaXQgdXNlcyBpdHMgb3duIGJha2VkLWluIGNvcHksCisgICAgICAgIC8vIHdoaWNoIG9ubHkgZ2V0cyB1cGRhdGVkIHdoZW4gd2UgdXBkYXRlIGljdTRjLiBodHRwOi8vYi83OTU1NjE0IGFuZCBodHRwOi8vYi84MDI2Nzc2LgorCisgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBnZW5lcmF0ZSB0aGVzZSBvbmNlLCBpbiBUaW1lWm9uZU5hbWVzLmdldERpc3BsYXlOYW1lPyBSZXZpc2l0IHdoZW4gd2UKKyAgICAgICAgLy8gdXBncmFkZSB0byBpY3U0YyA1MCBhbmQgcmV3cml0ZSB0aGUgdW5kZXJseWluZyBuYXRpdmUgY29kZS4gU2VlIGFsc28gdGhlCisgICAgICAgIC8vICJlbGVtZW50W2pdICE9IG51bGwiIGNoZWNrIGluIFNpbXBsZURhdGVGb3JtYXQucGFyc2VUaW1lWm9uZSwgYW5kIHRoZSBleHRyYSB3b3JrIGluCisgICAgICAgIC8vIERhdGVGb3JtYXRTeW1ib2xzLmdldFpvbmVTdHJpbmdzLgogCiAgICAgICAgIGludCBvZmZzZXQgPSBnZXRSYXdPZmZzZXQoKTsKLSAgICAgICAgaWYgKHVzZURheWxpZ2h0ICYmIHRoaXMgaW5zdGFuY2VvZiBTaW1wbGVUaW1lWm9uZSkgeworICAgICAgICBpZiAoZGF5bGlnaHRUaW1lKSB7CiAgICAgICAgICAgICBvZmZzZXQgKz0gZ2V0RFNUU2F2aW5ncygpOwogICAgICAgICB9CiAgICAgICAgIG9mZnNldCAvPSA2MDAwMDsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVGltZXIuamF2YQppbmRleCBhZmM3NDVjLi4yNWFjNDMyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RpbWVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9UaW1lci5qYXZhCkBAIC00MzMsNyArNDMzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZShUaW1lclRhc2sgdGFzaywgRGF0ZSB3aGVuKSB7CiAgICAgICAgIGlmICh3aGVuLmdldFRpbWUoKSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndoZW4gPCAwOiAiICsgd2hlbi5nZXRUaW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGxvbmcgZGVsYXkgPSB3aGVuLmdldFRpbWUoKSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBzY2hlZHVsZUltcGwodGFzaywgZGVsYXkgPCAwID8gMCA6IGRlbGF5LCAtMSwgZmFsc2UpOwpAQCAtNDU0LDcgKzQ1NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NoZWR1bGUoVGltZXJUYXNrIHRhc2ssIGxvbmcgZGVsYXkpIHsKICAgICAgICAgaWYgKGRlbGF5IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVsYXkgPCAwOiAiICsgZGVsYXkpOwogICAgICAgICB9CiAgICAgICAgIHNjaGVkdWxlSW1wbCh0YXNrLCBkZWxheSwgLTEsIGZhbHNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1RyZWVNYXAuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZU1hcC5qYXZhCmluZGV4IDllMTk5MzMuLmRiMzdiOWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZU1hcC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVHJlZU1hcC5qYXZhCkBAIC00NDEsNyArNDQxLDcgQEAKICAgICAgICAgICAgIGlmIChwYXJlbnQubGVmdCA9PSBub2RlKSB7CiAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSByZXBsYWNlbWVudDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IChwYXJlbnQucmlnaHQgPT0gbm9kZSk7CisgICAgICAgICAgICAgICAgLy8gYXNzZXJ0IChwYXJlbnQucmlnaHQgPT0gbm9kZSk7CiAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gcmVwbGFjZW1lbnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC00NzQsNyArNDc0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocmlnaHREZWx0YSA9PSAtMSB8fCAocmlnaHREZWx0YSA9PSAwICYmICFpbnNlcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQobm9kZSk7IC8vIEFWTCByaWdodCByaWdodAogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCAocmlnaHREZWx0YSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0IChyaWdodERlbHRhID09IDEpOwogICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodChyaWdodCk7IC8vIEFWTCByaWdodCBsZWZ0CiAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQobm9kZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDkyLDcgKzQ5Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGxlZnREZWx0YSA9PSAxIHx8IChsZWZ0RGVsdGEgPT0gMCAmJiAhaW5zZXJ0KSkgewogICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodChub2RlKTsgLy8gQVZMIGxlZnQgbGVmdAogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCAobGVmdERlbHRhID09IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0IChsZWZ0RGVsdGEgPT0gLTEpOwogICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGxlZnQpOyAvLyBBVkwgbGVmdCByaWdodAogICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodChub2RlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MDcsNyArNTA3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IChkZWx0YSA9PSAtMSB8fCBkZWx0YSA9PSAxKTsKKyAgICAgICAgICAgICAgICAvLyBhc3NlcnQgKGRlbHRhID09IC0xIHx8IGRlbHRhID09IDEpOwogICAgICAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gTWF0aC5tYXgobGVmdEhlaWdodCwgcmlnaHRIZWlnaHQpICsgMTsKICAgICAgICAgICAgICAgICBpZiAoIWluc2VydCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gdGhlIGhlaWdodCBoYXNuJ3QgY2hhbmdlZCwgc28gcmViYWxhbmNpbmcgaXMgZG9uZSEKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVVVJRC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKaW5kZXggOGFjMGE2My4uMzU5NGQ4NyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9VVUlELmphdmEKQEAgLTMzNSwxMyArMzM1LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3N0U2lnQml0cyA8IHV1aWQubW9zdFNpZ0JpdHMgPyAtMSA6IDE7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdGhpcy5tb3N0U2lnQml0cyA9PSB1dWlkLm1vc3RTaWdCaXRzOworICAgICAgICAvLyBhc3NlcnQgdGhpcy5tb3N0U2lnQml0cyA9PSB1dWlkLm1vc3RTaWdCaXRzOwogCiAgICAgICAgIGlmICh0aGlzLmxlYXN0U2lnQml0cyAhPSB1dWlkLmxlYXN0U2lnQml0cykgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVhc3RTaWdCaXRzIDwgdXVpZC5sZWFzdFNpZ0JpdHMgPyAtMSA6IDE7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdGhpcy5sZWFzdFNpZ0JpdHMgPT0gdXVpZC5sZWFzdFNpZ0JpdHM7CisgICAgICAgIC8vIGFzc2VydCB0aGlzLmxlYXN0U2lnQml0cyA9PSB1dWlkLmxlYXN0U2lnQml0czsKIAogICAgICAgICByZXR1cm4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1ZlY3Rvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9WZWN0b3IuamF2YQppbmRleCBjMjM2YmUwLi42NWUxMzVhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1ZlY3Rvci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvVmVjdG9yLmphdmEKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgVmVjdG9yKGludCBjYXBhY2l0eSwgaW50IGNhcGFjaXR5SW5jcmVtZW50KSB7CiAgICAgICAgIGlmIChjYXBhY2l0eSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhcGFjaXR5IDwgMDogIiArIGNhcGFjaXR5KTsKICAgICAgICAgfQogICAgICAgICBlbGVtZW50RGF0YSA9IG5ld0VsZW1lbnRBcnJheShjYXBhY2l0eSk7CiAgICAgICAgIGVsZW1lbnRDb3VudCA9IDA7CkBAIC00NDUsNyArNDQ1LDcgQEAKICAgICBwcml2YXRlIHZvaWQgZ3JvdyhpbnQgbmV3Q2FwYWNpdHkpIHsKICAgICAgICAgRVtdIG5ld0RhdGEgPSBuZXdFbGVtZW50QXJyYXkobmV3Q2FwYWNpdHkpOwogICAgICAgICAvLyBBc3N1bWVzIGVsZW1lbnRDb3VudCBpcyA8PSBuZXdDYXBhY2l0eQotICAgICAgICBhc3NlcnQgZWxlbWVudENvdW50IDw9IG5ld0NhcGFjaXR5OworICAgICAgICAvLyBhc3NlcnQgZWxlbWVudENvdW50IDw9IG5ld0NhcGFjaXR5OwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnREYXRhLCAwLCBuZXdEYXRhLCAwLCBlbGVtZW50Q291bnQpOwogICAgICAgICBlbGVtZW50RGF0YSA9IG5ld0RhdGE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9XZWFrSGFzaE1hcC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9XZWFrSGFzaE1hcC5qYXZhCmluZGV4IDY0MTc2NzkuLjJkYjg2OTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvV2Vha0hhc2hNYXAuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL1dlYWtIYXNoTWFwLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVudHJ5PEssIFY+IGV4dGVuZHMgV2Vha1JlZmVyZW5jZTxLPiBpbXBsZW1lbnRzCiAgICAgICAgICAgICBNYXAuRW50cnk8SywgVj4gewotICAgICAgICBpbnQgaGFzaDsKKyAgICAgICAgZmluYWwgaW50IGhhc2g7CiAKICAgICAgICAgYm9vbGVhbiBpc051bGw7CiAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgRW50cnkoSyBrZXksIFYgb2JqZWN0LCBSZWZlcmVuY2VRdWV1ZTxLPiBxdWV1ZSkgewogICAgICAgICAgICAgc3VwZXIoa2V5LCBxdWV1ZSk7CiAgICAgICAgICAgICBpc051bGwgPSBrZXkgPT0gbnVsbDsKLSAgICAgICAgICAgIGhhc2ggPSBpc051bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICBoYXNoID0gaXNOdWxsID8gMCA6IENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KTsKICAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0OwogICAgICAgICB9CiAKQEAgLTE5OCwxNSArMTk4LDE0IEBACiAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB6ZXJvLgogICAgICAqLwogICAgIHB1YmxpYyBXZWFrSGFzaE1hcChpbnQgY2FwYWNpdHkpIHsKLSAgICAgICAgaWYgKGNhcGFjaXR5ID49IDApIHsKLSAgICAgICAgICAgIGVsZW1lbnRDb3VudCA9IDA7Ci0gICAgICAgICAgICBlbGVtZW50RGF0YSA9IG5ld0VudHJ5QXJyYXkoY2FwYWNpdHkgPT0gMCA/IDEgOiBjYXBhY2l0eSk7Ci0gICAgICAgICAgICBsb2FkRmFjdG9yID0gNzUwMDsgLy8gRGVmYXVsdCBsb2FkIGZhY3RvciBvZiAwLjc1Ci0gICAgICAgICAgICBjb21wdXRlTWF4U2l6ZSgpOwotICAgICAgICAgICAgcmVmZXJlbmNlUXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWU8Sz4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FwYWNpdHkgPCAwOiAiICsgY2FwYWNpdHkpOwogICAgICAgICB9CisgICAgICAgIGVsZW1lbnRDb3VudCA9IDA7CisgICAgICAgIGVsZW1lbnREYXRhID0gbmV3RW50cnlBcnJheShjYXBhY2l0eSA9PSAwID8gMSA6IGNhcGFjaXR5KTsKKyAgICAgICAgbG9hZEZhY3RvciA9IDc1MDA7IC8vIERlZmF1bHQgbG9hZCBmYWN0b3Igb2YgMC43NQorICAgICAgICBjb21wdXRlTWF4U2l6ZSgpOworICAgICAgICByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZTxLPigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjIyLDE1ICsyMjEsMTcgQEAKICAgICAgKiAgICAgICAgICAgICBvciBlcXVhbCB0byB6ZXJvLgogICAgICAqLwogICAgIHB1YmxpYyBXZWFrSGFzaE1hcChpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgaWYgKGNhcGFjaXR5ID49IDAgJiYgbG9hZEZhY3RvciA+IDApIHsKLSAgICAgICAgICAgIGVsZW1lbnRDb3VudCA9IDA7Ci0gICAgICAgICAgICBlbGVtZW50RGF0YSA9IG5ld0VudHJ5QXJyYXkoY2FwYWNpdHkgPT0gMCA/IDEgOiBjYXBhY2l0eSk7Ci0gICAgICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSAoaW50KSAobG9hZEZhY3RvciAqIDEwMDAwKTsKLSAgICAgICAgICAgIGNvbXB1dGVNYXhTaXplKCk7Ci0gICAgICAgICAgICByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZTxLPigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAoY2FwYWNpdHkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXBhY2l0eSA8IDA6ICIgKyBjYXBhY2l0eSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGxvYWRGYWN0b3IgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibG9hZEZhY3RvciA8PSAwOiAiICsgbG9hZEZhY3Rvcik7CisgICAgICAgIH0KKyAgICAgICAgZWxlbWVudENvdW50ID0gMDsKKyAgICAgICAgZWxlbWVudERhdGEgPSBuZXdFbnRyeUFycmF5KGNhcGFjaXR5ID09IDAgPyAxIDogY2FwYWNpdHkpOworICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSAoaW50KSAobG9hZEZhY3RvciAqIDEwMDAwKTsKKyAgICAgICAgY29tcHV0ZU1heFNpemUoKTsKKyAgICAgICAgcmVmZXJlbmNlUXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWU8Sz4oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM4MywyNiArMzg0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248Sz4gY29sbCA9IG5ldyBBcnJheUxpc3Q8Sz4oc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEs+IGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbGwuYWRkKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbC50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gY29udGVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxLPiBjb2xsID0gbmV3IEFycmF5TGlzdDxLPihzaXplKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8Sz4gaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sbC5hZGQoaXRlci5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsLnRvQXJyYXkoY29udGVudHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGtleVNldDsKQEAgLTQ3Miw3ICs0NTMsNyBAQAogICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KSB7CiAgICAgICAgIHBvbGwoKTsKICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGVsZW1lbnREYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIGludCBpbmRleCA9IChDb2xsZWN0aW9ucy5zZWNvbmRhcnlIYXNoKGtleSkgJiAweDdGRkZGRkZGKSAlIGVsZW1lbnREYXRhLmxlbmd0aDsKICAgICAgICAgICAgIEVudHJ5PEssIFY+IGVudHJ5ID0gZWxlbWVudERhdGFbaW5kZXhdOwogICAgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhlbnRyeS5nZXQoKSkpIHsKQEAgLTQ5NSw3ICs0NzYsNyBAQAogICAgIEVudHJ5PEssIFY+IGdldEVudHJ5KE9iamVjdCBrZXkpIHsKICAgICAgICAgcG9sbCgpOwogICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOworICAgICAgICAgICAgaW50IGluZGV4ID0gKENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwogICAgICAgICAgICAgRW50cnk8SywgVj4gZW50cnkgPSBlbGVtZW50RGF0YVtpbmRleF07CiAgICAgICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKGVudHJ5LmdldCgpKSkgewpAQCAtNjA5LDcgKzU5MCw3IEBACiAgICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICAgIEVudHJ5PEssIFY+IGVudHJ5OwogICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBlbGVtZW50RGF0YS5sZW5ndGg7CisgICAgICAgICAgICBpbmRleCA9IChDb2xsZWN0aW9ucy5zZWNvbmRhcnlIYXNoKGtleSkgJiAweDdGRkZGRkZGKSAlIGVsZW1lbnREYXRhLmxlbmd0aDsKICAgICAgICAgICAgIGVudHJ5ID0gZWxlbWVudERhdGFbaW5kZXhdOwogICAgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwgJiYgIWtleS5lcXVhbHMoZW50cnkuZ2V0KCkpKSB7CiAgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwpAQCAtNjI0LDcgKzYwNSw3IEBACiAgICAgICAgICAgICBtb2RDb3VudCsrOwogICAgICAgICAgICAgaWYgKCsrZWxlbWVudENvdW50ID4gdGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICAgcmVoYXNoKCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBrZXkgPT0gbnVsbCA/IDAgOiAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKQorICAgICAgICAgICAgICAgIGluZGV4ID0ga2V5ID09IG51bGwgPyAwIDogKENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KSAmIDB4N0ZGRkZGRkYpCiAgICAgICAgICAgICAgICAgICAgICAgICAlIGVsZW1lbnREYXRhLmxlbmd0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVudHJ5ID0gbmV3IEVudHJ5PEssIFY+KGtleSwgdmFsdWUsIHJlZmVyZW5jZVF1ZXVlKTsKQEAgLTY4Nyw3ICs2NjgsNyBAQAogICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgICBFbnRyeTxLLCBWPiBlbnRyeSwgbGFzdCA9IG51bGw7CiAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGVsZW1lbnREYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIGluZGV4ID0gKENvbGxlY3Rpb25zLnNlY29uZGFyeUhhc2goa2V5KSAmIDB4N0ZGRkZGRkYpICUgZWxlbWVudERhdGEubGVuZ3RoOwogICAgICAgICAgICAgZW50cnkgPSBlbGVtZW50RGF0YVtpbmRleF07CiAgICAgICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCAmJiAha2V5LmVxdWFscyhlbnRyeS5nZXQoKSkpIHsKICAgICAgICAgICAgICAgICBsYXN0ID0gZW50cnk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJGaWxlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJGaWxlLmphdmEKaW5kZXggZTEyOWU4Mi4uMGIyNzBiYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyRmlsZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phckZpbGUuamF2YQpAQCAtMzM3LDcgKzMzNyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHZlcmlmaWVyICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbmRzV2l0aElnbm9yZUNhc2UoZW50cnlOYW1lLCAiLlNGIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZW5kc1dpdGhJZ25vcmVDYXNlKGVudHJ5TmFtZSwgIi5EU0EiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbmRzV2l0aElnbm9yZUNhc2UoZW50cnlOYW1lLCAiLlJTQSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbmRzV2l0aElnbm9yZUNhc2UoZW50cnlOYW1lLCAiLlJTQSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVuZHNXaXRoSWdub3JlQ2FzZShlbnRyeU5hbWUsICIuRUMiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBzdXBlci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVyLmFkZE1ldGFFbnRyeShlbnRyeU5hbWUsIFN0cmVhbXMucmVhZEZ1bGx5KGlzKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJWZXJpZmllci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9qYXIvSmFyVmVyaWZpZXIuamF2YQppbmRleCBlYzBlMDg4Li5kYzM3YjcyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2phci9KYXJWZXJpZmllci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvamFyL0phclZlcmlmaWVyLmphdmEKQEAgLTUxLDYgKzUxLDE2IEBACiAgKiA8L3VsPgogICovCiBjbGFzcyBKYXJWZXJpZmllciB7CisgICAgLyoqCisgICAgICogTGlzdCBvZiBhY2NlcHRlZCBkaWdlc3QgYWxnb3JpdGhtcy4gVGhpcyBsaXN0IGlzIGluIG9yZGVyIGZyb20gbW9zdAorICAgICAqIHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRElHRVNUX0FMR09SSVRITVMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiU0hBLTUxMiIsCisgICAgICAgICJTSEEtMzg0IiwKKyAgICAgICAgIlNIQS0yNTYiLAorICAgICAgICAiU0hBMSIsCisgICAgfTsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGphck5hbWU7CiAKQEAgLTE5MCwyMiArMjAwLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXNBcnJheSA9IGNlcnRzLnRvQXJyYXkobmV3IENlcnRpZmljYXRlW2NlcnRzLnNpemUoKV0pOwogCi0gICAgICAgIFN0cmluZyBhbGdvcml0aG1zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiRGlnZXN0LUFsZ29yaXRobXMiKTsKLSAgICAgICAgaWYgKGFsZ29yaXRobXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWxnb3JpdGhtcyA9ICJTSEEgU0hBMSI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWxnb3JpdGhtcyk7Ci0gICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gdG9rZW5zLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIGhhc2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGFsZ29yaXRobSArICItRGlnZXN0Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRElHRVNUX0FMR09SSVRITVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhbGdvcml0aG0gPSBESUdFU1RfQUxHT1JJVEhNU1tpXTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYXNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhbGdvcml0aG0gKyAiLURpZ2VzdCIpOwogICAgICAgICAgICAgaWYgKGhhc2ggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnl0ZVtdIGhhc2hCeXRlcyA9IGhhc2guZ2V0Qnl0ZXMoQ2hhcnNldHMuSVNPXzg4NTlfMSk7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJpZmllckVudHJ5KG5hbWUsIE1lc3NhZ2VEaWdlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShhbGdvcml0aG0pLCBoYXNoQnl0ZXMsIGNlcnRpZmljYXRlc0FycmF5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlcmlmaWVyRW50cnkobmFtZSwgTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pLCBoYXNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXNBcnJheSk7CiAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKICAgICAgICAgICAgIH0KQEAgLTI1NCw3ICsyNTksNyBAQAogICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ID0gbWV0YUVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICAgU3RyaW5nIGtleSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoIi5EU0EiKSB8fCBrZXkuZW5kc1dpdGgoIi5SU0EiKSkgeworICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgiLkRTQSIpIHx8IGtleS5lbmRzV2l0aCgiLlJTQSIpIHx8IGtleS5lbmRzV2l0aCgiLkVDIikpIHsKICAgICAgICAgICAgICAgICB2ZXJpZnlDZXJ0aWZpY2F0ZShrZXkpOwogICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciByZWN1cnNpdmUgY2xhc3MgbG9hZAogICAgICAgICAgICAgICAgIGlmIChtZXRhRW50cmllcyA9PSBudWxsKSB7CkBAIC0zNzgsMTMgKzM4Myw4IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU3RyaW5nIGVudHJ5LCBieXRlW10gZGF0YSwKICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgYm9vbGVhbiBpZ25vcmVTZWNvbmRFbmRsaW5lLCBib29sZWFuIGlnbm9yYWJsZSkgewotICAgICAgICBTdHJpbmcgYWxnb3JpdGhtcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkRpZ2VzdC1BbGdvcml0aG1zIik7Ci0gICAgICAgIGlmIChhbGdvcml0aG1zID09IG51bGwpIHsKLSAgICAgICAgICAgIGFsZ29yaXRobXMgPSAiU0hBIFNIQTEiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFsZ29yaXRobXMpOwotICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBESUdFU1RfQUxHT1JJVEhNUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9IERJR0VTVF9BTEdPUklUSE1TW2ldOwogICAgICAgICAgICAgU3RyaW5nIGhhc2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGFsZ29yaXRobSArIGVudHJ5KTsKICAgICAgICAgICAgIGlmIChoYXNoID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlci5qYXZhCmluZGV4IDEzZGJkZDUuLmFlNzI4OGQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL0hhbmRsZXIuamF2YQpAQCAtMjgxLDE0ICsyODEsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBieSB0aGlzIGhhbmRsZXIsIHtAY29kZSBudWxsfSBpbmRpY2F0ZXMKICAgICAgKiBhIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gc2V0LgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYge0Bjb2RlIGNoYXJzZXROYW1lfSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBjaGFyc2V0TmFtZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogICAgICAgICBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5jaGVja0FjY2VzcygpOwotICAgICAgICBpbnRlcm5hbFNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgaW50ZXJuYWxTZXRFbmNvZGluZyhjaGFyc2V0TmFtZSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU3RyZWFtSGFuZGxlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXIuamF2YQppbmRleCA2MGI0MzIxLi40Nzg1ZjEzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL2xvZ2dpbmcvU3RyZWFtSGFuZGxlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyLmphdmEKQEAgLTE4MCwxNiArMTgwLDEzIEBACiAgICAgICogU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgYnkgdGhpcyBoYW5kbGVyLiBBIHtAY29kZSBudWxsfSB2YWx1ZQogICAgICAqIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IGVuY29kaW5nIHNob3VsZCBiZSB1c2VkLgogICAgICAqCi0gICAgICogQHBhcmFtIGVuY29kaW5nCi0gICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldC4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHtAY29kZSBjaGFyc2V0TmFtZX0gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmx1c2ggZmlyc3QgYmVmb3JlIHNldCBuZXcgZW5jb2RpbmcKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgY2hhcnNldE5hbWUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmx1c2ggYW55IGV4aXN0aW5nIGRhdGEgZmlyc3QuCiAgICAgICAgIHRoaXMuZmx1c2goKTsKLSAgICAgICAgc3VwZXIuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICBzdXBlci5zZXRFbmNvZGluZyhjaGFyc2V0TmFtZSk7CiAgICAgICAgIC8vIHJlbmV3IHdyaXRlciBvbmx5IGlmIHRoZSB3cml0ZXIgZXhpc3RzCiAgICAgICAgIGlmICh0aGlzLndyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoZ2V0RW5jb2RpbmcoKSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L01hdGNoZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlci5qYXZhCmluZGV4IGNmZDQ0MzIuLjE2MmZlNTMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvTWF0Y2hlci5qYXZhCkBAIC0yOCw3ICsyOCw4IEBACiAgICAgcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm47CiAKICAgICAvKioKLSAgICAgKiBIb2xkcyB0aGUgaGFuZGxlIGZvciB0aGUgbmF0aXZlIHZlcnNpb24gb2YgdGhlIHBhdHRlcm4uCisgICAgICogVGhlIGFkZHJlc3Mgb2YgdGhlIG5hdGl2ZSBwZWVyLgorICAgICAqIFVzZXMgb2YgdGhpcyBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZCB0byBhdm9pZCBuYXRpdmUgY3Jhc2hlcy4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBhZGRyZXNzOwogCkBAIC0xOTQsNyArMTk1LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIE1hdGNoZXIgcmVzZXQoQ2hhclNlcXVlbmNlIGlucHV0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlucHV0ID09IG51bGwiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGFydCA8IDAgfHwgZW5kIDwgMCB8fCBzdGFydCA+IGlucHV0Lmxlbmd0aCgpIHx8IGVuZCA+IGlucHV0Lmxlbmd0aCgpIHx8IHN0YXJ0ID4gZW5kKSB7CkBAIC0yMjQsMTYgKzIyNSwxOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBNYXRjaGVyIHVzZVBhdHRlcm4oUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhdHRlcm4gPT0gbnVsbCIpOwogICAgICAgICB9CiAKICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAotICAgICAgICBpZiAoYWRkcmVzcyAhPSAwKSB7Ci0gICAgICAgICAgICBjbG9zZUltcGwoYWRkcmVzcyk7Ci0gICAgICAgICAgICBhZGRyZXNzID0gMDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2xvc2VJbXBsKGFkZHJlc3MpOworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAwOyAvLyBJbiBjYXNlIG9wZW5JbXBsIHRocm93cy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJlc3MgPSBvcGVuSW1wbChwYXR0ZXJuLmFkZHJlc3MpOwogICAgICAgICB9Ci0gICAgICAgIGFkZHJlc3MgPSBvcGVuSW1wbChwYXR0ZXJuLmFkZHJlc3MpOwogCiAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXNldEZvcklucHV0KCk7CkBAIC0yNDUsOSArMjQ4LDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Rm9ySW5wdXQoKSB7Ci0gICAgICAgIHNldElucHV0SW1wbChhZGRyZXNzLCBpbnB1dCwgcmVnaW9uU3RhcnQsIHJlZ2lvbkVuZCk7Ci0gICAgICAgIHVzZUFuY2hvcmluZ0JvdW5kc0ltcGwoYWRkcmVzcywgYW5jaG9yaW5nQm91bmRzKTsKLSAgICAgICAgdXNlVHJhbnNwYXJlbnRCb3VuZHNJbXBsKGFkZHJlc3MsIHRyYW5zcGFyZW50Qm91bmRzKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBzZXRJbnB1dEltcGwoYWRkcmVzcywgaW5wdXQsIHJlZ2lvblN0YXJ0LCByZWdpb25FbmQpOworICAgICAgICAgICAgdXNlQW5jaG9yaW5nQm91bmRzSW1wbChhZGRyZXNzLCBhbmNob3JpbmdCb3VuZHMpOworICAgICAgICAgICAgdXNlVHJhbnNwYXJlbnRCb3VuZHNJbXBsKGFkZHJlc3MsIHRyYW5zcGFyZW50Qm91bmRzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzgxLDcgKzM4Niw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigic3RhcnQ9IiArIHN0YXJ0ICsgIjsgbGVuZ3RoPSIgKyBpbnB1dC5sZW5ndGgoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXRjaEZvdW5kID0gZmluZEltcGwoYWRkcmVzcywgaW5wdXQsIHN0YXJ0LCBtYXRjaE9mZnNldHMpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1hdGNoRm91bmQgPSBmaW5kSW1wbChhZGRyZXNzLCBpbnB1dCwgc3RhcnQsIG1hdGNoT2Zmc2V0cyk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1hdGNoRm91bmQ7CiAgICAgfQogCkBAIC0zOTQsNyArNDAxLDkgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBhIG1hdGNoIGhhcyBiZWVuIGZvdW5kLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGZpbmQoKSB7Ci0gICAgICAgIG1hdGNoRm91bmQgPSBmaW5kTmV4dEltcGwoYWRkcmVzcywgaW5wdXQsIG1hdGNoT2Zmc2V0cyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IGZpbmROZXh0SW1wbChhZGRyZXNzLCBpbnB1dCwgbWF0Y2hPZmZzZXRzKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbWF0Y2hGb3VuZDsKICAgICB9CiAKQEAgLTQwNiw3ICs0MTUsOSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIHRoZSB7QGNvZGUgUGF0dGVybn0gbWF0Y2hlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBsb29raW5nQXQoKSB7Ci0gICAgICAgIG1hdGNoRm91bmQgPSBsb29raW5nQXRJbXBsKGFkZHJlc3MsIGlucHV0LCBtYXRjaE9mZnNldHMpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1hdGNoRm91bmQgPSBsb29raW5nQXRJbXBsKGFkZHJlc3MsIGlucHV0LCBtYXRjaE9mZnNldHMpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtYXRjaEZvdW5kOwogICAgIH0KIApAQCAtNDE4LDcgKzQyOSw5IEBACiAgICAgICogICAgICAgICByZWdpb24uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcygpIHsKLSAgICAgICAgbWF0Y2hGb3VuZCA9IG1hdGNoZXNJbXBsKGFkZHJlc3MsIGlucHV0LCBtYXRjaE9mZnNldHMpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1hdGNoRm91bmQgPSBtYXRjaGVzSW1wbChhZGRyZXNzLCBpbnB1dCwgbWF0Y2hPZmZzZXRzKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbWF0Y2hGb3VuZDsKICAgICB9CiAKQEAgLTQ5NCw3ICs1MDcsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBncm91cHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBncm91cENvdW50KCkgewotICAgICAgICByZXR1cm4gZ3JvdXBDb3VudEltcGwoYWRkcmVzcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwQ291bnRJbXBsKGFkZHJlc3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzQsOCArNTQ5LDEwIEBACiAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIE1hdGNoZXJ9IGl0c2VsZi4KICAgICAgKi8KICAgICBwdWJsaWMgTWF0Y2hlciB1c2VBbmNob3JpbmdCb3VuZHMoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBhbmNob3JpbmdCb3VuZHMgPSB2YWx1ZTsKLSAgICAgICAgdXNlQW5jaG9yaW5nQm91bmRzSW1wbChhZGRyZXNzLCB2YWx1ZSk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYW5jaG9yaW5nQm91bmRzID0gdmFsdWU7CisgICAgICAgICAgICB1c2VBbmNob3JpbmdCb3VuZHNJbXBsKGFkZHJlc3MsIHZhbHVlKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTU2Miw4ICs1NzksMTAgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgTWF0Y2hlcn0gaXRzZWxmLgogICAgICAqLwogICAgIHB1YmxpYyBNYXRjaGVyIHVzZVRyYW5zcGFyZW50Qm91bmRzKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdHJhbnNwYXJlbnRCb3VuZHMgPSB2YWx1ZTsKLSAgICAgICAgdXNlVHJhbnNwYXJlbnRCb3VuZHNJbXBsKGFkZHJlc3MsIHZhbHVlKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB0cmFuc3BhcmVudEJvdW5kcyA9IHZhbHVlOworICAgICAgICAgICAgdXNlVHJhbnNwYXJlbnRCb3VuZHNJbXBsKGFkZHJlc3MsIHZhbHVlKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTU5Myw0OCArNjEyLDQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIG1hdGNoZXIncyByZWdpb24gc3RhcnQsIHRoYXQgaXMsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBpcworICAgICAqIFJldHVybnMgdGhpcyBtYXRjaGVyJ3MgcmVnaW9uIHN0YXJ0LCB0aGF0IGlzLCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0IGlzCiAgICAgICogY29uc2lkZXJlZCBmb3IgYSBtYXRjaC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCByZWdpb25TdGFydCgpIHsKICAgICAgICAgcmV0dXJuIHJlZ2lvblN0YXJ0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBtYXRjaGVyJ3MgcmVnaW9uIGVuZCwgdGhhdCBpcywgdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0IGlzCisgICAgICogUmV0dXJucyB0aGlzIG1hdGNoZXIncyByZWdpb24gZW5kLCB0aGF0IGlzLCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0IGlzCiAgICAgICogbm90IGNvbnNpZGVyZWQgZm9yIGEgbWF0Y2guCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlZ2lvbkVuZCgpIHsKICAgICAgICAgcmV0dXJuIHJlZ2lvbkVuZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBtb3JlIGlucHV0IG1pZ2h0IGNoYW5nZSBhIHN1Y2Nlc3NmdWwgbWF0Y2ggaW50byBhbgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBtb3JlIGlucHV0IG1pZ2h0IGNoYW5nZSBhIHN1Y2Nlc3NmdWwgbWF0Y2ggaW50byBhbgogICAgICAqIHVuc3VjY2Vzc2Z1bCBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBtb3JlIGlucHV0IG1pZ2h0IGNoYW5nZSBhIHN1Y2Nlc3NmdWwgbWF0Y2gKLSAgICAgKiAgICAgICAgIGludG8gYW4gdW5zdWNjZXNzZnVsIG9uZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlRW5kKCkgewotICAgICAgICByZXR1cm4gcmVxdWlyZUVuZEltcGwoYWRkcmVzcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVFbmRJbXBsKGFkZHJlc3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgbWF0Y2ggaGl0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIChhbmQgb25seSBpZikgdGhlIGxhc3QgbWF0Y2ggaGl0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgbGFzdCBtYXRjaCBoaXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGl0RW5kKCkgewotICAgICAgICByZXR1cm4gaGl0RW5kSW1wbChhZGRyZXNzKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gaGl0RW5kSW1wbChhZGRyZXNzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xvc2VJbXBsKGFkZHJlc3MpOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgY2xvc2VJbXBsKGFkZHJlc3MpOworICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9TcGxpdHRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC9yZWdleC9TcGxpdHRlci5qYXZhCmluZGV4IGQzMGJhZGEuLmE0Y2I1MmMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvcmVnZXgvU3BsaXR0ZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3JlZ2V4L1NwbGl0dGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgbGliY29yZS51dGlsLkVtcHR5QXJyYXk7CiAKIC8qKgogICogVXNlZCB0byBtYWtlIHtAY29kZSBTdHJpbmcuc3BsaXR9IGZhc3QgKGFuZCB0byBoZWxwIHtAY29kZSBQYXR0ZXJuLnNwbGl0fSB0b28pLgpAQCAtNjMsMTYgKzY0LDQxIEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgIiIgfTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIENvbGxlY3QgdGV4dCBwcmVjZWRpbmcgZWFjaCBvY2N1cnJlbmNlIG9mIHRoZSBzZXBhcmF0b3IsIHdoaWxlIHRoZXJlJ3MgZW5vdWdoIHNwYWNlLgotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGludCBtYXhTaXplID0gbGltaXQgPD0gMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogbGltaXQ7CisgICAgICAgIC8vIENvdW50IHNlcGFyYXRvcnMKKyAgICAgICAgaW50IHNlcGFyYXRvckNvdW50ID0gMDsKICAgICAgICAgaW50IGJlZ2luID0gMDsKICAgICAgICAgaW50IGVuZDsKLSAgICAgICAgd2hpbGUgKChlbmQgPSBpbnB1dC5pbmRleE9mKGNoLCBiZWdpbikpICE9IC0xICYmIGxpc3Quc2l6ZSgpICsgMSA8IG1heFNpemUpIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKGlucHV0LnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7CisgICAgICAgIHdoaWxlIChzZXBhcmF0b3JDb3VudCArIDEgIT0gbGltaXQgJiYgKGVuZCA9IGlucHV0LmluZGV4T2YoY2gsIGJlZ2luKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICsrc2VwYXJhdG9yQ291bnQ7CiAgICAgICAgICAgICBiZWdpbiA9IGVuZCArIDE7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbmlzaFNwbGl0KGxpc3QsIGlucHV0LCBiZWdpbiwgbWF4U2l6ZSwgbGltaXQpOworICAgICAgICBpbnQgbGFzdFBhcnRFbmQgPSBpbnB1dC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGxpbWl0ID09IDAgJiYgYmVnaW4gPT0gbGFzdFBhcnRFbmQpIHsKKyAgICAgICAgICAgIC8vIExhc3QgcGFydCBpcyBlbXB0eSBmb3IgbGltaXQgPT0gMCwgcmVtb3ZlIGFsbCB0cmFpbGluZyBlbXB0eSBtYXRjaGVzLgorICAgICAgICAgICAgaWYgKHNlcGFyYXRvckNvdW50ID09IGxhc3RQYXJ0RW5kKSB7CisgICAgICAgICAgICAgICAgLy8gSW5wdXQgY29udGFpbnMgb25seSBzZXBhcmF0b3JzLgorICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eUFycmF5LlNUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIGJlZ2lubmluZyBvZiB0cmFpbGluZyBzZXBhcmF0b3JzLgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIC0tYmVnaW47CisgICAgICAgICAgICB9IHdoaWxlIChpbnB1dC5jaGFyQXQoYmVnaW4gLSAxKSA9PSBjaCk7CisgICAgICAgICAgICAvLyBSZWR1Y2Ugc2VwYXJhdG9yQ291bnQgYW5kIGZpeCBsYXN0UGFydEVuZC4KKyAgICAgICAgICAgIHNlcGFyYXRvckNvdW50IC09IGlucHV0Lmxlbmd0aCgpIC0gYmVnaW47CisgICAgICAgICAgICBsYXN0UGFydEVuZCA9IGJlZ2luOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29sbGVjdCB0aGUgcmVzdWx0IHBhcnRzLgorICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3NlcGFyYXRvckNvdW50ICsgMV07CisgICAgICAgIGJlZ2luID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gc2VwYXJhdG9yQ291bnQ7ICsraSkgeworICAgICAgICAgICAgZW5kID0gaW5wdXQuaW5kZXhPZihjaCwgYmVnaW4pOworICAgICAgICAgICAgcmVzdWx0W2ldID0gaW5wdXQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpOworICAgICAgICAgICAgYmVnaW4gPSBlbmQgKyAxOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCBsYXN0IHBhcnQuCisgICAgICAgIHJlc3VsdFtzZXBhcmF0b3JDb3VudF0gPSBpbnB1dC5zdWJzdHJpbmcoYmVnaW4sIGxhc3RQYXJ0RW5kKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlLCBTdHJpbmcgaW5wdXQsIGludCBsaW1pdCkgewpAQCAtODksMjUgKzExNSwyMyBAQAogCiAgICAgICAgIC8vIENvbGxlY3QgdGV4dCBwcmVjZWRpbmcgZWFjaCBvY2N1cnJlbmNlIG9mIHRoZSBzZXBhcmF0b3IsIHdoaWxlIHRoZXJlJ3MgZW5vdWdoIHNwYWNlLgogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGludCBtYXhTaXplID0gbGltaXQgPD0gMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogbGltaXQ7CiAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKHBhdHRlcm4sIGlucHV0KTsKICAgICAgICAgaW50IGJlZ2luID0gMDsKLSAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpICYmIGxpc3Quc2l6ZSgpICsgMSA8IG1heFNpemUpIHsKKyAgICAgICAgd2hpbGUgKGxpc3Quc2l6ZSgpICsgMSAhPSBsaW1pdCAmJiBtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgbGlzdC5hZGQoaW5wdXQuc3Vic3RyaW5nKGJlZ2luLCBtYXRjaGVyLnN0YXJ0KCkpKTsKICAgICAgICAgICAgIGJlZ2luID0gbWF0Y2hlci5lbmQoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmluaXNoU3BsaXQobGlzdCwgaW5wdXQsIGJlZ2luLCBtYXhTaXplLCBsaW1pdCk7CisgICAgICAgIHJldHVybiBmaW5pc2hTcGxpdChsaXN0LCBpbnB1dCwgYmVnaW4sIGxpbWl0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmaW5pc2hTcGxpdChMaXN0PFN0cmluZz4gbGlzdCwgU3RyaW5nIGlucHV0LCBpbnQgYmVnaW4sIGludCBtYXhTaXplLCBpbnQgbGltaXQpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmaW5pc2hTcGxpdChMaXN0PFN0cmluZz4gbGlzdCwgU3RyaW5nIGlucHV0LCBpbnQgYmVnaW4sIGludCBsaW1pdCkgewogICAgICAgICAvLyBBZGQgdHJhaWxpbmcgdGV4dC4KICAgICAgICAgaWYgKGJlZ2luIDwgaW5wdXQubGVuZ3RoKCkpIHsKICAgICAgICAgICAgIGxpc3QuYWRkKGlucHV0LnN1YnN0cmluZyhiZWdpbikpOwotICAgICAgICB9IGVsc2UgaWYgKGxpbWl0ICE9IDApIHsgLy8gTm8gcG9pbnQgYWRkaW5nIHRoZSBlbXB0eSBzdHJpbmcgaWYgbGltaXQgPT0gMCwganVzdCB0byByZW1vdmUgaXQgYmVsb3cuCisgICAgICAgIH0gZWxzZSBpZiAobGltaXQgIT0gMCkgewogICAgICAgICAgICAgbGlzdC5hZGQoIiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSBhbGwgdHJhaWxpbmcgZW1wdHkgbWF0Y2hlcyBpbiB0aGUgbGltaXQgPT0gMCBjYXNlLgotICAgICAgICBpZiAobGltaXQgPT0gMCkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0cmFpbGluZyBlbXB0eSBtYXRjaGVzIGluIHRoZSBsaW1pdCA9PSAwIGNhc2UuCiAgICAgICAgICAgICBpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMTsKICAgICAgICAgICAgIHdoaWxlIChpID49IDAgJiYgbGlzdC5nZXQoaSkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXIuamF2YQppbmRleCAwNDRiOTc2Li4xNTkzYTYwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVyLmphdmEKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIERlZmxhdGVyfSBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWMgY29tcHJlc3Npb24KICAgICAgKiBsZXZlbC4gSWYge0Bjb2RlIG5vSGVhZGVyfSBpcyB0cnVlLCBubyBaTElCIGhlYWRlciBpcyBhZGRlZCB0byB0aGUKLSAgICAgKiBvdXRwdXQuIEluIGEgWklQIGFyY2hpdmUgZXZlcnkgZW50cnkgKGNvbXByZXNzZWQgZmlsZSkgY29tZXMgd2l0aCBzdWNoIGEKKyAgICAgKiBvdXRwdXQuIEluIGEgemlwIGZpbGUsIGV2ZXJ5IGVudHJ5IChjb21wcmVzc2VkIGZpbGUpIGNvbWVzIHdpdGggc3VjaCBhCiAgICAgICogaGVhZGVyLiBUaGUgc3RyYXRlZ3kgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB7QGxpbmsgI3NldFN0cmF0ZWd5fS4KICAgICAgKgogICAgICAqIEBwYXJhbSBsZXZlbApAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIERlZmxhdGVyKGludCBsZXZlbCwgYm9vbGVhbiBub0hlYWRlcikgewogICAgICAgICBpZiAobGV2ZWwgPCBERUZBVUxUX0NPTVBSRVNTSU9OIHx8IGxldmVsID4gQkVTVF9DT01QUkVTU0lPTikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGxldmVsOiAiICsgbGV2ZWwpOwogICAgICAgICB9CiAgICAgICAgIGNvbXByZXNzTGV2ZWwgPSBsZXZlbDsKICAgICAgICAgc3RyZWFtSGFuZGxlID0gY3JlYXRlU3RyZWFtKGNvbXByZXNzTGV2ZWwsIHN0cmF0ZWd5LCBub0hlYWRlcik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlcklucHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlcklucHV0U3RyZWFtLmphdmEKaW5kZXggODA1Y2UxNy4uZDg1NGZlYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVySW5wdXRTdHJlYW0uamF2YQpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJkZWZsYXRlciA9PSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyU2l6ZSA8PSAwOiAiICsgYnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5kZWYgPSBkZWZsYXRlcjsKICAgICAgICAgdGhpcy5idWYgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVyT3V0cHV0U3RyZWFtLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGQzMzZlNzIuLjQ0OGY2MWMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0RlZmxhdGVyT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvRGVmbGF0ZXJPdXRwdXRTdHJlYW0uamF2YQpAQCAtODYsMTEgKzg2LDExIEBACiAgICAgICogQHBhcmFtIGRlZgogICAgICAqICAgICAgICAgICAgaXMgdGhlIHNwZWNpZmljIHtAY29kZSBEZWZsYXRlcn0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcHJlc3MKICAgICAgKiAgICAgICAgICAgIGRhdGEuCi0gICAgICogQHBhcmFtIGJzaXplCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUKICAgICAgKiAgICAgICAgICAgIGlzIHRoZSBzaXplIHRvIGJlIHVzZWQgZm9yIHRoZSBpbnRlcm5hbCBidWZmZXIuCiAgICAgICovCi0gICAgcHVibGljIERlZmxhdGVyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgRGVmbGF0ZXIgZGVmLCBpbnQgYnNpemUpIHsKLSAgICAgICAgdGhpcyhvcywgZGVmLCBic2l6ZSwgZmFsc2UpOworICAgIHB1YmxpYyBEZWZsYXRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIERlZmxhdGVyIGRlZiwgaW50IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgdGhpcyhvcywgZGVmLCBidWZmZXJTaXplLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTMsMTkgKzExMywxOSBAQAogICAgICAqIEBoaWRlCiAgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIHB1YmxpYyBEZWZsYXRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIERlZmxhdGVyIGRlZiwgaW50IGJzaXplLCBib29sZWFuIHN5bmNGbHVzaCkgeworICAgIHB1YmxpYyBEZWZsYXRlck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIERlZmxhdGVyIGRlZiwgaW50IGJ1ZmZlclNpemUsIGJvb2xlYW4gc3luY0ZsdXNoKSB7CiAgICAgICAgIHN1cGVyKG9zKTsKICAgICAgICAgaWYgKG9zID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3MgPT0gbnVsbCIpOwogICAgICAgICB9IGVsc2UgaWYgKGRlZiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImRlZiA9PSBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJzaXplIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyU2l6ZSA8PSAwOiAiICsgYnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5kZWYgPSBkZWY7CiAgICAgICAgIHRoaXMuc3luY0ZsdXNoID0gc3luY0ZsdXNoOwotICAgICAgICBidWYgPSBuZXcgYnl0ZVtic2l6ZV07CisgICAgICAgIGJ1ZiA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJJbnB1dFN0cmVhbS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDYwODEwMzcuLjM3MWM4MGEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0luZmxhdGVySW5wdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9JbmZsYXRlcklucHV0U3RyZWFtLmphdmEKQEAgLTk4LDI0ICs5OCwyNCBAQAogICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gcmVhZCBkYXRhIGZyb20uCiAgICAgICogQHBhcmFtIGluZmxhdGVyCiAgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWMge0Bjb2RlIEluZmxhdGVyfSBmb3IgZGVjb21wcmVzc2luZyBkYXRhLgotICAgICAqIEBwYXJhbSBic2l6ZQorICAgICAqIEBwYXJhbSBidWZmZXJTaXplCiAgICAgICogICAgICAgICAgICB0aGUgc2l6ZSB0byBiZSB1c2VkIGZvciB0aGUgaW50ZXJuYWwgYnVmZmVyLgogICAgICAqLwotICAgIHB1YmxpYyBJbmZsYXRlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBJbmZsYXRlciBpbmZsYXRlciwgaW50IGJzaXplKSB7CisgICAgcHVibGljIEluZmxhdGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIEluZmxhdGVyIGluZmxhdGVyLCBpbnQgYnVmZmVyU2l6ZSkgewogICAgICAgICBzdXBlcihpcyk7CiAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImlzID09IG51bGwiKTsKICAgICAgICAgfSBlbHNlIGlmIChpbmZsYXRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImluZmxhdGVyID09IG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYnNpemUgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXJTaXplIDw9IDA6ICIgKyBidWZmZXJTaXplKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLmluZiA9IGluZmxhdGVyOwogICAgICAgICBpZiAoaXMgaW5zdGFuY2VvZiBaaXBGaWxlLlJBRlN0cmVhbSkgewotICAgICAgICAgICAgbmF0aXZlRW5kQnVmU2l6ZSA9IGJzaXplOworICAgICAgICAgICAgbmF0aXZlRW5kQnVmU2l6ZSA9IGJ1ZmZlclNpemU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWYgPSBuZXcgYnl0ZVtic2l6ZV07CisgICAgICAgICAgICBidWYgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg5LDEzICsxODksOCBAQAogICAgIHByb3RlY3RlZCB2b2lkIGZpbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nsb3NlZCgpOwogICAgICAgICBpZiAobmF0aXZlRW5kQnVmU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIFppcEZpbGUuUkFGU3RyZWFtIGlzID0gKFppcEZpbGUuUkFGU3RyZWFtKWluOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChpcy5tU2hhcmVkUmFmKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBsZW4gPSBpcy5tTGVuZ3RoIC0gaXMubU9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAobGVuID4gbmF0aXZlRW5kQnVmU2l6ZSkgbGVuID0gbmF0aXZlRW5kQnVmU2l6ZTsKLSAgICAgICAgICAgICAgICBpbnQgY250ID0gaW5mLnNldEZpbGVJbnB1dChpcy5tU2hhcmVkUmFmLmdldEZEKCksIGlzLm1PZmZzZXQsIG5hdGl2ZUVuZEJ1ZlNpemUpOwotICAgICAgICAgICAgICAgIGlzLnNraXAoY250KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFppcEZpbGUuUkFGU3RyZWFtIGlzID0gKFppcEZpbGUuUkFGU3RyZWFtKSBpbjsKKyAgICAgICAgICAgIGxlbiA9IGlzLmZpbGwoaW5mLCBuYXRpdmVFbmRCdWZTaXplKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKICAgICAgICAgICAgICAgICBpbmYuc2V0SW5wdXQoYnVmLCAwLCBsZW4pOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJPdXRwdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL0luZmxhdGVyT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggOWE2OTlhOC4uY2E4YTk1MCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvSW5mbGF0ZXJPdXRwdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9JbmZsYXRlck91dHB1dFN0cmVhbS5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImluZiA9PSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyU2l6ZSA8PSAwOiAiICsgYnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5pbmYgPSBpbmY7CiAgICAgICAgIHRoaXMuYnVmID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBFbnRyeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRW50cnkuamF2YQppbmRleCBlMmJmYzhkLi41NjNmNjQ5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBFbnRyeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmphdmEKQEAgLTI5LDI3ICsyOSwyOSBAQAogaW1wb3J0IGxpYmNvcmUuaW8uSGVhcEJ1ZmZlckl0ZXJhdG9yOwogCiAvKioKLSAqIEFuIGluc3RhbmNlIG9mIHtAY29kZSBaaXBFbnRyeX0gcmVwcmVzZW50cyBhbiBlbnRyeSB3aXRoaW4gYSA8aT5aSVAtYXJjaGl2ZTwvaT4uCi0gKiBBbiBlbnRyeSBoYXMgYXR0cmlidXRlcyBzdWNoIGFzIG5hbWUgKD0gcGF0aCkgb3IgdGhlIHNpemUgb2YgaXRzIGRhdGEuIFdoaWxlCi0gKiBhbiBlbnRyeSBpZGVudGlmaWVzIGRhdGEgc3RvcmVkIGluIGFuIGFyY2hpdmUsIGl0IGRvZXMgbm90IGhvbGQgdGhlIGRhdGEKLSAqIGl0c2VsZi4gRm9yIGV4YW1wbGUgd2hlbiByZWFkaW5nIGEgPGk+WklQLWZpbGU8L2k+IHlvdSB3aWxsIGZpcnN0IHJldHJpZXZlCi0gKiBhbGwgaXRzIGVudHJpZXMgaW4gYSBjb2xsZWN0aW9uIGFuZCB0aGVuIHJlYWQgdGhlIGRhdGEgZm9yIGEgc3BlY2lmaWMgZW50cnkKLSAqIHRocm91Z2ggYW4gaW5wdXQgc3RyZWFtLgotICoKLSAqIEBzZWUgWmlwRmlsZQotICogQHNlZSBaaXBPdXRwdXRTdHJlYW0KKyAqIEFuIGVudHJ5IHdpdGhpbiBhIHppcCBmaWxlLgorICogQW4gZW50cnkgaGFzIGF0dHJpYnV0ZXMgc3VjaCBhcyBpdHMgbmFtZSAod2hpY2ggaXMgYWN0dWFsbHkgYSBwYXRoKSBhbmQgdGhlIHVuY29tcHJlc3NlZCBzaXplCisgKiBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhLiBBbiBlbnRyeSBkb2VzIG5vdCBjb250YWluIHRoZSBkYXRhIGl0c2VsZiwgYnV0IGNhbiBiZSB1c2VkIGFzIGEga2V5CisgKiB3aXRoIHtAbGluayBaaXBGaWxlI2dldElucHV0U3RyZWFtfS4gVGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHtAbGluayBaaXBJbnB1dFN0cmVhbX0gYW5kCisgKiB7QGxpbmsgWmlwT3V0cHV0U3RyZWFtfSBzaG93cyBob3cge0Bjb2RlIFppcEVudHJ5fSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhvc2UgdHdvIGNsYXNzZXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBaaXBFbnRyeSBpbXBsZW1lbnRzIFppcENvbnN0YW50cywgQ2xvbmVhYmxlIHsKLSAgICBTdHJpbmcgbmFtZSwgY29tbWVudDsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgY29tbWVudDsKIAotICAgIGxvbmcgY29tcHJlc3NlZFNpemUgPSAtMSwgY3JjID0gLTEsIHNpemUgPSAtMTsKKyAgICBsb25nIGNyYyA9IC0xOyAvLyBOZWVkcyB0byBiZSBhIGxvbmcgdG8gZGlzdGluZ3Vpc2ggLTEgKCJub3Qgc2V0IikgZnJvbSB0aGUgMHhmZmZmZmZmZiBDUkMzMi4KIAotICAgIGludCBjb21wcmVzc2lvbk1ldGhvZCA9IC0xLCB0aW1lID0gLTEsIG1vZERhdGUgPSAtMTsKKyAgICBsb25nIGNvbXByZXNzZWRTaXplID0gLTE7CisgICAgbG9uZyBzaXplID0gLTE7CisKKyAgICBpbnQgY29tcHJlc3Npb25NZXRob2QgPSAtMTsKKyAgICBpbnQgdGltZSA9IC0xOworICAgIGludCBtb2REYXRlID0gLTE7CiAKICAgICBieXRlW10gZXh0cmE7CiAKICAgICBpbnQgbmFtZUxlbmd0aCA9IC0xOwotICAgIGxvbmcgbUxvY2FsSGVhZGVyUmVsT2Zmc2V0ID0gLTE7CisgICAgbG9uZyBsb2NhbEhlYWRlclJlbE9mZnNldCA9IC0xOwogCiAgICAgLyoqCiAgICAgICogWmlwIGVudHJ5IHN0YXRlOiBEZWZsYXRlZC4KQEAgLTYyLDEwICs2NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVEID0gMDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEVudHJ5fSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBFbnRyeX0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIGlzIGFjdHVhbGx5IGEgcGF0aCwKKyAgICAgKiBhbmQgbWF5IGNvbnRhaW4ge0Bjb2RlIC99IGNoYXJhY3RlcnMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIFpJUCBlbnRyeS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGxlbmd0aCBpcyBvdXRzaWRlIHRoZSByYW5nZSAoPiAweEZGRkYpLgogICAgICAqLwpAQCAtODAsMTEgKzgxLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb21tZW50IGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21tZW50IGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZQotICAgICAqICAgICAgICAgaXMgbm8gY29tbWVudC4gSWYgd2UncmUgcmVhZGluZyBhbiBhcmNoaXZlIHdpdGgKLSAgICAgKiAgICAgICAgIHtAY29kZSBaaXBJbnB1dFN0cmVhbX0gdGhlIGNvbW1lbnQgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IGZvciB0aGlzIHtAY29kZSBaaXBFbnRyeX0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyBjb21tZW50LgorICAgICAqIElmIHdlJ3JlIHJlYWRpbmcgYSB6aXAgZmlsZSB1c2luZyB7QGNvZGUgWmlwSW5wdXRTdHJlYW19LCB0aGUgY29tbWVudCBpcyBub3QgYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CkBAIC0xNzgsMTYgKzE3NiwxOSBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29tbWVudCBmb3IgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGZvciB0aGlzIGVudHJ5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb21tZW50IGlzID49IDY0IEtpIFVURi04IGJ5dGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLSAgICAgICAgaWYgKGNvbW1lbnQgPT0gbnVsbCB8fCBjb21tZW50Lmxlbmd0aCgpIDw9IDB4RkZGRikgewotICAgICAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGNvbW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBjb21tZW50Qnl0ZXMgPSBjb21tZW50LmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgICAgICAgaWYgKGNvbW1lbnRCeXRlcy5sZW5ndGggPiAweGZmZmYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbW1lbnQgdG9vIGxvbmc6ICIgKyBjb21tZW50Qnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE5LDI1ICsyMjAsMjIgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBmb3IgdGhpcyB7QGNvZGUgWmlwRW50cnl9LgogICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIGxlbmd0aCBvZiBkYXRhIGlzIGdyZWF0ZXIgdGhhbiAweEZGRkYgYnl0ZXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGRhdGEgbGVuZ3RoID49IDY0IEtpQi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYShieXRlW10gZGF0YSkgewotICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoIDw9IDB4RkZGRikgewotICAgICAgICAgICAgZXh0cmEgPSBkYXRhOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMHhmZmZmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHRyYSBkYXRhIHRvbyBsb25nOiAiICsgZGF0YS5sZW5ndGgpOwogICAgICAgICB9CisgICAgICAgIGV4dHJhID0gZGF0YTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHRoaXMge0Bjb2RlIFppcEVudHJ5fS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCwgZWl0aGVyIHtAY29kZSBERUZMQVRFRH0gb3Ige0Bjb2RlCi0gICAgICogICAgICAgICAgICBTVE9SRUR9LgorICAgICAqIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgdGhpcyBlbnRyeSB0byBlaXRoZXIge0Bjb2RlIERFRkxBVEVEfSBvciB7QGNvZGUgU1RPUkVEfS4KKyAgICAgKiBUaGUgZGVmYXVsdCBpcyB7QGNvZGUgREVGTEFURUR9LCB3aGljaCB3aWxsIGNhdXNlIHRoZSBzaXplLCBjb21wcmVzc2VkIHNpemUsIGFuZCBDUkMgdG8gYmUKKyAgICAgKiBzZXQgYXV0b21hdGljYWxseSwgYW5kIHRoZSBlbnRyeSdzIGRhdGEgdG8gYmUgY29tcHJlc3NlZC4gSWYgeW91IHN3aXRjaCB0byB7QGNvZGUgU1RPUkVEfQorICAgICAqIG5vdGUgdGhhdCB5b3UnbGwgaGF2ZSB0byBzZXQgdGhlIHNpemUgKG9yIGNvbXByZXNzZWQgc2l6ZTsgdGhleSBtdXN0IGJlIHRoZSBzYW1lLCBidXQgaXQncworICAgICAqIG9rYXkgdG8gb25seSBzZXQgb25lKSBhbmQgQ1JDIHlvdXJzZWxmIGJlY2F1c2UgdGhleSBtdXN0IGFwcGVhciA8aT5iZWZvcmU8L2k+IHRoZSB1c2VyIGRhdGEKKyAgICAgKiBpbiB0aGUgcmVzdWx0aW5nIHppcCBmaWxlLiBTZWUge0BsaW5rICNzZXRTaXplfSBhbmQge0BsaW5rICNzZXRDcmN9LgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgd2hlbiB2YWx1ZSBpcyBub3Qge0Bjb2RlIERFRkxBVEVEfSBvciB7QGNvZGUgU1RPUkVEfS4KICAgICAgKi8KQEAgLTMxNiw3ICszMTQsNyBAQAogICAgICAgICBtb2REYXRlID0gemUubW9kRGF0ZTsKICAgICAgICAgZXh0cmEgPSB6ZS5leHRyYTsKICAgICAgICAgbmFtZUxlbmd0aCA9IHplLm5hbWVMZW5ndGg7Ci0gICAgICAgIG1Mb2NhbEhlYWRlclJlbE9mZnNldCA9IHplLm1Mb2NhbEhlYWRlclJlbE9mZnNldDsKKyAgICAgICAgbG9jYWxIZWFkZXJSZWxPZmZzZXQgPSB6ZS5sb2NhbEhlYWRlclJlbE9mZnNldDsKICAgICB9CiAKICAgICAvKioKQEAgLTM3MSwxMSArMzY5LDExIEBACiAKICAgICAgICAgbmFtZUxlbmd0aCA9IGl0LnJlYWRTaG9ydCgpOwogICAgICAgICBpbnQgZXh0cmFMZW5ndGggPSBpdC5yZWFkU2hvcnQoKTsKLSAgICAgICAgaW50IGNvbW1lbnRMZW5ndGggPSBpdC5yZWFkU2hvcnQoKTsKKyAgICAgICAgaW50IGNvbW1lbnRCeXRlQ291bnQgPSBpdC5yZWFkU2hvcnQoKTsKIAogICAgICAgICAvLyBUaGlzIGlzIGEgMzItYml0IHZhbHVlIGluIHRoZSBmaWxlLCBidXQgYSA2NC1iaXQgZmllbGQgaW4gdGhpcyBvYmplY3QuCiAgICAgICAgIGl0LnNlZWsoNDIpOwotICAgICAgICBtTG9jYWxIZWFkZXJSZWxPZmZzZXQgPSAoKGxvbmcpIGl0LnJlYWRJbnQoKSkgJiAweGZmZmZmZmZmTDsKKyAgICAgICAgbG9jYWxIZWFkZXJSZWxPZmZzZXQgPSAoKGxvbmcpIGl0LnJlYWRJbnQoKSkgJiAweGZmZmZmZmZmTDsKIAogICAgICAgICBieXRlW10gbmFtZUJ5dGVzID0gbmV3IGJ5dGVbbmFtZUxlbmd0aF07CiAgICAgICAgIFN0cmVhbXMucmVhZEZ1bGx5KGluLCBuYW1lQnl0ZXMsIDAsIG5hbWVCeXRlcy5sZW5ndGgpOwpAQCAtMzgzLDkgKzM4MSw5IEBACiAKICAgICAgICAgLy8gVGhlIFJJIGhhcyBhbHdheXMgYXNzdW1lZCBVVEYtOC4gKElmIEdQQkZfVVRGOF9GTEFHIGlzbid0IHNldCwgdGhlIGVuY29kaW5nIGlzCiAgICAgICAgIC8vIGFjdHVhbGx5IElCTS00MzcuKQotICAgICAgICBpZiAoY29tbWVudExlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGJ5dGVbXSBjb21tZW50Qnl0ZXMgPSBuZXcgYnl0ZVtjb21tZW50TGVuZ3RoXTsKLSAgICAgICAgICAgIFN0cmVhbXMucmVhZEZ1bGx5KGluLCBjb21tZW50Qnl0ZXMsIDAsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBpZiAoY29tbWVudEJ5dGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGJ5dGVbXSBjb21tZW50Qnl0ZXMgPSBuZXcgYnl0ZVtjb21tZW50Qnl0ZUNvdW50XTsKKyAgICAgICAgICAgIFN0cmVhbXMucmVhZEZ1bGx5KGluLCBjb21tZW50Qnl0ZXMsIDAsIGNvbW1lbnRCeXRlQ291bnQpOwogICAgICAgICAgICAgY29tbWVudCA9IG5ldyBTdHJpbmcoY29tbWVudEJ5dGVzLCAwLCBjb21tZW50Qnl0ZXMubGVuZ3RoLCBDaGFyc2V0cy5VVEZfOCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXJyb3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEVycm9yLmphdmEKaW5kZXggNTcxODU3NS4uZDQ2OTRkNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXJyb3IuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBFcnJvci5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiBwYWNrYWdlIGphdmEudXRpbC56aXA7CiAKIC8qKgotICogVGhyb3duIHdoZW4gYW4gdW5yZWNvdmVyYWJsZSBaSVAgZXJyb3IgaGFzIG9jY3VycmVkLgorICogVGhyb3duIHdoZW4gYW4gdW5yZWNvdmVyYWJsZSB6aXAgZXJyb3IgaGFzIG9jY3VycmVkLgogICogQHNpbmNlIDEuNgogICovCiBwdWJsaWMgY2xhc3MgWmlwRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEV4Y2VwdGlvbi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKaW5kZXggYjc3OTQzZS4uMjcyMDNmYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBUaGlzIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHRocm93biBieSB7QGNvZGUgWmlwRmlsZX0gYW5kIHtAY29kZQotICogWmlwSW5wdXRTdHJlYW19IHdoZW4gdGhlIGZpbGUgb3Igc3RyZWFtIGlzIG5vdCBhIHZhbGlkIFpJUCBmaWxlLgorICogWmlwSW5wdXRTdHJlYW19IHdoZW4gdGhlIGZpbGUgb3Igc3RyZWFtIGlzIG5vdCBhIHZhbGlkIHppcCBmaWxlLgogICoKICAqIEBzZWUgWmlwRmlsZQogICogQHNlZSBaaXBJbnB1dFN0cmVhbQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRmlsZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwRmlsZS5qYXZhCmluZGV4IDgxNmQxYjguLjE3MjE0MWMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcEZpbGUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBGaWxlLmphdmEKQEAgLTM0LDE4ICszNCwxNiBAQAogaW1wb3J0IGxpYmNvcmUuaW8uU3RyZWFtczsKIAogLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHJhbmRvbSByZWFkIGFjY2VzcyB0byBhIDxpPlpJUC1hcmNoaXZlPC9pPiBmaWxlLgotICogPHA+Ci0gKiBXaGlsZSB7QGNvZGUgWmlwSW5wdXRTdHJlYW19IHByb3ZpZGVzIHN0cmVhbSBiYXNlZCByZWFkIGFjY2VzcyB0byBhCi0gKiA8aT5aSVAtYXJjaGl2ZTwvaT4sIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBtb3JlIGVmZmljaWVudCAoZmlsZSBiYXNlZCkgYWNjZXNzCi0gKiBhbmQgbWFrZXMgdXNlIG9mIHRoZSA8aT5jZW50cmFsIGRpcmVjdG9yeTwvaT4gd2l0aGluIGEgPGk+WklQLWFyY2hpdmU8L2k+LgotICogPHA+Ci0gKiBVc2Uge0Bjb2RlIFppcE91dHB1dFN0cmVhbX0gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIGFyY2hpdmUuCi0gKiA8cD4KLSAqIEEgdGVtcG9yYXJ5IFpJUCBmaWxlIGNhbiBiZSBtYXJrZWQgZm9yIGF1dG9tYXRpYyBkZWxldGlvbiB1cG9uIGNsb3NpbmcgaXQuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHJhbmRvbSByZWFkIGFjY2VzcyB0byBhIHppcCBmaWxlLiBZb3UgcGF5IG1vcmUgdG8gcmVhZAorICogdGhlIHppcCBmaWxlJ3MgY2VudHJhbCBkaXJlY3RvcnkgdXAgZnJvbnQgKGZyb20gdGhlIGNvbnN0cnVjdG9yKSwgYnV0IGlmIHlvdSdyZSB1c2luZworICoge0BsaW5rICNnZXRFbnRyeX0gdG8gbG9vayB1cCBtdWx0aXBsZSBmaWxlcyBieSBuYW1lLCB5b3UgZ2V0IHRoZSBiZW5lZml0IG9mIHRoaXMgaW5kZXguCiAgKgotICogQHNlZSBaaXBFbnRyeQotICogQHNlZSBaaXBPdXRwdXRTdHJlYW0KKyAqIDxwPklmIHlvdSBvbmx5IHdhbnQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgZmlsZXMgKHVzaW5nIHtAbGluayAjZW50cmllc30sIHlvdSBzaG91bGQKKyAqIGNvbnNpZGVyIHtAbGluayBaaXBJbnB1dFN0cmVhbX0sIHdoaWNoIHByb3ZpZGVzIHN0cmVhbS1saWtlIHJlYWQgYWNjZXNzIHRvIGEgemlwIGZpbGUgYW5kCisgKiBoYXMgYSBsb3dlciB1cC1mcm9udCBjb3N0IGJlY2F1c2UgeW91IGRvbid0IHBheSB0byBidWlsZCBhbiBpbi1tZW1vcnkgaW5kZXguCisgKgorICogPHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgemlwIGZpbGUsIHVzZSB7QGxpbmsgWmlwT3V0cHV0U3RyZWFtfS4gVGhlcmUgaXMgbm8gQVBJIGZvciB1cGRhdGluZworICogYW4gZXhpc3RpbmcgemlwIGZpbGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBaaXBGaWxlIGltcGxlbWVudHMgWmlwQ29uc3RhbnRzIHsKICAgICAvKioKQEAgLTcwLDgxICs2OCw3MSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgR1BCRl9VVEY4X0ZMQUcgPSAxIDw8IDExOwogCiAgICAgLyoqCi0gICAgICogT3BlbiBaSVAgZmlsZSBmb3IgcmVhZC4KKyAgICAgKiBPcGVuIHppcCBmaWxlIGZvciByZWFkaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fUkVBRCA9IDE7CiAKICAgICAvKioKLSAgICAgKiBEZWxldGUgWklQIGZpbGUgd2hlbiBjbG9zZWQuCisgICAgICogRGVsZXRlIHppcCBmaWxlIHdoZW4gY2xvc2VkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fREVMRVRFID0gNDsKIAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVuYW1lOwogCiAgICAgcHJpdmF0ZSBGaWxlIGZpbGVUb0RlbGV0ZU9uQ2xvc2U7CiAKLSAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgbVJhZjsKKyAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgWmlwRW50cnk+IG1FbnRyaWVzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBaaXBFbnRyeT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBaaXBFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgWmlwRW50cnk+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIENsb3NlR3VhcmQgZ3VhcmQgPSBDbG9zZUd1YXJkLmdldCgpOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgWmlwRmlsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gcmVhZCBmcm9tLgotICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSBaSVAgZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBGaWxlfSBhbGxvd2luZyByZWFkIGFjY2VzcyB0byB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGZpbGUuCisgICAgICogQHRocm93cyBaaXBFeGNlcHRpb24gaWYgYSB6aXAgZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCiAgICAgICovCiAgICAgcHVibGljIFppcEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoZmlsZSwgT1BFTl9SRUFEKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVucyBhIGZpbGUgYXMgPGk+WklQLWFyY2hpdmU8L2k+LiAibW9kZSIgbXVzdCBiZSB7QGNvZGUgT1BFTl9SRUFEfSBvcgotICAgICAqIHtAY29kZSBPUEVOX0RFTEVURX0gLiBUaGUgbGF0dGVyIHNldHMgdGhlICJkZWxldGUgb24gZXhpdCIgZmxhZyB0aHJvdWdoIGEKLSAgICAgKiBmaWxlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcEZpbGV9IGFsbG93aW5nIHJlYWQgYWNjZXNzIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhuZXcgRmlsZShuYW1lKSwgT1BFTl9SRUFEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBaaXBGaWxlfSBhbGxvd2luZyBhY2Nlc3MgdG8gdGhlIGdpdmVuIGZpbGUuCisgICAgICogVGhlIHtAY29kZSBtb2RlfSBtdXN0IGJlIGVpdGhlciB7QGNvZGUgT1BFTl9SRUFEfSBvciB7QGNvZGUgT1BFTl9SRUFEfE9QRU5fREVMRVRFfS4KICAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgWklQIGZpbGUgdG8gcmVhZC4KLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICAgICAgICAgdGhlIG1vZGUgb2YgdGhlIGZpbGUgb3BlbiBvcGVyYXRpb24uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgorICAgICAqIDxwPklmIHRoZSB7QGNvZGUgT1BFTl9ERUxFVEV9IGZsYWcgaXMgc3VwcGxpZWQsIHRoZSBmaWxlIHdpbGwgYmUgZGVsZXRlZCBhdCBvciBiZWZvcmUgdGhlCisgICAgICogdGltZSB0aGF0IHRoZSB7QGNvZGUgWmlwRmlsZX0gaXMgY2xvc2VkICh0aGUgY29udGVudHMgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbAorICAgICAqIHRoaXMge0Bjb2RlIFppcEZpbGV9IGlzIGNsb3NlZCk7IGl0IGFsc28gY2FsbHMge0Bjb2RlIEZpbGUuZGVsZXRlT25FeGl0fS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBvY2N1cnMuCiAgICAgICovCiAgICAgcHVibGljIFppcEZpbGUoRmlsZSBmaWxlLCBpbnQgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmlsZU5hbWUgPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlLmdldFBhdGgoKTsKICAgICAgICAgaWYgKG1vZGUgIT0gT1BFTl9SRUFEICYmIG1vZGUgIT0gKE9QRU5fUkVBRCB8IE9QRU5fREVMRVRFKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIG1vZGU6ICIgKyBtb2RlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgobW9kZSAmIE9QRU5fREVMRVRFKSAhPSAwKSB7Ci0gICAgICAgICAgICBmaWxlVG9EZWxldGVPbkNsb3NlID0gZmlsZTsgLy8gZmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgIGZpbGVUb0RlbGV0ZU9uQ2xvc2UgPSBmaWxlOworICAgICAgICAgICAgZmlsZVRvRGVsZXRlT25DbG9zZS5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbGVUb0RlbGV0ZU9uQ2xvc2UgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgbVJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGVOYW1lLCAiciIpOworICAgICAgICByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlbmFtZSwgInIiKTsKIAogICAgICAgICByZWFkQ2VudHJhbERpcigpOwogICAgICAgICBndWFyZC5vcGVuKCJjbG9zZSIpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIE9wZW5zIGEgWklQIGFyY2hpdmVkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIFpJUCBmaWxlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIFppcEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IEZpbGUobmFtZSksIE9QRU5fUkVBRCk7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChndWFyZCAhPSBudWxsKSB7CkBAIC0xNjAsMTkgKzE0OCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIFpJUCBmaWxlLiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LgorICAgICAqIENsb3NlcyB0aGlzIHppcCBmaWxlLiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBUaGlzIG1ldGhvZCBtYXkgY2F1c2UgSS9PIGlmIHRoZQorICAgICAqIHppcCBmaWxlIG5lZWRzIHRvIGJlIGRlbGV0ZWQuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZ3VhcmQuY2xvc2UoKTsKLSAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBtUmFmOwogCi0gICAgICAgIGlmIChyYWYgIT0gbnVsbCkgeyAvLyBPbmx5IGNsb3NlIGluaXRpYWxpemVkIGluc3RhbmNlcwotICAgICAgICAgICAgc3luY2hyb25pemVkKHJhZikgewotICAgICAgICAgICAgICAgIG1SYWYgPSBudWxsOwotICAgICAgICAgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIGxvY2FsUmFmID0gcmFmOworICAgICAgICBpZiAobG9jYWxSYWYgIT0gbnVsbCkgeyAvLyBPbmx5IGNsb3NlIGluaXRpYWxpemVkIGluc3RhbmNlcworICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NhbFJhZikgeworICAgICAgICAgICAgICAgIHJhZiA9IG51bGw7CisgICAgICAgICAgICAgICAgbG9jYWxSYWYuY2xvc2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaWxlVG9EZWxldGVPbkNsb3NlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBmaWxlVG9EZWxldGVPbkNsb3NlLmRlbGV0ZSgpOwpAQCAtMTgyLDIxICsxNzEsMjQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RDbG9zZWQoKSB7Ci0gICAgICAgIGlmIChtUmFmID09IG51bGwpIHsKKyAgICAgICAgaWYgKHJhZiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJaaXAgZmlsZSBjbG9zZWQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgdGhlIGVudHJpZXMuIFRoZSBlbnRyaWVzIGFyZSBsaXN0ZWQgaW4gdGhlCi0gICAgICogb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIFpJUCBhcmNoaXZlLgorICAgICAqIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSB6aXAgZmlsZS4KICAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBlbnRyaWVzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgWklQIGZpbGUgaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIDxwPklmIHlvdSBvbmx5IG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRyaWVzIGluIGEgemlwIGZpbGUsIGFuZCBkb24ndAorICAgICAqIG5lZWQgcmFuZG9tLWFjY2VzcyBlbnRyeSBsb29rdXAgYnkgbmFtZSwgeW91IHNob3VsZCBwcm9iYWJseSB1c2Uge0BsaW5rIFppcElucHV0U3RyZWFtfQorICAgICAqIGluc3RlYWQsIHRvIGF2b2lkIHBheWluZyB0byBjb25zdHJ1Y3QgdGhlIGluLW1lbW9yeSBpbmRleC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgemlwIGZpbGUgaGFzIGJlZW4gY2xvc2VkLgogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IGVudHJpZXMoKSB7CiAgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yPFppcEVudHJ5PiBpdGVyYXRvciA9IG1FbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFppcEVudHJ5PiBpdGVyYXRvciA9IGVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKIAogICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uPFppcEVudHJ5PigpIHsKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKQEAgLTIxMiwxMyArMjA0LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBaSVAgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHtAY29kZSBaaXBGaWxlfS4KKyAgICAgKiBSZXR1cm5zIHRoZSB6aXAgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LgogICAgICAqCi0gICAgICogQHBhcmFtIGVudHJ5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IGluIHRoZSBaSVAgZmlsZS4KLSAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFppcEVudHJ5fSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGVudHJ5IG5hbWUgZG9lcyBub3QKLSAgICAgKiAgICAgICAgIGV4aXN0IGluIHRoZSBaSVAgZmlsZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIFpJUCBmaWxlIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIHppcCBmaWxlIGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgWmlwRW50cnkgZ2V0RW50cnkoU3RyaW5nIGVudHJ5TmFtZSkgewogICAgICAgICBjaGVja05vdENsb3NlZCgpOwpAQCAtMjI2LDkgKzIxNCw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVudHJ5TmFtZSA9PSBudWxsIik7CiAgICAgICAgIH0KIAotICAgICAgICBaaXBFbnRyeSB6ZSA9IG1FbnRyaWVzLmdldChlbnRyeU5hbWUpOworICAgICAgICBaaXBFbnRyeSB6ZSA9IGVudHJpZXMuZ2V0KGVudHJ5TmFtZSk7CiAgICAgICAgIGlmICh6ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB6ZSA9IG1FbnRyaWVzLmdldChlbnRyeU5hbWUgKyAiLyIpOworICAgICAgICAgICAgemUgPSBlbnRyaWVzLmdldChlbnRyeU5hbWUgKyAiLyIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB6ZTsKICAgICB9CkBAIC0yNDEsNyArMjI5LDcgQEAKICAgICAgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHtAY29kZSBaaXBFbnRyeX0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgWklQIGZpbGUgaGFzIGJlZW4gY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgemlwIGZpbGUgaGFzIGJlZW4gY2xvc2VkLgogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShaaXBFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgWmlwRW50cnkgaXMgaW4gdGhpcyBaaXAgZmlsZS4gIFdlIHJ1biBpdCB0aHJvdWdoIHRoZSBuYW1lIGxvb2t1cC4KQEAgLTI1MSwyNSArMjM5LDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBDcmVhdGUgYW4gSW5wdXRTdHJlYW0gYXQgdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGZpbGUuCi0gICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbVJhZjsKLSAgICAgICAgc3luY2hyb25pemVkIChyYWYpIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSBsb2NhbFJhZiA9IHJhZjsKKyAgICAgICAgc3luY2hyb25pemVkIChsb2NhbFJhZikgewogICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgZW50cnkgZGF0YSdzIHN0YXJ0IHBvc2l0aW9uLiBBbGwgd2UgaGF2ZSBpcyB0aGUKICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBlbnRyeSdzIGxvY2FsIGhlYWRlci4gQXQgcG9zaXRpb24gMjggd2UgZmluZCB0aGUKICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgZXh0cmEgZGF0YS4gSW4gc29tZSBjYXNlcyB0aGlzIGxlbmd0aCBkaWZmZXJzIGZyb20KICAgICAgICAgICAgIC8vIHRoZSBvbmUgY29taW5nIGluIHRoZSBjZW50cmFsIGhlYWRlci4KLSAgICAgICAgICAgIFJBRlN0cmVhbSByYWZzdHJtID0gbmV3IFJBRlN0cmVhbShyYWYsIGVudHJ5Lm1Mb2NhbEhlYWRlclJlbE9mZnNldCArIDI4KTsKLSAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmFmc3RybSk7CisgICAgICAgICAgICBSQUZTdHJlYW0gcmFmU3RyZWFtID0gbmV3IFJBRlN0cmVhbShsb2NhbFJhZiwgZW50cnkubG9jYWxIZWFkZXJSZWxPZmZzZXQgKyAyOCk7CisgICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJhZlN0cmVhbSk7CiAgICAgICAgICAgICBpbnQgbG9jYWxFeHRyYUxlbk9yV2hhdGV2ZXIgPSBTaG9ydC5yZXZlcnNlQnl0ZXMoaXMucmVhZFNob3J0KCkpOwogICAgICAgICAgICAgaXMuY2xvc2UoKTsKIAogICAgICAgICAgICAgLy8gU2tpcCB0aGUgbmFtZSBhbmQgdGhpcyAiZXh0cmEiIGRhdGEgb3Igd2hhdGV2ZXIgaXQgaXM6Ci0gICAgICAgICAgICByYWZzdHJtLnNraXAoZW50cnkubmFtZUxlbmd0aCArIGxvY2FsRXh0cmFMZW5PcldoYXRldmVyKTsKLSAgICAgICAgICAgIHJhZnN0cm0ubUxlbmd0aCA9IHJhZnN0cm0ubU9mZnNldCArIGVudHJ5LmNvbXByZXNzZWRTaXplOworICAgICAgICAgICAgcmFmU3RyZWFtLnNraXAoZW50cnkubmFtZUxlbmd0aCArIGxvY2FsRXh0cmFMZW5PcldoYXRldmVyKTsKKyAgICAgICAgICAgIHJhZlN0cmVhbS5sZW5ndGggPSByYWZTdHJlYW0ub2Zmc2V0ICsgZW50cnkuY29tcHJlc3NlZFNpemU7CiAgICAgICAgICAgICBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT0gWmlwRW50cnkuREVGTEFURUQpIHsKICAgICAgICAgICAgICAgICBpbnQgYnVmU2l6ZSA9IE1hdGgubWF4KDEwMjQsIChpbnQpTWF0aC5taW4oZW50cnkuZ2V0U2l6ZSgpLCA2NTUzNUwpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFppcEluZmxhdGVySW5wdXRTdHJlYW0ocmFmc3RybSwgbmV3IEluZmxhdGVyKHRydWUpLCBidWZTaXplLCBlbnRyeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBaaXBJbmZsYXRlcklucHV0U3RyZWFtKHJhZlN0cmVhbSwgbmV3IEluZmxhdGVyKHRydWUpLCBidWZTaXplLCBlbnRyeSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiByYWZzdHJtOworICAgICAgICAgICAgICAgIHJldHVybiByYWZTdHJlYW07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yODAsMTggKzI2OCwxOCBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGlzIHtAY29kZSBaaXBGaWxlfS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB7QGNvZGUgWmlwRW50cmllc30gaW4gdGhpcyB7QGNvZGUgWmlwRmlsZX0uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGZpbGUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBaSVAgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyB6aXAgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCiAgICAgICovCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBjaGVja05vdENsb3NlZCgpOwotICAgICAgICByZXR1cm4gbUVudHJpZXMuc2l6ZSgpOworICAgICAgICByZXR1cm4gZW50cmllcy5zaXplKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDgsMTcgKzI5NiwxMyBAQAogICAgICAqIGl0IHRob3VnaCwgc28gd2UncmUgaW4gZ29vZCBjb21wYW55IGlmIHRoaXMgZmFpbHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRDZW50cmFsRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2NhbiBiYWNrLCBsb29raW5nIGZvciB0aGUgRW5kIE9mIENlbnRyYWwgRGlyZWN0b3J5IGZpZWxkLiAgSWYKLSAgICAgICAgICogdGhlIGFyY2hpdmUgZG9lc24ndCBoYXZlIGEgY29tbWVudCwgd2UnbGwgaGl0IGl0IG9uIHRoZSBmaXJzdAotICAgICAgICAgKiB0cnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIE5vIG5lZWQgdG8gc3luY2hyb25pemUgbVJhZiBoZXJlIC0tIHdlIG9ubHkgZG8gdGhpcyB3aGVuIHdlCi0gICAgICAgICAqIGZpcnN0IG9wZW4gdGhlIFppcCBmaWxlLgotICAgICAgICAgKi8KLSAgICAgICAgbG9uZyBzY2FuT2Zmc2V0ID0gbVJhZi5sZW5ndGgoKSAtIEVOREhEUjsKKyAgICAgICAgLy8gU2NhbiBiYWNrLCBsb29raW5nIGZvciB0aGUgRW5kIE9mIENlbnRyYWwgRGlyZWN0b3J5IGZpZWxkLiBJZiB0aGUgemlwIGZpbGUgZG9lc24ndAorICAgICAgICAvLyBoYXZlIGFuIG92ZXJhbGwgY29tbWVudCAodW5yZWxhdGVkIHRvIGFueSBwZXItZW50cnkgY29tbWVudHMpLCB3ZSdsbCBoaXQgdGhlIEVPQ0QKKyAgICAgICAgLy8gb24gdGhlIGZpcnN0IHRyeS4KKyAgICAgICAgLy8gTm8gbmVlZCB0byBzeW5jaHJvbml6ZSByYWYgaGVyZSAtLSB3ZSBvbmx5IGRvIHRoaXMgd2hlbiB3ZSBmaXJzdCBvcGVuIHRoZSB6aXAgZmlsZS4KKyAgICAgICAgbG9uZyBzY2FuT2Zmc2V0ID0gcmFmLmxlbmd0aCgpIC0gRU5ESERSOwogICAgICAgICBpZiAoc2Nhbk9mZnNldCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIkZpbGUgdG9vIHNob3J0IHRvIGJlIGEgemlwIGZpbGU6ICIgKyBtUmFmLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIkZpbGUgdG9vIHNob3J0IHRvIGJlIGEgemlwIGZpbGU6ICIgKyByYWYubGVuZ3RoKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbG9uZyBzdG9wT2Zmc2V0ID0gc2Nhbk9mZnNldCAtIDY1NTM2OwpAQCAtMzI4LDIxICszMTIsMjEgQEAKIAogICAgICAgICBmaW5hbCBpbnQgRU5ESEVBREVSTUFHSUMgPSAweDA2MDU0YjUwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbVJhZi5zZWVrKHNjYW5PZmZzZXQpOwotICAgICAgICAgICAgaWYgKEludGVnZXIucmV2ZXJzZUJ5dGVzKG1SYWYucmVhZEludCgpKSA9PSBFTkRIRUFERVJNQUdJQykgeworICAgICAgICAgICAgcmFmLnNlZWsoc2Nhbk9mZnNldCk7CisgICAgICAgICAgICBpZiAoSW50ZWdlci5yZXZlcnNlQnl0ZXMocmFmLnJlYWRJbnQoKSkgPT0gRU5ESEVBREVSTUFHSUMpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2Nhbk9mZnNldC0tOwogICAgICAgICAgICAgaWYgKHNjYW5PZmZzZXQgPCBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiRU9DRCBub3QgZm91bmQ7IG5vdCBhIFppcCBhcmNoaXZlPyIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIkVPQ0Qgbm90IGZvdW5kOyBub3QgYSB6aXAgZmlsZT8iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFJlYWQgdGhlIEVuZCBPZiBDZW50cmFsIERpcmVjdG9yeS4gV2UgY291bGQgdXNlIEVOREhEUiBpbnN0ZWFkIG9mIHRoZSBtYWdpYyBudW1iZXIgMTgsCiAgICAgICAgIC8vIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGFsbCB0aGUgaGVhZGVyLgogICAgICAgICBieXRlW10gZW9jZCA9IG5ldyBieXRlWzE4XTsKLSAgICAgICAgbVJhZi5yZWFkRnVsbHkoZW9jZCk7CisgICAgICAgIHJhZi5yZWFkRnVsbHkoZW9jZCk7CiAKICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQuCiAgICAgICAgIEJ1ZmZlckl0ZXJhdG9yIGl0ID0gSGVhcEJ1ZmZlckl0ZXJhdG9yLml0ZXJhdG9yKGVvY2QsIDAsIGVvY2QubGVuZ3RoLCBCeXRlT3JkZXIuTElUVExFX0VORElBTik7CkBAIC0zNTEsMjAgKzMzNSwyMyBAQAogICAgICAgICBpbnQgbnVtRW50cmllcyA9IGl0LnJlYWRTaG9ydCgpICYgMHhmZmZmOwogICAgICAgICBpbnQgdG90YWxOdW1FbnRyaWVzID0gaXQucmVhZFNob3J0KCkgJiAweGZmZmY7CiAgICAgICAgIGl0LnNraXAoNCk7IC8vIElnbm9yZSBjZW50cmFsRGlyU2l6ZS4KLSAgICAgICAgaW50IGNlbnRyYWxEaXJPZmZzZXQgPSBpdC5yZWFkSW50KCk7CisgICAgICAgIGxvbmcgY2VudHJhbERpck9mZnNldCA9ICgobG9uZykgaXQucmVhZEludCgpKSAmIDB4ZmZmZmZmZmZMOwogCiAgICAgICAgIGlmIChudW1FbnRyaWVzICE9IHRvdGFsTnVtRW50cmllcyB8fCBkaXNrTnVtYmVyICE9IDAgfHwgZGlza1dpdGhDZW50cmFsRGlyICE9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oInNwYW5uZWQgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gU2VlayB0byB0aGUgZmlyc3QgQ0RFIGFuZCByZWFkIGFsbCBlbnRyaWVzLgotICAgICAgICBSQUZTdHJlYW0gcmFmcyA9IG5ldyBSQUZTdHJlYW0obVJhZiwgY2VudHJhbERpck9mZnNldCk7Ci0gICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocmFmcywgNDA5Nik7CisgICAgICAgIC8vIFdlIGhhdmUgdG8gZG8gdGhpcyBub3cgKGZyb20gdGhlIGNvbnN0cnVjdG9yKSByYXRoZXIgdGhhbiBsYXppbHkgYmVjYXVzZSB0aGUKKyAgICAgICAgLy8gcHVibGljIEFQSSBkb2Vzbid0IGFsbG93IHVzIHRvIHRocm93IElPRXhjZXB0aW9uIGV4Y2VwdCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAvLyBvciBmcm9tIGdldElucHV0U3RyZWFtLgorICAgICAgICBSQUZTdHJlYW0gcmFmU3RyZWFtID0gbmV3IFJBRlN0cmVhbShyYWYsIGNlbnRyYWxEaXJPZmZzZXQpOworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmZlcmVkU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocmFmU3RyZWFtLCA0MDk2KTsKICAgICAgICAgYnl0ZVtdIGhkckJ1ZiA9IG5ldyBieXRlW0NFTkhEUl07IC8vIFJldXNlIHRoZSBzYW1lIGJ1ZmZlciBmb3IgZWFjaCBlbnRyeS4KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsKLSAgICAgICAgICAgIFppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KGhkckJ1ZiwgYmluKTsKKyAgICAgICAgICAgIFppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KGhkckJ1ZiwgYnVmZmVyZWRTdHJlYW0pOwogICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IG5ld0VudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtRW50cmllcy5wdXQoZW50cnlOYW1lLCBuZXdFbnRyeSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGVudHJpZXMucHV0KGVudHJ5TmFtZSwgbmV3RW50cnkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJEdXBsaWNhdGUgZW50cnkgbmFtZTogIiArIGVudHJ5TmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM3OSwxOSArMzY2LDE4IEBACiAgICAgICogPHA+V2UgY291bGQgc3VwcG9ydCBtYXJrL3Jlc2V0LCBidXQgd2UgZG9uJ3QgY3VycmVudGx5IG5lZWQgdGhlbS4KICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgUkFGU3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc0ZpbGUgc2hhcmVkUmFmOworICAgICAgICBwcml2YXRlIGxvbmcgbGVuZ3RoOworICAgICAgICBwcml2YXRlIGxvbmcgb2Zmc2V0OwogCi0gICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgbVNoYXJlZFJhZjsKLSAgICAgICAgbG9uZyBtT2Zmc2V0OwotICAgICAgICBsb25nIG1MZW5ndGg7Ci0KLSAgICAgICAgcHVibGljIFJBRlN0cmVhbShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtU2hhcmVkUmFmID0gcmFmOwotICAgICAgICAgICAgbU9mZnNldCA9IHBvczsKLSAgICAgICAgICAgIG1MZW5ndGggPSByYWYubGVuZ3RoKCk7CisgICAgICAgIHB1YmxpYyBSQUZTdHJlYW0oUmFuZG9tQWNjZXNzRmlsZSByYWYsIGxvbmcgaW5pdGlhbE9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNoYXJlZFJhZiA9IHJhZjsKKyAgICAgICAgICAgIG9mZnNldCA9IGluaXRpYWxPZmZzZXQ7CisgICAgICAgICAgICBsZW5ndGggPSByYWYubGVuZ3RoKCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIChtT2Zmc2V0IDwgbUxlbmd0aCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiAob2Zmc2V0IDwgbGVuZ3RoID8gMSA6IDApOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zOTksMTQgKzM4NSwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNoYXJlZFJhZikgewotICAgICAgICAgICAgICAgIG1TaGFyZWRSYWYuc2VlayhtT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAobGVuID4gbUxlbmd0aCAtIG1PZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gKGludCkgKG1MZW5ndGggLSBtT2Zmc2V0KTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2hhcmVkUmFmKSB7CisgICAgICAgICAgICAgICAgc2hhcmVkUmFmLnNlZWsob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gbGVuZ3RoIC0gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpIChsZW5ndGggLSBvZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtU2hhcmVkUmFmLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHNoYXJlZFJhZi5yZWFkKGIsIG9mZiwgbGVuKTsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PZmZzZXQgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3VudDsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTQxNCwyOCArNDAwLDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGJ5dGVDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChieXRlQ291bnQgPiBtTGVuZ3RoIC0gbU9mZnNldCkgewotICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IG1MZW5ndGggLSBtT2Zmc2V0OworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmcgc2tpcChsb25nIGJ5dGVDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChieXRlQ291bnQgPiBsZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBieXRlQ291bnQgPSBsZW5ndGggLSBvZmZzZXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT2Zmc2V0ICs9IGJ5dGVDb3VudDsKKyAgICAgICAgICAgIG9mZnNldCArPSBieXRlQ291bnQ7CiAgICAgICAgICAgICByZXR1cm4gYnl0ZUNvdW50OwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBmaWxsKEluZmxhdGVyIGluZmxhdGVyLCBpbnQgbmF0aXZlRW5kQnVmU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2hhcmVkUmFmKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IE1hdGgubWluKChpbnQpIChsZW5ndGggLSBvZmZzZXQpLCBuYXRpdmVFbmRCdWZTaXplKTsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gaW5mbGF0ZXIuc2V0RmlsZUlucHV0KHNoYXJlZFJhZi5nZXRGRCgpLCBvZmZzZXQsIG5hdGl2ZUVuZEJ1ZlNpemUpOworICAgICAgICAgICAgICAgIC8vIHNldEZpbGVJbnB1dCByZWFkIGZyb20gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gZ2V0IHRoZSBPUyBhbmQgUkFGU3RyZWFtIGJhY2sKKyAgICAgICAgICAgICAgICAvLyBpbiBzeW5jLi4uCisgICAgICAgICAgICAgICAgc2tpcChjbnQpOworICAgICAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0aWMgY2xhc3MgWmlwSW5mbGF0ZXJJbnB1dFN0cmVhbSBleHRlbmRzIEluZmxhdGVySW5wdXRTdHJlYW0gewotCi0gICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICBsb25nIGJ5dGVzUmVhZCA9IDA7CisgICAgICAgIHByaXZhdGUgZmluYWwgWmlwRW50cnkgZW50cnk7CisgICAgICAgIHByaXZhdGUgbG9uZyBieXRlc1JlYWQgPSAwOwogCiAgICAgICAgIHB1YmxpYyBaaXBJbmZsYXRlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBJbmZsYXRlciBpbmYsIGludCBic2l6ZSwgWmlwRW50cnkgZW50cnkpIHsKICAgICAgICAgICAgIHN1cGVyKGlzLCBpbmYsIGJzaXplKTsKICAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZiwgaW50IG5ieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2ZmLCBpbnQgbmJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaW50IGkgPSBzdXBlci5yZWFkKGJ1ZmZlciwgb2ZmLCBuYnl0ZXMpOwogICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICBieXRlc1JlYWQgKz0gaTsKQEAgLTQ0Myw4ICs0MzcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaWYgKGNsb3NlZCkgewogICAgICAgICAgICAgICAgIC8vIE91ciBzdXBlcmNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBidXQgdGhlcmUncyBhIGp0cmVnIHRlc3QgdGhhdAogICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgY2hlY2tzIHRoYXQgdGhlIElucHV0U3RyZWFtIHJldHVybmVkIGZyb20gWmlwRmlsZS5nZXRJbnB1dFN0cmVhbQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcElucHV0U3RyZWFtLmphdmEKaW5kZXggZTdjNDU2Ni4uOTdhYTM1MCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW0uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbS5qYXZhCkBAIC0yOSwyNCArMjksMjUgQEAKIGltcG9ydCBsaWJjb3JlLmlvLlN0cmVhbXM7CiAKIC8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgRmlsdGVySW5wdXRTdHJlYW19IHRoYXQKLSAqIGRlY29tcHJlc3NlcyBkYXRhIGZyb20gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBjb250YWluaW5nIGEgWklQIGFyY2hpdmUuCisgKiBVc2VkIHRvIHJlYWQgKGRlY29tcHJlc3MpIHRoZSBkYXRhIGZyb20gemlwIGZpbGVzLgogICoKLSAqIDxwPkEgWklQIGFyY2hpdmUgaXMgYSBjb2xsZWN0aW9uIG9mIChwb3NzaWJseSkgY29tcHJlc3NlZCBmaWxlcy4KLSAqIFdoZW4gcmVhZGluZyBmcm9tIGEge0Bjb2RlIFppcElucHV0U3RyZWFtfSwgeW91IHJldHJpZXZlIHRoZQotICogZW50cnkncyBtZXRhZGF0YSB3aXRoIHtAY29kZSBnZXROZXh0RW50cnl9IGJlZm9yZSB5b3UgY2FuIHJlYWQgdGhlIHVzZXJkYXRhLgorICogPHA+QSB6aXAgZmlsZSAob3IgImFyY2hpdmUiKSBpcyBhIGNvbGxlY3Rpb24gb2YgKHBvc3NpYmx5KSBjb21wcmVzc2VkIGZpbGVzLgorICogV2hlbiByZWFkaW5nIGZyb20gYSB7QGNvZGUgWmlwSW5wdXRTdHJlYW19LCB5b3UgY2FsbCB7QGxpbmsgI2dldE5leHRFbnRyeX0KKyAqIHdoaWNoIHJldHVybnMgYSB7QGxpbmsgWmlwRW50cnl9IG9mIG1ldGFkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXJkYXRhIHRoYXQgZm9sbG93cy4KKyAqIFdoZW4geW91IGFwcGVhciB0byBoYXZlIGhpdCB0aGUgZW5kIG9mIHRoaXMgc3RyZWFtICh3aGljaCBpcyByZWFsbHkganVzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CisgKiBlbnRyeSdzIHVzZXJkYXRhKSwgY2FsbCB7QGNvZGUgZ2V0TmV4dEVudHJ5fSBhZ2Fpbi4gV2hlbiBpdCByZXR1cm5zIG51bGwsCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBpbnB1dCBmaWxlLgogICoKLSAqIDxwPkFsdGhvdWdoIHtAY29kZSBJbmZsYXRlcklucHV0U3RyZWFtfSBjYW4gb25seSByZWFkIGNvbXByZXNzZWQgWklQIGFyY2hpdmUKKyAqIDxwPkFsdGhvdWdoIHtAY29kZSBJbmZsYXRlcklucHV0U3RyZWFtfSBjYW4gb25seSByZWFkIGNvbXByZXNzZWQgemlwCiAgKiBlbnRyaWVzLCB0aGlzIGNsYXNzIGNhbiByZWFkIG5vbi1jb21wcmVzc2VkIGVudHJpZXMgYXMgd2VsbC4KICAqCi0gKiA8cD5Vc2Uge0Bjb2RlIFppcEZpbGV9IGlmIHlvdSBjYW4gYWNjZXNzIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBkaXJlY3RseSwKLSAqIGVzcGVjaWFsbHkgaWYgeW91IHdhbnQgcmFuZG9tIGFjY2VzcyB0byBlbnRyaWVzLCByYXRoZXIgdGhhbiBuZWVkaW5nIHRvCi0gKiBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMuCisgKiA8cD5Vc2Uge0BsaW5rIFppcEZpbGV9IGlmIHlvdSBuZWVkIHJhbmRvbSBhY2Nlc3MgdG8gZW50cmllcyBieSBuYW1lLCBidXQgdXNlIHRoaXMgY2xhc3MKKyAqIGlmIHlvdSBqdXN0IHdhbnQgdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzLgogICoKICAqIDxoMz5FeGFtcGxlPC9oMz4KICAqIDxwPlVzaW5nIHtAY29kZSBaaXBJbnB1dFN0cmVhbX0gaXMgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCB0aGFuIHtAbGluayBHWklQSW5wdXRTdHJlYW19Ci0gKiBiZWNhdXNlIFpJUCBhcmNoaXZlcyBhcmUgY29udGFpbmVycyB0aGF0IGNhbiBjb250YWluIG11bHRpcGxlIGZpbGVzLiBUaGlzIGNvZGUgcHVsbHMgYWxsIHRoZQotICogZmlsZXMgb3V0IG9mIGEgWklQIGFyY2hpdmUsIHNpbWlsYXIgdG8gdGhlIHtAY29kZSB1bnppcCgxKX0gdXRpbGl0eS4KKyAqIGJlY2F1c2UgemlwIGZpbGVzIGFyZSBjb250YWluZXJzIHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMuIFRoaXMgY29kZSBwdWxscyBhbGwgdGhlCisgKiBmaWxlcyBvdXQgb2YgYSB6aXAgZmlsZSwgc2ltaWxhciB0byB0aGUge0Bjb2RlIHVuemlwKDEpfSB1dGlsaXR5LgogICogPHByZT4KICAqIElucHV0U3RyZWFtIGlzID0gLi4uCiAgKiBaaXBJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpKTsKQEAgLTY3LDkgKzY4LDYgQEAKICAqICAgICB6aXMuY2xvc2UoKTsKICAqIH0KICAqIDwvcHJlPgotICoKLSAqIEBzZWUgWmlwRW50cnkKLSAqIEBzZWUgWmlwRmlsZQogICovCiBwdWJsaWMgY2xhc3MgWmlwSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbmZsYXRlcklucHV0U3RyZWFtIGltcGxlbWVudHMgWmlwQ29uc3RhbnRzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkID0gMjA7CkBAIC05MywxMCArOTEsNyBAQAogICAgIHByaXZhdGUgY2hhcltdIGNoYXJCdWYgPSBuZXcgY2hhclsyNTZdOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgWmlwSW5wdXRTdHJlYW19IGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlcHJlc2VudGluZyBhIFpJUCBhcmNoaXZlLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFppcElucHV0U3RyZWFtfSB0byByZWFkIHppcCBlbnRyaWVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KICAgICAgKi8KICAgICBwdWJsaWMgWmlwSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7CiAgICAgICAgIHN1cGVyKG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKHN0cmVhbSwgQlVGX1NJWkUpLCBuZXcgSW5mbGF0ZXIodHJ1ZSkpOwpAQCAtMTIwLDcgKzExNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IFpJUCBlbnRyeSBhbmQgcG9zaXRpb25zIHRvIHJlYWQgdGhlIG5leHQgZW50cnkuCisgICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHppcCBlbnRyeSBhbmQgcHJlcGFyZXMgdG8gcmVhZCB0aGUgbmV4dCBlbnRyeS4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IG9jY3Vycy4KQEAgLTIxMywxMyArMjA4LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG5leHQgZW50cnkgZnJvbSB0aGlzIHtAY29kZSBaaXBJbnB1dFN0cmVhbX0gb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoaXMge0Bjb2RlIFppcElucHV0U3RyZWFtfSBvciB7QGNvZGUgbnVsbH0gaWYKICAgICAgKiBubyBtb3JlIGVudHJpZXMgYXJlIHByZXNlbnQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHtAY29kZSBaaXBFbnRyeX0gY29udGFpbmVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgotICAgICAqIEBzZWUgWmlwRW50cnkKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gb2NjdXJzLgogICAgICAqLwogICAgIHB1YmxpYyBaaXBFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjbG9zZUVudHJ5KCk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDQ3ZGI4ZjYuLjVkYjIyNjIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMywyNSArMjMsMjMgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgbGliY29yZS51dGlsLkVtcHR5QXJyYXk7CiAKIC8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgRmlsdGVyT3V0cHV0U3RyZWFtfSB0aGF0Ci0gKiBjb21wcmVzc2VzIGRhdGEgZW50cmllcyBpbnRvIGEgPGk+WklQLWFyY2hpdmU8L2k+IG91dHB1dCBzdHJlYW0uCi0gKiA8cD4KLSAqIHtAY29kZSBaaXBPdXRwdXRTdHJlYW19IGlzIHVzZWQgdG8gd3JpdGUge0Bjb2RlIFppcEVudHJpZXN9IHRvIHRoZSB1bmRlcmx5aW5nCi0gKiBzdHJlYW0uIE91dHB1dCBmcm9tIHtAY29kZSBaaXBPdXRwdXRTdHJlYW19IGNvbmZvcm1zIHRvIHRoZSB7QGNvZGUgWmlwRmlsZX0KLSAqIGZpbGUgZm9ybWF0LgotICogPHA+Ci0gKiBXaGlsZSB7QGNvZGUgRGVmbGF0ZXJPdXRwdXRTdHJlYW19IGNhbiB3cml0ZSBhIGNvbXByZXNzZWQgPGk+WklQLWFyY2hpdmU8L2k+Ci0gKiBlbnRyeSwgdGhpcyBleHRlbnNpb24gY2FuIHdyaXRlIHVuY29tcHJlc3NlZCBlbnRyaWVzIGFzIHdlbGwuIEluIHRoaXMgY2FzZQotICogc3BlY2lhbCBydWxlcyBhcHBseSwgZm9yIHRoaXMgcHVycG9zZSByZWZlciB0byB0aGUgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPmZpbGUgZm9ybWF0Ci0gKiBzcGVjaWZpY2F0aW9uPC9hPi4KKyAqIFVzZWQgdG8gd3JpdGUgKGNvbXByZXNzKSBkYXRhIGludG8gemlwIGZpbGVzLgorICoKKyAqIDxwPntAY29kZSBaaXBPdXRwdXRTdHJlYW19IGlzIHVzZWQgdG8gd3JpdGUge0BsaW5rIFppcEVudHJ5fXMgdG8gdGhlIHVuZGVybHlpbmcKKyAqIHN0cmVhbS4gT3V0cHV0IGZyb20ge0Bjb2RlIFppcE91dHB1dFN0cmVhbX0gY2FuIGJlIHJlYWQgdXNpbmcge0BsaW5rIFppcEZpbGV9CisgKiBvciB7QGxpbmsgWmlwSW5wdXRTdHJlYW19LgorICoKKyAqIDxwPldoaWxlIHtAY29kZSBEZWZsYXRlck91dHB1dFN0cmVhbX0gY2FuIHdyaXRlIGNvbXByZXNzZWQgemlwIGZpbGUKKyAqIGVudHJpZXMsIHRoaXMgZXh0ZW5zaW9uIGNhbiB3cml0ZSB1bmNvbXByZXNzZWQgZW50cmllcyBhcyB3ZWxsLgorICogVXNlIHtAbGluayBaaXBFbnRyeSNzZXRNZXRob2R9IG9yIHtAbGluayAjc2V0TWV0aG9kfSB3aXRoIHRoZSB7QGxpbmsgWmlwRW50cnkjU1RPUkVEfSBmbGFnLgogICoKICAqIDxoMz5FeGFtcGxlPC9oMz4KICAqIDxwPlVzaW5nIHtAY29kZSBaaXBPdXRwdXRTdHJlYW19IGlzIGEgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB7QGxpbmsgR1pJUE91dHB1dFN0cmVhbX0KLSAqIGJlY2F1c2UgWklQIGFyY2hpdmVzIGFyZSBjb250YWluZXJzIHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMuIFRoaXMgY29kZSBjcmVhdGVzIGEgWklQCi0gKiBhcmNoaXZlIGNvbnRhaW5pbmcgc2V2ZXJhbCBmaWxlcywgc2ltaWxhciB0byB0aGUge0Bjb2RlIHppcCgxKX0gdXRpbGl0eS4KKyAqIGJlY2F1c2UgemlwIGZpbGVzIGFyZSBjb250YWluZXJzIHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMuIFRoaXMgY29kZSBjcmVhdGVzIGEgemlwCisgKiBmaWxlIGNvbnRhaW5pbmcgc2V2ZXJhbCBmaWxlcywgc2ltaWxhciB0byB0aGUge0Bjb2RlIHppcCgxKX0gdXRpbGl0eS4KICAqIDxwcmU+CiAgKiBPdXRwdXRTdHJlYW0gb3MgPSAuLi4KICAqIFppcE91dHB1dFN0cmVhbSB6b3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvcykpOwpAQCAtNTgsOSArNTYsNiBAQAogICogICAgIHpvcy5jbG9zZSgpOwogICogfQogICogPC9wcmU+Ci0gKgotICogQHNlZSBaaXBFbnRyeQotICogQHNlZSBaaXBGaWxlCiAgKi8KIHB1YmxpYyBjbGFzcyBaaXBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBEZWZsYXRlck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIFppcENvbnN0YW50cyB7CiAKQEAgLTc2LDEzICs3MSwxMyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpJUExvY2FsSGVhZGVyVmVyc2lvbk5lZWRlZCA9IDIwOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsKKyAgICBwcml2YXRlIGJ5dGVbXSBjb21tZW50Qnl0ZXMgPSBFbXB0eUFycmF5LkJZVEU7CiAKICAgICBwcml2YXRlIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBlbnRyaWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHJlc3NNZXRob2QgPSBERUZMQVRFRDsKKyAgICBwcml2YXRlIGludCBkZWZhdWx0Q29tcHJlc3Npb25NZXRob2QgPSBERUZMQVRFRDsKIAotICAgIHByaXZhdGUgaW50IGNvbXByZXNzTGV2ZWwgPSBEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgIHByaXZhdGUgaW50IGNvbXByZXNzaW9uTGV2ZWwgPSBEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OOwogCiAgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY0RpciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIApAQCAtOTUsMTQgKzkwLDExIEBACiAgICAgcHJpdmF0ZSBieXRlW10gbmFtZUJ5dGVzOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgWmlwT3V0cHV0U3RyZWFtfSB3aXRoIHRoZSBzcGVjaWZpZWQgb3V0cHV0Ci0gICAgICogc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIHAxCi0gICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIE91dHB1dFN0cmVhbX0gdG8gd3JpdGUgdGhlIGRhdGEgdG8uCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgWmlwT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBhIHppcCBmaWxlCisgICAgICogdG8gdGhlIGdpdmVuIHtAY29kZSBPdXRwdXRTdHJlYW19LgogICAgICAqLwotICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHAxKSB7Ci0gICAgICAgIHN1cGVyKHAxLCBuZXcgRGVmbGF0ZXIoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTiwgdHJ1ZSkpOworICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHN1cGVyKG9zLCBuZXcgRGVmbGF0ZXIoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTiwgdHJ1ZSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMxLDcgKzEyMyw3IEBACiAgICAgICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGNsb3NpbmcgdGhlIGVudHJ5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICBjaGVja09wZW4oKTsKICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE4NiwxMiArMTc4LDEzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3cml0ZVNob3J0KGNEaXIsIDApOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjOwotICAgICAgICBpZiAoKGMgPSBjdXJyZW50RW50cnkuZ2V0Q29tbWVudCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGNEaXIsIGMubGVuZ3RoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVTaG9ydChjRGlyLCAwKTsKKworICAgICAgICBTdHJpbmcgY29tbWVudCA9IGN1cnJlbnRFbnRyeS5nZXRDb21tZW50KCk7CisgICAgICAgIGJ5dGVbXSBjb21tZW50Qnl0ZXMgPSBFbXB0eUFycmF5LkJZVEU7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1lbnRCeXRlcyA9IGNvbW1lbnQuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOwogICAgICAgICB9CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgY29tbWVudEJ5dGVzLmxlbmd0aCk7IC8vIENvbW1lbnQgbGVuZ3RoLgogICAgICAgICB3cml0ZVNob3J0KGNEaXIsIDApOyAvLyBEaXNrIFN0YXJ0CiAgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgMCk7IC8vIEludGVybmFsIEZpbGUgQXR0cmlidXRlcwogICAgICAgICB3cml0ZUxvbmcoY0RpciwgMCk7IC8vIEV4dGVybmFsIEZpbGUgQXR0cmlidXRlcwpAQCAtMjAyLDggKzE5NSw4IEBACiAgICAgICAgICAgICBjRGlyLndyaXRlKGN1cnJlbnRFbnRyeS5leHRyYSk7CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IGN1ck9mZnNldDsKLSAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgY0Rpci53cml0ZShjLmdldEJ5dGVzKCkpOworICAgICAgICBpZiAoY29tbWVudEJ5dGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGNEaXIud3JpdGUoY29tbWVudEJ5dGVzKTsKICAgICAgICAgfQogICAgICAgICBjdXJyZW50RW50cnkgPSBudWxsOwogICAgICAgICBjcmMucmVzZXQoKTsKQEAgLTIyMCw3ICsyMTMsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgYnVnIGhlcmU/IHdoeSBub3QgY2hlY2tDbG9zZWQ/CisgICAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgYnVnIGhlcmU/IHdoeSBub3QgY2hlY2tPcGVuPwogICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGlzIGNsb3NlZCIpOwogICAgICAgICB9CkBAIC0yNDIsMTEgKzIzNSw5IEBACiAgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgZW50cmllcy5zaXplKCkpOyAvLyBOdW1iZXIgb2YgZW50cmllcwogICAgICAgICB3cml0ZUxvbmcoY0RpciwgY2RpclNpemUpOyAvLyBTaXplIG9mIGNlbnRyYWwgZGlyCiAgICAgICAgIHdyaXRlTG9uZyhjRGlyLCBvZmZzZXQpOyAvLyBPZmZzZXQgb2YgY2VudHJhbCBkaXIKLSAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVTaG9ydChjRGlyLCBjb21tZW50Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGNEaXIud3JpdGUoY29tbWVudC5nZXRCeXRlcygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgMCk7CisgICAgICAgIHdyaXRlU2hvcnQoY0RpciwgY29tbWVudEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGlmIChjb21tZW50Qnl0ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgY0Rpci53cml0ZShjb21tZW50Qnl0ZXMpOwogICAgICAgICB9CiAgICAgICAgIC8vIFdyaXRlIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4KICAgICAgICAgY0Rpci53cml0ZVRvKG91dCk7CkBAIC0yNjksMTggKzI2MCwzMyBAQAogICAgICAgICBpZiAoY3VycmVudEVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIGNsb3NlRW50cnkoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEIHx8IChjb21wcmVzc01ldGhvZCA9PSBTVE9SRUQgJiYgemUuZ2V0TWV0aG9kKCkgPT0gLTEpKSB7Ci0gICAgICAgICAgICBpZiAoemUuY3JjID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQ1JDIG1pc21hdGNoIik7CisKKyAgICAgICAgLy8gRGlkIHRoaXMgWmlwRW50cnkgc3BlY2lmeSBhIG1ldGhvZCwgb3Igc2hvdWxkIHdlIHVzZSB0aGUgZGVmYXVsdD8KKyAgICAgICAgaW50IG1ldGhvZCA9IHplLmdldE1ldGhvZCgpOworICAgICAgICBpZiAobWV0aG9kID09IC0xKSB7CisgICAgICAgICAgICBtZXRob2QgPSBkZWZhdWx0Q29tcHJlc3Npb25NZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgbWV0aG9kIGlzIFNUT1JFRCwgY2hlY2sgdGhhdCB0aGUgWmlwRW50cnkgd2FzIGNvbmZpZ3VyZWQgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgaWYgKG1ldGhvZCA9PSBTVE9SRUQpIHsKKyAgICAgICAgICAgIGlmICh6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgemUuc2V0Q29tcHJlc3NlZFNpemUoemUuZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoemUuZ2V0U2l6ZSgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgemUuc2V0U2l6ZSh6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh6ZS5zaXplID09IC0xICYmIHplLmNvbXByZXNzZWRTaXplID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiU2l6ZSBtaXNtYXRjaCIpOworICAgICAgICAgICAgaWYgKHplLmdldENyYygpID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiU1RPUkVEIGVudHJ5IG1pc3NpbmcgQ1JDIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoemUuc2l6ZSAhPSB6ZS5jb21wcmVzc2VkU2l6ZSAmJiB6ZS5jb21wcmVzc2VkU2l6ZSAhPSAtMSAmJiB6ZS5zaXplICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiU2l6ZSBtaXNtYXRjaCIpOworICAgICAgICAgICAgaWYgKHplLmdldFNpemUoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIlNUT1JFRCBlbnRyeSBtaXNzaW5nIHNpemUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh6ZS5zaXplICE9IHplLmNvbXByZXNzZWRTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiU1RPUkVEIGVudHJ5IHNpemUvY29tcHJlc3NlZCBzaXplIG1pc21hdGNoIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY2hlY2tDbG9zZWQoKTsKKworICAgICAgICBjaGVja09wZW4oKTsKKwogICAgICAgICBpZiAoZW50cmllcy5jb250YWlucyh6ZS5uYW1lKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiRW50cnkgYWxyZWFkeSBleGlzdHM6ICIgKyB6ZS5uYW1lKTsKICAgICAgICAgfQpAQCAtMjk0LDM1ICszMDAsMjkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgdG9vIGxvbmc6ICIgKyBuYW1lTGVuZ3RoICsgIiBVVEYtOCBieXRlcyIpOwogICAgICAgICB9CiAKLSAgICAgICAgZGVmLnNldExldmVsKGNvbXByZXNzTGV2ZWwpOworICAgICAgICBkZWYuc2V0TGV2ZWwoY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgIHplLnNldE1ldGhvZChtZXRob2QpOworCiAgICAgICAgIGN1cnJlbnRFbnRyeSA9IHplOwogICAgICAgICBlbnRyaWVzLmFkZChjdXJyZW50RW50cnkubmFtZSk7Ci0gICAgICAgIGlmIChjdXJyZW50RW50cnkuZ2V0TWV0aG9kKCkgPT0gLTEpIHsKLSAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5zZXRNZXRob2QoY29tcHJlc3NNZXRob2QpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gTG9jYWwgZmlsZSBoZWFkZXIuCiAgICAgICAgIC8vIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKLSAgICAgICAgaW50IGZsYWdzID0gY3VycmVudEVudHJ5LmdldE1ldGhvZCgpID09IFNUT1JFRCA/IDAgOiBaaXBGaWxlLkdQQkZfREFUQV9ERVNDUklQVE9SX0ZMQUc7CisgICAgICAgIGludCBmbGFncyA9IChtZXRob2QgPT0gU1RPUkVEKSA/IDAgOiBaaXBGaWxlLkdQQkZfREFUQV9ERVNDUklQVE9SX0ZMQUc7CiAgICAgICAgIC8vIEphdmEgYWx3YXlzIG91dHB1dHMgVVRGLTggZmlsZW5hbWVzLiAoQmVmb3JlIEphdmEgNywgdGhlIFJJIGRpZG4ndCBzZXQgdGhpcyBmbGFnIGFuZCB1c2VkCiAgICAgICAgIC8vIG1vZGlmaWVkIFVURi04LiBGcm9tIEphdmEgNywgaXQgc2V0cyB0aGlzIGZsYWcgYW5kIHVzZXMgbm9ybWFsIFVURi04LikKICAgICAgICAgZmxhZ3MgfD0gWmlwRmlsZS5HUEJGX1VURjhfRkxBRzsKICAgICAgICAgd3JpdGVMb25nKG91dCwgTE9DU0lHKTsgLy8gRW50cnkgaGVhZGVyCiAgICAgICAgIHdyaXRlU2hvcnQob3V0LCBaSVBMb2NhbEhlYWRlclZlcnNpb25OZWVkZWQpOyAvLyBFeHRyYWN0aW9uIHZlcnNpb24KICAgICAgICAgd3JpdGVTaG9ydChvdXQsIGZsYWdzKTsKLSAgICAgICAgd3JpdGVTaG9ydChvdXQsIGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSk7CisgICAgICAgIHdyaXRlU2hvcnQob3V0LCBtZXRob2QpOwogICAgICAgICBpZiAoY3VycmVudEVudHJ5LmdldFRpbWUoKSA9PSAtMSkgewogICAgICAgICAgICAgY3VycmVudEVudHJ5LnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICAgICAgICB9CiAgICAgICAgIHdyaXRlU2hvcnQob3V0LCBjdXJyZW50RW50cnkudGltZSk7CiAgICAgICAgIHdyaXRlU2hvcnQob3V0LCBjdXJyZW50RW50cnkubW9kRGF0ZSk7CiAKLSAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5nZXRNZXRob2QoKSA9PSBTVE9SRUQpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50RW50cnkuc2l6ZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5zaXplID0gY3VycmVudEVudHJ5LmNvbXByZXNzZWRTaXplOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuY29tcHJlc3NlZFNpemUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuY29tcHJlc3NlZFNpemUgPSBjdXJyZW50RW50cnkuc2l6ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZCA9PSBTVE9SRUQpIHsKICAgICAgICAgICAgIHdyaXRlTG9uZyhvdXQsIGN1cnJlbnRFbnRyeS5jcmMpOwogICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgY3VycmVudEVudHJ5LnNpemUpOwogICAgICAgICAgICAgd3JpdGVMb25nKG91dCwgY3VycmVudEVudHJ5LnNpemUpOwpAQCAtMzQ0LDE2ICszNDQsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGNvZGUgWmlwRmlsZX0gY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tZW50Ci0gICAgICogICAgICAgICAgICB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCisgICAgICogU2V0cyB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29tbWVudCBpcyA+PSA2NCBLaSBVVEYtOCBieXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIGlmIChjb21tZW50Lmxlbmd0aCgpID4gMHhGRkZGKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21tZW50IHRvbyBsb25nOiAiICsgY29tbWVudC5sZW5ndGgoKSArICIgY2hhcmFjdGVycyIpOworICAgICAgICBpZiAoY29tbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1lbnRCeXRlcyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKworICAgICAgICBieXRlW10gbmV3Q29tbWVudEJ5dGVzID0gY29tbWVudC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIGlmIChuZXdDb21tZW50Qnl0ZXMubGVuZ3RoID4gMHhmZmZmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21tZW50IHRvbyBsb25nOiAiICsgbmV3Q29tbWVudEJ5dGVzLmxlbmd0aCArICIgYnl0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbW1lbnRCeXRlcyA9IG5ld0NvbW1lbnRCeXRlczsKICAgICB9CiAKICAgICAvKioKQEAgLTM2NywyNCArMzcxLDIwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGV2ZWwoaW50IGxldmVsKSB7CiAgICAgICAgIGlmIChsZXZlbCA8IERlZmxhdGVyLkRFRkFVTFRfQ09NUFJFU1NJT04gfHwgbGV2ZWwgPiBEZWZsYXRlci5CRVNUX0NPTVBSRVNTSU9OKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgbGV2ZWw6ICIgKyBsZXZlbCk7CiAgICAgICAgIH0KLSAgICAgICAgY29tcHJlc3NMZXZlbCA9IGxldmVsOworICAgICAgICBjb21wcmVzc2lvbkxldmVsID0gbGV2ZWw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIGJlIHVzZWQgd2hlbiBjb21wcmVzc2luZyBlbnRyeSBkYXRhLgotICAgICAqIG1ldGhvZCBtdXN0IGJlIG9uZSBvZiB7QGNvZGUgU1RPUkVEfSAoZm9yIG5vIGNvbXByZXNzaW9uKSBvciB7QGNvZGUKLSAgICAgKiBERUZMQVRFRH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogICAgICAgICAgICB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIHVzZS4KKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIG1ldGhvZCB0byBiZSB1c2VkIHdoZW4gYSB7QGNvZGUgWmlwRW50cnl9IGRvZXNuJ3QKKyAgICAgKiBleHBsaWNpdGx5IHNwZWNpZnkgYSBtZXRob2QuIFNlZSB7QGxpbmsgWmlwRW50cnkjc2V0TWV0aG9kfSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChpbnQgbWV0aG9kKSB7CiAgICAgICAgIGlmIChtZXRob2QgIT0gU1RPUkVEICYmIG1ldGhvZCAhPSBERUZMQVRFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIG1ldGhvZDogIiArIG1ldGhvZCk7CiAgICAgICAgIH0KLSAgICAgICAgY29tcHJlc3NNZXRob2QgPSBtZXRob2Q7CisgICAgICAgIGRlZmF1bHRDb21wcmVzc2lvbk1ldGhvZCA9IG1ldGhvZDsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgd3JpdGVMb25nKE91dHB1dFN0cmVhbSBvcywgbG9uZyBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNDIzLDcgKzQyMyw3IEBACiAgICAgICAgIGNyYy51cGRhdGUoYnVmZmVyLCBvZmZzZXQsIGJ5dGVDb3VudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gaXMgY2xvc2VkIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTWFjLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvY3J5cHRvL01hYy5qYXZhCmluZGV4IDQ2YmUxNDEuLmMyMDg0NTYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9jcnlwdG8vTWFjLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L2NyeXB0by9NYWMuamF2YQpAQCAtMjY1LDcgKzI2NSw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKChvZmZzZXQgPCAwKSB8fCAobGVuIDwgMCkgfHwgKChvZmZzZXQgKyBsZW4pID4gaW5wdXQubGVuZ3RoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IGFyZ3VtZW50cyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IGFyZ3VtZW50cy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnB1dC5sZW5ndGg9IiArIGlucHV0Lmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb2Zmc2V0PSIgKyBvZmZzZXQgKyAiLCBsZW49IiArIGxlbik7CiAgICAgICAgIH0KICAgICAgICAgc3BpSW1wbC5lbmdpbmVVcGRhdGUoaW5wdXQsIG9mZnNldCwgbGVuKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3BhY2thZ2UuaHRtbCBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc0ZDA2Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08aHRtbD4KLSAgPGJvZHk+Ci0gICAgPHA+Ci0gICAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgZmFjdG9yeSBjbGFzc2VzIHRvIGNyZWF0ZSBzb2NrZXRzIGFuZCBzZXJ2ZXItc29ja2V0cy4gVGhpcyBjbGFzc2VzIGNhbiBiZSBzdWJjbGFzc2VkIHRvIGNyZWF0ZSBmYWN0b3JpZXMgZm9yIG90aGVyIGtpbmRzIG9mIHNvY2tldCBmb3IgZXhhbXBsZSB0aGUgU1NMLWNhcGFibGUgc29ja2V0cyBmcm9tIHRoZSBwYWNrYWdlIGphdmF4Lm5ldC5zc2wuCi0gICAgPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0SG9zdG5hbWVWZXJpZmllci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIuamF2YQppbmRleCBlNjhiYWNhLi5mYTExMzcxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EZWZhdWx0SG9zdG5hbWVWZXJpZmllci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyLmphdmEKQEAgLTgwLDcgKzgwLDggQEAKIAogICAgICAgICBpZiAoIWhhc0RucykgewogICAgICAgICAgICAgWDUwMFByaW5jaXBhbCBwcmluY2lwYWwgPSBjZXJ0aWZpY2F0ZS5nZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpOwotICAgICAgICAgICAgU3RyaW5nIGNuID0gbmV3IERpc3Rpbmd1aXNoZWROYW1lUGFyc2VyKHByaW5jaXBhbCkuZmluZCgiY24iKTsKKyAgICAgICAgICAgIC8vIFJGQyAyODE4IGFkdmlzZXMgdXNpbmcgdGhlIG1vc3Qgc3BlY2lmaWMgbmFtZSBmb3IgbWF0Y2hpbmcuCisgICAgICAgICAgICBTdHJpbmcgY24gPSBuZXcgRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXIocHJpbmNpcGFsKS5maW5kTW9zdFNwZWNpZmljKCJjbiIpOwogICAgICAgICAgICAgaWYgKGNuICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdmVyaWZ5SG9zdE5hbWUoaG9zdE5hbWUsIGNuKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0Rpc3Rpbmd1aXNoZWROYW1lUGFyc2VyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9EaXN0aW5ndWlzaGVkTmFtZVBhcnNlci5qYXZhCmluZGV4IGZhOGVkMWIuLmMzYzE2MDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0Rpc3Rpbmd1aXNoZWROYW1lUGFyc2VyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXIuamF2YQpAQCAtMzksNiArMzksOSBAQAogICAgIHByaXZhdGUgY2hhcltdIGNoYXJzOwogCiAgICAgcHVibGljIERpc3Rpbmd1aXNoZWROYW1lUGFyc2VyKFg1MDBQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisgICAgICAgIC8vIFJGQzIyNTMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZ2V0IGF0dHJpYnV0ZXMgaW4gdGhlIHJldmVyc2UKKyAgICAgICAgLy8gb3JkZXIgb2YgdGhlIHVuZGVybHlpbmcgQVNOLjEgZW5jb2RpbmcsIHNvIHRoYXQgdGhlIG1vc3QKKyAgICAgICAgLy8gc2lnbmlmaWNhbnQgdmFsdWVzIG9mIHJlcGVhdGVkIGF0dHJpYnV0ZXMgb2NjdXIgZmlyc3QuCiAgICAgICAgIHRoaXMuZG4gPSBwcmluY2lwYWwuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzIyNTMpOwogICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZG4ubGVuZ3RoKCk7CiAgICAgfQpAQCAtMTk2LDcgKzE5OSw3IEBACiAgICAgICAgICAgICBjYXNlICcrJzoKICAgICAgICAgICAgIGNhc2UgJywnOgogICAgICAgICAgICAgY2FzZSAnOyc6Ci0gICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9yIGNoYXIgaGFzIGJlZWQgZm91bmQKKyAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3IgY2hhciBoYXMgYmVlbiBmb3VuZAogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCBiZWcsIGVuZCAtIGJlZyk7CiAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgLy8gZXNjYXBlZCBjaGFyCkBAIC0yMTYsNyArMjE5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsZW5ndGggfHwgY2hhcnNbcG9zXSA9PSAnLCcgfHwgY2hhcnNbcG9zXSA9PSAnKycKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYXJzW3Bvc10gPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvciBjaGFyIG9yIHRoZSBlbmQgb2YgRE4gaGFzIGJlZWQgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9yIGNoYXIgb3IgdGhlIGVuZCBvZiBETiBoYXMgYmVlbiBmb3VuZAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycywgYmVnLCBjdXIgLSBiZWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM0MCwxMiArMzQzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBETiBhbmQgcmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIGZvciBhbiBhdHRyaWJ1dGUgdHlwZS4KKyAgICAgKiBQYXJzZXMgdGhlIEROIGFuZCByZXR1cm5zIHRoZSBtb3N0IHNpZ25pZmljYW50IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqIGZvciBhbiBhdHRyaWJ1dGUgdHlwZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kLgogICAgICAqCiAgICAgICogQHBhcmFtIGF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlIHR5cGUgdG8gbG9vayBmb3IgKGUuZy4gImNhIikKLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBmaXJzdCBmb3VuZCwgb3IgbnVsbCBpZiBub25lIGZvdW5kCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBmaW5kKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7CisgICAgcHVibGljIFN0cmluZyBmaW5kTW9zdFNwZWNpZmljKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7CiAgICAgICAgIC8vIEluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUuCiAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgIGJlZyA9IDA7CkBAIC0zODAsNiArMzgzLDkgQEAKICAgICAgICAgICAgICAgICBhdHRWYWx1ZSA9IGVzY2FwZWRBVigpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBWYWx1ZXMgYXJlIG9yZGVyZWQgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0IHNwZWNpZmljCisgICAgICAgICAgICAvLyBkdWUgdG8gdGhlIFJGQzIyNTMgZm9ybWF0dGluZy4gU28gdGFrZSB0aGUgZmlyc3QgbWF0Y2gKKyAgICAgICAgICAgIC8vIHdlIHNlZS4KICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVUeXBlLmVxdWFsc0lnbm9yZUNhc2UoYXR0VHlwZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gYXR0VmFsdWU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9IdHRwc1VSTENvbm5lY3Rpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvbi5qYXZhCmluZGV4IDBmMjJmMzguLjk4MDNmM2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvbi5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0h0dHBzVVJMQ29ubmVjdGlvbi5qYXZhCkBAIC00NCw3ICs0NCw4IEBACiAgKiA8cD5Gb3IgZXhhbXBsZSwgdG8gdHJ1c3QgYSBzZXQgb2YgY2VydGlmaWNhdGVzIHNwZWNpZmllZCBieSBhIHtAY29kZSBLZXlTdG9yZX06CiAgKiA8cHJlPiAgIHtAY29kZQogICogICBLZXlTdG9yZSBrZXlTdG9yZSA9IC4uLjsKLSAqICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgKiAgIFN0cmluZyBhbGdvcml0aG0gPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKKyAqICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CiAgKiAgIHRtZi5pbml0KGtleVN0b3JlKTsKICAqCiAgKiAgIFNTTENvbnRleHQgY29udGV4dCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMUyIpOwpAQCAtNzcsNyArNzgsOCBAQAogICogPHA+Rm9yIGV4YW1wbGUsIHRvIHN1cHBseSBjbGllbnQgY2VydGlmaWNhdGVzIGZyb20gYSB7QGNvZGUgS2V5U3RvcmV9OgogICogPHByZT4gICB7QGNvZGUKICAqICAgS2V5U3RvcmUga2V5U3RvcmUgPSAuLi47Ci0gKiAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgKiAgIFN0cmluZyBhbGdvcml0aG0gPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCk7CisgKiAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CiAgKiAgIGttZi5pbml0KGtleVN0b3JlKTsKICAqCiAgKiAgIFNTTENvbnRleHQgY29udGV4dCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMUyIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL0tleU1hbmFnZXJGYWN0b3J5LmphdmEKaW5kZXggMGIzZGI2MS4uZWYwODVlNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvS2V5TWFuYWdlckZhY3RvcnkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyRmFjdG9yeS5qYXZhCkBAIC00MCw2ICs0MCw5IEBACiAgICAgLy8gU3RvcmUgZGVmYXVsdCBwcm9wZXJ0eSBuYW1lCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAic3NsLktleU1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobSI7CiAKKyAgICAvLyBEZWZhdWx0IHZhbHVlIG9mIEtleU1hbmFnZXJGYWN0b3J5IHR5cGUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJPUEVSVFkgPSAiUEtJWCI7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGtleSBtYW5hZ2VyIGZhY3RvcnkgYWxnb3JpdGhtIG5hbWUuCiAgICAgICogPHA+CkBAIC00OSw3ICs1Miw4IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0QWxnb3JpdGhtKCkgewotICAgICAgICByZXR1cm4gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSk7CisgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShQUk9QRVJUWV9OQU1FKTsKKyAgICAgICAgcmV0dXJuIChhbGdvcml0aG0gIT0gbnVsbCA/IGFsZ29yaXRobSA6IERFRkFVTFRfUFJPUEVSVFkpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uLmphdmEKaW5kZXggYmI1YmQ2NC4uY2RkNDY3YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiBwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CiAKIC8qKgotICogVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBpZGVudGl0eSBvZiBhIHBlZXIgaGFzIG5vdCBiZWVkCisgKiBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlIGlkZW50aXR5IG9mIGEgcGVlciBoYXMgbm90IGJlZW4KICAqIHZlcmlmaWVkLgogICovCiBwdWJsaWMgY2xhc3MgU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb24gZXh0ZW5kcyBTU0xFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeS5qYXZhCmluZGV4IGJlOWRiMDYuLjcyMDIzZjUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTM4LDcgKzM4LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW5naW5lIEVOR0lORSA9IG5ldyBFbmdpbmUoU0VSVklDRSk7CiAKICAgICAvLyBTdG9yZSBkZWZhdWx0IHByb3BlcnR5IG5hbWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlOQU1FID0gInNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAic3NsLlRydXN0TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtIjsKKworICAgIC8vIERlZmF1bHQgdmFsdWUgb2YgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0eXBlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST1BFUlRZID0gIlBLSVgiOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZSBmb3IgdGhlIHtAY29kZSBUcnVzdE1hbmFnZXJGYWN0b3J5fS4gVGhlCkBAIC00OCw3ICs1MSw4IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBhbGdvcml0aG0gbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0QWxnb3JpdGhtKCkgewotICAgICAgICByZXR1cm4gU2VjdXJpdHkuZ2V0UHJvcGVydHkoUFJPUEVSVFlOQU1FKTsKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KFBST1BFUlRZX05BTUUpOworICAgICAgICByZXR1cm4gKGFsZ29yaXRobSAhPSBudWxsID8gYWxnb3JpdGhtIDogREVGQVVMVF9QUk9QRVJUWSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL2RhdGF0eXBlL0RhdGF0eXBlRmFjdG9yeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9kYXRhdHlwZS9EYXRhdHlwZUZhY3RvcnkuamF2YQppbmRleCA2ODI5MWI2Li4yOWNmNDkwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL2RhdGF0eXBlL0RhdGF0eXBlRmFjdG9yeS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvZGF0YXR5cGUvRGF0YXR5cGVGYWN0b3J5LmphdmEKQEAgLTUwLDYgKzUwLDggQEAKICAqICAgIDwvbGk+CiAgKiA8L29sPgogICoKKyAqIDxwPk5vdGUgdGhhdCB5b3UgbXVzdCBzdXBwbHkgeW91ciBvd24gaW1wbGVtZW50YXRpb24gKHN1Y2ggYXMgWGVyY2VzKTsgQW5kcm9pZCBkb2VzIG5vdCBzaGlwIHdpdGggYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICoKICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOkpvc2VwaC5GaWFsbGlAU3VuLkNPTSI+Sm9zZXBoIEZpYWxsaTwvYT4KICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOkplZmYuU3V0dG9yQFN1bi5jb20iPkplZmYgU3V0dG9yPC9hPgogICogQHZlcnNpb24gJFJldmlzaW9uOiA4ODQ5NTAgJCwgJERhdGU6IDIwMDktMTEtMjcgMTA6NDY6MTggLTA4MDAgKEZyaSwgMjcgTm92IDIwMDkpICQKQEAgLTg0LDYgKzg2LDcgQEAKICAgICAgKgogICAgICAqIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiByZXNvbHV0aW9uIG1lY2hhbmlzbXMgYXJlIDxhIGhyZWY9IiNEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UiPmRlZmluZWQ8L2E+IGluIHRoaXMKICAgICAgKiA8Y29kZT5DbGFzczwvY29kZT4ncyBkb2N1bWVudGF0aW9uLjwvcD4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgeW91IG11c3Qgc3VwcGx5IHlvdXIgb3duIGltcGxlbWVudGF0aW9uIChzdWNoIGFzIFhlcmNlcyk7IEFuZHJvaWQgZG9lcyBub3Qgc2hpcCB3aXRoIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgKgogICAgICAqIEByZXR1cm4gTmV3IGluc3RhbmNlIG9mIGEgPGNvZGU+RG9jdW1lbnRCdWlsZGVyRmFjdG9yeTwvY29kZT4KICAgICAgKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9kYXRhdHlwZS9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL2RhdGF0eXBlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODUzMy4uMDAwMDAwMAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL2RhdGF0eXBlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCA1NDE5MzkgMjAwNy0wNS0yNiAyMToxMDo1MlogbXJnbGF2YXMgJCAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCi0JPGhlYWQ+Ci0JCTx0aXRsZT5qYXZheC54bWwuZGF0YXR5cGU8L3RpdGxlPgotCi0JCTxtZXRhIG5hbWU9IkBhdXRob3IiIGNvbnRlbnQ9Im1haWx0bzpKZWZmLlN1dHRvckBTdW4uY29tIiAvPgotCQk8bWV0YSBuYW1lPSJAdmVyc2lvbiIgY29udGVudD0iJFJldmlzaW9uOiA1NDE5MzkgJCwgJERhdGU6IDIwMDctMDUtMjYgMTQ6MTA6NTIgLTA3MDAgKFNhdCwgMjYgTWF5IDIwMDcpICQiIC8+Ci0JCTxtZXRhIG5hbWU9IkBzZWUiIGNvbnRlbnQ9JzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSI+VzNDIFhNTCBTY2hlbWEgMS4wIFBhcnQgMiwgU2VjdGlvbiAzLjIuNy0xNDwvYT4nIC8+Ci0JCTxtZXRhIG5hbWU9IkBzZWUiIGNvbnRlbnQ9JzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoLWRhdGFtb2RlbC8jZGF5VGltZUR1cmF0aW9uIj5YUXVlcnkgMS4wIGFuZCBYUGF0aCAyLjAgRGF0YSBNb2RlbCwgeGR0OmRheVRpbWVEdXJhdGlvbjwvYT4nIC8+Ci0JCTxtZXRhIG5hbWU9IkBzZWUiIGNvbnRlbnQ9JzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoLWRhdGFtb2RlbC8jeWVhck1vbnRoRHVyYXRpb24iPlhRdWVyeSAxLjAgYW5kIFhQYXRoIDIuMCBEYXRhIE1vZGVsLCB4ZHQ6eWVhck1vbnRoRHVyYXRpb248L2E+JyAvPgotCQk8bWV0YSBuYW1lPSJAc2luY2UiIGNvbnRlbnQ9IjEuNSIgLz4KLQk8L2hlYWQ+Ci0KLQk8Ym9keT4KLQotCQk8cD5YTUwvSmF2YSBUeXBlIE1hcHBpbmdzLjwvcD4KLQkJCi0JCTxwPlRoZSA8Y29kZT5qYXZheC54bWwuZGF0YXR5cGU8L2NvZGU+IEFQSSBwcm92aWRlcyBYTUwvSmF2YSB0eXBlIG1hcHBpbmdzLjwvcD4KLQkJCi0JCTxwPlRoZSBmb2xsb3dpbmcgWE1MIHN0YW5kYXJkcyBhcHBseTo8L3A+Ci0JCTx1bD4KLQkJCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiPlczQyBYTUwgU2NoZW1hIDEuMCBQYXJ0IDIsIFNlY3Rpb24gMy4yLjctMTQ8L2E+PC9saT4KLQkJCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aC1kYXRhbW9kZWwvI2RheVRpbWVEdXJhdGlvbiI+WFF1ZXJ5IDEuMCBhbmQgWFBhdGggMi4wIERhdGEgTW9kZWwsIHhkdDpkYXlUaW1lRHVyYXRpb248L2E+PC9saT4KLQkJCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aC1kYXRhbW9kZWwvI3llYXJNb250aER1cmF0aW9uIj5YUXVlcnkgMS4wIGFuZCBYUGF0aCAyLjAgRGF0YSBNb2RlbCwgeGR0OnllYXJNb250aER1cmF0aW9uPC9hPjwvbGk+Ci0JCTwvdWw+Ci0KLQkJPGhyIC8+Ci0JCQotCQk8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiI+Ci0JCQk8dGhlYWQ+Ci0JCQkJPHRyPgotCQkJCQk8dGg+VzNDIFhNTCBTY2hlbWEgRGF0YSBUeXBlPC90aD4KLQkJCQkJPHRoPkphdmEgRGF0YSBUeXBlPC90aD4KLQkJCQk8L3RyPgotCQkJPC90aGVhZD4KLQkJCQotCQkJPHRib2R5PgotCQkJCTx0cj4KLQkJCQkJPHRkPnhzOmRhdGU8L3RkPgotCQkJCQk8dGQ+e0BsaW5rIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcn08L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+eHM6ZGF0ZVRpbWU8L3RkPgotCQkJCQk8dGQ+e0BsaW5rIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcn08L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+eHM6ZHVyYXRpb248L3RkPgotCQkJCQk8dGQ+e0BsaW5rIGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbn08L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+eHM6Z0RheTwvdGQ+Ci0JCQkJCTx0ZD57QGxpbmsgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyfTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZD54czpnTW9udGggPC90ZD4KLQkJCQkJPHRkPntAbGluayBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXJ9PC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkPnhzOmdNb250aERheTwvdGQ+Ci0JCQkJCTx0ZD57QGxpbmsgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyfTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZD54czpnWWVhcjwvdGQ+Ci0JCQkJCTx0ZD57QGxpbmsgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyfTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZD54czpnWWVhck1vbnRoPC90ZD4KLQkJCQkJPHRkPntAbGluayBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXJ9PC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkPnhzOnRpbWU8L3RkPgotCQkJCQk8dGQ+e0BsaW5rIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcn08L3RkPgotCQkJCTwvdHI+Ci0JCQkJCi0JCQk8L3Rib2R5PgotCQk8L3RhYmxlPgotCQkKLQkJPGhyIC8+Ci0JCQotCQkKLQkJPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiPgotCQkJPHRoZWFkPgotCQkJCTx0cj4KLQkJCQkJPHRoPlhRdWVyeSAxLjAgYW5kIFhQYXRoIDIuMCBEYXRhIE1vZGVsPC90aD4KLQkJCQkJPHRoPkphdmEgRGF0YSBUeXBlPC90aD4KLQkJCQk8L3RyPgotCQkJPC90aGVhZD4KLQkJCQotCQkJPHRib2R5PgotCQkJCTx0cj4KLQkJCQkJPHRkPnhkdDpkYXlUaW1lRHVyYXRpb248L3RkPgotCQkJCQk8dGQ+e0BsaW5rIGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbn08L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+eGR0OnllYXJNb250aER1cmF0aW9uPC90ZD4KLQkJCQkJPHRkPntAbGluayBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb259PC90ZD4KLQkJCQk8L3RyPgotCQkJPC90Ym9keT4KLQkJPC90YWJsZT4KLQkJCi0JCTxociAvPgotCQkKLQkJPHA+Ci0JCQlXM0MgWE1MIFNjaGVtYSBkYXRhIHR5cGVzIHRoYXQgaGF2ZSBhICI8ZW0+bmF0dXJhbDwvZW0+IiBtYXBwaW5nIHRvIEphdmEgdHlwZXMgYXJlIGRlZmluZWQgYnkKLQkJCUpTUiAzMTogSmF2YSZ0cmFkZTsgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQikgU3BlY2lmaWNhdGlvbiwgQmluZGluZyBYTUwgU2NoZW1hIHRvIEphdmEgUmVwcmVzZW50YXRpb25zLgotCQkJSkFYQiBkZWZpbmVkIG1hcHBpbmdzIGZvciBYTUwgU2NoZW1hIGJ1aWx0LWluIGRhdGEgdHlwZXMgaW5jbHVkZToKLQkJPC9wPgotCQk8dWw+Ci0JCQk8bGk+eHM6YW55U2ltcGxlVHlwZTwvbGk+Ci0JCQk8bGk+eHM6YmFzZTY0QmluYXJ5PC9saT4KLQkJCTxsaT54czpib29sZWFuPC9saT4KLQkJCTxsaT54czpieXRlPC9saT4KLQkJCTxsaT54czpkZWNpbWFsPC9saT4KLQkJCTxsaT54czpkb3VibGU8L2xpPgotCQkJPGxpPnhzOmZsb2F0PC9saT4KLQkJCTxsaT54czpoZXhCaW5hcnk8L2xpPgotCQkJPGxpPnhzOmludDwvbGk+Ci0JCQk8bGk+eHM6aW50ZWdlcjwvbGk+Ci0JCQk8bGk+eHM6bG9uZzwvbGk+Ci0JCQk8bGk+eHM6UU5hbWU8L2xpPgotCQkJPGxpPnhzOnNob3J0PC9saT4KLQkJCTxsaT54czpzdHJpbmc8L2xpPgotCQkJPGxpPnhzOnVuc2lnbmVkQnl0ZTwvbGk+Ci0JCQk8bGk+eHM6dW5zaWduZWRJbnQ8L2xpPgotCQkJPGxpPnhzOnVuc2lnbmVkU2hvcnQ8L2xpPgotCQk8L3VsPgotCQkKLQkJPGhyIC8+Ci0JCQotCi0JCTx1bD4KLQkJCTxsaT5BdXRob3IgPGEgaHJlZj0ibWFpbHRvOkplZmYuU3V0dG9yQFN1bi5jb20iPkplZmYgU3V0dG9yPC9hPjwvbGk+Ci0JCQk8bGk+U2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSI+VzNDIFhNTCBTY2hlbWEgMS4wIFBhcnQgMiwgU2VjdGlvbiAzLjIuNy0xNDwvYT48L2xpPgotCQkJPGxpPlNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aC1kYXRhbW9kZWwvI2RheVRpbWVEdXJhdGlvbiI+WFF1ZXJ5IDEuMCBhbmQgWFBhdGggMi4wIERhdGEgTW9kZWwsIHhkdDpkYXlUaW1lRHVyYXRpb248L2E+PC9saT4KLQkJCTxsaT5TZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgtZGF0YW1vZGVsLyN5ZWFyTW9udGhEdXJhdGlvbiI+WFF1ZXJ5IDEuMCBhbmQgWFBhdGggMi4wIERhdGEgTW9kZWwsIHhkdDp5ZWFyTW9udGhEdXJhdGlvbjwvYT48L2xpPgotCQkJPGxpPlNpbmNlIDEuNTwvbGk+Ci0JCTwvdWw+Ci0JCQotCQk8aHIgLz4KLQkJCi0KLQk8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL25hbWVzcGFjZS9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL25hbWVzcGFjZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Mjk2ZjcuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC9uYW1lc3BhY2UvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgJElkOiBwYWNrYWdlLmh0bWwgMjI2MTg3IDIwMDUtMDQtMTEgMDc6MDI6MDJaIG5lZXJhaiAkCi0tLT4KLQotPCFET0NUWVBFIGh0bWwKLSAgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLTxoZWFkPgotICA8dGl0bGU+amF2YXgueG1sLm5hbWVzcGFjZTwvdGl0bGU+Ci0KLSAgPG1ldGEgbmFtZT0iQ1ZTIgotICAgICAgICBjb250ZW50PSIkSWQ6IHBhY2thZ2UuaHRtbCAyMjYxODcgMjAwNS0wNC0xMSAwNzowMjowMlogbmVlcmFqICQiIC8+Ci0gIDxtZXRhIG5hbWU9IkFVVEhPUiIKLSAgICAgICAgY29udGVudD0iSmVmZi5TdXR0b3JAU3VuLmNvbSIgLz4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxwPlhNTCBOYW1lc3BhY2UgcHJvY2Vzc2luZy48L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgWE1MIHN0YW5kYXJkcyBhcHBseTo8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiPlhNTCBTY2hlbWEgUGFydDI6IERhdGF0eXBlcyBzcGVjaWZpY2F0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNucy1xdWFsbmFtZXMiPk5hbWVzcGFjZXMgaW4gWE1MPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwveG1sLW5hbWVzLTE5OTkwMTE0LWVycmF0YSI+TmFtZXNwYWNlcyBpbiBYTUwgRXJyYXRhPC9hPjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhY2thZ2UuaHRtbCBiL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q4MzE4Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08aHRtbD4KLSAgPGJvZHk+Ci0gICAgPHA+Ci0gICAgICBQcm92aWRlcyBhIHV0aWxpdHkgY2xhc3Mgd2l0aCB1c2VmdWwgWE1MIGNvbnN0YW50cy4KLSAgICA8L3A+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3BhcnNlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmUwOWQ1Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvcGFyc2Vycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08SFRNTD48SEVBRD4KLTwhLS0KLSAgICAkSWQ6IHBhY2thZ2UuaHRtbCAyMjYxODMgMjAwNS0wNC0wOCAxMDozOToxNFogbmVlcmFqICQKLS0tPgotCi08L0hFQUQ+PEJPRFk+Ci0KLVByb3ZpZGVzIGNsYXNzZXMgYWxsb3dpbmcgdGhlIHByb2Nlc3Npbmcgb2YgWE1MIGRvY3VtZW50cy4gVHdvIHR5cGVzCi1vZiBwbHVnYWJsZSBwYXJzZXJzIGFyZSBzdXBwb3J0ZWQ6Ci08dWw+Ci08bGk+U0FYIChTaW1wbGUgQVBJIGZvciBYTUwpCi08bGk+RE9NIChEb2N1bWVudCBPYmplY3QgTW9kZWwpCi08L3VsPgotCi0KLQotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL2RvbS9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3RyYW5zZm9ybS9kb20vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjdlNzcxLi4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL2RvbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTx0aXRsZT5qYXZheC54bWwudHJhbnNmb3JtLmRvbTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIERPTS1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbiBBUElzLjwvcD4KLTxwPlRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlfSBjbGFzcyBhbGxvd3MgdGhlCi1jbGllbnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgQVBJIHRvIHNwZWNpZnkgYSBET00KLXtAbGluayBvcmcudzNjLmRvbS5Ob2RlfSBhcyB0aGUgc291cmNlIG9mIHRoZSBpbnB1dCB0cmVlLiBUaGUgbW9kZWwgb2YKLWhvdyB0aGUgVHJhbnNmb3JtZXIgZGVhbHMgd2l0aCB0aGUgRE9NIHRyZWUgaW4gdGVybXMgb2YgbWlzbWF0Y2hlcyB3aXRoIHRoZQotPEEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCNkYXRhLW1vZGVsIj5YU0xUIGRhdGEgbW9kZWw8L0E+IG9yCi1vdGhlciBkYXRhIG1vZGVscyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuIEFueSBvZiB0aGUgbm9kZXMKLWRlcml2ZWQgZnJvbSB7QGxpbmsgb3JnLnczYy5kb20uTm9kZX0gYXJlIGxlZ2FsIGlucHV0LjwvcD4KLTxwPlRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0fSBjbGFzcyBhbGxvd3MKLWEge0BsaW5rIG9yZy53M2MuZG9tLk5vZGV9IHRvIGJlIHNwZWNpZmllZCB0byB3aGljaCByZXN1bHQgRE9NIG5vZGVzIHdpbGwKLWJlIGFwcGVuZGVkLiBJZiBhbiBvdXRwdXQgbm9kZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgdHJhbnNmb3JtZXIgd2lsbCB1c2UKLXtAbGluayBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIjbmV3RG9jdW1lbnR9IHRvIGNyZWF0ZSBhbgotb3V0cHV0IHtAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudH0gbm9kZS4gSWYgYSBub2RlIGlzIHNwZWNpZmllZCwgaXQKLXNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50fSwKLXtAbGluayBvcmcudzNjLmRvbS5FbGVtZW50fSwgb3IKLXtAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50fS4gU3BlY2lmaWNhdGlvbiBvZiBhbnkgb3RoZXIgbm9kZQotdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgYW5kIHVuZGVmaW5lZCBieSB0aGlzIEFQSS4gSWYgdGhlIHJlc3VsdCBpcyBhCi17QGxpbmsgb3JnLnczYy5kb20uRG9jdW1lbnR9LCB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGhhdmUKLWEgc2luZ2xlIGVsZW1lbnQgcm9vdCB0byBzZXQgYXMgdGhlIGRvY3VtZW50IGVsZW1lbnQuPC9wPgotPHA+VGhlIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Mb2NhdG9yfSBub2RlIG1heSBiZSBwYXNzZWQKLXRvIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9ufSBvYmplY3RzLCBhbmQKLXJldHJpZXZlZCBieSB0cnlpbmcgdG8gY2FzdCB0aGUgcmVzdWx0IG9mIHRoZQote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24jZ2V0TG9jYXRvcigpfSBtZXRob2QuCi1UaGUgaW1wbGVtZW50YXRpb24gaGFzIG5vIHJlc3BvbnNpYmlsaXR5IHRvIHVzZSBhIERPTUxvY2F0b3IgaW5zdGVhZCBvZiBhCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yfSAodGhvdWdoIGxpbmUgbnVtYmVycyBhbmQgdGhlCi1saWtlIGRvIG5vdCBtYWtlIG11Y2ggc2Vuc2UgZm9yIGEgRE9NKSwgc28gdGhlIHJlc3VsdCBvZiBnZXRMb2NhdG9yIG11c3QgYWx3YXlzCi1iZSB0ZXN0ZWQgd2l0aCBhbiBpbnN0YW5jZW9mLiA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3RyYW5zZm9ybS9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3RyYW5zZm9ybS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDhjN2MuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC90cmFuc2Zvcm0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCAyMjYxODMgMjAwNS0wNC0wOCAxMDozOToxNFogbmVlcmFqICQgLS0+Ci0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPHRpdGxlPmphdmF4LnhtbC50cmFuc2Zvcm08L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxwPlRoaXMgcGFja2FnZSBkZWZpbmVzIHRoZSBnZW5lcmljIEFQSXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNmb3JtYXRpb24KLWluc3RydWN0aW9ucywgYW5kIHBlcmZvcm1pbmcgYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHNvdXJjZSB0byByZXN1bHQuIFRoZXNlCi1pbnRlcmZhY2VzIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIFNBWCBvciB0aGUgRE9NIHN0YW5kYXJkLCBhbmQgdHJ5IHRvIG1ha2UgYXMKLWZldyBhc3N1bXB0aW9ucyBhcyBwb3NzaWJsZSBhYm91dCB0aGUgZGV0YWlscyBvZiB0aGUgc291cmNlIGFuZCByZXN1bHQgb2YgYQotdHJhbnNmb3JtYXRpb24uIEl0IGFjaGlldmVzIHRoaXMgYnkgZGVmaW5pbmcKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZX0gYW5kCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHR9IGludGVyZmFjZXMuCi08L3A+Ci0KLTxwPlRvIGRlZmluZSBjb25jcmV0ZSBjbGFzc2VzIGZvciB0aGUgdXNlciwgdGhlIEFQSSBkZWZpbmVzIHNwZWNpYWxpemF0aW9ucwotb2YgdGhlIGludGVyZmFjZXMgZm91bmQgYXQgdGhlIHJvb3QgbGV2ZWwuIFRoZXNlIGludGVyZmFjZXMgYXJlIGZvdW5kIGluCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXh9LCB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5kb219LAotYW5kIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbX0uCi08L3A+Ci0KLQotPGgzPkNyZWF0aW5nIE9iamVjdHM8L2gzPgotCi08cD5UaGUgQVBJIGFsbG93cyBhIGNvbmNyZXRlCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnl9IG9iamVjdCB0byBiZSBjcmVhdGVkIGZyb20KLXRoZSBzdGF0aWMgZnVuY3Rpb24KLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdJbnN0YW5jZX0uCi08L3A+Ci0KLQotPGgzPlNwZWNpZmljYXRpb24gb2YgSW5wdXRzIGFuZCBPdXRwdXRzPC9oMz4KLQotPHA+VGhpcyBBUEkgZGVmaW5lcyB0d28gaW50ZXJmYWNlIG9iamVjdHMgY2FsbGVkCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2V9IGFuZAote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0fS4gSW4gb3JkZXIgdG8gcGFzcyBTb3VyY2UgYW5kIFJlc3VsdAotb2JqZWN0cyB0byB0aGUgaW50ZXJmYWNlcywgY29uY3JldGUgY2xhc3NlcyBtdXN0IGJlIHVzZWQuCi1UaHJlZSBjb25jcmV0ZSByZXByZXNlbnRhdGlvbnMgYXJlIGRlZmluZWQgZm9yIGVhY2ggb2YgdGhlc2UKLW9iamVjdHM6Ci17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlfSBhbmQKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHR9LAote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZX0gYW5kCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0fSwgYW5kCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlfSBhbmQKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHR9LiBFYWNoIG9mIHRoZXNlIG9iamVjdHMgZGVmaW5lcwotYSBGRUFUVVJFIHN0cmluZyAod2hpY2ggaXMgaSB0aGUgZm9ybSBvZiBhIFVSTCksIHdoaWNoIGNhbiBiZSBwYXNzZWQgaW50bwote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9IHRvIHNlZSBpZiB0aGUKLWdpdmVuIHR5cGUgb2YgU291cmNlIG9yIFJlc3VsdCBvYmplY3QgaXMgc3VwcG9ydGVkLiBGb3IgaW5zdGFuY2UsIHRvIHRlc3QgaWYgYQotRE9NU291cmNlIGFuZCBhIFN0cmVhbVJlc3VsdCBpcyBzdXBwb3J0ZWQsIHlvdSBjYW4gYXBwbHkgdGhlIGZvbGxvd2luZwotdGVzdC4KLTwvcD4KLQotPHByZT4KLTxjb2RlPgotVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci1pZiAodGZhY3RvcnkuZ2V0RmVhdHVyZShET01Tb3VyY2UuRkVBVFVSRSkgJmFtcDsmYW1wOyB0ZmFjdG9yeS5nZXRGZWF0dXJlKFN0cmVhbVJlc3VsdC5GRUFUVVJFKSkgewotLi4uCi19Ci08L2NvZGU+Ci08L3ByZT4KLQotCi08aDM+Ci08YSBuYW1lPSJxbmFtZS1kZWxpbWl0ZXIiPlF1YWxpZmllZCBOYW1lIFJlcHJlc2VudGF0aW9uPC9hPgotPC9oMz4KLQotPHA+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcyI+TmFtZXNwYWNlczwvYT4KLXByZXNlbnQgc29tZXRoaW5nIG9mIGEgcHJvYmxlbSBhcmVhIHdoZW4gZGVhbGluZyB3aXRoIFhNTCBvYmplY3RzLiBRdWFsaWZpZWQKLU5hbWVzIGFwcGVhciBpbiBYTUwgbWFya3VwIGFzIHByZWZpeGVkIG5hbWVzLiBCdXQgdGhlIHByZWZpeGVzIHRoZW1zZWx2ZXMgZG8KLW5vdCBob2xkIGlkZW50aXR5LiBSYXRoZXIsIGl0IGlzIHRoZSBVUklzIHRoYXQgdGhleSBjb250ZXh0dWFsbHkgbWFwIHRvIHRoYXQKLWhvbGQgdGhlIGlkZW50aXR5LiBUaGVyZWZvcmUsIHdoZW4gcGFzc2luZyBhIFF1YWxpZmllZCBOYW1lIGxpa2UgInh5ejpmb28iCi1hbW9uZyBKYXZhIHByb2dyYW1zLCBvbmUgbXVzdCBwcm92aWRlIGEgbWVhbnMgdG8gbWFwICJ4eXoiIHRvIGEgbmFtZXNwYWNlLgotPC9wPgotCi08cD5PbmUgc29sdXRpb24gaGFzIGJlZW4gdG8gY3JlYXRlIGEgIlFOYW1lIiBvYmplY3QgdGhhdCBob2xkcyB0aGUKLW5hbWVzcGFjZSBVUkksIGFzIHdlbGwgYXMgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBhbgotb3B0aW1hbCBzb2x1dGlvbiwgYXMgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHVzZSB1bmlxdWUgc3RyaW5ncyBhcyBrZXlzCi1pbiBhIGRpY3Rpb25hcnkgb2JqZWN0LiBOb3QgaGF2aW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFsc28gbWFrZXMgaXQKLWRpZmZpY3VsdCB0byBzcGVjaWZ5IGEgbmFtZXNwYWNlZCBpZGVudGl0eSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGFuIFhNTAotZG9jdW1lbnQuCi08L3A+Ci0KLTxwPkluIG9yZGVyIHRvIHBhc3MgbmFtZXNwYWNlZCB2YWx1ZXMgdG8gdHJhbnNmb3JtYXRpb25zLAotZm9yIAotaW5zdGFuY2Ugd2hlbiBzZXR0aW5nIGEgcHJvcGVydHkgb3IgYSBwYXJhbWV0ZXIgb24gYSAKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyfSBvYmplY3QsCi10aGlzIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGF0IGEKLVN0cmluZyAicW5hbWUiIG9iamVjdCBwYXJhbWV0ZXIgYmUgcGFzc2VkIGFzIHR3by1wYXJ0IHN0cmluZywgdGhlIG5hbWVzcGFjZSBVUkkKLWVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcyAoe30pLCBmb2xsb3dlZCBieSB0aGUgbG9jYWwgbmFtZS4gSWYgdGhlIHFuYW1lIGhhcyBhCi1udWxsIFVSSSwgdGhlbiB0aGUgU3RyaW5nIG9iamVjdCBvbmx5IGNvbnRhaW5zIHRoZSBsb2NhbCBuYW1lLiBBbiBhcHBsaWNhdGlvbgotY2FuIHNhZmVseSBjaGVjayBmb3IgYSBub24tbnVsbCBVUkkgYnkgdGVzdGluZyB0byBzZWUgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgotdGhlIG5hbWUgaXMgYSAneycgY2hhcmFjdGVyLgotPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgaWYgYSBVUkkgYW5kIGxvY2FsIG5hbWUgd2VyZSBvYnRhaW5lZCBmcm9tIGFuIGVsZW1lbnQKLWRlZmluZWQgd2l0aCAmbHQ7eHl6OmZvbyB4bWxuczp4eXo9Imh0dHA6Ly94eXouZm9vLmNvbS95YWRhL2Jhei5odG1sIi8mZ3Q7LAotdGhlbiB0aGUgUXVhbGlmaWVkIE5hbWUgd291bGQgYmUgIntodHRwOi8veHl6LmZvby5jb20veWFkYS9iYXouaHRtbH1mb28iLgotTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgbG9zdC4KLTwvcD4KLQotCi08aDM+UmVzdWx0IFRyZWUgU2VyaWFsaXphdGlvbjwvaDM+Ci0KLTxwPlNlcmlhbGl6YXRpb24gb2YgdGhlIHJlc3VsdCB0cmVlIHRvIGEgc3RyZWFtIGNhbiBiZSBjb250cm9sbGVkIHdpdGgKLXRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciNzZXRPdXRwdXRQcm9wZXJ0aWVzfSBhbmQgdGhlCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciNzZXRPdXRwdXRQcm9wZXJ0eX0gbWV0aG9kcy4KLVRoZXNlIHByb3BlcnRpZXMgb25seSBhcHBseSB0byBzdHJlYW0gcmVzdWx0cywgdGhleSBoYXZlIG5vIGVmZmVjdCB3aGVuCi10aGUgcmVzdWx0IGlzIGEgRE9NIHRyZWUgb3IgU0FYIGV2ZW50IHN0cmVhbS48L3A+Ci0KLTxwPlN0cmluZ3MgdGhhdCBtYXRjaCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCNvdXRwdXQiPlhTTFQKLXNwZWNpZmljYXRpb24gZm9yIHhzbDpvdXRwdXQgYXR0cmlidXRlczwvYT4gY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGUKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXN9IGNsYXNzLiBPdGhlciBzdHJpbmdzIGNhbiBiZQotc3BlY2lmaWVkIGFzIHdlbGwuCi1JZiB0aGUgdHJhbnNmb3JtZXIgZG9lcyBub3QgcmVjb2duaXplIGFuIG91dHB1dCBrZXksIGEKLXtAbGluayBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24sIHVubGVzcyB0aGUKLWtleSBuYW1lIGlzIDxhIGhyZWY9IiNxbmFtZS1kZWxpbWl0ZXIiPm5hbWVzcGFjZSBxdWFsaWZpZWQ8L2E+LiBPdXRwdXQga2V5IG5hbWVzCi10aGF0IGFyZSBuYW1lc3BhY2UgcXVhbGlmaWVkIGFyZSBhbHdheXMgYWxsb3dlZCwgYWx0aG91Z2ggdGhleSBtYXkgYmUKLWlnbm9yZWQgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMuPC9wPgotCi08cD5JZiBhbGwgdGhhdCBpcyBkZXNpcmVkIGlzIHRoZSBzaW1wbGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gb2YgYQotc291cmNlIHRvIGEgcmVzdWx0LCB0aGVuIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeX0KLXByb3ZpZGVzIGEKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdUcmFuc2Zvcm1lcigpfSBtZXRob2QKLXdpdGggbm8gYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgVHJhbnNmb3JtZXIgdGhhdCBlZmZlY3RpdmVseSBjb3BpZXMKLXRoZSBzb3VyY2UgdG8gdGhlIHJlc3VsdC4gVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGEgRE9NIGZyb20gU0FYCi1ldmVudHMgb3IgdG8gY3JlYXRlIGFuIFhNTCBvciBIVE1MIHN0cmVhbSBmcm9tIGEgRE9NIG9yIFNBWCBldmVudHMuICA8L3A+Ci0KLTxoMz5FeGNlcHRpb25zIGFuZCBFcnJvciBSZXBvcnRpbmc8L2gzPgotCi08cD5UaGUgdHJhbnNmb3JtYXRpb24gQVBJIHRocm93IHRocmVlIHR5cGVzIG9mIHNwZWNpYWxpemVkIGV4Y2VwdGlvbnMuIEEKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcn0gaXMgcGFyYWxsZWwgdG8KLXRoZSB7QGxpbmsgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcn0sIGFuZCBpcyB0aHJvd24KLXdoZW4gYSBjb25maWd1cmF0aW9uIHByb2JsZW0gd2l0aCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGV4aXN0cy4gVGhpcyBlcnJvcgotd2lsbCB0eXBpY2FsbHkgYmUgdGhyb3duIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uIGZhY3RvcnkgY2xhc3Mgc3BlY2lmaWVkIHdpdGgKLXRoZSAiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiIHN5c3RlbSBwcm9wZXJ0eSBjYW5ub3QgYmUgZm91bmQgb3IKLWluc3RhbnRpYXRlZC48L3A+Ci0KLTxwPkEge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9ufQotbWF5IGJlIHRocm93biBpZiBmb3IgYW55IHJlYXNvbiBhIFRyYW5zZm9ybWVyIGNhbiBub3QgYmUgY3JlYXRlZC4gQQotVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IgaW4KLXRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMsIGZvciBleGFtcGxlIHdoZW4KLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSNuZXdUcmFuc2Zvcm1lcn0gaXMKLWNhbGxlZC48L3A+Ci0KLTxwPntAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9ufSBpcyBhIGdlbmVyYWwKLWV4Y2VwdGlvbiB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHRyYW5zZm9ybWF0aW9uLiBBIHRyYW5zZm9ybWVyCi1leGNlcHRpb24gbWF5IHdyYXAgYW5vdGhlciBleGNlcHRpb24sIGFuZCBpZiBhbnkgb2YgdGhlCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNwcmludFN0YWNrVHJhY2UoKX0KLW1ldGhvZHMgYXJlIGNhbGxlZCBvbiBpdCwgaXQgd2lsbCBwcm9kdWNlIGEgbGlzdCBvZiBzdGFjayBkdW1wcywgc3RhcnRpbmcgZnJvbQotdGhlIG1vc3QgcmVjZW50LiBUaGUgdHJhbnNmb3JtZXIgZXhjZXB0aW9uIGFsc28gcHJvdmlkZXMgYQote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcn0gb2JqZWN0IHdoaWNoIGluZGljYXRlcyB3aGVyZQotaW4gdGhlIHNvdXJjZSB0cmVlIG9yIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucyB0aGUgZXJyb3Igb2NjdXJyZWQuCi17QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbiNnZXRNZXNzYWdlQW5kTG9jYXRpb24oKX0KLW1heSBiZSBjYWxsZWQgdG8gZ2V0IGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBsb2NhdGlvbiBpbmZvLCBhbmQKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uI2dldExvY2F0aW9uQXNTdHJpbmcoKX0KLW1heSBiZSBjYWxsZWQgdG8gZ2V0IGp1c3QgdGhlIGxvY2F0aW9uIHN0cmluZy48L3A+Ci0KLTxwPlRyYW5zZm9ybWF0aW9uIHdhcm5pbmdzIGFuZCBlcnJvcnMgYXJlIHNlbnQgdG8gYW4KLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXJ9LCBhdCB3aGljaCBwb2ludCB0aGUKLWFwcGxpY2F0aW9uIG1heSBkZWNpZGUgdG8gcmVwb3J0IHRoZSBlcnJvciBvciB3YXJuaW5nLCBhbmQgbWF5IGRlY2lkZSB0byB0aHJvdwotYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBmb3IgYSBub24tZmF0YWwgZXJyb3IuIFRoZSA8Y29kZT5FcnJvckxpc3RlbmVyPC9jb2RlPiBtYXkgYmUgc2V0IHZpYQote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I3NldEVycm9yTGlzdGVuZXJ9IGZvcgotcmVwb3J0aW5nIGVycm9ycyB0aGF0IGhhdmUgdG8gZG8gd2l0aCBzeW50YXggZXJyb3JzIGluIHRoZSB0cmFuc2Zvcm1hdGlvbgotaW5zdHJ1Y3Rpb25zLCBvciB2aWEKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyI3NldEVycm9yTGlzdGVuZXJ9IHRvIHJlcG9ydAotZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIDxjb2RlPkVycm9yTGlzdGVuZXI8L2NvZGU+IG9uIGJvdGggb2JqZWN0cwotd2lsbCBhbHdheXMgYmUgdmFsaWQgYW5kIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgd2hldGhlciBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIG9yIGEgZGVmYXVsdAotaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHByb2Nlc3Nvci4KLVRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwcm9jZXNzb3Igd2lsbCByZXBvcnQgYWxsIHdhcm5pbmdzIGFuZCBlcnJvcnMgdG8gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4KLWFuZCBkb2VzIG5vdCB0aHJvdyBhbnkgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPnMuCi1BcHBsaWNhdGlvbnMgYXJlIDxlbT5zdHJvbmdseTwvZW0+IGVuY291cmFnZWQgdG8gcmVnaXN0ZXIgYW5kIHVzZQotPGNvZGU+RXJyb3JMaXN0ZW5lcjwvY29kZT5zIHRoYXQgaW5zdXJlIHByb3BlciBiZWhhdmlvciBmb3Igd2FybmluZ3MgYW5kCi1lcnJvcnMuCi08L3A+Ci0KLQotPGgzPlJlc29sdXRpb24gb2YgVVJJcyB3aXRoaW4gYSB0cmFuc2Zvcm1hdGlvbjwvaDM+Ci0KLTxwPlRoZSBBUEkgcHJvdmlkZXMgYSB3YXkgZm9yIFVSSXMgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiB0aGUgc3R5bGVzaGVldAotaW5zdHJ1Y3Rpb25zIG9yIHdpdGhpbiB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIGNhbGxpbmcKLWFwcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGNyZWF0aW5nIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXJ9IGludGVyZmFjZSwgd2l0aCBpdHMgb25lIG1ldGhvZCwKLXtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyI3Jlc29sdmV9LCBhbmQgdXNlIHRoaXMgY2xhc3MgdG8KLXNldCB0aGUgVVJJIHJlc29sdXRpb24gZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMgb3IgdHJhbnNmb3JtYXRpb24KLXdpdGgge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I3NldFVSSVJlc29sdmVyfSBvcgote0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIjc2V0VVJJUmVzb2x2ZXJ9LiBUaGUKLTxjb2RlPlVSSVJlc29sdmVyLnJlc29sdmU8L2NvZGU+IG1ldGhvZCB0YWtlcyB0d28gU3RyaW5nIGFyZ3VtZW50cywgdGhlIFVSSSBmb3VuZCBpbiB0aGUKLXN0eWxlc2hlZXQgaW5zdHJ1Y3Rpb25zIG9yIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MsIGFuZCB0aGUKLWJhc2UgVVJJIAotYWdhaW5zdCB3aGljaCB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBtYWRlIGFic29sdXRlIGlmIHRoZQotYWJzb2x1dGUgVVJJIGlzIHJlcXVpcmVkLgotVGhlIHJldHVybmVkIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZX0gb2JqZWN0IG11c3QgYmUgdXNhYmxlIGJ5Ci10aGUgdHJhbnNmb3JtZXIsIGFzIHNwZWNpZmllZCBpbiBpdHMgaW1wbGVtZW50ZWQgZmVhdHVyZXMuPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL3NheC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBkNzA3Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL3NheC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTx0aXRsZT5qYXZheC54bWwudHJhbnNmb3JtLnNheDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIFNBWDItc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4gSXQgcHJvdmlkZXMKLSAgY2xhc3NlcyB3aGljaCBhbGxvdyBpbnB1dCBmcm9tIHtAbGluayBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcn0KLSAgZXZlbnRzLCBhbmQgYWxzbyBjbGFzc2VzIHRoYXQgcHJvZHVjZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBldmVudHMuIEl0Ci0gIGFsc28gcHJvdmlkZXMgbWV0aG9kcyB0byBzZXQgdGhlIGlucHV0IHNvdXJjZSBhcyBhbgotICB7QGxpbmsgb3JnLnhtbC5zYXguWE1MUmVhZGVyfSwgb3IgdG8gdXNlIGEKLSAge0BsaW5rIG9yZy54bWwuc2F4LklucHV0U291cmNlfSBhcyB0aGUgc291cmNlLiBJdCBhbHNvIGFsbG93cyB0aGUKLSAgY3JlYXRpb24gb2YgYSB7QGxpbmsgb3JnLnhtbC5zYXguWE1MRmlsdGVyfSwgd2hpY2ggZW5hYmxlcwotICB0cmFuc2Zvcm1hdGlvbnMgdG8gInB1bGwiIGZyb20gb3RoZXIgdHJhbnNmb3JtYXRpb25zLCBhbmQgbGV0cyB0aGUgdHJhbnNmb3JtZXIKLSAgdG8gYmUgdXNlZCBwb2x5bW9ycGhpY2FsbHkgYXMgYW4ge0BsaW5rIG9yZy54bWwuc2F4LlhNTFJlYWRlcn0uPC9wPgotPHA+VGhlIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2V9IGNsYXNzIGFsbG93cyB0aGUKLSAgc2V0dGluZyBvZiBhbiB7QGxpbmsgb3JnLnhtbC5zYXguWE1MUmVhZGVyfSB0byBiZSB1c2VkIGZvciAicHVsbGluZyIKLSAgcGFyc2UgZXZlbnRzLCBhbmQgYW4ge0BsaW5rIG9yZy54bWwuc2F4LklucHV0U291cmNlfSB0aGF0IG1heSBiZSB1c2VkIHRvCi0gIHNwZWNpZnkgdGhlIFNBWCBzb3VyY2UuPC9wPgotPHA+VGhlIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHR9IGNsYXNzIGFsbG93cyB0aGUKLSAgc2V0dGluZyBvZiBhIHtAbGluayBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcn0gdG8gYmUgdGhlIHJlY2VpdmVyIG9mCi0gIFNBWDIgZXZlbnRzIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uLiAKLTxwPlRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5fSBleHRlbmRzCi0gIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeX0gdG8gcHJvdmlkZSBmYWN0b3J5Ci0gIG1ldGhvZHMgZm9yIGNyZWF0aW5nIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyfSwKLSAge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcn0sIGFuZAotICB7QGxpbmsgb3JnLnhtbC5zYXguWE1MUmVhZGVyfSBpbnN0YW5jZXMuPC9wPgotPHA+VG8gb2J0YWluIGEge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeX0sCi0gIHRoZSBjYWxsZXIgbXVzdCBjYXN0IHRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnl9Ci0gIGluc3RhbmNlIHJldHVybmVkIGZyb20KLSAge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I25ld0luc3RhbmNlfS4gCi0KLTxwPlRoZSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyfSBpbnRlcmZhY2UKLSAgYWxsb3dzIGEgdHJhbnNmb3JtYXRpb24gdG8gYmUgY3JlYXRlZCBmcm9tIFNBWDIgcGFyc2UgZXZlbnRzLCB3aGljaCBpcyBhICJwdXNoIgotICBtb2RlbCByYXRoZXIgdGhhbiB0aGUgInB1bGwiIG1vZGVsIHRoYXQgbm9ybWFsbHkgb2NjdXJzIGZvciBhIHRyYW5zZm9ybWF0aW9uLgotICBOb3JtYWwgcGFyc2UgZXZlbnRzIGFyZSByZWNlaXZlZCB0aHJvdWdoIHRoZQotICB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXJ9IGludGVyZmFjZSwgbGV4aWNhbCBldmVudHMgc3VjaCBhcwotICBzdGFydENEQVRBIGFuZCBlbmRDREFUQSBhcmUgcmVjZWl2ZWQgdGhyb3VnaCB0aGUKLSAge0BsaW5rIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcn0gaW50ZXJmYWNlLCBhbmQgZXZlbnRzIHRoYXQgc2lnbmFsCi0gIHRoZSBzdGFydCBvciBlbmQgb2YgZGlzYWJsaW5nIG91dHB1dCBlc2NhcGluZyBhcmUgcmVjZWl2ZWQgdmlhCi0gIHtAbGluayBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNwcm9jZXNzaW5nSW5zdHJ1Y3Rpb259LCB3aXRoIHRoZQotICB0YXJnZXQgcGFyYW1ldGVyIGJlaW5nCi0gIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCNQSV9ESVNBQkxFX09VVFBVVF9FU0NBUElOR30gYW5kCi0gIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdCNQSV9FTkFCTEVfT1VUUFVUX0VTQ0FQSU5HfS4gSWYKLSAgcGFyYW1ldGVycywgb3V0cHV0IHByb3BlcnRpZXMsIG9yIG90aGVyIGZlYXR1cmVzIG5lZWQgdG8gYmUgc2V0IG9uIHRoZQotICBUcmFuc2Zvcm1lciBoYW5kbGVyLCBhIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyfSByZWZlcmVuY2UKLSAgd2lsbCBuZWVkIHRvIGJlIG9idGFpbmVkIGZyb20KLSAge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlciNnZXRUcmFuc2Zvcm1lcn0sIGFuZAotICB0aGUgbWV0aG9kcyBpbnZva2VkIGZyb20gdGhhdCByZWZlcmVuY2UuIAotCi08cD5UaGUge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXJ9IGludGVyZmFjZQotICBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlc30gb2JqZWN0cwotICBmcm9tIFNBWDIgcGFyc2UgZXZlbnRzLiBPbmNlIHRoZSB7QGxpbmsgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXJ9Ci0gIGV2ZW50cyBhcmUgY29tcGxldGUsIHRoZSBUZW1wbGF0ZXMgb2JqZWN0IG1heSBiZSBvYnRhaW5lZCBmcm9tCi0gIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyI2dldFRlbXBsYXRlc30uIE5vdGUgdGhhdAotICB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVGVtcGxhdGVzSGFuZGxlciNzZXRTeXN0ZW1JZH0gc2hvdWxkCi0gIG5vcm1hbGx5IGJlIGNhbGxlZCBpbiBvcmRlciB0byBlc3RhYmxpc2ggYSBiYXNlIHN5c3RlbSBJRCBmcm9tIHdoaWNoIHJlbGF0aXZlCi0gIFVSTHMgbWF5IGJlIHJlc29sdmVkLiAKLTxwPlRoZQotICB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5I25ld1hNTEZpbHRlcn0KLSAgbWV0aG9kIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSB7QGxpbmsgb3JnLnhtbC5zYXguWE1MRmlsdGVyfSwgd2hpY2gKLSAgZW5jYXBzdWxhdGVzIHRoZSBTQVgyIG5vdGlvbiBvZiBhICJwdWxsIiB0cmFuc2Zvcm1hdGlvbi4gVGhlIGZvbGxvd2luZwotICBpbGx1c3RyYXRlcyBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucyBjaGFpbmVkIHRvZ2V0aGVyLiBFYWNoIGZpbHRlciBwb2ludHMgdG8gYQotICBwYXJlbnQge0BsaW5rIG9yZy54bWwuc2F4LlhNTFJlYWRlcn0sIGFuZCB0aGUgZmluYWwgdHJhbnNmb3JtYXRpb24gaXMKLSAgY2F1c2VkIGJ5IGludm9raW5nIHtAbGluayBvcmcueG1sLnNheC5YTUxSZWFkZXIjcGFyc2V9IG9uIHRoZSBmaW5hbAotICByZWFkZXIgaW4gdGhlIGNoYWluLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL3N0cmVhbS9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3RyYW5zZm9ybS9zdHJlYW0vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU0YWJkLi4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwvdHJhbnNmb3JtL3N0cmVhbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTx0aXRsZT5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIHN0cmVhbS0gYW5kIFVSSS0gc3BlY2lmaWMgdHJhbnNmb3JtYXRpb24gQVBJcy4KLQkgPC9wPgotPHA+VGhlIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2V9IGNsYXNzCi0JIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHNwZWNpZnlpbmcge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW19IGlucHV0LAotCSB7QGxpbmsgamF2YS5pby5SZWFkZXJ9IGlucHV0LCBhbmQgVVJMIGlucHV0IGluIHRoZSBmb3JtIG9mIHN0cmluZ3MuIEV2ZW4KLQkgaWYgYW4gaW5wdXQgc3RyZWFtIG9yIHJlYWRlciBpcyBzcGVjaWZpZWQgYXMgdGhlIHNvdXJjZSwKLQkge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZSNzZXRTeXN0ZW1JZH0gc2hvdWxkIHN0aWxsCi0JIGJlIGNhbGxlZCwgc28gdGhhdCB0aGUgdHJhbnNmb3JtZXIgY2FuIGtub3cgZnJvbSB3aGVyZSBpdCBzaG91bGQgcmVzb2x2ZQotCSByZWxhdGl2ZSBVUklzLiBUaGUgcHVibGljIGlkZW50aWZpZXIgaXMgYWx3YXlzIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24KLQkgd3JpdGVyIGluY2x1ZGVzIG9uZSwgaXQgd2lsbCBiZSBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZQotCSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2VMb2NhdG9yfSBpbmZvcm1hdGlvbi48L3A+Ci08cD5UaGUge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdH0gY2xhc3MKLQkgcHJvdmlkZXMgbWV0aG9kcyBmb3Igc3BlY2lmeWluZyB7QGxpbmsgamF2YS5pby5PdXRwdXRTdHJlYW19LAotCSB7QGxpbmsgamF2YS5pby5Xcml0ZXJ9LCBvciBhbiBvdXRwdXQgc3lzdGVtIElELCBhcyB0aGUgb3V0cHV0IG9mIHRoZQotCSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQuPC9wPgotPHA+Tm9ybWFsbHkgc3RyZWFtcyBzaG91bGQgYmUgdXNlZCByYXRoZXIgdGhhbiByZWFkZXJzIG9yIHdyaXRlcnMsIGZvcgotCSBib3RoIHRoZSBTb3VyY2UgYW5kIFJlc3VsdCwgc2luY2UgcmVhZGVycyBhbmQgd3JpdGVycyBhbHJlYWR5IGhhdmUgdGhlIGVuY29kaW5nCi0JIGVzdGFibGlzaGVkIHRvIGFuZCBmcm9tIHRoZSBpbnRlcm5hbCBVbmljb2RlIGZvcm1hdC4gSG93ZXZlciwgdGhlcmUgYXJlIHRpbWVzCi0JIHdoZW4gaXQgaXMgdXNlZnVsIHRvIHdyaXRlIHRvIGEgY2hhcmFjdGVyIHN0cmVhbSwgc3VjaCBhcyB3aGVuIHVzaW5nIGEKLQkgU3RyaW5nV3JpdGVyIGluIG9yZGVyIHRvIHdyaXRlIHRvIGEgU3RyaW5nLCBvciBpbiB0aGUgY2FzZSBvZiByZWFkaW5nIHNvdXJjZQotCSBYTUwgZnJvbSBhIFN0cmluZ1JlYWRlci48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3ZhbGlkYXRpb24vcGFja2FnZS5odG1sIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmNzFhNC4uMDAwMDAwMAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvamF2YXgveG1sL3ZhbGlkYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCA1NzAxMDQgMjAwNy0wOC0yNyAxMzoyODoyNFogbXJnbGF2YXMgJCAtLT4KLTxodG1sPgotCTxib2R5IGJnY29sb3I9IndoaXRlIj4KLQkJPHA+Ci0JCSAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYW4gQVBJIGZvciB2YWxpZGF0aW9uIG9mIFhNTCBkb2N1bWVudHMuICA8ZW0+VmFsaWRhdGlvbjwvZW0+IGlzIHRoZSBwcm9jZXNzIG9mIHZlcmlmeWluZwotCQkgICAgdGhhdCBhbiBYTUwgZG9jdW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYSBzcGVjaWZpZWQgWE1MIDxlbT5zY2hlbWE8L2VtPi4gIEFuIFhNTCBzY2hlbWEgZGVmaW5lcyB0aGUKLQkJICAgIGNvbnRlbnQgbW9kZWwgKGFsc28gY2FsbGVkIGEgPGVtPmdyYW1tYXI8L2VtPiBvciA8ZW0+dm9jYWJ1bGFyeTwvZW0+KSB0aGF0IGl0cyBpbnN0YW5jZSBkb2N1bWVudHMKLQkJICAgIHdpbGwgcmVwcmVzZW50LgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHBvcHVsYXIgdGVjaG5vbG9naWVzIGF2YWlsYWJsZSBmb3IgY3JlYXRpbmcgYW4gWE1MIHNjaGVtYS4gU29tZSBvZiB0aGUgbW9zdAotICAgICAgICAgICAgcG9wdWxhciBpbmNsdWRlOgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPkRvY3VtZW50IFR5cGUgRGVmaW5pdGlvbiAoRFREKTwvc3Ryb25nPiAtIFhNTCdzIGJ1aWx0LWluIHNjaGVtYSBsYW5ndWFnZS48L2xpPgotICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC9TY2hlbWEiPlczQyBYTUwgU2NoZW1hIChXWFMpPC9hPjwvc3Ryb25nPiAtIGFuIG9iamVjdC1vcmllbnRlZCBYTUwgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlLiBXWFMgYWxzbyBwcm92aWRlcyBhIHR5cGUgc3lzdGVtIGZvciBjb25zdHJhaW5pbmcgdGhlIGNoYXJhY3RlciBkYXRhIG9mIGFuIFhNTCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgICAgICAgV1hTIGlzIG1haW50YWluZWQgYnkgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnIj5Xb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIChXM0MpPC9hPiBhbmQgaXMgYSBXM0MKLSAgICAgICAgICAgICAgICAgICAgUmVjb21tZW5kYXRpb24gKHRoYXQgaXMsIGEgcmF0aWZpZWQgVzNDIHN0YW5kYXJkIHNwZWNpZmljYXRpb24pLjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+PGEgaHJlZj0iaHR0cDovL3d3dy5yZWxheG5nLm9yZyI+UkVMQVggTkcgKFJORyk8L2E+PC9zdHJvbmc+IC0gYSBwYXR0ZXJuLWJhc2VkLAotICAgICAgICAgICAgICAgICAgICB1c2VyLWZyaWVuZGx5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UuIFJORyBzY2hlbWFzIG1heSBhbHNvIHVzZSB0eXBlcyB0byBjb25zdHJhaW4gWE1MIGNoYXJhY3RlciBkYXRhLgotICAgICAgICAgICAgICAgICAgICBSTkcgaXMgbWFpbnRhaW5lZCBieSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZyI+T3JnYW5pemF0aW9uIGZvciB0aGUgQWR2YW5jZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlZCBJbmZvcm1hdGlvbiBTdGFuZGFyZHMgKE9BU0lTKTwvYT4gYW5kIGlzIGJvdGggYW4gT0FTSVMgYW5kIGFuCi0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaXNvLm9yZyI+SVNPIChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKTwvYT4gc3RhbmRhcmQuPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz48YSBocmVmPSJodHRwOi8vd3d3LnNjaGVtYXRyb24uY29tLyI+U2NoZW1hdHJvbjwvYT48L3N0cm9uZz4gLSBhIHJ1bGVzLWJhc2VkIFhNTCBzY2hlbWEKLSAgICAgICAgICAgICAgICBsYW5ndWFnZS4gV2hlcmVhcyBEVEQsIFdYUywgYW5kIFJORyBhcmUgZGVzaWduZWQgdG8gZXhwcmVzcyB0aGUgc3RydWN0dXJlIG9mIGEgY29udGVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICBTY2hlbWF0cm9uIGlzIGRlc2lnbmVkIHRvIGVuZm9yY2UgaW5kaXZpZHVhbCBydWxlcyB0aGF0IGFyZSBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB0byBleHByZXNzCi0gICAgICAgICAgICAgICAgd2l0aCBvdGhlciBzY2hlbWEgbGFuZ3VhZ2VzLiBTY2hlbWF0cm9uIGlzIGludGVuZGVkIHRvIHN1cHBsZW1lbnQgYSBzY2hlbWEgd3JpdHRlbiBpbgotICAgICAgICAgICAgICAgIHN0cnVjdHVyYWwgc2NoZW1hIGxhbmd1YWdlIHN1Y2ggYXMgdGhlIGFmb3JlbWVudGlvbmVkLiBTY2hlbWF0cm9uIGlzIGluIHRoZSBwcm9jZXNzCi0gICAgICAgICAgICAgICAgb2YgYmVjb21pbmcgYW4gSVNPIHN0YW5kYXJkLjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotCQkgICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgSkFYUCBzdXBwb3J0ZWQgdmFsaWRhdGlvbiBhcyBhIGZlYXR1cmUgb2YgYW4gWE1MIHBhcnNlciwgcmVwcmVzZW50ZWQgYnkKLQkJICAgIGVpdGhlciBhIHtAbGluayBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJ9IG9yIHtAbGluayBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJ9IGluc3RhbmNlLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotCQkgICAgVGhlIEpBWFAgdmFsaWRhdGlvbiBBUEkgZGVjb3VwbGVzIHRoZSB2YWxpZGF0aW9uIG9mIGFuIGluc3RhbmNlIGRvY3VtZW50IGZyb20gdGhlIHBhcnNpbmcgb2YgYW4KLQkJICAgIFhNTCBkb2N1bWVudC4gVGhpcyBpcyBhZHZhbnRhZ2VvdXMgZm9yIHNldmVyYWwgcmVhc29ucywgc29tZSBvZiB3aGljaCBhcmU6Ci0JCSAgICA8dWw+Ci0JCSAgICAgICAgPGxpPjxzdHJvbmc+U3VwcG9ydCBmb3IgYWRkaXRpb25hbCBzY2hlbWEgbGFuZ3VhZ2VzLjwvc3Ryb25nPiBBcyBvZiBKREsgMS41LCB0aGUgdHdvIG1vc3QKLQkJICAgICAgICBwb3B1bGFyIEpBWFAgcGFyc2VyIGltcGxlbWVudGF0aW9ucywgQ3JpbXNvbiBhbmQgWGVyY2VzLCBvbmx5IHN1cHBvcnQgYSBzdWJzZXQgb2YgdGhlIGF2YWlsYWJsZQotCQkgICAgICAgIFhNTCBzY2hlbWEgbGFuZ3VhZ2VzLiBUaGUgVmFsaWRhdGlvbiBBUEkgcHJvdmlkZXMgYSBzdGFuZGFyZCBtZWNoYW5pc20gdGhyb3VnaCB3aGljaCBhcHBsaWNhdGlvbnMKLQkJICAgICAgICBtYXkgdGFrZSBvZiBhZHZhbnRhZ2Ugb2Ygc3BlY2lhbGl6YXRpb24gdmFsaWRhdGlvbiBsaWJyYXJpZXMgd2hpY2ggc3VwcG9ydCBhZGRpdGlvbmFsIHNjaGVtYQotCQkgICAgICAgIGxhbmd1YWdlcy48L2xpPgotCQkgICAgICAgIDxsaT48c3Ryb25nPkVhc3kgcnVudGltZSBjb3VwbGluZyBvZiBhbiBYTUwgaW5zdGFuY2UgYW5kIHNjaGVtYS48L3N0cm9uZz4gU3BlY2lmeWluZyB0aGUgbG9jYXRpb24KLQkJICAgICAgICBvZiBhIHNjaGVtYSB0byB1c2UgZm9yIHZhbGlkYXRpb24gd2l0aCBKQVhQIHBhcnNlcnMgY2FuIGJlIGNvbmZ1c2luZy4gVGhlIFZhbGlkYXRpb24gQVBJIG1ha2VzIHRoaXMKLQkJICAgICAgICBwcm9jZXNzIHNpbXBsZSAoc2VlIDxhIGhyZWY9IiNleGFtcGxlLTEiPmV4YW1wbGU8L2E+IGJlbG93KS48L2xpPgotICAgICAgICAgIDwvdWw+Ci0JCTwvcD4KLQkJPHA+Ci0gICAgICAgICAgICA8YSBuYW1lPSJleGFtcGxlLTEiPjxzdHJvbmc+VXNhZ2UgZXhhbXBsZTwvc3Ryb25nPi48L2E+IFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdmFsaWRhdGluZwotICAgICAgICAgICAgYW4gWE1MIGRvY3VtZW50IHdpdGggdGhlIFZhbGlkYXRpb24gQVBJIChmb3IgcmVhZGFiaWxpdHksIHNvbWUgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIG5vdCBzaG93bik6Ci0gICAgICAgICAgICA8cHJlPgotICAgICAgICAgICAgCi0gICAgLy8gcGFyc2UgYW4gWE1MIGRvY3VtZW50IGludG8gYSBET00gdHJlZQotICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIERvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBGaWxlKCJpbnN0YW5jZS54bWwiKSk7Ci0KLSAgICAvLyBjcmVhdGUgYSBTY2hlbWFGYWN0b3J5IGNhcGFibGUgb2YgdW5kZXJzdGFuZGluZyBXWFMgc2NoZW1hcwotICAgIFNjaGVtYUZhY3RvcnkgZmFjdG9yeSA9IFNjaGVtYUZhY3RvcnkubmV3SW5zdGFuY2UoWE1MQ29uc3RhbnRzLlczQ19YTUxfU0NIRU1BX05TX1VSSSk7Ci0KLSAgICAvLyBsb2FkIGEgV1hTIHNjaGVtYSwgcmVwcmVzZW50ZWQgYnkgYSBTY2hlbWEgaW5zdGFuY2UKLSAgICBTb3VyY2Ugc2NoZW1hRmlsZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IEZpbGUoIm15U2NoZW1hLnhzZCIpKTsKLSAgICBTY2hlbWEgc2NoZW1hID0gZmFjdG9yeS5uZXdTY2hlbWEoc2NoZW1hRmlsZSk7Ci0KLSAgICAvLyBjcmVhdGUgYSBWYWxpZGF0b3IgaW5zdGFuY2UsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIGluc3RhbmNlIGRvY3VtZW50Ci0gICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNjaGVtYS5uZXdWYWxpZGF0b3IoKTsKLQotICAgIC8vIHZhbGlkYXRlIHRoZSBET00gdHJlZQotICAgIHRyeSB7Ci0gICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgRE9NU291cmNlKGRvY3VtZW50KSk7Ci0gICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gaW5zdGFuY2UgZG9jdW1lbnQgaXMgaW52YWxpZCEKLSAgICB9Ci08L3ByZT4KLQkJPC9wPgotCQk8cD4KLQkJICAgIFRoZSBKQVhQIHBhcnNpbmcgQVBJIGhhcyBiZWVuIGludGVncmF0ZWQgd2l0aCB0aGUgVmFsaWRhdGlvbiBBUEkuIEFwcGxpY2F0aW9ucyBtYXkgY3JlYXRlIGEge0BsaW5rIGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYX0gd2l0aCB0aGUgdmFsaWRhdGlvbiBBUEkKLQkJICAgIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBhIHtAbGluayBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5fSBvciBhIHtAbGluayBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5fSBpbnN0YW5jZQotCQkgICAgYnkgdXNpbmcgdGhlIHtAbGluayBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5I3NldFNjaGVtYShTY2hlbWEpfSBhbmQge0BsaW5rIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnkjc2V0U2NoZW1hKFNjaGVtYSl9Ci0JCSAgICBtZXRob2RzLiA8c3Ryb25nPllvdSBzaG91bGQgbm90PC9zdHJvbmc+IGJvdGggc2V0IGEgc2NoZW1hIGFuZCBjYWxsIDxjb2RlPnNldFZhbGlkYXRpbmcodHJ1ZSk8L2NvZGU+IG9uIGEgcGFyc2VyIGZhY3RvcnkuIFRoZSBmb3JtZXIgdGVjaG5pcXVlCi0JCSAgICB3aWxsIGNhdXNlIHBhcnNlcnMgdG8gdXNlIHRoZSBuZXcgdmFsaWRhdGlvbiBBUEk7IHRoZSBsYXR0ZXIgd2lsbCBjYXVzZSBwYXJzZXJzIHRvIHVzZSB0aGVpciBvd24gaW50ZXJuYWwgdmFsaWRhdGlvbgotCQkgICAgZmFjaWxpdGllcy4gPHN0cm9uZz5UdXJuaW5nIG9uIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBzaW11bHRhbmVvdXNseSB3aWxsIGNhdXNlIGVpdGhlciByZWR1bmRhbnQgYmVoYXZpb3Igb3IgZXJyb3IgY29uZGl0aW9ucy48L3N0cm9uZz4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLQotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9qYXZheC94bWwveHBhdGgvcGFja2FnZS5odG1sIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC94cGF0aC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmEyOWMuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2phdmF4L3htbC94cGF0aC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gJElkOiBwYWNrYWdlLmh0bWwgNTcwMTA3IDIwMDctMDgtMjcgMTM6MzA6MTlaIG1yZ2xhdmFzICQgLS0+Ci0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08dGl0bGU+amF2YXgueG1sLnhwYXRoPC90aXRsZT4KLTxtZXRhIG5hbWU9IkBhdXRob3IiIGNvbnRlbnQ9Im1haWx0bzpCZW5AZ2FsYnJhaXRocy5vcmciIC8+Ci08bWV0YSBuYW1lPSJAYXV0aG9yIiBjb250ZW50PSJtYWlsdG86Tm9ybWFuLldhbHNoQFN1bi5jb20iIC8+Ci08bWV0YSBuYW1lPSJAYXV0aG9yIiBjb250ZW50PSJtYWlsdG86SmVmZi5TdXR0b3JAU3VuLmNvbSIgLz4KLTxtZXRhIG5hbWU9IkB2ZXJzaW9uIiBjb250ZW50PSIkUmV2aXNpb246IDU3MDEwNyAkLCAkRGF0ZTogMjAwNy0wOC0yNyAwNjozMDoxOSAtMDcwMCAoTW9uLCAyNyBBdWcgMjAwNykgJCIgLz4KLTxtZXRhIG5hbWU9IkBzZWUiIGNvbnRlbnQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoIiAvPgotPG1ldGEgbmFtZT0iQHNpbmNlIiBjb250ZW50PSIxLjUiIC8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08cD5UaGlzIHBhY2thZ2UgcHJvdmlkZXMgYW4gPGVtPm9iamVjdC1tb2RlbCBuZXV0cmFsPC9lbT4gQVBJIGZvciB0aGUKLWV2YWx1YXRpb24gb2YgWFBhdGggZXhwcmVzc2lvbnMgYW5kIGFjY2VzcyB0byB0aGUgZXZhbHVhdGlvbgotZW52aXJvbm1lbnQuCi08L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgWE1MIHN0YW5kYXJkcyBhcHBseTo8L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aCI+WE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMDwvYT48L2xpPgotPC91bD4KLQotPGhyIC8+Ci0KLTxoMj5YUGF0aCBPdmVydmlldzwvaDI+Ci0KLTxwPlRoZSBYUGF0aCBsYW5ndWFnZSBwcm92aWRlcyBhIHNpbXBsZSwgY29uY2lzZSBzeW50YXggZm9yIHNlbGVjdGluZwotbm9kZXMgZnJvbSBhbiBYTUwgZG9jdW1lbnQuIFhQYXRoIGFsc28gcHJvdmlkZXMgcnVsZXMgZm9yIGNvbnZlcnRpbmcgYQotbm9kZSBpbiBhbiBYTUwgZG9jdW1lbnQgb2JqZWN0IG1vZGVsIChET00pIHRyZWUgdG8gYSBib29sZWFuLCBkb3VibGUsCi1vciBzdHJpbmcgdmFsdWUuIFhQYXRoIGlzIGEgVzNDLWRlZmluZWQgbGFuZ3VhZ2UgYW5kIGFuIG9mZmljaWFsIFczQwotcmVjb21tZW5kYXRpb247IHRoZSBXM0MgaG9zdHMgdGhlIFhNTCBQYXRoIExhbmd1YWdlIChYUGF0aCkgVmVyc2lvbgotMS4wIHNwZWNpZmljYXRpb24uCi08L3A+Ci0KLTxwPlhQYXRoIHN0YXJ0ZWQgaW4gbGlmZSBpbiAxOTk5IGFzIGEgc3VwcGxlbWVudCB0byB0aGUgWFNMVCBhbmQKLVhQb2ludGVyIGxhbmd1YWdlcywgYnV0IGhhcyBtb3JlIHJlY2VudGx5IGJlY29tZSBwb3B1bGFyIGFzIGEKLXN0YW5kLWFsb25lIGxhbmd1YWdlLCBhcyBhIHNpbmdsZSBYUGF0aCBleHByZXNzaW9uIGNhbiBiZSB1c2VkIHRvCi1yZXBsYWNlIG1hbnkgbGluZXMgb2YgRE9NIEFQSSBjb2RlLgotPC9wPgotCi08aDM+WFBhdGggRXhwcmVzc2lvbnM8L2gzPgotCi08cD5BbiBYUGF0aCA8ZW0+ZXhwcmVzc2lvbjwvZW0+IGlzIGNvbXBvc2VkIG9mIGEgPGVtPmxvY2F0aW9uCi1wYXRoPC9lbT4gYW5kIG9uZSBvciBtb3JlIG9wdGlvbmFsIDxlbT5wcmVkaWNhdGVzPC9lbT4uIEV4cHJlc3Npb25zCi1tYXkgYWxzbyBpbmNsdWRlIFhQYXRoIHZhcmlhYmxlcy4KLTwvcD4KLQotPHA+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIFhQYXRoIGV4cHJlc3Npb246PC9wPgotCi08cHJlPgotL2Zvby9iYXIKLTwvcHJlPgotCi08cD5UaGlzIGV4YW1wbGUgd291bGQgc2VsZWN0IHRoZSA8Y29kZT4mbHQ7YmFyJmd0OzwvY29kZT4gZWxlbWVudCBpbgotYW4gWE1MIGRvY3VtZW50IHN1Y2ggYXMgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxwcmU+Ci0mbHQ7Zm9vJmd0OwotJmx0O2Jhci8mZ3Q7Ci0mbHQ7L2ZvbyZndDsKLTwvcHJlPgotCi08cD5UaGUgZXhwcmVzc2lvbiA8Y29kZT4vZm9vL2JhcjwvY29kZT4gaXMgYW4gZXhhbXBsZSBvZiBhIGxvY2F0aW9uCi1wYXRoLiBXaGlsZSBYUGF0aCBsb2NhdGlvbiBwYXRocyByZXNlbWJsZSBVbml4LXN0eWxlIGZpbGUgc3lzdGVtCi1wYXRocywgYW4gaW1wb3J0YW50IGRpc3RpbmN0aW9uIGlzIHRoYXQgWFBhdGggZXhwcmVzc2lvbnMgcmV0dXJuCi08ZW0+YWxsPC9lbT4gbm9kZXMgdGhhdCBtYXRjaCB0aGUgZXhwcmVzc2lvbi4gVGh1cywgYWxsIHRocmVlCi08Y29kZT4mbHQ7YmFyJmd0OzwvY29kZT4gZWxlbWVudHMgaW4gdGhlIGZvbGxvd2luZyBkb2N1bWVudCB3b3VsZCBiZQotc2VsZWN0ZWQgYnkgdGhlIDxjb2RlPi9mb28vYmFyPC9jb2RlPiBleHByZXNzaW9uOjwvcD4KLQotPHByZT4KLSZsdDtmb28mZ3Q7Ci0mbHQ7YmFyLyZndDsKLSZsdDtiYXIvJmd0OwotJmx0O2Jhci8mZ3Q7Ci0mbHQ7L2ZvbyZndDsKLTwvcHJlPgotCi08cD5BIHNwZWNpYWwgbG9jYXRpb24gcGF0aCBvcGVyYXRvciwgPGNvZGU+Ly88L2NvZGU+LCBzZWxlY3RzIG5vZGVzIGF0Ci1hbnkgZGVwdGggaW4gYW4gWE1MIGRvY3VtZW50LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2VsZWN0cyBhbGwKLTxjb2RlPiZsdDtiYXImZ3Q7PC9jb2RlPiBlbGVtZW50cyByZWdhcmRsZXNzIG9mIHRoZWlyIGxvY2F0aW9uIGluIGEKLWRvY3VtZW50OjwvcD4KLQotPHByZT4KLS8vYmFyCi08L3ByZT4KLQotPHA+QSB3aWxkY2FyZCBvcGVyYXRvciwgKiwgY2F1c2VzIGFsbCBlbGVtZW50IG5vZGVzIHRvIGJlIHNlbGVjdGVkLgotVGhlIGZvbGxvd2luZyBleGFtcGxlIHNlbGVjdHMgYWxsIGNoaWxkcmVuIGVsZW1lbnRzIG9mIGEKLTxjb2RlPiZsdDtmb28mZ3Q7PC9jb2RlPiBlbGVtZW50OjwvcD4KLQotPHByZT4KLS9mb28vKgotPC9wcmU+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIGVsZW1lbnQgbm9kZXMsIFhQYXRoIGxvY2F0aW9uIHBhdGhzIG1heSBhbHNvIGFkZHJlc3MKLWF0dHJpYnV0ZSBub2RlcywgdGV4dCBub2RlcywgY29tbWVudCBub2RlcywgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLW5vZGVzLiBUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGV4YW1wbGVzIG9mIGxvY2F0aW9uIHBhdGhzIGZvciBlYWNoCi1vZiB0aGVzZSBub2RlIHR5cGVzOjwvcD4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+Ci08dGQ+TG9jYXRpb24gUGF0aDwvdGQ+Ci08dGQ+RGVzY3JpcHRpb248L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxjb2RlPi9mb28vYmFyLzxzdHJvbmc+QGlkPC9zdHJvbmc+PC9jb2RlPgotPC90ZD4KLTx0ZD5TZWxlY3RzIHRoZSBhdHRyaWJ1dGUgPGNvZGU+aWQ8L2NvZGU+IG9mIHRoZSA8Y29kZT4mbHQ7YmFyJmd0OzwvY29kZT4gZWxlbWVudAotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+PGNvZGU+L2Zvby9iYXIvPHN0cm9uZz50ZXh0KCk8L3N0cm9uZz48L2NvZGU+Ci08L3RkPgotPHRkPlNlbGVjdHMgdGhlIHRleHQgbm9kZXMgb2YgdGhlIDxjb2RlPiZsdDtiYXImZ3Q7PC9jb2RlPiBlbGVtZW50LiBObwotZGlzdGluY3Rpb24gaXMgbWFkZSBiZXR3ZWVuIGVzY2FwZWQgYW5kIG5vbi1lc2NhcGVkIGNoYXJhY3RlciBkYXRhLgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+PGNvZGU+L2Zvby9iYXIvPHN0cm9uZz5jb21tZW50KCk8L3N0cm9uZz48L2NvZGU+Ci08L3RkPgotPHRkPlNlbGVjdHMgYWxsIGNvbW1lbnQgbm9kZXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT4mbHQ7YmFyJmd0OzwvY29kZT4gZWxlbWVudC4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPjxjb2RlPi9mb28vYmFyLzxzdHJvbmc+cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpPC9zdHJvbmc+PC9jb2RlPgotPC90ZD4KLTx0ZD5TZWxlY3RzIGFsbCBwcm9jZXNzaW5nLWluc3RydWN0aW9uIG5vZGVzIGNvbnRhaW5lZCBpbiB0aGUKLTxjb2RlPiZsdDtiYXImZ3Q7PC9jb2RlPiBlbGVtZW50LgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08cD5QcmVkaWNhdGVzIGFsbG93IGZvciByZWZpbmluZyB0aGUgbm9kZXMgc2VsZWN0ZWQgYnkgYW4gWFBhdGgKLWxvY2F0aW9uIHBhdGguIFByZWRpY2F0ZXMgYXJlIG9mIHRoZSBmb3JtCi08Y29kZT5bPGVtPmV4cHJlc3Npb248L2VtPl08L2NvZGU+LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2VsZWN0cyBhbGwKLTxjb2RlPiZsdDtmb28mZ3Q7PC9jb2RlPiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gYW4gPGNvZGU+aW5jbHVkZTwvY29kZT4KLWF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPjo8L3A+Ci0KLTxwcmU+Ci0vL2Zvb1tAaW5jbHVkZT0ndHJ1ZSddCi08L3ByZT4KLQotPHA+UHJlZGljYXRlcyBtYXkgYmUgYXBwZW5kZWQgdG8gZWFjaCBvdGhlciB0byBmdXJ0aGVyIHJlZmluZSBhbgotZXhwcmVzc2lvbiwgc3VjaCBhczo8L3A+Ci0KLTxwcmU+Ci0vL2Zvb1tAaW5jbHVkZT0ndHJ1ZSddW0Btb2RlPSdiYXInXQotPC9wcmU+Ci0KLTxoMz5Vc2luZyB0aGUgWFBhdGggQVBJPC9oMz4KLQotPHA+Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIHVzaW5nIHRoZSBYUGF0aCBBUEkgdG8gc2VsZWN0IG9uZQotb3IgbW9yZSBub2RlcyBmcm9tIGFuIFhNTCBkb2N1bWVudDo8L3A+Ci0KLTxwcmU+Ci1YUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7Ci1TdHJpbmcgZXhwcmVzc2lvbiA9ICIvd2lkZ2V0cy93aWRnZXQiOwotSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoIndpZGdldHMueG1sIik7Ci1Ob2RlTGlzdCBub2RlcyA9IChOb2RlTGlzdCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgaW5wdXRTb3VyY2UsIFhQYXRoQ29uc3RhbnRzLk5PREVTRVQpOwotPC9wcmU+Ci0KLTxoMz5YUGF0aCBFeHByZXNzaW9ucyBhbmQgVHlwZXM8L2gzPgotCi08cD5XaGlsZSBYUGF0aCBleHByZXNzaW9ucyBzZWxlY3Qgbm9kZXMgaW4gdGhlIFhNTCBkb2N1bWVudCwgdGhlIFhQYXRoCi1BUEkgYWxsb3dzIHRoZSBzZWxlY3RlZCBub2RlcyB0byBiZSBjb2FsZXNjZWQgaW50byBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgb3RoZXIgZGF0YSB0eXBlczo8L3A+Ci0KLTx1bD4KLTxsaT48Y29kZT5Cb29sZWFuPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+TnVtYmVyPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+U3RyaW5nPC9jb2RlPjwvbGk+Ci08L3VsPgotCi08cD5UaGUgZGVzaXJlZCByZXR1cm4gdHlwZSBpcyBzcGVjaWZpZWQgYnkgYSB7QGxpbmsKLWphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWV9IHBhcmFtZXRlciBpbiBtZXRob2QgY2FsbCB1c2VkIHRvIGV2YWx1YXRlCi10aGUgZXhwcmVzc2lvbiwgd2hpY2ggaXMgZWl0aGVyIGEgY2FsbCB0bwotPGNvZGU+WFBhdGhFeHByZXNzaW9uLmV2YWx1YXRlKC4uLik8L2NvZGU+IG9yIHRvIG9uZSBvZiB0aGUKLTxjb2RlPlhQYXRoLmV2YWx1YXRlKC4uLik8L2NvZGU+IGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZSBhbGxvd2VkCi1RTmFtZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBjb25zdGFudHMgaW4gdGhlIHtAbGluawotamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzfSBjbGFzczsgdGhleSBhcmU6PC9wPgotCi08dWw+Ci08bGk+e0BsaW5rIGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50cyNOT0RFU0VUfTwvbGk+Ci08bGk+e0BsaW5rIGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50cyNOT0RFfTwvbGk+Ci08bGk+e0BsaW5rIGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50cyNTVFJJTkd9PC9saT4KLTxsaT57QGxpbmsgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzI0JPT0xFQU59PC9saT4KLTxsaT57QGxpbmsgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzI05VTUJFUn08L2xpPgotPC91bD4KLQotPHA+V2hlbiBhIDxjb2RlPkJvb2xlYW48L2NvZGU+IHJldHVybiB0eXBlIGlzIHJlcXVlc3RlZCwKLTxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgbm9kZXMgd2VyZQotc2VsZWN0ZWQ7IG90aGVyd2lzZSwgPGNvZGU+Qm9vbGVhbi5GQUxTRTwvY29kZT4gaXMgcmV0dXJuZWQuPC9wPgotCi08cD5UaGUgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXR1cm4gdHlwZSBpcyBhIGNvbnZlbmllbmNlIGZvciByZXRyaWV2aW5nCi10aGUgY2hhcmFjdGVyIGRhdGEgZnJvbSBhIHRleHQgbm9kZSwgYXR0cmlidXRlIG5vZGUsIGNvbW1lbnQgbm9kZSwgb3IKLXByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24gbm9kZS4gV2hlbiB1c2VkIG9uIGFuIGVsZW1lbnQgbm9kZSwgdGhlIHZhbHVlCi1vZiB0aGUgY2hpbGQgdGV4dCBub2RlcyBpcyByZXR1cm5lZC4KLTwvcD4KLQotPHA+VGhlIDxjb2RlPk51bWJlcjwvY29kZT4gcmV0dXJuIHR5cGUgYXR0ZW1wdHMgdG8gY29hbGVzY2UgdGhlIHRleHQKLW9mIGEgbm9kZSB0byBhIDxjb2RlPmRvdWJsZTwvY29kZT4gZGF0YSB0eXBlLgotPC9wPgotCi08aDM+WFBhdGggQ29udGV4dDwvaDM+Ci0KLTxwPlhQYXRoIGxvY2F0aW9uIHBhdGhzIG1heSBiZSByZWxhdGl2ZSB0byBhIHBhcnRpY3VsYXIgbm9kZSBpbiB0aGUKLWRvY3VtZW50LCBrbm93biBhcyB0aGUgPGNvZGU+Y29udGV4dDwvY29kZT4uIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcKLVhNTCBkb2N1bWVudDo8L3A+Ci0KLTxwcmU+Ci0mbHQ7d2lkZ2V0cyZndDsKLSZsdDt3aWRnZXQmZ3Q7Ci0mbHQ7bWFudWZhY3R1cmVyLyZndDsKLSZsdDtkaW1lbnNpb25zLyZndDsKLSZsdDsvd2lkZ2V0Jmd0OwotJmx0Oy93aWRnZXRzJmd0OwotPC9wcmU+Ci0KLTxwPlRoZSA8Y29kZT4mbHQ7d2lkZ2V0Jmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGUKLWZvbGxvd2luZyBYUGF0aCBBUEkgY29kZTo8L3A+Ci0KLTxwcmU+Ci0vLyBwYXJzZSB0aGUgWE1MIGFzIGEgVzNDIERvY3VtZW50Ci1Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotYnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci1Eb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKCIvd2lkZ2V0cy54bWwiKSk7Ci0KLVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKLVN0cmluZyBleHByZXNzaW9uID0gIi93aWRnZXRzL3dpZGdldCI7Ci1Ob2RlIHdpZGdldE5vZGUgPSAoTm9kZSkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLk5PREUpOwotPC9wcmU+Ci0KLTxwPldpdGggYSByZWZlcmVuY2UgdG8gdGhlIDxjb2RlPiZsdDt3aWRnZXQmZ3Q7PC9jb2RlPiBlbGVtZW50LCBhCi1yZWxhdGl2ZSBYUGF0aCBleHByZXNzaW9uIGNhbiBub3cgd3JpdHRlbiB0byBzZWxlY3QgdGhlCi08Y29kZT4mbHQ7bWFudWZhY3R1cmVyJmd0OzwvY29kZT4gY2hpbGQgZWxlbWVudDo8L3A+Ci0KLTxwcmU+Ci1YUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7Ci08c3Ryb25nPlN0cmluZyBleHByZXNzaW9uID0gIm1hbnVmYWN0dXJlciI7PC9zdHJvbmc+Ci1Ob2RlIG1hbnVmYWN0dXJlck5vZGUgPSAoTm9kZSkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgPHN0cm9uZz53aWRnZXROb2RlPC9zdHJvbmc+LCBYUGF0aENvbnN0YW50cy5OT0RFKTsKLTwvcHJlPgotCi08dWw+Ci08bGk+QXV0aG9yIDxhIGhyZWY9Im1haWx0bzpCZW5AZ2FsYnJhaXRocy5vcmciPkJlbiBHYWxicmFpdGg8L2E+PC9saT4KLTxsaT5BdXRob3IgPGEgaHJlZj0ibWFpbHRvOk5vcm1hbi5XYWxzaEBTdW4uY29tIj5Ob3JtYW4gV2Fsc2g8L2E+PC9saT4KLTxsaT5BdXRob3IgPGEgaHJlZj0ibWFpbHRvOkplZmYuU3V0dG9yQFN1bi5jb20iPkplZmYgU3V0dG9yPC9hPjwvbGk+Ci08bGk+U2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hwYXRoIj5YTUwgUGF0aCBMYW5ndWFnZSAoWFBhdGgpIFZlcnNpb24gMS4wPC9hPjwvbGk+Ci08bGk+U2luY2UgMS41PC9saT4KLTwvdWw+CQkKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9BbHBoYWJldGljSW5kZXguamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9BbHBoYWJldGljSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzRlMTRhCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L0FscGhhYmV0aWNJbmRleC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGxpYmNvcmUuaWN1OworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBFeHBvc2VzIGljdTRjJ3MgQWxwaGFiZXRpY0luZGV4LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWxwaGFiZXRpY0luZGV4IHsKKyAgcHJpdmF0ZSBsb25nIHBlZXI7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgQWxwaGFiZXRpY0luZGV4IGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgKi8KKyAgcHVibGljIEFscGhhYmV0aWNJbmRleChMb2NhbGUgbG9jYWxlKSB7CisgICAgcGVlciA9IGNyZWF0ZShsb2NhbGUudG9TdHJpbmcoKSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgdHJ5IHsKKyAgICAgIGRlc3Ryb3kocGVlcik7CisgICAgICBwZWVyID0gMDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQWRkcyB0aGUgaW5kZXggY2hhcmFjdGVycyBmcm9tIHRoZSBnaXZlbiBsb2NhbGUgdG8gdGhlIGluZGV4LgorICAgKiBUaGUgbGFiZWxzIGFyZSBhZGRlZCB0byB0aG9zZSB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBpbmRleDsKKyAgICogdGhleSBkbyBub3QgcmVwbGFjZSB0aGUgZXhpc3RpbmcgaW5kZXggY2hhcmFjdGVycy4KKyAgICogVGhlIGNvbGxhdGlvbiBvcmRlciBmb3IgdGhpcyBpbmRleCBpcyBub3QgY2hhbmdlZDsKKyAgICogaXQgcmVtYWlucyB0aGF0IG9mIHRoZSBsb2NhbGUgdGhhdCB3YXMgb3JpZ2luYWxseSBzcGVjaWZpZWQKKyAgICogd2hlbiBjcmVhdGluZyB0aGlzIGluZGV4LgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExhYmVscyhMb2NhbGUgbG9jYWxlKSB7CisgICAgYWRkTGFiZWxzKHBlZXIsIGxvY2FsZS50b1N0cmluZygpKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRoZSBpbmRleCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kCisgICAqIGVuZCBjb2RlIHBvaW50cywgaW5jbHVzaXZlLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExhYmVsUmFuZ2UoaW50IGNvZGVQb2ludFN0YXJ0LCBpbnQgY29kZVBvaW50RW5kKSB7CisgICAgYWRkTGFiZWxSYW5nZShwZWVyLCBjb2RlUG9pbnRTdGFydCwgY29kZVBvaW50RW5kKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGxhYmVsIGJ1Y2tldHMgaW4gdGhpcyBpbmRleC4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEJ1Y2tldENvdW50KCkgeworICAgIHJldHVybiBnZXRCdWNrZXRDb3VudChwZWVyKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYnVja2V0IGluIHdoaWNoICdzJyBzaG91bGQgYXBwZWFyLgorICAgKiBGdW5jdGlvbiBpcyBzeW5jaHJvbml6ZWQgYmVjYXVzZSB1bmRlcmx5aW5nIHJvdXRpbmUgd2Fsa3MgYW4gaXRlcmF0b3IKKyAgICogd2hvc2Ugc3RhdGUgaXMgbWFpbnRhaW5lZCBpbnNpZGUgdGhlIGluZGV4IG9iamVjdC4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEJ1Y2tldEluZGV4KFN0cmluZyBzKSB7CisgICAgcmV0dXJuIGdldEJ1Y2tldEluZGV4KHBlZXIsIHMpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgYnVja2V0IGF0IHRoZSBnaXZlbiBpbmRleCAoYXMgcmV0dXJuZWQgYnkgZ2V0QnVja2V0SW5kZXgpLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRCdWNrZXRMYWJlbChpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gZ2V0QnVja2V0TGFiZWwocGVlciwgaW5kZXgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgY3JlYXRlKFN0cmluZyBsb2NhbGUpOworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBkZXN0cm95KGxvbmcgcGVlcik7CisgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGFkZExhYmVscyhsb25nIHBlZXIsIFN0cmluZyBsb2NhbGUpOworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBhZGRMYWJlbFJhbmdlKGxvbmcgcGVlciwgaW50IGNvZGVQb2ludFN0YXJ0LCBpbnQgY29kZVBvaW50RW5kKTsKKyAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRCdWNrZXRDb3VudChsb25nIHBlZXIpOworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEJ1Y2tldEluZGV4KGxvbmcgcGVlciwgU3RyaW5nIHMpOworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEJ1Y2tldExhYmVsKGxvbmcgcGVlciwgaW50IGluZGV4KTsKK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9JQ1UuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9JQ1UuamF2YQppbmRleCA5OTg0NDE0Li44ZTBjZDBiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvSUNVLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L0lDVS5qYXZhCkBAIC0xMjcsMTMgKzEyNywyMCBAQAogICAgICAgICByZXR1cm4gbG9jYWxlc0Zyb21TdHJpbmdzKGdldEF2YWlsYWJsZU51bWJlckZvcm1hdExvY2FsZXNOYXRpdmUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEJlc3REYXRlVGltZVBhdHRlcm4oU3RyaW5nIHNrZWxldG9uLCBTdHJpbmcgbG9jYWxlTmFtZSk7CisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJQ1UgdmVyc2lvbiBpbiB1c2UuIFRoaXMgaXMgIjQuNCIgZm9yIGdpbmdlcmJyZWFkLCBmb3IgZXhhbXBsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBDTERSIGRhdGEgaW4gdXNlLCBzdWNoIGFzICIyMi4xLjEiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRDbGRyVmVyc2lvbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaWN1NGMgdmVyc2lvbiBpbiB1c2UsIHN1Y2ggYXMgIjUwLjEuMSIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEljdVZlcnNpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFVuaWNvZGUgdmVyc2lvbiBvdXIgSUNVIHN1cHBvcnRzLiBUaGlzIGlzICI1LjIiIGZvciBnaW5nZXJicmVhZCwgZm9yIGV4YW1wbGUuCisgICAgICogUmV0dXJucyB0aGUgVW5pY29kZSB2ZXJzaW9uIG91ciBJQ1Ugc3VwcG9ydHMsIHN1Y2ggYXMgIjYuMiIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldFVuaWNvZGVWZXJzaW9uKCk7CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9Mb2NhbGVEYXRhLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvTG9jYWxlRGF0YS5qYXZhCmluZGV4IDhlYzIyOTQuLjdhODYwN2IgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9Mb2NhbGVEYXRhLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L0xvY2FsZURhdGEuamF2YQpAQCAtNzksNiArNzksMTAgQEAKICAgICBwdWJsaWMgU3RyaW5nIG1lZGl1bURhdGVGb3JtYXQ7CiAgICAgcHVibGljIFN0cmluZyBzaG9ydERhdGVGb3JtYXQ7CiAKKyAgICAvLyBVc2VkIGJ5IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdC5nZXRUaW1lRm9ybWF0LgorICAgIHB1YmxpYyBTdHJpbmcgdGltZUZvcm1hdDEyOyAvLyAiaGg6bW0gYSIKKyAgICBwdWJsaWMgU3RyaW5nIHRpbWVGb3JtYXQyNDsgLy8gIkhIOm1tIgorCiAgICAgLy8gVXNlZCBieSBEZWNpbWFsRm9ybWF0U3ltYm9scy4KICAgICBwdWJsaWMgY2hhciB6ZXJvRGlnaXQ7CiAgICAgcHVibGljIGNoYXIgZGVjaW1hbFNlcGFyYXRvcjsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9OYXRpdmVCcmVha0l0ZXJhdG9yLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvTmF0aXZlQnJlYWtJdGVyYXRvci5qYXZhCmluZGV4IDg4Y2ViNzEuLjQxNTZmOWEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9OYXRpdmVCcmVha0l0ZXJhdG9yLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L05hdGl2ZUJyZWFrSXRlcmF0b3IuamF2YQpAQCAtMjcsMjIgKzI3LDI3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJX0xJTkVfSU5TVEFOQ0UgPSAzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSV9TRU5UX0lOU1RBTkNFID0gNDsKIAorICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBuYXRpdmUgcGVlci4KKyAgICAvLyBVc2VzIG9mIHRoaXMgbXVzdCBiZSBtYW51YWxseSBzeW5jaHJvbml6ZWQgdG8gYXZvaWQgbmF0aXZlIGNyYXNoZXMuCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYWRkcmVzczsKKwogICAgIHByaXZhdGUgZmluYWwgaW50IHR5cGU7Ci0gICAgcHJpdmF0ZSBDaGFyYWN0ZXJJdGVyYXRvciBjaGFySXRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7CisgICAgcHJpdmF0ZSBDaGFyYWN0ZXJJdGVyYXRvciBjaGFySXRlcmF0b3I7CiAKICAgICBwcml2YXRlIE5hdGl2ZUJyZWFrSXRlcmF0b3IoaW50IGFkZHJlc3MsIGludCB0eXBlKSB7CiAgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CiAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMuY2hhckl0ZXIgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoIiIpOworICAgICAgICB0aGlzLmNoYXJJdGVyYXRvciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcigiIik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgaW50IGNsb25lQWRkciA9IGNsb25lSW1wbCh0aGlzLmFkZHJlc3MpOwogICAgICAgICBOYXRpdmVCcmVha0l0ZXJhdG9yIGNsb25lID0gbmV3IE5hdGl2ZUJyZWFrSXRlcmF0b3IoY2xvbmVBZGRyLCB0aGlzLnR5cGUpOworICAgICAgICBjbG9uZS5zdHJpbmcgPSB0aGlzLnN0cmluZzsKICAgICAgICAgLy8gVGhlIFJJIGRvZXNuJ3QgY2xvbmUgdGhlIENoYXJhY3Rlckl0ZXJhdG9yLgotICAgICAgICBjbG9uZS5jaGFySXRlciA9IHRoaXMuY2hhckl0ZXI7CisgICAgICAgIGNsb25lLmNoYXJJdGVyYXRvciA9IHRoaXMuY2hhckl0ZXJhdG9yOwogICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgfQogCkBAIC01Niw3ICs2MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gVE9ETzogaXMgdGhpcyBzdWZmaWNpZW50PyBzaG91bGRuJ3Qgd2UgYmUgY2hlY2tpbmcgdGhlIHVuZGVybHlpbmcgcnVsZXM/CiAgICAgICAgIE5hdGl2ZUJyZWFrSXRlcmF0b3IgcmhzID0gKE5hdGl2ZUJyZWFrSXRlcmF0b3IpIG9iamVjdDsKLSAgICAgICAgcmV0dXJuIHR5cGUgPT0gcmhzLnR5cGUgJiYgY2hhckl0ZXIuZXF1YWxzKHJocy5jaGFySXRlcik7CisgICAgICAgIHJldHVybiB0eXBlID09IHJocy50eXBlICYmIGNoYXJJdGVyYXRvci5lcXVhbHMocmhzLmNoYXJJdGVyYXRvcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02Niw0NCArNzEsNDQgQEAKIAogICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xvc2VCcmVha0l0ZXJhdG9ySW1wbCh0aGlzLmFkZHJlc3MpOworICAgICAgICAgICAgY2xvc2VJbXBsKHRoaXMuYWRkcmVzcyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGludCBjdXJyZW50KCkgewotICAgICAgICByZXR1cm4gY3VycmVudEltcGwodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRJbXBsKHRoaXMuYWRkcmVzcywgdGhpcy5zdHJpbmcpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiBmaXJzdEltcGwodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGZpcnN0SW1wbCh0aGlzLmFkZHJlc3MsIHRoaXMuc3RyaW5nKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGZvbGxvd2luZyhpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBmb2xsb3dpbmdJbXBsKHRoaXMuYWRkcmVzcywgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGZvbGxvd2luZ0ltcGwodGhpcy5hZGRyZXNzLCB0aGlzLnN0cmluZywgb2Zmc2V0KTsKICAgICB9CiAKICAgICBwdWJsaWMgQ2hhcmFjdGVySXRlcmF0b3IgZ2V0VGV4dCgpIHsKLSAgICAgICAgaW50IG5ld0xvYyA9IGN1cnJlbnRJbXBsKHRoaXMuYWRkcmVzcyk7Ci0gICAgICAgIHRoaXMuY2hhckl0ZXIuc2V0SW5kZXgobmV3TG9jKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2hhckl0ZXI7CisgICAgICAgIGludCBuZXdMb2NhdGlvbiA9IGN1cnJlbnRJbXBsKHRoaXMuYWRkcmVzcywgdGhpcy5zdHJpbmcpOworICAgICAgICB0aGlzLmNoYXJJdGVyYXRvci5zZXRJbmRleChuZXdMb2NhdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzLmNoYXJJdGVyYXRvcjsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGxhc3QoKSB7Ci0gICAgICAgIHJldHVybiBsYXN0SW1wbCh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gbGFzdEltcGwodGhpcy5hZGRyZXNzLCB0aGlzLnN0cmluZyk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBuZXh0KGludCBuKSB7Ci0gICAgICAgIHJldHVybiBuZXh0SW1wbCh0aGlzLmFkZHJlc3MsIG4pOworICAgICAgICByZXR1cm4gbmV4dEltcGwodGhpcy5hZGRyZXNzLCB0aGlzLnN0cmluZywgbik7CiAgICAgfQogCiAgICAgcHVibGljIGludCBuZXh0KCkgewotICAgICAgICByZXR1cm4gbmV4dEltcGwodGhpcy5hZGRyZXNzLCAxKTsKKyAgICAgICAgcmV0dXJuIG5leHRJbXBsKHRoaXMuYWRkcmVzcywgdGhpcy5zdHJpbmcsIDEpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgcHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBwcmV2aW91c0ltcGwodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzSW1wbCh0aGlzLmFkZHJlc3MsIHRoaXMuc3RyaW5nKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJhY3Rlckl0ZXJhdG9yIG5ld1RleHQpIHsKQEAgLTExOSwxNiArMTI0LDIxIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldFRleHQoU3RyaW5nIHMsIENoYXJhY3Rlckl0ZXJhdG9yIGl0KSB7Ci0gICAgICAgIHRoaXMuY2hhckl0ZXIgPSBpdDsKLSAgICAgICAgc2V0VGV4dEltcGwodGhpcy5hZGRyZXNzLCBzKTsKKyAgICAgICAgdGhpcy5zdHJpbmcgPSBzOworICAgICAgICB0aGlzLmNoYXJJdGVyYXRvciA9IGl0OworICAgICAgICBzZXRUZXh0SW1wbCh0aGlzLmFkZHJlc3MsIHRoaXMuc3RyaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgeworICAgICAgICByZXR1cm4gKHN0cmluZyAhPSBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0JvdW5kYXJ5KGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGlzQm91bmRhcnlJbXBsKHRoaXMuYWRkcmVzcywgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGlzQm91bmRhcnlJbXBsKHRoaXMuYWRkcmVzcywgdGhpcy5zdHJpbmcsIG9mZnNldCk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBwcmVjZWRpbmcoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gcHJlY2VkaW5nSW1wbCh0aGlzLmFkZHJlc3MsIG9mZnNldCk7CisgICAgICByZXR1cm4gcHJlY2VkaW5nSW1wbCh0aGlzLmFkZHJlc3MsIHRoaXMuc3RyaW5nLCBvZmZzZXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlQnJlYWtJdGVyYXRvciBnZXRDaGFyYWN0ZXJJbnN0YW5jZShMb2NhbGUgd2hlcmUpIHsKQEAgLTE1MSwxNSArMTYxLDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRXb3JkSW5zdGFuY2VJbXBsKFN0cmluZyBsb2NhbGUpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TGluZUluc3RhbmNlSW1wbChTdHJpbmcgbG9jYWxlKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldFNlbnRlbmNlSW5zdGFuY2VJbXBsKFN0cmluZyBsb2NhbGUpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlQnJlYWtJdGVyYXRvckltcGwoaW50IGFkZHJlc3MpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFRleHRJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjbG9uZUltcGwoaW50IGFkZHJlc3MpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgcHJlY2VkaW5nSW1wbChpbnQgYWRkcmVzcywgaW50IG9mZnNldCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNCb3VuZGFyeUltcGwoaW50IGFkZHJlc3MsIGludCBvZmZzZXQpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmV4dEltcGwoaW50IGFkZHJlc3MsIGludCBuKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IHByZXZpb3VzSW1wbChpbnQgYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjdXJyZW50SW1wbChpbnQgYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBmaXJzdEltcGwoaW50IGFkZHJlc3MpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZm9sbG93aW5nSW1wbChpbnQgYWRkcmVzcywgaW50IG9mZnNldCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBsYXN0SW1wbChpbnQgYWRkcmVzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgY2xvbmVJbXBsKGludCBhZGRyZXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCBjbG9zZUltcGwoaW50IGFkZHJlc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldFRleHRJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgcHJlY2VkaW5nSW1wbChpbnQgYWRkcmVzcywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpOworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgYm9vbGVhbiBpc0JvdW5kYXJ5SW1wbChpbnQgYWRkcmVzcywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpOworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IG5leHRJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCwgaW50IG4pOworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IHByZXZpb3VzSW1wbChpbnQgYWRkcmVzcywgU3RyaW5nIHRleHQpOworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IGN1cnJlbnRJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgZmlyc3RJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgZm9sbG93aW5nSW1wbChpbnQgYWRkcmVzcywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpOworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgaW50IGxhc3RJbXBsKGludCBhZGRyZXNzLCBTdHJpbmcgdGV4dCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvTmF0aXZlQ29udmVydGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvTmF0aXZlQ29udmVydGVyLmphdmEKaW5kZXggZTE4ZjQ4My4uMWI4YTdlMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L05hdGl2ZUNvbnZlcnRlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9OYXRpdmVDb252ZXJ0ZXIuamF2YQpAQCAtMjEsNyArMjEsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBlbmNvZGUobG9uZyBjb252ZXJ0ZXJIYW5kbGUsIGNoYXJbXSBpbnB1dCwgaW50IGluRW5kLAogICAgICAgICAgICAgYnl0ZVtdIG91dHB1dCwgaW50IG91dEVuZCwgaW50W10gZGF0YSwgYm9vbGVhbiBmbHVzaCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIG9wZW5Db252ZXJ0ZXIoU3RyaW5nIGVuY29kaW5nKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIG9wZW5Db252ZXJ0ZXIoU3RyaW5nIGNoYXJzZXROYW1lKTsKICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlQ29udmVydGVyKGxvbmcgY29udmVydGVySGFuZGxlKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXRCeXRlVG9DaGFyKGxvbmcgY29udmVydGVySGFuZGxlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9OYXRpdmVEZWNpbWFsRm9ybWF0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvTmF0aXZlRGVjaW1hbEZvcm1hdC5qYXZhCmluZGV4IGY2YjUyMTQuLjM3NjUyNmUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9OYXRpdmVEZWNpbWFsRm9ybWF0LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L05hdGl2ZURlY2ltYWxGb3JtYXQuamF2YQpAQCAtOTQsNyArOTQsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBhZGRyZXNzIG9mIHRoZSBJQ1UgRGVjaW1hbEZvcm1hdCogb24gdGhlIG5hdGl2ZSBoZWFwLgogICAgICAqLwotICAgIHByaXZhdGUgaW50IGFkZHJlc3M7CisgICAgcHJpdmF0ZSBsb25nIGFkZHJlc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgbGFzdCBwYXR0ZXJuIHdlIGdhdmUgdG8gSUNVLCBzbyB3ZSBjYW4gbWFrZSByZXBlYXRlZCBhcHBsaWNhdGlvbnMgY2hlYXAuCkBAIC0yODAsOCArMjgwLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9yKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm9iamVjdCA9PSBudWxsIik7CisgICAgICAgIH0KICAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib2JqZWN0IG5vdCBhIE51bWJlcjogIiArIG9iamVjdC5nZXRDbGFzcygpKTsKICAgICAgICAgfQogICAgICAgICBOdW1iZXIgbnVtYmVyID0gKE51bWJlcikgb2JqZWN0OwogICAgICAgICBGaWVsZFBvc2l0aW9uSXRlcmF0b3IgZnBJdGVyID0gbmV3IEZpZWxkUG9zaXRpb25JdGVyYXRvcigpOwpAQCAtNDc4LDcgKzQ4MSw3IEBACiAgICAgICAgIHNldEF0dHJpYnV0ZSh0aGlzLmFkZHJlc3MsIFVOVU1fUEFSU0VfSU5UX09OTFksIGkpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlQYXR0ZXJuKGludCBhZGRyLCBib29sZWFuIGxvY2FsaXplZCwgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5UGF0dGVybihsb25nIGFkZHIsIGJvb2xlYW4gbG9jYWxpemVkLCBTdHJpbmcgcGF0dGVybikgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXBwbHlQYXR0ZXJuSW1wbChhZGRyLCBsb2NhbGl6ZWQsIHBhdHRlcm4pOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKQEAgLTYxNywyOCArNjIwLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBhcHBseVBhdHRlcm5JbXBsKGludCBhZGRyLCBib29sZWFuIGxvY2FsaXplZCwgU3RyaW5nIHBhdHRlcm4pOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY2xvbmVJbXBsKGludCBhZGRyKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZShpbnQgYWRkcik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXJbXSBmb3JtYXRMb25nKGludCBhZGRyLCBsb25nIHZhbHVlLCBGaWVsZFBvc2l0aW9uSXRlcmF0b3IgaXRlcik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXJbXSBmb3JtYXREb3VibGUoaW50IGFkZHIsIGRvdWJsZSB2YWx1ZSwgRmllbGRQb3NpdGlvbkl0ZXJhdG9yIGl0ZXIpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBjaGFyW10gZm9ybWF0RGlnaXRMaXN0KGludCBhZGRyLCBTdHJpbmcgdmFsdWUsIEZpZWxkUG9zaXRpb25JdGVyYXRvciBpdGVyKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEF0dHJpYnV0ZShpbnQgYWRkciwgaW50IHN5bWJvbCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRUZXh0QXR0cmlidXRlKGludCBhZGRyLCBpbnQgc3ltYm9sKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG9wZW4oU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBjdXJyZW5jeVN5bWJvbCwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBhcHBseVBhdHRlcm5JbXBsKGxvbmcgYWRkciwgYm9vbGVhbiBsb2NhbGl6ZWQsIFN0cmluZyBwYXR0ZXJuKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNsb25lSW1wbChsb25nIGFkZHIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlKGxvbmcgYWRkcik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXJbXSBmb3JtYXRMb25nKGxvbmcgYWRkciwgbG9uZyB2YWx1ZSwgRmllbGRQb3NpdGlvbkl0ZXJhdG9yIGl0ZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBjaGFyW10gZm9ybWF0RG91YmxlKGxvbmcgYWRkciwgZG91YmxlIHZhbHVlLCBGaWVsZFBvc2l0aW9uSXRlcmF0b3IgaXRlcik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXJbXSBmb3JtYXREaWdpdExpc3QobG9uZyBhZGRyLCBTdHJpbmcgdmFsdWUsIEZpZWxkUG9zaXRpb25JdGVyYXRvciBpdGVyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEF0dHJpYnV0ZShsb25nIGFkZHIsIGludCBzeW1ib2wpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VGV4dEF0dHJpYnV0ZShsb25nIGFkZHIsIGludCBzeW1ib2wpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIG9wZW4oU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBjdXJyZW5jeVN5bWJvbCwKICAgICAgICAgICAgIGNoYXIgZGVjaW1hbFNlcGFyYXRvciwgY2hhciBkaWdpdCwgU3RyaW5nIGV4cG9uZW50U2VwYXJhdG9yLCBjaGFyIGdyb3VwaW5nU2VwYXJhdG9yLAogICAgICAgICAgICAgU3RyaW5nIGluZmluaXR5LCBTdHJpbmcgaW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sLCBjaGFyIG1pbnVzU2lnbiwKICAgICAgICAgICAgIGNoYXIgbW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yLCBTdHJpbmcgbmFuLCBjaGFyIHBhdHRlcm5TZXBhcmF0b3IsIGNoYXIgcGVyY2VudCwKICAgICAgICAgICAgIGNoYXIgcGVyTWlsbCwgY2hhciB6ZXJvRGlnaXQpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBOdW1iZXIgcGFyc2UoaW50IGFkZHIsIFN0cmluZyBzdHJpbmcsIFBhcnNlUG9zaXRpb24gcG9zaXRpb24sIGJvb2xlYW4gcGFyc2VCaWdEZWNpbWFsKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXREZWNpbWFsRm9ybWF0U3ltYm9scyhpbnQgYWRkciwgU3RyaW5nIGN1cnJlbmN5U3ltYm9sLAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBOdW1iZXIgcGFyc2UobG9uZyBhZGRyLCBTdHJpbmcgc3RyaW5nLCBQYXJzZVBvc2l0aW9uIHBvc2l0aW9uLCBib29sZWFuIHBhcnNlQmlnRGVjaW1hbCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMobG9uZyBhZGRyLCBTdHJpbmcgY3VycmVuY3lTeW1ib2wsCiAgICAgICAgICAgICBjaGFyIGRlY2ltYWxTZXBhcmF0b3IsIGNoYXIgZGlnaXQsIFN0cmluZyBleHBvbmVudFNlcGFyYXRvciwgY2hhciBncm91cGluZ1NlcGFyYXRvciwKICAgICAgICAgICAgIFN0cmluZyBpbmZpbml0eSwgU3RyaW5nIGludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbCwgY2hhciBtaW51c1NpZ24sCiAgICAgICAgICAgICBjaGFyIG1vbmV0YXJ5RGVjaW1hbFNlcGFyYXRvciwgU3RyaW5nIG5hbiwgY2hhciBwYXR0ZXJuU2VwYXJhdG9yLCBjaGFyIHBlcmNlbnQsCiAgICAgICAgICAgICBjaGFyIHBlck1pbGwsIGNoYXIgemVyb0RpZ2l0KTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRTeW1ib2woaW50IGFkZHIsIGludCBzeW1ib2wsIFN0cmluZyBzdHIpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEF0dHJpYnV0ZShpbnQgYWRkciwgaW50IHN5bWJvbCwgaW50IGkpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFJvdW5kaW5nTW9kZShpbnQgYWRkciwgaW50IHJvdW5kaW5nTW9kZSwgZG91YmxlIHJvdW5kaW5nSW5jcmVtZW50KTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRUZXh0QXR0cmlidXRlKGludCBhZGRyLCBpbnQgc3ltYm9sLCBTdHJpbmcgc3RyKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIHRvUGF0dGVybkltcGwoaW50IGFkZHIsIGJvb2xlYW4gbG9jYWxpemVkKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRTeW1ib2wobG9uZyBhZGRyLCBpbnQgc3ltYm9sLCBTdHJpbmcgc3RyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRBdHRyaWJ1dGUobG9uZyBhZGRyLCBpbnQgc3ltYm9sLCBpbnQgaSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0Um91bmRpbmdNb2RlKGxvbmcgYWRkciwgaW50IHJvdW5kaW5nTW9kZSwgZG91YmxlIHJvdW5kaW5nSW5jcmVtZW50KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRUZXh0QXR0cmlidXRlKGxvbmcgYWRkciwgaW50IHN5bWJvbCwgU3RyaW5nIHN0cik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyB0b1BhdHRlcm5JbXBsKGxvbmcgYWRkciwgYm9vbGVhbiBsb2NhbGl6ZWQpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L1RpbWVab25lcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L1RpbWVab25lTmFtZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBsdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvVGltZVpvbmVzLmphdmEKcmVuYW1lIHRvIGx1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9UaW1lWm9uZU5hbWVzLmphdmEKaW5kZXggM2UyNzk4NS4uZTcxZWM2MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaWN1L1RpbWVab25lcy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9UaW1lWm9uZU5hbWVzLmphdmEKQEAgLTI0LDEwICsyNCwxMCBAQAogaW1wb3J0IGxpYmNvcmUudXRpbC5CYXNpY0xydUNhY2hlOwogCiAvKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBJQ1UncyB0aW1lIHpvbmUgZGF0YS4KKyAqIFByb3ZpZGVzIGFjY2VzcyB0byBJQ1UncyB0aW1lIHpvbmUgbmFtZSBkYXRhLgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGltZVpvbmVzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhdmFpbGFibGVUaW1lWm9uZXMgPSBUaW1lWm9uZS5nZXRBdmFpbGFibGVJRHMoKTsKK3B1YmxpYyBmaW5hbCBjbGFzcyBUaW1lWm9uZU5hbWVzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhdmFpbGFibGVUaW1lWm9uZUlkcyA9IFRpbWVab25lLmdldEF2YWlsYWJsZUlEcygpOwogCiAgICAgLyoKICAgICAgKiBPZmZzZXRzIGludG8gdGhlIGFycmF5cyByZXR1cm5lZCBieSBEYXRlRm9ybWF0U3ltYm9scy5nZXRab25lU3RyaW5ncy4KQEAgLTU5LDIyICs1OSwzMCBAQAogICAgICAgICAgICAgLy8gaXNuJ3QgcGFydGljdWxhcmx5IGxhcmdlIChhbmQgd2UgcmVtb3ZlIGR1cGxpY2F0ZXMpLCBidXQgaXMgY3VycmVudGx5IChIb25leWNvbWIpCiAgICAgICAgICAgICAvLyByZWFsbHkgZXhwZW5zaXZlIHRvIGNvbXB1dGUuCiAgICAgICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMsIHlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGUgc2NvcGUgb2YgdGhlIGludGVybiB0YWJsZSB0b28uCi0gICAgICAgICAgICBzdXBlcihhdmFpbGFibGVUaW1lWm9uZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHN1cGVyKGF2YWlsYWJsZVRpbWVab25lSWRzLmxlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIFN0cmluZ1tdW10gY3JlYXRlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQsIG5hdGl2ZVN0YXJ0OwotICAgICAgICAgICAgc3RhcnQgPSBuYXRpdmVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgU3RyaW5nW11bXSByZXN1bHQgPSBnZXRab25lU3RyaW5nc0ltcGwobG9jYWxlLnRvU3RyaW5nKCksIGF2YWlsYWJsZVRpbWVab25lcyk7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgMkQgYXJyYXkgdXNlZCB0byBob2xkIHRoZSBuYW1lcy4gVGhlIGZpcnN0IGNvbHVtbiBjb250YWlucyB0aGUgT2xzb24gaWRzLgorICAgICAgICAgICAgU3RyaW5nW11bXSByZXN1bHQgPSBuZXcgU3RyaW5nW2F2YWlsYWJsZVRpbWVab25lSWRzLmxlbmd0aF1bNV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZVRpbWVab25lSWRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldWzBdID0gYXZhaWxhYmxlVGltZVpvbmVJZHNbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgbmF0aXZlU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZpbGxab25lU3RyaW5ncyhsb2NhbGUudG9TdHJpbmcoKSwgcmVzdWx0KTsKICAgICAgICAgICAgIGxvbmcgbmF0aXZlRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKICAgICAgICAgICAgIGludGVyblN0cmluZ3MocmVzdWx0KTsKICAgICAgICAgICAgIC8vIEVuZGluZyB1cCBpbiB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gaXMgYW4gZWFzeSB3YXkgdG8gbWFrZSB5b3VyIGFwcCBzbG93LCBzbyB3ZSBlbnN1cmUKICAgICAgICAgICAgIC8vIGl0J3MgZWFzeSB0byB0ZWxsIGZyb20gdGhlIGxvZyAoYSkgd2hhdCB3ZSB3ZXJlIGRvaW5nLCAoYikgaG93IGxvbmcgaXQgdG9vaywgYW5kCiAgICAgICAgICAgICAvLyAoYykgdGhhdCBpdCdzIGFsbCBJQ1UncyBmYXVsdC4KICAgICAgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICBsb25nIG5hdGl2ZUR1cmF0aW9uID0gbmF0aXZlRW5kIC0gbmF0aXZlU3RhcnQ7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9nSSgiTG9hZGVkIHRpbWUgem9uZSBuYW1lcyBmb3IgIiArIGxvY2FsZSArICIgaW4gIiArIGR1cmF0aW9uICsgIm1zIiArCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBTeXN0ZW0ubG9nSSgiTG9hZGVkIHRpbWUgem9uZSBuYW1lcyBmb3IgXCIiICsgbG9jYWxlICsgIlwiIGluICIgKyBkdXJhdGlvbiArICJtcyIgKwogICAgICAgICAgICAgICAgICAgICAiICgiICsgbmF0aXZlRHVyYXRpb24gKyAibXMgaW4gSUNVKSIpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQpAQCAtMTAwLDcgKzEwOCw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBUaW1lWm9uZXMoKSB7fQorICAgIHByaXZhdGUgVGltZVpvbmVOYW1lcygpIHt9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdHJpbmcgZnJvbSAnem9uZVN0cmluZ3MnLiBVc2VkIHdpdGggZ2V0Wm9uZVN0cmluZ3MuCkBAIC0xMzksNSArMTQ3LDUgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nW10gZm9yQ291bnRyeUNvZGUoU3RyaW5nIGNvdW50cnlDb2RlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nW11bXSBnZXRab25lU3RyaW5nc0ltcGwoU3RyaW5nIGxvY2FsZSwgU3RyaW5nW10gdGltZVpvbmVJZHMpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbGxab25lU3RyaW5ncyhTdHJpbmcgbG9jYWxlLCBTdHJpbmdbXVtdIHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvVHJhbnNsaXRlcmF0b3IuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2ljdS9UcmFuc2xpdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjViYTcKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pY3UvVHJhbnNsaXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBsaWJjb3JlLmljdTsKKworLyoqCisgKiBFeHBvc2VzIGljdTRjJ3MgVHJhbnNsaXRlcmF0b3IuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2xpdGVyYXRvciB7CisgIHByaXZhdGUgbG9uZyBwZWVyOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRyYW5zbGl0ZXJhdG9yIGZvciB0aGUgZ2l2ZW4gaWQuCisgICAqLworICBwdWJsaWMgVHJhbnNsaXRlcmF0b3IoU3RyaW5nIGlkKSB7CisgICAgcGVlciA9IGNyZWF0ZShpZCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgdHJ5IHsKKyAgICAgIGRlc3Ryb3kocGVlcik7CisgICAgICBwZWVyID0gMDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBrbm93biB0cmFuc2xpdGVyYXRvcnMuCisgICAqLworICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmdbXSBnZXRBdmFpbGFibGVJRHMoKTsKKworICAvKioKKyAgICogVHJhbnNsaXRlcmF0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRyYW5zbGl0ZXJhdGUoU3RyaW5nIHMpIHsKKyAgICByZXR1cm4gdHJhbnNsaXRlcmF0ZShwZWVyLCBzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGNyZWF0ZShTdHJpbmcgaWQpOworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBkZXN0cm95KGxvbmcgcGVlcik7CisgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgdHJhbnNsaXRlcmF0ZShsb25nIHBlZXIsIFN0cmluZyBzKTsKK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL0Rpc2tMcnVDYWNoZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vRGlza0xydUNhY2hlLmphdmEKaW5kZXggODMzODk4My4uYjljYzBhMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vRGlza0xydUNhY2hlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vRGlza0xydUNhY2hlLmphdmEKQEAgLTI0MywyOCArMjQzLDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIG1hZ2ljICsgIiwgIiArIHZlcnNpb24gKyAiLCAiICsgdmFsdWVDb3VudFN0cmluZyArICIsICIgKyBibGFuayArICJdIik7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGludCBsaW5lQ291bnQgPSAwOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByZWFkSm91cm5hbExpbmUocmVhZGVyLnJlYWRMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICBsaW5lQ291bnQrKzsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZW5kT2ZKb3VybmFsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZHVuZGFudE9wQ291bnQgPSBsaW5lQ291bnQgLSBscnVFbnRyaWVzLnNpemUoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIElvVXRpbHMuY2xvc2VRdWlldGx5KHJlYWRlcik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVhZEpvdXJuYWxMaW5lKFN0cmluZyBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIiAiKTsKLSAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgaW50IGZpcnN0U3BhY2UgPSBsaW5lLmluZGV4T2YoJyAnKTsKKyAgICAgICAgaWYgKGZpcnN0U3BhY2UgPT0gLTEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCBqb3VybmFsIGxpbmU6ICIgKyBsaW5lKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZyBrZXkgPSBwYXJ0c1sxXTsKLSAgICAgICAgaWYgKHBhcnRzWzBdLmVxdWFscyhSRU1PVkUpICYmIHBhcnRzLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBscnVFbnRyaWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQga2V5QmVnaW4gPSBmaXJzdFNwYWNlICsgMTsKKyAgICAgICAgaW50IHNlY29uZFNwYWNlID0gbGluZS5pbmRleE9mKCcgJywga2V5QmVnaW4pOworICAgICAgICBmaW5hbCBTdHJpbmcga2V5OworICAgICAgICBpZiAoc2Vjb25kU3BhY2UgPT0gLTEpIHsKKyAgICAgICAgICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKGtleUJlZ2luKTsKKyAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlID09IFJFTU9WRS5sZW5ndGgoKSAmJiBsaW5lLnN0YXJ0c1dpdGgoUkVNT1ZFKSkgeworICAgICAgICAgICAgICAgIGxydUVudHJpZXMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga2V5ID0gbGluZS5zdWJzdHJpbmcoa2V5QmVnaW4sIHNlY29uZFNwYWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIEVudHJ5IGVudHJ5ID0gbHJ1RW50cmllcy5nZXQoa2V5KTsKQEAgLTI3MywxMyArMjgzLDE0IEBACiAgICAgICAgICAgICBscnVFbnRyaWVzLnB1dChrZXksIGVudHJ5KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChwYXJ0c1swXS5lcXVhbHMoQ0xFQU4pICYmIHBhcnRzLmxlbmd0aCA9PSAyICsgdmFsdWVDb3VudCkgeworICAgICAgICBpZiAoc2Vjb25kU3BhY2UgIT0gLTEgJiYgZmlyc3RTcGFjZSA9PSBDTEVBTi5sZW5ndGgoKSAmJiBsaW5lLnN0YXJ0c1dpdGgoQ0xFQU4pKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKHNlY29uZFNwYWNlICsgMSkuc3BsaXQoIiAiKTsKICAgICAgICAgICAgIGVudHJ5LnJlYWRhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgIGVudHJ5LmN1cnJlbnRFZGl0b3IgPSBudWxsOwotICAgICAgICAgICAgZW50cnkuc2V0TGVuZ3RocyhBcnJheXMuY29weU9mUmFuZ2UocGFydHMsIDIsIHBhcnRzLmxlbmd0aCkpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcnRzWzBdLmVxdWFscyhESVJUWSkgJiYgcGFydHMubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgIGVudHJ5LnNldExlbmd0aHMocGFydHMpOworICAgICAgICB9IGVsc2UgaWYgKHNlY29uZFNwYWNlID09IC0xICYmIGZpcnN0U3BhY2UgPT0gRElSVFkubGVuZ3RoKCkgJiYgbGluZS5zdGFydHNXaXRoKERJUlRZKSkgewogICAgICAgICAgICAgZW50cnkuY3VycmVudEVkaXRvciA9IG5ldyBFZGl0b3IoZW50cnkpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcnRzWzBdLmVxdWFscyhSRUFEKSAmJiBwYXJ0cy5sZW5ndGggPT0gMikgeworICAgICAgICB9IGVsc2UgaWYgKHNlY29uZFNwYWNlID09IC0xICYmIGZpcnN0U3BhY2UgPT0gUkVBRC5sZW5ndGgoKSAmJiBsaW5lLnN0YXJ0c1dpdGgoUkVBRCkpIHsKICAgICAgICAgICAgIC8vIHRoaXMgd29yayB3YXMgYWxyZWFkeSBkb25lIGJ5IGNhbGxpbmcgbHJ1RW50cmllcy5nZXQoKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGpvdXJuYWwgbGluZTogIiArIGxpbmUpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vRm9yd2FyZGluZ09zLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Gb3J3YXJkaW5nT3MuamF2YQppbmRleCBlZTI2ZDA0Li5mYWIzY2M5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Gb3J3YXJkaW5nT3MuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Gb3J3YXJkaW5nT3MuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBkdXAoRmlsZURlc2NyaXB0b3Igb2xkRmQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IHJldHVybiBvcy5kdXAob2xkRmQpOyB9CiAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGR1cDIoRmlsZURlc2NyaXB0b3Igb2xkRmQsIGludCBuZXdGZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgcmV0dXJuIG9zLmR1cDIob2xkRmQsIG5ld0ZkKTsgfQogICAgIHB1YmxpYyBTdHJpbmdbXSBlbnZpcm9uKCkgeyByZXR1cm4gb3MuZW52aXJvbigpOyB9CisgICAgcHVibGljIHZvaWQgZXhlY3YoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXJybm9FeGNlcHRpb24geyBvcy5leGVjdihmaWxlbmFtZSwgYXJndik7IH0KKyAgICBwdWJsaWMgdm9pZCBleGVjdmUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmdbXSBhcmd2LCBTdHJpbmdbXSBlbnZwKSB0aHJvd3MgRXJybm9FeGNlcHRpb24geyBvcy5leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnApOyB9CiAgICAgcHVibGljIHZvaWQgZmNobW9kKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbW9kZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgb3MuZmNobW9kKGZkLCBtb2RlKTsgfQogICAgIHB1YmxpYyB2b2lkIGZjaG93bihGaWxlRGVzY3JpcHRvciBmZCwgaW50IHVpZCwgaW50IGdpZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgb3MuZmNob3duKGZkLCB1aWQsIGdpZCk7IH0KICAgICBwdWJsaWMgaW50IGZjbnRsVm9pZChGaWxlRGVzY3JpcHRvciBmZCwgaW50IGNtZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgcmV0dXJuIG9zLmZjbnRsVm9pZChmZCwgY21kKTsgfQpAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgcHVibGljIGludCBzZW5kdG8oRmlsZURlc2NyaXB0b3IgZmQsIEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgZmxhZ3MsIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzLCBpbnQgcG9ydCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uLCBTb2NrZXRFeGNlcHRpb24geyByZXR1cm4gb3Muc2VuZHRvKGZkLCBidWZmZXIsIGZsYWdzLCBpbmV0QWRkcmVzcywgcG9ydCk7IH0KICAgICBwdWJsaWMgaW50IHNlbmR0byhGaWxlRGVzY3JpcHRvciBmZCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZU9mZnNldCwgaW50IGJ5dGVDb3VudCwgaW50IGZsYWdzLCBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcywgaW50IHBvcnQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uIHsgcmV0dXJuIG9zLnNlbmR0byhmZCwgYnl0ZXMsIGJ5dGVPZmZzZXQsIGJ5dGVDb3VudCwgZmxhZ3MsIGluZXRBZGRyZXNzLCBwb3J0KTsgfQogICAgIHB1YmxpYyB2b2lkIHNldGVnaWQoaW50IGVnaWQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IG9zLnNldGVnaWQoZWdpZCk7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRlbnYoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IG9zLnNldGVudihuYW1lLCB2YWx1ZSwgb3ZlcndyaXRlKTsgfQogICAgIHB1YmxpYyB2b2lkIHNldGV1aWQoaW50IGV1aWQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IG9zLnNldGV1aWQoZXVpZCk7IH0KICAgICBwdWJsaWMgdm9pZCBzZXRnaWQoaW50IGdpZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgb3Muc2V0Z2lkKGdpZCk7IH0KICAgICBwdWJsaWMgaW50IHNldHNpZCgpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IHJldHVybiBvcy5zZXRzaWQoKTsgfQpAQCAtMTI4LDggKzEzMSwxMCBAQAogICAgIHB1YmxpYyB2b2lkIHN5bWxpbmsoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKSB0aHJvd3MgRXJybm9FeGNlcHRpb24geyBvcy5zeW1saW5rKG9sZFBhdGgsIG5ld1BhdGgpOyB9CiAgICAgcHVibGljIGxvbmcgc3lzY29uZihpbnQgbmFtZSkgeyByZXR1cm4gb3Muc3lzY29uZihuYW1lKTsgfQogICAgIHB1YmxpYyB2b2lkIHRjZHJhaW4oRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IG9zLnRjZHJhaW4oZmQpOyB9CisgICAgcHVibGljIHZvaWQgdGNzZW5kYnJlYWsoRmlsZURlc2NyaXB0b3IgZmQsIGludCBkdXJhdGlvbikgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgb3MudGNzZW5kYnJlYWsoZmQsIGR1cmF0aW9uKTsgfQogICAgIHB1YmxpYyBpbnQgdW1hc2soaW50IG1hc2spIHsgcmV0dXJuIG9zLnVtYXNrKG1hc2spOyB9CiAgICAgcHVibGljIFN0cnVjdFV0c25hbWUgdW5hbWUoKSB7IHJldHVybiBvcy51bmFtZSgpOyB9CisgICAgcHVibGljIHZvaWQgdW5zZXRlbnYoU3RyaW5nIG5hbWUpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IG9zLnVuc2V0ZW52KG5hbWUpOyB9CiAgICAgcHVibGljIGludCB3YWl0cGlkKGludCBwaWQsIE11dGFibGVJbnQgc3RhdHVzLCBpbnQgb3B0aW9ucykgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsgcmV0dXJuIG9zLndhaXRwaWQocGlkLCBzdGF0dXMsIG9wdGlvbnMpOyB9CiAgICAgcHVibGljIGludCB3cml0ZShGaWxlRGVzY3JpcHRvciBmZCwgQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IHJldHVybiBvcy53cml0ZShmZCwgYnVmZmVyKTsgfQogICAgIHB1YmxpYyBpbnQgd3JpdGUoRmlsZURlc2NyaXB0b3IgZmQsIGJ5dGVbXSBieXRlcywgaW50IGJ5dGVPZmZzZXQsIGludCBieXRlQ291bnQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7IHJldHVybiBvcy53cml0ZShmZCwgYnl0ZXMsIGJ5dGVPZmZzZXQsIGJ5dGVDb3VudCk7IH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL0lvQnJpZGdlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Jb0JyaWRnZS5qYXZhCmluZGV4IDJkNjBhODYuLmFmYjQxNDYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL0lvQnJpZGdlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vSW9CcmlkZ2UuamF2YQpAQCAtMjE2LDE4ICsyMTYsMTEgQEAKICAgICAgICAgICAgICAgICBjYXVzZSA9IGVycm5vRXhjZXB0aW9uOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IGlzIGl0IHJlYWxseSBoZWxwZnVsL25lY2Vzc2FyeSB0byB0aHJvdyBzbyBtYW55IGRpZmZlcmVudCBleGNlcHRpb25zPwogICAgICAgICBTdHJpbmcgZGV0YWlsID0gY29ubmVjdERldGFpbChpbmV0QWRkcmVzcywgcG9ydCwgdGltZW91dE1zLCBjYXVzZSk7Ci0gICAgICAgIGlmIChjYXVzZS5lcnJubyA9PSBFQ09OTlJFU0VUIHx8IGNhdXNlLmVycm5vID09IEVDT05OUkVGVVNFRCB8fAotICAgICAgICAgICAgICAgIGNhdXNlLmVycm5vID09IEVBRERSTk9UQVZBSUwgfHwgY2F1c2UuZXJybm8gPT0gRUFERFJJTlVTRSB8fAotICAgICAgICAgICAgICAgIGNhdXNlLmVycm5vID09IEVORVRVTlJFQUNIKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdEV4Y2VwdGlvbihkZXRhaWwsIGNhdXNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChjYXVzZS5lcnJubyA9PSBFQUNDRVMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihkZXRhaWwsIGNhdXNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChjYXVzZS5lcnJubyA9PSBFVElNRURPVVQpIHsKKyAgICAgICAgaWYgKGNhdXNlLmVycm5vID09IEVUSU1FRE9VVCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNvY2tldFRpbWVvdXRFeGNlcHRpb24oZGV0YWlsLCBjYXVzZSk7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbihkZXRhaWwsIGNhdXNlKTsKKyAgICAgICAgdGhyb3cgbmV3IENvbm5lY3RFeGNlcHRpb24oZGV0YWlsLCBjYXVzZSk7CiAgICAgfQogCiAgICAgLy8gU29ja2V0IG9wdGlvbnMgdXNlZCBieSBqYXZhLm5ldCBidXQgbm90IGV4cG9zZWQgaW4gU29ja2V0T3B0aW9ucy4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL0lvVXRpbHMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL0lvVXRpbHMuamF2YQppbmRleCAyNDNkOGQ4Li4wMzczZWE5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Jb1V0aWxzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vSW9VdGlscy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRzOwpAQCAtMTQ1LDQgKzE0NiwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIge0Bjb2RlIHBhdGh9IGNhbiBiZSBvcGVuZWQgcmVhZC1vbmx5LiBTaW1pbGFyIHRvIEZpbGUuZXhpc3RzLCBidXQgZG9lc24ndAorICAgICAqIHJlcXVpcmUgcmVhZCBwZXJtaXNzaW9uIG9uIHRoZSBwYXJlbnQsIHNvIGl0J2xsIHdvcmsgaW4gbW9yZSBjYXNlcywgYW5kIGFsbG93IHlvdSB0bworICAgICAqIHJlbW92ZSByZWFkIHBlcm1pc3Npb24gZnJvbSBtb3JlIGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5PcGVuUmVhZE9ubHkoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFVzZSBvcGVuKDIpIHJhdGhlciB0aGFuIHN0YXQoMikgc28gd2UgcmVxdWlyZSBmZXdlciBwZXJtaXNzaW9ucy4gaHR0cDovL2IvNjQ4NTMxMi4KKyAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gTGliY29yZS5vcy5vcGVuKHBhdGgsIE9fUkRPTkxZLCAwKTsKKyAgICAgICAgICAgIExpYmNvcmUub3MuY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKEVycm5vRXhjZXB0aW9uIGVycm5vRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dJbnRlcnJ1cHRlZElvRXhjZXB0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkSU9FeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB0aHJvd24gaW4gcmVzcG9uc2UgdG8gYW4KKyAgICAgICAgLy8gSW50ZXJydXB0ZWRFeGNlcHRpb24gd2hpY2ggZG9lcyBub3QgbGVhdmUgdGhlIHRocmVhZCBpbiBhbgorICAgICAgICAvLyBpbnRlcnJ1cHRlZCBzdGF0ZSwgc28gZXhwbGljaXRseSBpbnRlcnJ1cHQgaGVyZS4KKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgLy8gVE9ETzogc2V0IEludGVycnVwdGVkSU9FeGNlcHRpb24uYnl0ZXNUcmFuc2ZlcnJlZAorICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL09zLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Pcy5qYXZhCmluZGV4IDFmNDI0OTcuLjRhYTgzOWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL09zLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vT3MuamF2YQpAQCAtMzYsNiArMzYsOCBAQAogICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBkdXAoRmlsZURlc2NyaXB0b3Igb2xkRmQpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZHVwMihGaWxlRGVzY3JpcHRvciBvbGRGZCwgaW50IG5ld0ZkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIFN0cmluZ1tdIGVudmlyb24oKTsKKyAgICBwdWJsaWMgdm9pZCBleGVjdihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgdm9pZCBleGVjdmUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmdbXSBhcmd2LCBTdHJpbmdbXSBlbnZwKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIHZvaWQgZmNobW9kKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbW9kZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyB2b2lkIGZjaG93bihGaWxlRGVzY3JpcHRvciBmZCwgaW50IHVpZCwgaW50IGdpZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBpbnQgZmNudGxWb2lkKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgY21kKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CkBAIC0xMDEsNiArMTAzLDcgQEAKICAgICBwdWJsaWMgaW50IHNlbmR0byhGaWxlRGVzY3JpcHRvciBmZCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZU9mZnNldCwgaW50IGJ5dGVDb3VudCwgaW50IGZsYWdzLCBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcywgaW50IHBvcnQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uOwogICAgIHB1YmxpYyBsb25nIHNlbmRmaWxlKEZpbGVEZXNjcmlwdG9yIG91dEZkLCBGaWxlRGVzY3JpcHRvciBpbkZkLCBNdXRhYmxlTG9uZyBpbk9mZnNldCwgbG9uZyBieXRlQ291bnQpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgdm9pZCBzZXRlZ2lkKGludCBlZ2lkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgc2V0ZW52KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIHZvaWQgc2V0ZXVpZChpbnQgZXVpZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyB2b2lkIHNldGdpZChpbnQgZ2lkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIGludCBzZXRzaWQoKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CkBAIC0xMjIsOCArMTI1LDEwIEBACiAgICAgcHVibGljIHZvaWQgc3ltbGluayhTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgbG9uZyBzeXNjb25mKGludCBuYW1lKTsKICAgICBwdWJsaWMgdm9pZCB0Y2RyYWluKEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgdGNzZW5kYnJlYWsoRmlsZURlc2NyaXB0b3IgZmQsIGludCBkdXJhdGlvbikgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBpbnQgdW1hc2soaW50IG1hc2spOwogICAgIHB1YmxpYyBTdHJ1Y3RVdHNuYW1lIHVuYW1lKCk7CisgICAgcHVibGljIHZvaWQgdW5zZXRlbnYoU3RyaW5nIG5hbWUpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgaW50IHdhaXRwaWQoaW50IHBpZCwgTXV0YWJsZUludCBzdGF0dXMsIGludCBvcHRpb25zKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIGludCB3cml0ZShGaWxlRGVzY3JpcHRvciBmZCwgQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgaW50IHdyaXRlKEZpbGVEZXNjcmlwdG9yIGZkLCBieXRlW10gYnl0ZXMsIGludCBieXRlT2Zmc2V0LCBpbnQgYnl0ZUNvdW50KSB0aHJvd3MgRXJybm9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Qb3NpeC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvaW8vUG9zaXguamF2YQppbmRleCAyZmIxODdlLi4yN2QzNTEwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9pby9Qb3NpeC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL2lvL1Bvc2l4LmphdmEKQEAgLTM5LDYgKzM5LDggQEAKICAgICBwdWJsaWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGR1cChGaWxlRGVzY3JpcHRvciBvbGRGZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBuYXRpdmUgRmlsZURlc2NyaXB0b3IgZHVwMihGaWxlRGVzY3JpcHRvciBvbGRGZCwgaW50IG5ld0ZkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIG5hdGl2ZSBTdHJpbmdbXSBlbnZpcm9uKCk7CisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGV4ZWN2KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nW10gYXJndikgdGhyb3dzIEVycm5vRXhjZXB0aW9uOworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBleGVjdmUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmdbXSBhcmd2LCBTdHJpbmdbXSBlbnZwKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIGZjaG1vZChGaWxlRGVzY3JpcHRvciBmZCwgaW50IG1vZGUpIHRocm93cyBFcnJub0V4Y2VwdGlvbjsKICAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZmNob3duKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgdWlkLCBpbnQgZ2lkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIG5hdGl2ZSBpbnQgZmNudGxWb2lkKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgY21kKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CkBAIC0xNTIsNiArMTU0LDcgQEAKICAgICB9CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IHNlbmR0b0J5dGVzKEZpbGVEZXNjcmlwdG9yIGZkLCBPYmplY3QgYnVmZmVyLCBpbnQgYnl0ZU9mZnNldCwgaW50IGJ5dGVDb3VudCwgaW50IGZsYWdzLCBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcywgaW50IHBvcnQpIHRocm93cyBFcnJub0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uOwogICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRlZ2lkKGludCBlZ2lkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CisgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldGVudihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRldWlkKGludCBldWlkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldGdpZChpbnQgZ2lkKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIG5hdGl2ZSBpbnQgc2V0c2lkKCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwpAQCAtMTcyLDggKzE3NSwxNiBAQAogICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzeW1saW5rKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBuYXRpdmUgbG9uZyBzeXNjb25mKGludCBuYW1lKTsKICAgICBwdWJsaWMgbmF0aXZlIHZvaWQgdGNkcmFpbihGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwotICAgIHB1YmxpYyBuYXRpdmUgaW50IHVtYXNrKGludCBtYXNrKTsKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgdGNzZW5kYnJlYWsoRmlsZURlc2NyaXB0b3IgZmQsIGludCBkdXJhdGlvbikgdGhyb3dzIEVycm5vRXhjZXB0aW9uOworICAgIHB1YmxpYyBpbnQgdW1hc2soaW50IG1hc2spIHsKKyAgICAgICAgaWYgKChtYXNrICYgMDc3NykgIT0gbWFzaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB1bWFzazogIiArIG1hc2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1bWFza0ltcGwobWFzayk7CisgICAgfQorICAgIHByaXZhdGUgbmF0aXZlIGludCB1bWFza0ltcGwoaW50IG1hc2spOwogICAgIHB1YmxpYyBuYXRpdmUgU3RydWN0VXRzbmFtZSB1bmFtZSgpOworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCB1bnNldGVudihTdHJpbmcgbmFtZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uOwogICAgIHB1YmxpYyBuYXRpdmUgaW50IHdhaXRwaWQoaW50IHBpZCwgTXV0YWJsZUludCBzdGF0dXMsIGludCBvcHRpb25zKSB0aHJvd3MgRXJybm9FeGNlcHRpb247CiAgICAgcHVibGljIGludCB3cml0ZShGaWxlRGVzY3JpcHRvciBmZCwgQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChidWZmZXIuaXNEaXJlY3QoKSkgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvbmV0L1VyaUNvZGVjLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvVXJpQ29kZWMuamF2YQppbmRleCA2NjI0NDc0Li4zZGI5NWQwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvVXJpQ29kZWMuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvVXJpQ29kZWMuamF2YQpAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjID09ICclJyAmJiBpc1BhcnRpYWxseUVuY29kZWQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlbmNvZGVkIDMtY2hhcmFjdGVyIHNlcXVlbmNlIGxpa2UgIiUyMCIKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocywgaSwgaSArIDMpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzLCBpLCBNYXRoLm1pbihpICsgMywgcy5sZW5ndGgoKSkpOwogICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcgJykgewogICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnKycpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvbmV0L2h0dHAvSHR0cEVuZ2luZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvbmV0L2h0dHAvSHR0cEVuZ2luZS5qYXZhCmluZGV4IDQyYzliOTYuLjhkODFjMzggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL25ldC9odHRwL0h0dHBFbmdpbmUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvaHR0cC9IdHRwRW5naW5lLmphdmEKQEAgLTQ3Myw2ICs0NzMsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1hcmtDb25uZWN0aW9uQXNSZWN5Y2xlZCgpIHsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZWN5Y2xlZCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVsZWFzZXMgdGhpcyBlbmdpbmUgc28gdGhhdCBpdHMgcmVzb3VyY2VzIG1heSBiZSBlaXRoZXIgcmV1c2VkIG9yCiAgICAgICogY2xvc2VkLgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvbmV0L2h0dHAvSHR0cFVSTENvbm5lY3Rpb25JbXBsLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbkltcGwuamF2YQppbmRleCAyNjBhOWFkLi4zZTY1MDNmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbkltcGwuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS9uZXQvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbkltcGwuamF2YQpAQCAtMzI5LDYgKzMyOSw4IEBACiAKICAgICAgICAgICAgIGlmIChyZXRyeSA9PSBSZXRyeS5ESUZGRVJFTlRfQ09OTkVDVElPTikgewogICAgICAgICAgICAgICAgIGh0dHBFbmdpbmUuYXV0b21hdGljYWxseVJlbGVhc2VDb25uZWN0aW9uVG9Qb29sKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGh0dHBFbmdpbmUubWFya0Nvbm5lY3Rpb25Bc1JlY3ljbGVkKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGh0dHBFbmdpbmUucmVsZWFzZSh0cnVlKTsKQEAgLTQwNiw3ICs0MDgsNyBAQAogICAgIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0F1dGhIZWFkZXIoaW50IHJlc3BvbnNlQ29kZSwgUmVzcG9uc2VIZWFkZXJzIHJlc3BvbnNlLAogICAgICAgICAgICAgUmF3SGVhZGVycyBzdWNjZXNzb3JSZXF1ZXN0SGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIVFRQX1BST1hZX0FVVEggJiYgcmVzcG9uc2VDb2RlICE9IEhUVFBfVU5BVVRIT1JJWkVEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgcmVzcG9uc2UgY29kZTogIiArIHJlc3BvbnNlQ29kZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBrZWVwIGFza2luZyBmb3IgdXNlcm5hbWUvcGFzc3dvcmQgdW50aWwgYXV0aG9yaXplZApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvdXRpbC9ab25lSW5mby5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvdXRpbC9ab25lSW5mby5qYXZhCmluZGV4IGFjNDhiMjMuLjU0ZWU2NjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL3V0aWwvWm9uZUluZm8uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvbGliY29yZS91dGlsL1pvbmVJbmZvLmphdmEKQEAgLTE2LDExICsxNiwxMCBAQAogCiBwYWNrYWdlIGxpYmNvcmUudXRpbDsKIAotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgbGliY29yZS5pby5CdWZmZXJJdGVyYXRvcjsKIAogLyoqCiAgKiBPdXIgY29uY3JldGUgVGltZVpvbmUgaW1wbGVtZW50YXRpb24sIGJhY2tlZCBieSB6b25laW5mbyBkYXRhLgpAQCAtNDMsMTcgKzQyLDU3IEBACiAgICAgfTsKIAogICAgIHByaXZhdGUgaW50IG1SYXdPZmZzZXQ7Ci0KICAgICBwcml2YXRlIGZpbmFsIGludCBtRWFybGllc3RSYXdPZmZzZXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VEc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbURzdFNhdmluZ3M7IC8vIEltcGxlbWVudHMgVGltZVpvbmUuZ2V0RFNUU2F2aW5ncy4KIAogICAgIHByaXZhdGUgZmluYWwgaW50W10gbVRyYW5zaXRpb25zOwogICAgIHByaXZhdGUgZmluYWwgaW50W10gbU9mZnNldHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbVR5cGVzOwogICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1Jc0RzdHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VEc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbURzdFNhdmluZ3M7IC8vIEltcGxlbWVudHMgVGltZVpvbmUuZ2V0RFNUU2F2aW5ncy4KIAotICAgIFpvbmVJbmZvKFN0cmluZyBuYW1lLCBpbnRbXSB0cmFuc2l0aW9ucywgYnl0ZVtdIHR5cGVzLCBpbnRbXSBnbXRPZmZzZXRzLCBieXRlW10gaXNEc3RzKSB7CisgICAgcHVibGljIHN0YXRpYyBUaW1lWm9uZSBtYWtlVGltZVpvbmUoU3RyaW5nIGlkLCBCdWZmZXJJdGVyYXRvciBpdCkgeworICAgICAgICAvLyBWYXJpYWJsZSBuYW1lcyBiZWdpbm5pbmcgdHpoXyBjb3JyZXNwb25kIHRvIHRob3NlIGluICJ0emZpbGUuaCIuCisKKyAgICAgICAgLy8gQ2hlY2sgdHpoX21hZ2ljLgorICAgICAgICBpZiAoaXQucmVhZEludCgpICE9IDB4NTQ1YTY5NjYpIHsgLy8gIlRaaWYiCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraXAgdGhlIHVuaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgaGVhZGVyLgorICAgICAgICBpdC5za2lwKDI4KTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzaXplcyBvZiB0aGUgYXJyYXlzIHdlJ3JlIGFib3V0IHRvIHJlYWQuCisgICAgICAgIGludCB0emhfdGltZWNudCA9IGl0LnJlYWRJbnQoKTsKKyAgICAgICAgaW50IHR6aF90eXBlY250ID0gaXQucmVhZEludCgpOworCisgICAgICAgIGl0LnNraXAoNCk7IC8vIFNraXAgdHpoX2NoYXJjbnQuCisKKyAgICAgICAgaW50W10gdHJhbnNpdGlvbnMgPSBuZXcgaW50W3R6aF90aW1lY250XTsKKyAgICAgICAgaXQucmVhZEludEFycmF5KHRyYW5zaXRpb25zLCAwLCB0cmFuc2l0aW9ucy5sZW5ndGgpOworCisgICAgICAgIGJ5dGVbXSB0eXBlID0gbmV3IGJ5dGVbdHpoX3RpbWVjbnRdOworICAgICAgICBpdC5yZWFkQnl0ZUFycmF5KHR5cGUsIDAsIHR5cGUubGVuZ3RoKTsKKworICAgICAgICBpbnRbXSBnbXRPZmZzZXRzID0gbmV3IGludFt0emhfdHlwZWNudF07CisgICAgICAgIGJ5dGVbXSBpc0RzdHMgPSBuZXcgYnl0ZVt0emhfdHlwZWNudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHpoX3R5cGVjbnQ7ICsraSkgeworICAgICAgICAgICAgZ210T2Zmc2V0c1tpXSA9IGl0LnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlzRHN0c1tpXSA9IGl0LnJlYWRCeXRlKCk7CisgICAgICAgICAgICAvLyBXZSBza2lwIHRoZSBhYmJyZXZpYXRpb24gaW5kZXguIFRoaXMgd291bGQgbGV0IHVzIHByb3ZpZGUgaGlzdG9yaWNhbGx5LWFjY3VyYXRlCisgICAgICAgICAgICAvLyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyAoc3VjaCBhcyAiQUhTVCIsICJZU1QiLCBhbmQgIkFLU1QiIGZvciBzdGFuZGFyZCB0aW1lIGluCisgICAgICAgICAgICAvLyBBbWVyaWNhL0FuY2hvcmFnZSBpbiAxOTgyLCAxOTgzLCBhbmQgMTk4NCByZXNwZWN0aXZlbHkpLiBJQ1Ugb25seSBrbm93cyB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gbmFtZXMsIHRob3VnaCwgc28gZXZlbiBpZiB3ZSBkaWQgdXNlIHRoaXMgZGF0YSB0byBwcm92aWRlIHRoZSBjb3JyZWN0IGFiYnJldmlhdGlvbnMKKyAgICAgICAgICAgIC8vIGZvciBlbl9VUywgd2Ugd291bGRuJ3QgYmUgYWJsZSB0byBwcm92aWRlIGNvcnJlY3QgYWJicmV2aWF0aW9ucyBmb3Igb3RoZXIgbG9jYWxlcywKKyAgICAgICAgICAgIC8vIG5vciB3b3VsZCB3ZSBiZSBhYmxlIHRvIHByb3ZpZGUgY29ycmVjdCBsb25nIGZvcm1zIChzdWNoIGFzICJZdWtvbiBTdGFuZGFyZCBUaW1lIikKKyAgICAgICAgICAgIC8vIGZvciBhbnkgbG9jYWxlLiAoVGhlIFJJIGRvZXNuJ3QgZG8gYW55IGJldHRlciB0aGFuIHVzIGhlcmUgZWl0aGVyLikKKyAgICAgICAgICAgIGl0LnNraXAoMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFpvbmVJbmZvKGlkLCB0cmFuc2l0aW9ucywgdHlwZSwgZ210T2Zmc2V0cywgaXNEc3RzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFpvbmVJbmZvKFN0cmluZyBuYW1lLCBpbnRbXSB0cmFuc2l0aW9ucywgYnl0ZVtdIHR5cGVzLCBpbnRbXSBnbXRPZmZzZXRzLCBieXRlW10gaXNEc3RzKSB7CiAgICAgICAgIG1UcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zOwogICAgICAgICBtVHlwZXMgPSB0eXBlczsKICAgICAgICAgbUlzRHN0cyA9IGlzRHN0czsKQEAgLTI1NCwyOSArMjkzLDEyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgLy8gRmlyc3QgdGhlIGJhc2ljcy4uLgotICAgICAgICBzYi5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiWyIgKyBnZXRJRCgpICsgIixtUmF3T2Zmc2V0PSIgKyBtUmF3T2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAiLG1Vc2VEc3Q9IiArIG1Vc2VEc3QgKyAiLG1Ec3RTYXZpbmdzPSIgKyBtRHN0U2F2aW5ncyArICJdIik7Ci0gICAgICAgIC8vIC4uLmZvbGxvd2VkIGJ5IGEgemR1bXAoMSktbGlrZSBkZXNjcmlwdGlvbiBvZiBhbGwgb3VyIHRyYW5zaXRpb24gZGF0YS4KLSAgICAgICAgc2IuYXBwZW5kKCJcbiIpOwotICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoc2IpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UcmFuc2l0aW9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaW50IHR5cGUgPSBtVHlwZXNbaV0gJiAweGZmOwotICAgICAgICAgICAgU3RyaW5nIHV0Y1RpbWUgPSBmb3JtYXRUaW1lKG1UcmFuc2l0aW9uc1tpXSwgVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFRpbWUgPSBmb3JtYXRUaW1lKG1UcmFuc2l0aW9uc1tpXSwgdGhpcyk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldHNbdHlwZV07Ci0gICAgICAgICAgICBpbnQgZ210T2Zmc2V0ID0gbVJhd09mZnNldC8xMDAwICsgb2Zmc2V0OwotICAgICAgICAgICAgZi5mb3JtYXQoIiU0ZCA6IHRpbWU9JTExZCAlcyA9ICVzIGlzRHN0PSVkIG9mZnNldD0lNWQgZ210T2Zmc2V0PSVkXG4iLAotICAgICAgICAgICAgICAgICAgICBpLCBtVHJhbnNpdGlvbnNbaV0sIHV0Y1RpbWUsIGxvY2FsVGltZSwgbUlzRHN0c1t0eXBlXSwgb2Zmc2V0LCBnbXRPZmZzZXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRUaW1lKGludCBzLCBUaW1lWm9uZSB0eikgewotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUgTU1NIGRkIEhIOm1tOnNzIHl5eXkgenp6Iik7Ci0gICAgICAgIHNkZi5zZXRUaW1lWm9uZSh0eik7Ci0gICAgICAgIGxvbmcgbXMgPSAoKGxvbmcpIHMpICogMTAwMEw7Ci0gICAgICAgIHJldHVybiBzZGYuZm9ybWF0KG5ldyBEYXRlKG1zKSk7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbaWQ9XCIiICsgZ2V0SUQoKSArICJcIiIgKworICAgICAgICAgICAgIixtUmF3T2Zmc2V0PSIgKyBtUmF3T2Zmc2V0ICsKKyAgICAgICAgICAgICIsbUVhcmxpZXN0UmF3T2Zmc2V0PSIgKyBtRWFybGllc3RSYXdPZmZzZXQgKworICAgICAgICAgICAgIixtVXNlRHN0PSIgKyBtVXNlRHN0ICsKKyAgICAgICAgICAgICIsbURzdFNhdmluZ3M9IiArIG1Ec3RTYXZpbmdzICsKKyAgICAgICAgICAgICIsdHJhbnNpdGlvbnM9IiArIG1UcmFuc2l0aW9ucy5sZW5ndGggKworICAgICAgICAgICAgIl0iOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9saWJjb3JlL3V0aWwvWm9uZUluZm9EQi5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvdXRpbC9ab25lSW5mb0RCLmphdmEKaW5kZXggY2M3Y2M0Zi4uMmJmNTVjZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvdXRpbC9ab25lSW5mb0RCLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL2xpYmNvcmUvdXRpbC9ab25lSW5mb0RCLmphdmEKQEAgLTM1LDM2ICszNSwxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWwuVGltZXpvbmVHZXR0ZXI7CiAKIC8qKgotICogQSBjbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHRpbWUgem9uZSBkYXRhYmFzZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUKLSAqICd6b25laW5mbycgZGF0YWJhc2UgYXMgdGhlIHNvdXJjZSBvZiB0aW1lIHpvbmUgaW5mb3JtYXRpb24uICBIb3dldmVyLCB0byBjb25zZXJ2ZQotICogZGlzayBzcGFjZSB0aGUgZGF0YSBmb3IgYWxsIHRpbWUgem9uZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIGZpbGUsIGFuZCBhCi0gKiBzZWNvbmQgZmlsZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBlYWNoIHRpbWUgem9uZSByZWNvcmQuICBBCi0gKiB0aGlyZCBmaWxlIGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgem9uZWluZm8gZGF0YWJhc2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZGF0YS4KKyAqIEEgY2xhc3MgdXNlZCB0byBpbml0aWFsaXplIHRoZSB0aW1lIHpvbmUgZGF0YWJhc2UuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUKKyAqIE9sc29uIHR6ZGF0YSBhcyB0aGUgc291cmNlIG9mIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4gSG93ZXZlciwgdG8gY29uc2VydmUKKyAqIGRpc2sgc3BhY2UgKGlub2RlcykgYW5kIHJlZHVjZSBJL08sIGFsbCB0aGUgZGF0YSBpcyBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSBmaWxlLAorICogd2l0aCBhbiBpbmRleCB0byBpbmRpY2F0ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgZWFjaCB0aW1lIHpvbmUgcmVjb3JkLgogICoKICAqIEBoaWRlIC0gdXNlZCB0byBpbXBsZW1lbnQgVGltZVpvbmUKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFpvbmVJbmZvREIgewotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGltZSB6b25lIGRhdGFiYXNlIGZpbGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaT05FX0RJUkVDVE9SWV9OQU1FID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRlbnYoIkFORFJPSURfUk9PVCIpICsgIi91c3Ivc2hhcmUvem9uZWluZm8vIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCB0aW1lIHpvbmUgcmVjb3Jkcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWk9ORV9GSUxFX05BTUUgPSBaT05FX0RJUkVDVE9SWV9OQU1FICsgInpvbmVpbmZvLmRhdCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmRleCB0byBlYWNoIHRpbWUgem9uZSByZWNvcmQgd2l0aGluCi0gICAgICogdGhlIHpvbmVpbmZvLmRhdCBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9GSUxFX05BTUUgPSBaT05FX0RJUkVDVE9SWV9OQU1FICsgInpvbmVpbmZvLmlkeCI7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9DSyA9IG5ldyBPYmplY3QoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gcmVhZFZlcnNpb24oKTsKLQogICAgIC8qKgogICAgICAqIFJhdGhlciB0aGFuIG9wZW4sIHJlYWQsIGFuZCBjbG9zZSB0aGUgYmlnIGRhdGEgZmlsZSBlYWNoIHRpbWUgd2UgbG9vayB1cCBhIHRpbWUgem9uZSwKICAgICAgKiB3ZSBtYXAgdGhlIGJpZyBkYXRhIGZpbGUgZHVyaW5nIHN0YXJ0dXAsIGFuZCB0aGVuIGp1c3QgdXNlIHRoZSBNZW1vcnlNYXBwZWRGaWxlLgpAQCAtNzIsNjggKzUyLDY5IEBACiAgICAgICogQXQgdGhlIG1vbWVudCwgdGhpcyAiYmlnIiBkYXRhIGZpbGUgaXMgYWJvdXQgNTAwIEtpQi4gQXQgc29tZSBwb2ludCwgdGhhdCB3aWxsIGJlIHNtYWxsCiAgICAgICogZW5vdWdoIHRoYXQgd2UnbGwganVzdCBrZWVwIHRoZSBieXRlW10gaW4gbWVtb3J5LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lbW9yeU1hcHBlZEZpbGUgQUxMX1pPTkVfREFUQSA9IG1hcERhdGEoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZW1vcnlNYXBwZWRGaWxlIFRaREFUQSA9IG1hcERhdGEoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB2ZXJzaW9uOwogCiAgICAgLyoqCiAgICAgICogVGhlICdpZHMnIGFycmF5IGNvbnRhaW5zIHRpbWUgem9uZSBpZHMgc29ydGVkIGFscGhhYmV0aWNhbGx5LCBmb3IgYmluYXJ5IHNlYXJjaGluZy4KICAgICAgKiBUaGUgb3RoZXIgdHdvIGFycmF5cyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuICdieXRlT2Zmc2V0cycgZ2l2ZXMgdGhlIGJ5dGUgb2Zmc2V0Ci0gICAgICogaW50byAiem9uZWluZm8uZGF0IiBvZiBlYWNoIHRpbWUgem9uZSwgYW5kICdyYXdVdGNPZmZzZXRzJyBnaXZlcyB0aGUgdGltZSB6b25lJ3MKLSAgICAgKiByYXcgVVRDIG9mZnNldC4KKyAgICAgKiBvZiBlYWNoIHRpbWUgem9uZSwgYW5kICdyYXdVdGNPZmZzZXRzJyBnaXZlcyB0aGUgdGltZSB6b25lJ3MgcmF3IFVUQyBvZmZzZXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gaWRzOwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGJ5dGVPZmZzZXRzOwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIHJhd1V0Y09mZnNldHM7CisKICAgICBzdGF0aWMgewotICAgICAgICByZWFkSW5kZXgoKTsKKyAgICAgICAgcmVhZEhlYWRlcigpOwogICAgIH0KIAogICAgIHByaXZhdGUgWm9uZUluZm9EQigpIHsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgZmlsZSBpbmRpY2F0aW5nIHRoZSBkYXRhYmFzZSB2ZXJzaW9uIGluIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFZlcnNpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBJb1V0aWxzLnJlYWRGaWxlQXNCeXRlQXJyYXkoWk9ORV9ESVJFQ1RPUllfTkFNRSArICJ6b25laW5mby52ZXJzaW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCBDaGFyc2V0cy5JU09fODg1OV8xKS50cmltKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkSGVhZGVyKCkgeworICAgICAgICAvLyBieXRlWzEyXSB0emRhdGFfdmVyc2lvbiAgLS0gInR6ZGF0YTIwMTJmXDAiCisgICAgICAgIC8vIGludCBpbmRleF9vZmZzZXQKKyAgICAgICAgLy8gaW50IGRhdGFfb2Zmc2V0CisgICAgICAgIC8vIGludCB6b25ldGFiX29mZnNldAorICAgICAgICBCdWZmZXJJdGVyYXRvciBpdCA9IFRaREFUQS5iaWdFbmRpYW5JdGVyYXRvcigpOworCisgICAgICAgIGJ5dGVbXSB0emRhdGFfdmVyc2lvbiA9IG5ldyBieXRlWzEyXTsKKyAgICAgICAgaXQucmVhZEJ5dGVBcnJheSh0emRhdGFfdmVyc2lvbiwgMCwgdHpkYXRhX3ZlcnNpb24ubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nIG1hZ2ljID0gbmV3IFN0cmluZyh0emRhdGFfdmVyc2lvbiwgMCwgNiwgQ2hhcnNldHMuVVNfQVNDSUkpOworICAgICAgICBpZiAoIW1hZ2ljLmVxdWFscygidHpkYXRhIikgfHwgdHpkYXRhX3ZlcnNpb25bMTFdICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJiYWQgdHpkYXRhIG1hZ2ljOiAiICsgQXJyYXlzLnRvU3RyaW5nKHR6ZGF0YV92ZXJzaW9uKSk7CiAgICAgICAgIH0KKyAgICAgICAgdmVyc2lvbiA9IG5ldyBTdHJpbmcodHpkYXRhX3ZlcnNpb24sIDYsIDUsIENoYXJzZXRzLlVTX0FTQ0lJKTsKKworICAgICAgICBpbnQgaW5kZXhfb2Zmc2V0ID0gaXQucmVhZEludCgpOworICAgICAgICBpbnQgZGF0YV9vZmZzZXQgPSBpdC5yZWFkSW50KCk7CisgICAgICAgIGludCB6b25ldGFiX29mZnNldCA9IGl0LnJlYWRJbnQoKTsKKworICAgICAgICByZWFkSW5kZXgoaXQsIGluZGV4X29mZnNldCwgZGF0YV9vZmZzZXQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIE1lbW9yeU1hcHBlZEZpbGUgbWFwRGF0YSgpIHsKKyAgICAgICAgTWVtb3J5TWFwcGVkRmlsZSByZXN1bHQgPSBtYXBEYXRhKFN5c3RlbS5nZXRlbnYoIkFORFJPSURfREFUQSIpICsgIi9taXNjL3pvbmVpbmZvLyIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1hcERhdGEoU3lzdGVtLmdldGVudigiQU5EUk9JRF9ST09UIikgKyAiL3Vzci9zaGFyZS96b25laW5mby8iKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgdHpkYXRhISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVtb3J5TWFwcGVkRmlsZSBtYXBEYXRhKFN0cmluZyBkaXJlY3RvcnkpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBNZW1vcnlNYXBwZWRGaWxlLm1tYXBSTyhaT05FX0ZJTEVfTkFNRSk7CisgICAgICAgICAgICByZXR1cm4gTWVtb3J5TWFwcGVkRmlsZS5tbWFwUk8oZGlyZWN0b3J5ICsgInR6ZGF0YSIpOwogICAgICAgICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiBlcnJub0V4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm5vRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVHJhZGl0aW9uYWxseSwgVW5peCBzeXN0ZW1zIGhhdmUgb25lIGZpbGUgcGVyIHRpbWUgem9uZS4gV2UgaGF2ZSBvbmUgYmlnIGRhdGEgZmlsZSwgd2hpY2gKLSAgICAgKiBpcyBqdXN0IGEgY29uY2F0ZW5hdGlvbiBvZiByZWd1bGFyIHRpbWUgem9uZSBmaWxlcy4gVG8gYWxsb3cgcmFuZG9tIGFjY2VzcyBpbnRvIHRoaXMgYmlnCi0gICAgICogZGF0YSBmaWxlLCB3ZSBhbHNvIGhhdmUgYW4gaW5kZXguIFdlIHJlYWQgdGhlIGluZGV4IGF0IHN0YXJ0dXAsIGFuZCBrZWVwIGl0IGluIG1lbW9yeSBzbwotICAgICAqIHdlIGNhbiBiaW5hcnkgc2VhcmNoIGJ5IGlkIHdoZW4gd2UgbmVlZCB0aW1lIHpvbmUgZGF0YS4KLSAgICAgKgotICAgICAqIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzLCBJIGJlbGlldmUsIEFuZHJvaWQncyBvd24sIGFuZCB1bmRvY3VtZW50ZWQuCi0gICAgICoKLSAgICAgKiBBbGwgdGhpcyBjb2RlIGFzc3VtZXMgc3RyaW5ncyBhcmUgVVMtQVNDSUkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkSW5kZXgoKSB7Ci0gICAgICAgIE1lbW9yeU1hcHBlZEZpbGUgbWFwcGVkRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXBwZWRGaWxlID0gTWVtb3J5TWFwcGVkRmlsZS5tbWFwUk8oSU5ERVhfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIHJlYWRJbmRleChtYXBwZWRGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSW9VdGlscy5jbG9zZVF1aWV0bHkobWFwcGVkRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRJbmRleChNZW1vcnlNYXBwZWRGaWxlIG1hcHBlZEZpbGUpIHRocm93cyBFcnJub0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJJdGVyYXRvciBpdCA9IG1hcHBlZEZpbGUuYmlnRW5kaWFuSXRlcmF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRJbmRleChCdWZmZXJJdGVyYXRvciBpdCwgaW50IGluZGV4T2Zmc2V0LCBpbnQgZGF0YU9mZnNldCkgeworICAgICAgICBpdC5zZWVrKGluZGV4T2Zmc2V0KTsKIAogICAgICAgICAvLyBUaGUgZGF0YWJhc2UgcmVzZXJ2ZXMgNDAgYnl0ZXMgZm9yIGVhY2ggaWQuCiAgICAgICAgIGZpbmFsIGludCBTSVpFT0ZfVFpOQU1FID0gNDA7CkBAIC0xNDEsMTggKzEyMiwyMiBAQAogICAgICAgICBmaW5hbCBpbnQgU0laRU9GX1RaSU5UID0gNDsKIAogICAgICAgICBieXRlW10gaWRCeXRlcyA9IG5ldyBieXRlW1NJWkVPRl9UWk5BTUVdOwotICAgICAgICBpbnQgbnVtRW50cmllcyA9IChpbnQpIG1hcHBlZEZpbGUuc2l6ZSgpIC8gKFNJWkVPRl9UWk5BTUUgKyAzKlNJWkVPRl9UWklOVCk7CisgICAgICAgIGludCBpbmRleFNpemUgPSAoZGF0YU9mZnNldCAtIGluZGV4T2Zmc2V0KTsKKyAgICAgICAgaW50IGVudHJ5Q291bnQgPSBpbmRleFNpemUgLyAoU0laRU9GX1RaTkFNRSArIDMqU0laRU9GX1RaSU5UKTsKIAotICAgICAgICBjaGFyW10gaWRDaGFycyA9IG5ldyBjaGFyW251bUVudHJpZXMgKiBTSVpFT0ZfVFpOQU1FXTsKLSAgICAgICAgaW50W10gaWRFbmQgPSBuZXcgaW50W251bUVudHJpZXNdOworICAgICAgICBjaGFyW10gaWRDaGFycyA9IG5ldyBjaGFyW2VudHJ5Q291bnQgKiBTSVpFT0ZfVFpOQU1FXTsKKyAgICAgICAgaW50W10gaWRFbmQgPSBuZXcgaW50W2VudHJ5Q291bnRdOwogICAgICAgICBpbnQgaWRPZmZzZXQgPSAwOwogCi0gICAgICAgIGJ5dGVPZmZzZXRzID0gbmV3IGludFtudW1FbnRyaWVzXTsKLSAgICAgICAgcmF3VXRjT2Zmc2V0cyA9IG5ldyBpbnRbbnVtRW50cmllc107CisgICAgICAgIGJ5dGVPZmZzZXRzID0gbmV3IGludFtlbnRyeUNvdW50XTsKKyAgICAgICAgcmF3VXRjT2Zmc2V0cyA9IG5ldyBpbnRbZW50cnlDb3VudF07CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeUNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGl0LnJlYWRCeXRlQXJyYXkoaWRCeXRlcywgMCwgaWRCeXRlcy5sZW5ndGgpOworCiAgICAgICAgICAgICBieXRlT2Zmc2V0c1tpXSA9IGl0LnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGJ5dGVPZmZzZXRzW2ldICs9IGRhdGFPZmZzZXQ7IC8vIFRPRE86IGNoYW5nZSB0aGUgZmlsZSBmb3JtYXQgc28gdGhpcyBpcyBpbmNsdWRlZC4KKwogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGl0LnJlYWRJbnQoKTsKICAgICAgICAgICAgIGlmIChsZW5ndGggPCA0NCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigibGVuZ3RoIGluIGluZGV4IGZpbGUgPCBzaXplb2YodHpoZWFkKSIpOwpAQCAtMTc0LDggKzE1OSw4IEBACiAgICAgICAgIC8vIFdlIGNyZWF0ZSBvbmUgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBpZHMsIGFuZCB0aGVuIGJyZWFrIHRoYXQgaW50byBzdWJzdHJpbmdzLgogICAgICAgICAvLyBUaGlzIHdheSwgYWxsIGlkcyBzaGFyZSBhIHNpbmdsZSBjaGFyW10gb24gdGhlIGhlYXAuCiAgICAgICAgIFN0cmluZyBhbGxJZHMgPSBuZXcgU3RyaW5nKGlkQ2hhcnMsIDAsIGlkT2Zmc2V0KTsKLSAgICAgICAgaWRzID0gbmV3IFN0cmluZ1tudW1FbnRyaWVzXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWRzID0gbmV3IFN0cmluZ1tlbnRyeUNvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeUNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlkc1tpXSA9IGFsbElkcy5zdWJzdHJpbmcoaSA9PSAwID8gMCA6IGlkRW5kW2kgLSAxXSwgaWRFbmRbaV0pOwogICAgICAgICB9CiAgICAgfQpAQCAtMTg3LDQ2ICsxNzIsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgQnVmZmVySXRlcmF0b3IgZGF0YSA9IEFMTF9aT05FX0RBVEEuYmlnRW5kaWFuSXRlcmF0b3IoKTsKLSAgICAgICAgZGF0YS5za2lwKGJ5dGVPZmZzZXRzW2luZGV4XSk7CisgICAgICAgIEJ1ZmZlckl0ZXJhdG9yIGl0ID0gVFpEQVRBLmJpZ0VuZGlhbkl0ZXJhdG9yKCk7CisgICAgICAgIGl0LnNraXAoYnl0ZU9mZnNldHNbaW5kZXhdKTsKIAotICAgICAgICAvLyBWYXJpYWJsZSBuYW1lcyBiZWdpbm5pbmcgdHpoXyBjb3JyZXNwb25kIHRvIHRob3NlIGluICJ0emZpbGUuaCIuCi0gICAgICAgIC8vIENoZWNrIHR6aF9tYWdpYy4KLSAgICAgICAgaWYgKGRhdGEucmVhZEludCgpICE9IDB4NTQ1YTY5NjYpIHsgLy8gIlRaaWYiCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNraXAgdGhlIHVuaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgaGVhZGVyLgotICAgICAgICBkYXRhLnNraXAoMjgpOwotCi0gICAgICAgIC8vIFJlYWQgdGhlIHNpemVzIG9mIHRoZSBhcnJheXMgd2UncmUgYWJvdXQgdG8gcmVhZC4KLSAgICAgICAgaW50IHR6aF90aW1lY250ID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgIGludCB0emhfdHlwZWNudCA9IGRhdGEucmVhZEludCgpOwotCi0gICAgICAgIGRhdGEuc2tpcCg0KTsgLy8gU2tpcCB0emhfY2hhcmNudC4KLQotICAgICAgICBpbnRbXSB0cmFuc2l0aW9ucyA9IG5ldyBpbnRbdHpoX3RpbWVjbnRdOwotICAgICAgICBkYXRhLnJlYWRJbnRBcnJheSh0cmFuc2l0aW9ucywgMCwgdHJhbnNpdGlvbnMubGVuZ3RoKTsKLQotICAgICAgICBieXRlW10gdHlwZSA9IG5ldyBieXRlW3R6aF90aW1lY250XTsKLSAgICAgICAgZGF0YS5yZWFkQnl0ZUFycmF5KHR5cGUsIDAsIHR5cGUubGVuZ3RoKTsKLQotICAgICAgICBpbnRbXSBnbXRPZmZzZXRzID0gbmV3IGludFt0emhfdHlwZWNudF07Ci0gICAgICAgIGJ5dGVbXSBpc0RzdHMgPSBuZXcgYnl0ZVt0emhfdHlwZWNudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHpoX3R5cGVjbnQ7ICsraSkgewotICAgICAgICAgICAgZ210T2Zmc2V0c1tpXSA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgICAgaXNEc3RzW2ldID0gZGF0YS5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgLy8gV2Ugc2tpcCB0aGUgYWJicmV2aWF0aW9uIGluZGV4LiBUaGlzIHdvdWxkIGxldCB1cyBwcm92aWRlIGhpc3RvcmljYWxseS1hY2N1cmF0ZQotICAgICAgICAgICAgLy8gdGltZSB6b25lIGFiYnJldmlhdGlvbnMgKHN1Y2ggYXMgIkFIU1QiLCAiWVNUIiwgYW5kICJBS1NUIiBmb3Igc3RhbmRhcmQgdGltZSBpbgotICAgICAgICAgICAgLy8gQW1lcmljYS9BbmNob3JhZ2UgaW4gMTk4MiwgMTk4MywgYW5kIDE5ODQgcmVzcGVjdGl2ZWx5KS4gSUNVIG9ubHkga25vd3MgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgIC8vIG5hbWVzLCB0aG91Z2gsIHNvIGV2ZW4gaWYgd2UgZGlkIHVzZSB0aGlzIGRhdGEgdG8gcHJvdmlkZSB0aGUgY29ycmVjdCBhYmJyZXZpYXRpb25zCi0gICAgICAgICAgICAvLyBmb3IgZW5fVVMsIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gcHJvdmlkZSBjb3JyZWN0IGFiYnJldmlhdGlvbnMgZm9yIG90aGVyIGxvY2FsZXMsCi0gICAgICAgICAgICAvLyBub3Igd291bGQgd2UgYmUgYWJsZSB0byBwcm92aWRlIGNvcnJlY3QgbG9uZyBmb3JtcyAoc3VjaCBhcyAiWXVrb24gU3RhbmRhcmQgVGltZSIpCi0gICAgICAgICAgICAvLyBmb3IgYW55IGxvY2FsZS4gKFRoZSBSSSBkb2Vzbid0IGRvIGFueSBiZXR0ZXIgdGhhbiB1cyBoZXJlIGVpdGhlci4pCi0gICAgICAgICAgICBkYXRhLnNraXAoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFpvbmVJbmZvKGlkLCB0cmFuc2l0aW9ucywgdHlwZSwgZ210T2Zmc2V0cywgaXNEc3RzKTsKKyAgICAgICAgcmV0dXJuIFpvbmVJbmZvLm1ha2VUaW1lWm9uZShpZCwgaXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlSURzKCkgewpAQCAtMjM1LDcgKzE4NCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZUlEcyhpbnQgcmF3T2Zmc2V0KSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBlbmQgPSByYXdVdGNPZmZzZXRzLmxlbmd0aDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBlbmQgPSByYXdVdGNPZmZzZXRzLmxlbmd0aDsgaSA8IGVuZDsgKytpKSB7CiAgICAgICAgICAgICBpZiAocmF3VXRjT2Zmc2V0c1tpXSA9PSByYXdPZmZzZXQpIHsKICAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChpZHNbaV0pOwogICAgICAgICAgICAgfQpAQCAtMjYwLDYgKzIwOSw2IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZFUlNJT047CisgICAgICAgIHJldHVybiB2ZXJzaW9uOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xR2VuZXJhbGl6ZWRUaW1lLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvQVNOMUdlbmVyYWxpemVkVGltZS5qYXZhCmluZGV4IGU2NGViZTAuLjY0ZDdjZWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xR2VuZXJhbGl6ZWRUaW1lLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFHZW5lcmFsaXplZFRpbWUuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0czsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKIAogLyoqCkBAIC04Myw3ICs4NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTl9QQVRURVJOID0gInl5eXlNTWRkSEhtbXNzLlNTUyI7CiAKICAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoQmVyT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KEdFTl9QQVRURVJOKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChHRU5fUEFUVEVSTiwgTG9jYWxlLlVTKTsKICAgICAgICAgc2RmLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CiAgICAgICAgIFN0cmluZyB0ZW1wID0gc2RmLmZvcm1hdChvdXQuY29udGVudCk7CiAgICAgICAgIC8vIGN1dCBvZmYgdHJhaWxpbmcgMHMKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xU3RyaW5nVHlwZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlLmphdmEKaW5kZXggNzFmNWIwZS4uMDI0YjY1ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlLmphdmEKQEAgLTMyLDQzICszMiwzOSBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNOMVN0cmluZ1R5cGUgZXh0ZW5kcyBBU04xVHlwZSB7CiAKLSAgICAvLyBUT0RPOiB3aGF0IGFib3V0IGRlZmluaW5nIHRoZW0gYXMgc2VwYXJhdGUgY2xhc3Nlcz8KLSAgICAvLyBUT0RPOiBjaGVjayBkZWNvZGVkL2VuY29kZWQgY2hhcmFjdGVycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVN0cmluZ1R5cGUgQk1QU1RSSU5HID0gbmV3IEFTTjFTdHJpbmdUeXBlKAotICAgICAgICAgICAgVEFHX0JNUFNUUklORykgewotICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQVNOMVN0cmluZ1VURjhUeXBlIGV4dGVuZHMgQVNOMVN0cmluZ1R5cGUgeworICAgICAgICBwdWJsaWMgQVNOMVN0cmluZ1VURjhUeXBlKGludCB0YWdOdW1iZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHRhZ051bWJlcik7CisgICAgICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVN0cmluZ1R5cGUgSUE1U1RSSU5HID0gbmV3IEFTTjFTdHJpbmdUeXBlKAotICAgICAgICAgICAgVEFHX0lBNVNUUklORykgewotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTdHJpbmdUeXBlIEdFTkVSQUxTVFJJTkcgPSBuZXcgQVNOMVN0cmluZ1R5cGUoCi0gICAgICAgICAgICBUQUdfR0VORVJBTFNUUklORykgewotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTdHJpbmdUeXBlIFBSSU5UQUJMRVNUUklORyA9IG5ldyBBU04xU3RyaW5nVHlwZSgKLSAgICAgICAgICAgIFRBR19QUklOVEFCTEVTVFJJTkcpIHsKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xU3RyaW5nVHlwZSBURUxFVEVYU1RSSU5HID0gbmV3IEFTTjFTdHJpbmdUeXBlKAotICAgICAgICAgICAgVEFHX1RFTEVURVhTVFJJTkcpIHsKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xU3RyaW5nVHlwZSBVTklWRVJTQUxTVFJJTkcgPSBuZXcgQVNOMVN0cmluZ1R5cGUoCi0gICAgICAgICAgICBUQUdfVU5JVkVSU0FMU1RSSU5HKSB7Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVN0cmluZ1R5cGUgVVRGOFNUUklORyA9IG5ldyBBU04xU3RyaW5nVHlwZShUQUdfVVRGOFNUUklORykgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIE9iamVjdCBnZXREZWNvZGVkT2JqZWN0KEJlcklucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWNvZGVkT2JqZWN0KEJlcklucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoaW4uYnVmZmVyLCBpbi5jb250ZW50T2Zmc2V0LCBpbi5sZW5ndGgsIENoYXJzZXRzLlVURl84KTsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoQmVyT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KEJlck91dHB1dFN0cmVhbSBvdXQpIHsKICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9ICgoU3RyaW5nKSBvdXQuY29udGVudCkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOwogICAgICAgICAgICAgb3V0LmNvbnRlbnQgPSBieXRlczsKICAgICAgICAgICAgIG91dC5sZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICAgICAgIH0KLSAgICB9OworICAgIH0KKworICAgIC8vIFRPRE86IHdoYXQgYWJvdXQgZGVmaW5pbmcgdGhlbSBhcyBzZXBhcmF0ZSBjbGFzc2VzPworICAgIC8vIFRPRE86IGNoZWNrIGRlY29kZWQvZW5jb2RlZCBjaGFyYWN0ZXJzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xU3RyaW5nVHlwZSBCTVBTVFJJTkcgPSBuZXcgQVNOMVN0cmluZ1R5cGUoVEFHX0JNUFNUUklORykge307CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTdHJpbmdUeXBlIElBNVNUUklORyA9IG5ldyBBU04xU3RyaW5nVHlwZShUQUdfSUE1U1RSSU5HKSB7fTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVN0cmluZ1R5cGUgR0VORVJBTFNUUklORyA9IG5ldyBBU04xU3RyaW5nVHlwZShUQUdfR0VORVJBTFNUUklORykge307CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTdHJpbmdUeXBlIFBSSU5UQUJMRVNUUklORyA9IG5ldyBBU04xU3RyaW5nVHlwZShUQUdfUFJJTlRBQkxFU1RSSU5HKSB7fTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVN0cmluZ1R5cGUgVEVMRVRFWFNUUklORyA9IG5ldyBBU04xU3RyaW5nVVRGOFR5cGUoVEFHX1RFTEVURVhTVFJJTkcpIHt9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xU3RyaW5nVHlwZSBVTklWRVJTQUxTVFJJTkcgPSBuZXcgQVNOMVN0cmluZ1R5cGUoVEFHX1VOSVZFUlNBTFNUUklORykge307CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTdHJpbmdUeXBlIFVURjhTVFJJTkcgPSBuZXcgQVNOMVN0cmluZ1VURjhUeXBlKFRBR19VVEY4U1RSSU5HKSB7fTsKIAogICAgIHB1YmxpYyBBU04xU3RyaW5nVHlwZShpbnQgdGFnTnVtYmVyKSB7CiAgICAgICAgIHN1cGVyKHRhZ051bWJlcik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvQVNOMVVUQ1RpbWUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xVVRDVGltZS5qYXZhCmluZGV4IDJiYzhmNGIuLjdjMzU1ZjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xVVRDVGltZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xVVRDVGltZS5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRzOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiAvKioKQEAgLTk0LDcgKzk1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRDX1BBVFRFUk4gPSAieXlNTWRkSEhtbXNzJ1onIjsKIAogICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoQmVyT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KFVUQ19QQVRURVJOKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChVVENfUEFUVEVSTiwgTG9jYWxlLlVTKTsKICAgICAgICAgc2RmLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CiAgICAgICAgIG91dC5jb250ZW50ID0gc2RmLmZvcm1hdChvdXQuY29udGVudCkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOwogICAgICAgICBvdXQubGVuZ3RoID0gKChieXRlW10pIG91dC5jb250ZW50KS5sZW5ndGg7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvT2JqZWN0SWRlbnRpZmllci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL09iamVjdElkZW50aWZpZXIuamF2YQppbmRleCAyNDE0MGU1Li5lYjFlM2UzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvT2JqZWN0SWRlbnRpZmllci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9PYmplY3RJZGVudGlmaWVyLmphdmEKQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgICAgICAgICAgaWYgKCEgc2hvdWxkVGhyb3cpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0ciA9PSBudWxsIik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wa2NzNy9TaWduZXJJbmZvLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3BrY3M3L1NpZ25lckluZm8uamF2YQppbmRleCBiYWFhMDkwLi40MDE1ZTcwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3BrY3M3L1NpZ25lckluZm8uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3BrY3M3L1NpZ25lckluZm8uamF2YQpAQCAtOTMsMTAgKzkzLDE4IEBACiAgICAgICAgIHJldHVybiBkaWdlc3RBbGdvcml0aG0uZ2V0QWxnb3JpdGhtKCk7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3RBbGdvcml0aG1OYW1lKCkgeworICAgICAgICByZXR1cm4gZGlnZXN0QWxnb3JpdGhtLmdldEFsZ29yaXRobU5hbWUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldERpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG0oKSB7CiAgICAgICAgIHJldHVybiBkaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtLmdldEFsZ29yaXRobSgpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobU5hbWUoKSB7CisgICAgICAgIHJldHVybiBkaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtLmdldEFsZ29yaXRobU5hbWUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgTGlzdDxBdHRyaWJ1dGVUeXBlQW5kVmFsdWU+IGdldEF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgICBpZiAoYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRGYWN0b3J5SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0RmFjdG9yeUltcGwuamF2YQppbmRleCA3MjA3MDAyLi45NDUzMTY0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9YNTA5Q2VydEZhY3RvcnlJbXBsLmphdmEKQEAgLTE5Nyw3ICsxOTcsOCBAQAogICAgICAgICAgICAgICAgIC8vIHNvbWUgQ2VydGlmaWNhdGVzIGhhdmUgYmVlbiByZWFkCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIC8qIE5vIGRhdGEgaW4gdGhlIHN0cmVhbSwgc28gcmV0dXJuIHRoZSBlbXB0eSBjb2xsZWN0aW9uLiAqLworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBlbHNlOiBjaGVjayBpZiBpdCBpcyBQS0NTNwogICAgICAgICAgICAgaWYgKHNlY29uZF9hc24xX3RhZyA9PSBBU04xQ29uc3RhbnRzLlRBR19PSUQpIHsKQEAgLTQxNCw3ICs0MTUsNyBAQAogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeVNwaSNlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKExpc3QpCiAgICAgICogbWV0aG9kIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbwogICAgICAqLwotICAgIHB1YmxpYyBDZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKExpc3QgY2VydGlmaWNhdGVzKQorICAgIHB1YmxpYyBDZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKExpc3Q8PyBleHRlbmRzIENlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0UGF0aEltcGwoY2VydGlmaWNhdGVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRJbXBsLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRJbXBsLmphdmEKaW5kZXggYjE1ZThhYy4uNjhiY2VjNiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0SW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9YNTA5Q2VydEltcGwuamF2YQpAQCAtMzA1LDkgKzMwNSw5IEBACiAKICAgICBwdWJsaWMgaW50IGdldEJhc2ljQ29uc3RyYWludHMoKSB7CiAgICAgICAgIGlmIChleHRlbnNpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy52YWx1ZU9mQmFzaWNDb25zdHJhaW5zKCk7CisgICAgICAgIHJldHVybiBleHRlbnNpb25zLnZhbHVlT2ZCYXNpY0NvbnN0cmFpbnRzKCk7CiAgICAgfQogCiAgICAgcHVibGljIENvbGxlY3Rpb248TGlzdDw/Pj4gZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9YNTA5Q2VydFBhdGhJbXBsLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRQYXRoSW1wbC5qYXZhCmluZGV4IGI2NWQzNDUuLjM2OTk3MDAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY2VydC9YNTA5Q2VydFBhdGhJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0UGF0aEltcGwuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQW55OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFFeHBsaWNpdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xSW1wbGljaXQ7CkBAIC03MiwxMTggKzczLDE1MSBAQAogICogJm5ic3A7CiAgKi8KIHB1YmxpYyBjbGFzcyBYNTA5Q2VydFBhdGhJbXBsIGV4dGVuZHMgQ2VydFBhdGggewotCiAgICAgLyoqCiAgICAgICogQHNlcmlhbAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc5ODk3NTUxMDYyMDk1MTU0MzZMOwogCi0gICAgLy8gc3VwcG9ydGVkIGVuY29kaW5nIHR5cGVzOgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBLSV9QQVRIID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQS0NTNyA9IDE7Ci0KLSAgICAvLyBzdXBwb3J0ZWQgZW5jb2RpbmcgbmFtZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBlbmNvZGluZ3NBcnIgPSBuZXcgU3RyaW5nW10geyJQa2lQYXRoIiwgIlBLQ1M3In07Ci0gICAgc3RhdGljIGZpbmFsIExpc3QgZW5jb2RpbmdzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGVuY29kaW5nc0FycikpOwotICAgIC8vIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyByZXByZXNlbnRpbmcgdGhpcyBjZXJ0aWZpY2F0aW9uIHBhdGgKLSAgICBwcml2YXRlIGZpbmFsIExpc3QgY2VydGlmaWNhdGVzOwotICAgIC8vIFBraVBhdGggZW5jb2Rpbmcgb2YgdGhlIGNlcnRpZmljYXRpb24gcGF0aAotICAgIHByaXZhdGUgYnl0ZVtdIHBraVBhdGhFbmNvZGluZzsKLSAgICAvLyBQS0NTNyBlbmNvZGluZyBvZiB0aGUgY2VydGlmaWNhdGlvbiBwYXRoCi0gICAgcHJpdmF0ZSBieXRlW10gcGtjczdFbmNvZGluZzsKLQogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgWC41MDkgQ2VydGlmaWNhdGlvbiBQYXRoIG92ZXIgdGhlIHNwZWNpZmllZAotICAgICAqIGxpc3Qgb2YgY2VydGlmaWNhdGVzLgotICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gaWYgc29tZSBvZiB0aGUgb2JqZWN0IGluIHRoZSBsaXN0Ci0gICAgICogaXMgbm90IGFuIGluc3RhbmNlIG9mIHN1YmNsYXNzIG9mIFg1MDlDZXJ0aWZpY2F0ZS4KKyAgICAgKiBTdXBwb3J0ZWQgZW5jb2RpbmcgdHlwZXMgZm9yIENlcnRoUGF0aC4gVXNlZCBieSB0aGUgdmFyaW91cyBBUElzIHRoYXQKKyAgICAgKiBlbmNvZGUgdGhpcyBpbnRvIGJ5dGVzIHN1Y2ggYXMge0BsaW5rICNnZXRFbmNvZGVkKCl9LgogICAgICAqLwotICAgIHB1YmxpYyBYNTA5Q2VydFBhdGhJbXBsKExpc3QgY2VydHMpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCJYLjUwOSIpOwotICAgICAgICBpbnQgc2l6ZSA9IGNlcnRzLnNpemUoKTsKLSAgICAgICAgY2VydGlmaWNhdGVzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGNlcnQgPSBjZXJ0cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIShjZXJ0IGluc3RhbmNlb2YgWDUwOUNlcnRpZmljYXRlKSApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiT25lIG9mIHRoZSBwcm92aWRlZCBjZXJ0aWZpY2F0ZXMgaXMgbm90IGFuIFg1MDkgY2VydGlmaWNhdGUiKTsKKyAgICBwcml2YXRlIGVudW0gRW5jb2RpbmcgeworICAgICAgICBQS0lfUEFUSCgiUGtpUGF0aCIpLAorICAgICAgICBQS0NTNygiUEtDUzciKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcGlOYW1lOworCisgICAgICAgIEVuY29kaW5nKFN0cmluZyBhcGlOYW1lKSB7CisgICAgICAgICAgICB0aGlzLmFwaU5hbWUgPSBhcGlOYW1lOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEVuY29kaW5nIGZpbmRCeUFwaU5hbWUoU3RyaW5nIGFwaU5hbWUpIHRocm93cyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoRW5jb2RpbmcgZWxlbWVudCA6IHZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZS5lcXVhbHMoYXBpTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2VydGlmaWNhdGVzLmFkZChjZXJ0KTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIEludGVybmFsbHkgdXNlZCBjb25zdHJ1Y3Rvci4KLSAgICAgKiBDcmVhdGVzIGFuIFguNTA5IENlcnRpZmljYXRpb24gUGF0aCBvdmVyIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBsaXN0IG9mIGNlcnRpZmljYXRlcyBhbmQgdGhlaXIgZW5jb2RlZCBmb3JtIG9mIHNwZWNpZmllZCB0eXBlLgotICAgICAqIEBwYXJhbSBjZXJ0cyAtIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcwotICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIHR5cGUgb2YgdGhlIGVuY29kZWQgZm9ybSBvbiB0aGUgYmFzZSBvZiB3aGljaAotICAgICAqIHRoaXMgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgaGFkIGJlZW4gYnVpbHQuCi0gICAgICogQHBhcmFtIGVuY29kaW5nIC0gZW5jb2RlZCBmb3JtIG9mIGNlcnRpZmljYXRpb24gcGF0aC4KKyAgICAvKiogVW5tb2RpZmlhYmxlIGxpc3Qgb2YgZW5jb2RpbmdzIGZvciB0aGUgQVBJLiAqLworICAgIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gZW5jb2RpbmdzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBFbmNvZGluZy5QS0lfUEFUSC5hcGlOYW1lLAorICAgICAgICAgICAgRW5jb2RpbmcuUEtDUzcuYXBpTmFtZSwKKyAgICB9KSk7CisKKyAgICAvKiogVGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIGluIHRoZSBvcmRlciBvZiB0YXJnZXQgdG93YXJkIHRydXN0IGFuY2hvci4gKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8WDUwOUNlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXM7CisKKyAgICAvKiogUGtpUGF0aCBlbmNvZGluZyBvZiB0aGUgY2VydGlmaWNhdGlvbiBwYXRoLiAqLworICAgIHByaXZhdGUgYnl0ZVtdIHBraVBhdGhFbmNvZGluZzsKKworICAgIC8qKiBQS0NTNyBlbmNvZGluZyBvZiB0aGUgY2VydGlmaWNhdGlvbiBwYXRoLiAqLworICAgIHByaXZhdGUgYnl0ZVtdIHBrY3M3RW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFguNTA5IENlcnRQYXRoIG92ZXIgdGhlIHNwZWNpZmllZCBsaXN0IG9mCisgICAgICogY2VydGlmaWNhdGVzLgorICAgICAqCisgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBpZiBzb21lIG9mIHRoZSBvYmplY3QgaW4gdGhlIGxpc3QgaXMgbm90IGFuCisgICAgICogICAgICAgICAgICAgaW5zdGFuY2Ugb2Ygc3ViY2xhc3Mgb2YgWDUwOUNlcnRpZmljYXRlLgogICAgICAqLwotICAgIHByaXZhdGUgWDUwOUNlcnRQYXRoSW1wbChMaXN0IGNlcnRzLCBpbnQgdHlwZSwgYnl0ZVtdIGVuY29kaW5nKSB7CisgICAgcHVibGljIFg1MDlDZXJ0UGF0aEltcGwoTGlzdDw/IGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlPiBjZXJ0cykKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCJYLjUwOSIpOwotICAgICAgICBpZiAodHlwZSA9PSBQS0lfUEFUSCkgewotICAgICAgICAgICAgdGhpcy5wa2lQYXRoRW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICAgICAgfSBlbHNlIHsgLy8gUEtDUzcKLSAgICAgICAgICAgIHRoaXMucGtjczdFbmNvZGluZyA9IGVuY29kaW5nOworCisgICAgICAgIGZpbmFsIGludCBzaXplID0gY2VydHMuc2l6ZSgpOworICAgICAgICBjZXJ0aWZpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4oc2l6ZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSBjZXJ0ID0gY2VydHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCEoY2VydCBpbnN0YW5jZW9mIFg1MDlDZXJ0aWZpY2F0ZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkNlcnRpZmljYXRlICIgKyBpICsgIiBpcyBub3QgYW4gWC41MDkgY2VydGlmaWNhdGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2VydGlmaWNhdGVzLmFkZCgoWDUwOUNlcnRpZmljYXRlKSBjZXJ0KTsKICAgICAgICAgfQotICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgdHlwZSBjaGVjayBhbmQgbGlzdCBjbG9uaW5nIGhlcmUsCi0gICAgICAgIC8vIGJlY2F1c2UgaXQgaGFzIGJlZW4gZG9uZSBkdXJpbmcgZGVjb2RpbmcuCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYLjUwOSBDZXJ0UGF0aCBvdmVyIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGNlcnRzfS4gVGhlCisgICAgICoge0Bjb2RlIGNlcnRzfSBzaG91bGQgYmUgc29ydGVkIGNvcnJlY3RseSB3aGVuIGNhbGxpbmcgaW50byB0aGUKKyAgICAgKiBjb25zdHJ1Y3Rvci4gQWRkaXRpb25hbGx5LCB0aGUge0Bjb2RlIGVuY29kZWRQYXRofSBzaG91bGQgbWF0Y2ggdGhlCisgICAgICogZXhwZWN0ZWQgb3V0cHV0IGZvciB0aGUge0Bjb2RlIHR5cGV9IG9mIGVuY29kaW5nLgorICAgICAqLworICAgIHByaXZhdGUgWDUwOUNlcnRQYXRoSW1wbChMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMsIEVuY29kaW5nIHR5cGUpIHsKKyAgICAgICAgc3VwZXIoIlguNTA5Iik7CisKICAgICAgICAgY2VydGlmaWNhdGVzID0gY2VydHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGNlcnRpZmljYXRpb24gcGF0aCBvYmplY3Qgb24gdGhlIGJhc2Ugb2YgUGtpUGF0aAotICAgICAqIGVuY29kZWQgZm9ybSBwcm92aWRlZCB2aWEgaW5wdXQgc3RyZWFtLgotICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gaWYgc29tZSBwcm9ibGVtcyBvY2N1cnJlZCBkdXJpbmcKLSAgICAgKiB0aGUgZGVjb2RpbmcuCisgICAgICogRXh0cmFjdCBhIENlcnRQYXRoIGZyb20gYSBQS0NTIzcge0Bjb2RlIGNvbnRlbnRJbmZvfSBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRQYXRoSW1wbCBnZXRDZXJ0UGF0aEZyb21Db250ZW50SW5mbyhDb250ZW50SW5mbyBjb250ZW50SW5mbykKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNpZ25lZERhdGEgc2QgPSBjb250ZW50SW5mby5nZXRTaWduZWREYXRhKCk7CisgICAgICAgIGlmIChzZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkluY29ycmVjdCBQS0NTNyBlbmNvZGVkIGZvcm06IG1pc3Npbmcgc2lnbmVkIGRhdGEiKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8Q2VydGlmaWNhdGU+IGNlcnRzID0gc2QuZ2V0Q2VydGlmaWNhdGVzKCk7CisgICAgICAgIGlmIChjZXJ0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBjZXJ0cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxYNTA5Q2VydGlmaWNhdGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8WDUwOUNlcnRpZmljYXRlPihjZXJ0cy5zaXplKCkpOworICAgICAgICBmb3IgKENlcnRpZmljYXRlIGNlcnQgOiBjZXJ0cykgeworICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgWDUwOUNlcnRJbXBsKGNlcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRQYXRoSW1wbChyZXN1bHQsIEVuY29kaW5nLlBLQ1M3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgY2VydGlmaWNhdGlvbiBwYXRoIG9iamVjdCBvbiB0aGUgYmFzZSBvZiBQa2lQYXRoIGVuY29kZWQgZm9ybQorICAgICAqIHByb3ZpZGVkIHZpYSBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIGlmIHNvbWUgcHJvYmxlbXMgb2NjdXJyZWQgZHVyaW5nIHRoZQorICAgICAqICAgICAgICAgZGVjb2RpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBYNTA5Q2VydFBhdGhJbXBsIGdldEluc3RhbmNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIChYNTA5Q2VydFBhdGhJbXBsKSBBU04xLmRlY29kZShpbik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiSW5jb3JyZWN0IGVuY29kZWQgZm9ybTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlY29kZSBDZXJ0UGF0aCIsIGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGNlcnRpZmljYXRpb24gcGF0aCBvYmplY3Qgb24gdGhlIGJhc2Ugb2YgZW5jb2RpbmcgcHJvdmlkZWQgdmlhCisgICAgICogR2VuZXJhdGVzIGNlcnRpZmljYXRpb24gcGF0aCBvYmplY3Qgb24gdGhlIGJhc2lzIG9mIGVuY29kaW5nIHByb3ZpZGVkIHZpYQogICAgICAqIGlucHV0IHN0cmVhbS4gVGhlIGZvcm1hdCBvZiBwcm92aWRlZCBlbmNvZGVkIGZvcm0gaXMgc3BlY2lmaWVkIGJ5CiAgICAgICogcGFyYW1ldGVyIDxjb2RlPmVuY29kaW5nPC9jb2RlPi4KKyAgICAgKgogICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gaWYgc3BlY2lmaWVkIGVuY29kaW5nIGZvcm0gaXMgbm90IHN1cHBvcnRlZCwKLSAgICAgKiBvciBzb21lIHByb2JsZW1zIG9jY3VycmVkIGR1cmluZyB0aGUgZGVjb2RpbmcuCisgICAgICogICAgICAgICBvciBzb21lIHByb2JsZW1zIG9jY3VycmVkIGR1cmluZyB0aGUgZGVjb2RpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBYNTA5Q2VydFBhdGhJbXBsIGdldEluc3RhbmNlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgZW5jb2RpbmcpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICBpZiAoIWVuY29kaW5ncy5jb250YWlucyhlbmNvZGluZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmciKTsKLSAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGVuY29kaW5nc0FyclswXS5lcXVhbHMoZW5jb2RpbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIG9iamVjdCBmcm9tIFBraVBhdGggZW5jb2RlZCBmb3JtCi0gICAgICAgICAgICAgICAgcmV0dXJuIChYNTA5Q2VydFBhdGhJbXBsKSBBU04xLmRlY29kZShpbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBvYmplY3QgZnJvbSBQS0NTICM3IGVuY29kZWQgZm9ybQotICAgICAgICAgICAgICAgIENvbnRlbnRJbmZvIGNpID0gKENvbnRlbnRJbmZvKSBDb250ZW50SW5mby5BU04xLmRlY29kZShpbik7Ci0gICAgICAgICAgICAgICAgU2lnbmVkRGF0YSBzZCA9IGNpLmdldFNpZ25lZERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBQS0NTNyBlbmNvZGVkIGZvcm06IG1pc3Npbmcgc2lnbmVkIGRhdGEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gY2VydHMgPSBzZC5nZXRDZXJ0aWZpY2F0ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2VydHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBjaGFpbiBvZiBjZXJ0aWZpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgY2VydHMgPSBuZXcgQXJyYXlMaXN0PENlcnRpZmljYXRlPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMaXN0PFg1MDlDZXJ0SW1wbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxYNTA5Q2VydEltcGw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChDZXJ0aWZpY2F0ZSBjZXJ0IDogY2VydHMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgWDUwOUNlcnRJbXBsKGNlcnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydFBhdGhJbXBsKHJlc3VsdCwgUEtDUzcsIGNpLmdldEVuY29kZWQoKSk7CisgICAgICAgICAgICBmaW5hbCBFbmNvZGluZyBlbmNUeXBlID0gRW5jb2RpbmcuZmluZEJ5QXBpTmFtZShlbmNvZGluZyk7CisgICAgICAgICAgICBpZiAoZW5jVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChlbmNUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQS0lfUEFUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYNTA5Q2VydFBhdGhJbXBsKSBBU04xLmRlY29kZShpbik7CisgICAgICAgICAgICAgICAgY2FzZSBQS0NTNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENlcnRQYXRoRnJvbUNvbnRlbnRJbmZvKChDb250ZW50SW5mbykgQ29udGVudEluZm8uQVNOMS5kZWNvZGUoaW4pKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkluY29ycmVjdCBlbmNvZGVkIGZvcm06ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBkZWNvZGUgQ2VydFBhdGgiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTk3LDQ1ICsyMzEsMzYgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiAoWDUwOUNlcnRQYXRoSW1wbCkgQVNOMS5kZWNvZGUoaW4pOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkluY29ycmVjdCBlbmNvZGVkIGZvcm06ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBkZWNvZGUgQ2VydFBhdGgiLCBlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBjZXJ0aWZpY2F0aW9uIHBhdGggb2JqZWN0IG9uIHRoZSBiYXNlIG9mIGVuY29kaW5nIHByb3ZpZGVkIHZpYQogICAgICAqIGFycmF5IG9mIGJ5dGVzLiBUaGUgZm9ybWF0IG9mIHByb3ZpZGVkIGVuY29kZWQgZm9ybSBpcyBzcGVjaWZpZWQgYnkKLSAgICAgKiBwYXJhbWV0ZXIgPGNvZGU+ZW5jb2Rpbmc8L2NvZGU+LgorICAgICAqIHBhcmFtZXRlciB7QGNvZGUgZW5jb2Rpbmd9LgorICAgICAqCiAgICAgICogQHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBpZiBzcGVjaWZpZWQgZW5jb2RpbmcgZm9ybSBpcyBub3Qgc3VwcG9ydGVkLAotICAgICAqIG9yIHNvbWUgcHJvYmxlbXMgb2NjdXJyZWQgZHVyaW5nIHRoZSBkZWNvZGluZy4KKyAgICAgKiAgICAgICAgICAgICBvciBzb21lIHByb2JsZW1zIG9jY3VycmVkIGR1cmluZyB0aGUgZGVjb2RpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBYNTA5Q2VydFBhdGhJbXBsIGdldEluc3RhbmNlKGJ5dGVbXSBpbiwgU3RyaW5nIGVuY29kaW5nKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFlbmNvZGluZ3MuY29udGFpbnMoZW5jb2RpbmcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nIik7Ci0gICAgICAgIH0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZ3NBcnJbMF0uZXF1YWxzKGVuY29kaW5nKSkgewotICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBvYmplY3QgZnJvbSBQa2lQYXRoIGVuY29kZWQgZm9ybQotICAgICAgICAgICAgICAgIHJldHVybiAoWDUwOUNlcnRQYXRoSW1wbCkgQVNOMS5kZWNvZGUoaW4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgb2JqZWN0IGZyb20gUEtDUyAjNyBlbmNvZGVkIGZvcm0KLSAgICAgICAgICAgICAgICBDb250ZW50SW5mbyBjaSA9IChDb250ZW50SW5mbykgQ29udGVudEluZm8uQVNOMS5kZWNvZGUoaW4pOwotICAgICAgICAgICAgICAgIFNpZ25lZERhdGEgc2QgPSBjaS5nZXRTaWduZWREYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCJJbmNvcnJlY3QgUEtDUzcgZW5jb2RlZCBmb3JtOiBtaXNzaW5nIHNpZ25lZCBkYXRhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3Q8Q2VydGlmaWNhdGU+IGNlcnRzID0gc2QuZ2V0Q2VydGlmaWNhdGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNlcnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2VydHMgPSBuZXcgQXJyYXlMaXN0PENlcnRpZmljYXRlPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMaXN0PFg1MDlDZXJ0SW1wbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxYNTA5Q2VydEltcGw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChDZXJ0aWZpY2F0ZSBjZXJ0IDogY2VydHMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgWDUwOUNlcnRJbXBsKGNlcnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydFBhdGhJbXBsKHJlc3VsdCwgUEtDUzcsIGNpLmdldEVuY29kZWQoKSk7CisgICAgICAgICAgICBmaW5hbCBFbmNvZGluZyBlbmNUeXBlID0gRW5jb2RpbmcuZmluZEJ5QXBpTmFtZShlbmNvZGluZyk7CisgICAgICAgICAgICBpZiAoZW5jVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChlbmNUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQS0lfUEFUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYNTA5Q2VydFBhdGhJbXBsKSBBU04xLmRlY29kZShpbik7CisgICAgICAgICAgICAgICAgY2FzZSBQS0NTNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENlcnRQYXRoRnJvbUNvbnRlbnRJbmZvKChDb250ZW50SW5mbykgQ29udGVudEluZm8uQVNOMS5kZWNvZGUoaW4pKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkluY29ycmVjdCBlbmNvZGVkIGZvcm06ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBkZWNvZGUgQ2VydFBhdGgiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ3LDgxICsyNzIsOTAgQEAKICAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCNnZXRDZXJ0aWZpY2F0ZXMoKQogICAgICAqIG1ldGhvZCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8KICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDZXJ0aWZpY2F0ZXMoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8WDUwOUNlcnRpZmljYXRlPiBnZXRDZXJ0aWZpY2F0ZXMoKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNlcnRpZmljYXRlcyk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBpbiBQa2lQYXRoIGZvcm1hdCB3aGljaCBpcyBvdXIgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgKgogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoI2dldEVuY29kZWQoKQotICAgICAqIG1ldGhvZCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwa2lQYXRoRW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcGtpUGF0aEVuY29kaW5nID0gQVNOMS5lbmNvZGUodGhpcyk7CisgICAgICAgIHJldHVybiBnZXRFbmNvZGVkKEVuY29kaW5nLlBLSV9QQVRIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNnZXRFbmNvZGVkKFN0cmluZykKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRFbmNvZGVkKEVuY29kaW5nIGVuY29kaW5nKSB0aHJvd3MgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGNhc2UgUEtJX1BBVEg6CisgICAgICAgICAgICAgICAgaWYgKHBraVBhdGhFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBraVBhdGhFbmNvZGluZyA9IEFTTjEuZW5jb2RlKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBwa2lQYXRoRW5jb2RpbmcuY2xvbmUoKTsKKyAgICAgICAgICAgIGNhc2UgUEtDUzc6CisgICAgICAgICAgICAgICAgaWYgKHBrY3M3RW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwa2NzN0VuY29kaW5nID0gUEtDUzdfU0lHTkVEX0RBVEFfT0JKRUNULmVuY29kZSh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcGtjczdFbmNvZGluZy5jbG9uZSgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CiAgICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3BraVBhdGhFbmNvZGluZy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBraVBhdGhFbmNvZGluZywgMCwgcmVzdWx0LCAwLCBwa2lQYXRoRW5jb2RpbmcubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAc2VlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCNnZXRFbmNvZGVkKFN0cmluZykKLSAgICAgKiBtZXRob2QgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBpZiAoIWVuY29kaW5ncy5jb250YWlucyhlbmNvZGluZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZyIpOworICAgICAgICBmaW5hbCBFbmNvZGluZyBlbmNUeXBlID0gRW5jb2RpbmcuZmluZEJ5QXBpTmFtZShlbmNvZGluZyk7CisgICAgICAgIGlmIChlbmNUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZW5jb2RpbmdzQXJyWzBdLmVxdWFscyhlbmNvZGluZykpIHsKLSAgICAgICAgICAgIC8vIFBraVBhdGggZW5jb2RlZCBmb3JtCi0gICAgICAgICAgICByZXR1cm4gZ2V0RW5jb2RlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUEtDUzcgZW5jb2RlZCBmb3JtCi0gICAgICAgICAgICBpZiAocGtjczdFbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGtjczdFbmNvZGluZyA9IFBLQ1M3X1NJR05FRF9EQVRBX09CSkVDVC5lbmNvZGUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbcGtjczdFbmNvZGluZy5sZW5ndGhdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwa2NzN0VuY29kaW5nLCAwLCByZXN1bHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtjczdFbmNvZGluZy5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRFbmNvZGVkKGVuY1R5cGUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoI2dldEVuY29kaW5ncygpCiAgICAgICogbWV0aG9kIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbwogICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRFbmNvZGluZ3MoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgewogICAgICAgICByZXR1cm4gZW5jb2RpbmdzLml0ZXJhdG9yKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQVNOLjEgREVSIEVuY29kZXIvRGVjb2RlciBmb3IgUGtpUGF0aCBzdHJ1Y3R1cmUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xU2VxdWVuY2VPZiBBU04xID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBU04xU2VxdWVuY2VPZihBU04xQW55LmdldEluc3RhbmNlKCkpIHsKLQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQVNOMVNlcXVlbmNlT2YgQVNOMSA9IG5ldyBBU04xU2VxdWVuY2VPZihBU04xQW55LmdldEluc3RhbmNlKCkpIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUgaW5zdGFuY2Ugb2YgWDUwOUNlcnRQYXRoSW1wbCBvbiB0aGUgYmFzZSBvZiB0aGUgbGlzdAotICAgICAgICAgKiBvZiBBU04uMSBlbmNvZGluZ3Mgb2YgWC41MDkgY2VydGlmaWNhdGVzIHByb3ZpZGVkIHZpYQotICAgICAgICAgKiBQa2lQYXRoIHN0cnVjdHVyZS4KKyAgICAgICAgICogQnVpbGRzIHRoZSBpbnN0YW5jZSBvZiBYNTA5Q2VydFBhdGhJbXBsIG9uIHRoZSBiYXNlIG9mIHRoZSBsaXN0IG9mCisgICAgICAgICAqIEFTTi4xIGVuY29kaW5ncyBvZiBYLjUwOSBjZXJ0aWZpY2F0ZXMgcHJvdmlkZWQgdmlhIFBraVBhdGggc3RydWN0dXJlLgogICAgICAgICAgKiBUaGlzIG1ldGhvZCBwYXJ0aWNpcGF0ZXMgaW4gZGVjb2RpbmcgcHJvY2Vzcy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVjb2RlZE9iamVjdChCZXJJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBkZWNvZGVkIGNvbnRlbnQKLSAgICAgICAgICAgIExpc3QgZW5jb2RpbmdzID0gKExpc3QpIGluLmNvbnRlbnQ7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGVuY29kaW5ncy5zaXplKCk7Ci0gICAgICAgICAgICBMaXN0IGNlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PGJ5dGVbXT4gZW5jb2RlZENlcnRzID0gKExpc3Q8Ynl0ZVtdPikgaW4uY29udGVudDsKKworICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBlbmNvZGVkQ2VydHMuc2l6ZSgpOworICAgICAgICAgICAgZmluYWwgTGlzdDxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3Q8WDUwOUNlcnRpZmljYXRlPihzaXplKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgWC41MDkgY2VydGlmaWNhdGUgb24gdGhlIGJhc2Ugb2YgaXRzIGVuY29kZWQgZm9ybQogICAgICAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0SW1wbCgoQ2VydGlmaWNhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZS5BU04xLmRlY29kZSgoYnl0ZVtdKSBlbmNvZGluZ3MuZ2V0KGkpKSkpOworICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcy5hZGQobmV3IFg1MDlDZXJ0SW1wbCgoQ2VydGlmaWNhdGUpIENlcnRpZmljYXRlLkFTTjEKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWNvZGUoZW5jb2RlZENlcnRzLmdldChpKSkpKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBvYmplY3QKLSAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRQYXRoSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzLCBQS0lfUEFUSCwgaW4uZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRQYXRoSW1wbChjZXJ0aWZpY2F0ZXMsIEVuY29kaW5nLlBLSV9QQVRIKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMzI5LDM2ICszNjMsMzcgQEAKICAgICAgICAgICogaW4gdGhlIFg1MDlDZXJ0UGF0aEltcGwgb2JqZWN0IHRvIGJlIGVuY29kZWQuCiAgICAgICAgICAqIFRoaXMgbWV0aG9kIHBhcnRpY2lwYXRlcyBpbiBlbmNvZGluZyBwcm9jZXNzLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VmFsdWVzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248Ynl0ZVtdPiBnZXRWYWx1ZXMoT2JqZWN0IG9iamVjdCkgewogICAgICAgICAgICAgLy8gb2JqZWN0IHRvIGJlIGVuY29kZWQKLSAgICAgICAgICAgIFg1MDlDZXJ0UGF0aEltcGwgY3AgPSAoWDUwOUNlcnRQYXRoSW1wbCkgb2JqZWN0OworICAgICAgICAgICAgZmluYWwgWDUwOUNlcnRQYXRoSW1wbCBjcCA9IChYNTA5Q2VydFBhdGhJbXBsKSBvYmplY3Q7CisKICAgICAgICAgICAgIC8vIGlmIGl0IGhhcyBubyBjZXJ0aWZpY2F0ZXMgaW4gaXQgLSBjcmVhdGUgdGhlIHNlcXVlbmNlIG9mIHNpemUgMAogICAgICAgICAgICAgaWYgKGNwLmNlcnRpZmljYXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGNwLmNlcnRpZmljYXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBMaXN0IGVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gY3AuY2VydGlmaWNhdGVzLnNpemUoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Ynl0ZVtdPiBlbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oc2l6ZSk7CisKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbmNvZGVkIGZvcm0gb2YgY2VydGlmaWNhdGUgYW5kIHBsYWNlIGl0IGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3QgdG8gYmUgZW5jb2RlZCBpbiBQa2lQYXRoIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3MuYWRkKCgoWDUwOUNlcnRpZmljYXRlKSBjcC5jZXJ0aWZpY2F0ZXMuZ2V0KGkpKS5nZXRFbmNvZGVkKCkpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3MuYWRkKGNwLmNlcnRpZmljYXRlcy5nZXQoaSkuZ2V0RW5jb2RlZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbmNvZGluZyBFcnJvciBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVuY29kaW5nIGVycm9yIG9jY3VycmVkIiwgZSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBlbmNvZGluZ3M7CiAgICAgICAgIH0KICAgICB9OwogCiAKLSAgICAvLwotICAgIC8vIGVuY29kZXIgZm9yIFBLQ1MjNyBTaWduZWREYXRhCi0gICAgLy8gaXQgaXMgYXNzdW1lZCB0aGF0IG9ubHkgY2VydGlmaWNhdGUgZmllbGQgaXMgaW1wb3J0YW50Ci0gICAgLy8gYWxsIG90aGVyIGZpZWxkcyBjb250YWluIHByZWNhbGN1bGF0ZWQgZW5jb2RpbmdzOgotICAgIC8vCi0gICAgLy8gZW5jb2RlcyBYNTA5Q2VydFBhdGhJbXBsIG9iamVjdHMKLSAgICAvLworICAgIC8qKgorICAgICAqIEVuY29kZXIgZm9yIFBLQ1MjNyBTaWduZWREYXRhLiBJdCBpcyBhc3N1bWVkIHRoYXQgb25seSBjZXJ0aWZpY2F0ZSBmaWVsZAorICAgICAqIGlzIGltcG9ydGFudCBhbGwgb3RoZXIgZmllbGRzIGNvbnRhaW4gcHJlLWNhbGN1bGF0ZWQgZW5jb2RpbmdzLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFTTjFTZXF1ZW5jZSBBU04xX1NJR05FRF9EQVRBID0gbmV3IEFTTjFTZXF1ZW5jZSgKICAgICAgICAgICAgIG5ldyBBU04xVHlwZVtdIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiAsZGlnZXN0QWxnb3JpdGhtcywgY29udGVudCBpbmZvCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NyeXB0by9SYW5kb21CaXRzU3VwcGxpZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY3J5cHRvL1JhbmRvbUJpdHNTdXBwbGllci5qYXZhCmluZGV4IDM4NjIxMzIuLmFkM2EyODAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY3J5cHRvL1JhbmRvbUJpdHNTdXBwbGllci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcHJvdmlkZXIvY3J5cHRvL1JhbmRvbUJpdHNTdXBwbGllci5qYXZhCkBAIC0xOCwxNDQgKzE4LDM5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0bzsKIAotCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBsaWJjb3JlLmlvLlN0cmVhbXM7CiAKIC8qKgotICogIFRoZSBzdGF0aWMgY2xhc3MgcHJvdmlkaW5nIGFjY2VzcyBvbiBMaW51eCBwbGF0Zm9ybQotICogIHRvIHN5c3RlbSBtZWFucyBmb3IgZ2VuZXJhdGluZyB0cnVlIHJhbmRvbSBiaXRzLiA8QlI+Ci0gKgotICogIFRoZSBzb3VyY2UgZm9yIHRydWUgcmFuZG9tIGJpdHMgaXMgb25lIG9mIExpbnV4J3MgZGV2aWNlcyAiL2Rldi91cmFuZG9tIiBvcgotICogICIvZGV2L3JhbmRvbSIgZGVwZW5kcyBvbiB3aGljaCBvbmUgaXMgYXZhaWxhYmxlOyBpZiBib3RoIHRoZSBmaXJzdCBpcyB1c2VkLiA8QlI+Ci0gKgotICogIElmIG5vIGRldmljZSBhdmFpbGFibGUgdGhlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSwKLSAqICB0aGF0IGlzLCBwcm92aWRlciBzaG91bGRuJ3QgcmVnaXN0ZXIgdGhlIGFsZ29yaXRobS4gPEJSPgorICogU3VwcGxpZXMgcmFuZG9tIGJpdHMgZnJvbSAvZGV2L3VyYW5kb20uCiAgKi8KIHB1YmxpYyBjbGFzcyBSYW5kb21CaXRzU3VwcGxpZXIgaW1wbGVtZW50cyBTSEExX0RhdGEgewotCi0KLSAgICAvKioKLSAgICAgKiBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20gZGV2aWNlCi0gICAgICoKLSAgICAgKiBVc2luZyBhIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gbGVhZHMgdG8gcHJvYmxlbXMKLSAgICAgKiBvbiBBbmRyb2lkIGluIHJhcmUgY2FzZXMsIHNpbmNlIHRoZQotICAgICAqIEJ1ZmZlcmVkSW5wdXRTdHJlYW0ncyBhdmFpbGFibGUoKSBpc3N1ZXMgYW4KLSAgICAgKiBpb2N0bCgpLCBhbmQgdGhlIHBzZXVkbyBkZXZpY2UgZG9lc24ndCBzZWVtCi0gICAgICogdG8gbGlrZSB0aGF0LiBTaW5jZSB3ZSdyZSByZWFkaW5nIGJpZ2dlcgotICAgICAqIGNodW5rcyBhbmQgbm90IHNpbmdsZSBieXRlcywgdGhlIEZpbGVJbnB1dFN0cmVhbQotICAgICAqIHNob3VsZG4ndCBiZSBzbG93ZXIsIHNvIHdlIHVzZSB0aGF0LiBTYW1lIG1pZ2h0Ci0gICAgICogYXBwbHkgdG8gb3RoZXIgTGludXggcGxhdGZvcm1zLgotICAgICAqCi0gICAgICogVE9ETzogdGhlIGFib3ZlIGRvZXNuJ3Qgc291bmQgdHJ1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEZpbGUgdG8gY29ubmVjdCB0byBkZXZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHJhbmRvbUZpbGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogdmFsdWUgb2YgZmllbGQgaXMgInRydWUiIG9ubHkgaWYgYSBkZXZpY2UgaXMgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiAgbmFtZXMgb2YgcmFuZG9tIGRldmljZXMgb24gTGludXggcGxhdGZvcm0KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX05BTUVTW10gPSB7ICIvZGV2L3VyYW5kb20iIC8qLCAiL2Rldi9yYW5kb20iICovIH07Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gZGV2VVJhbmRvbTsKICAgICBzdGF0aWMgewotICAgICAgICBmb3IgKFN0cmluZyBkZXZpY2VOYW1lIDogREVWSUNFX05BTUVTKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRldmljZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICByYW5kb21GaWxlID0gZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgcHJvdmlkZXIgdG8gZGV0ZXJtaW5lIGlmIGEgZGV2aWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VBdmFpbGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQXZhaWxhYmxlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogT24gcGxhdGZvcm1zIHdpdGggInJhbmRvbSIgZGV2aWNlcyBhdmFpbGFibGUsCi0gICAgICogdGhlIG1ldGhvZCByZWFkcyByYW5kb20gYnl0ZXMgZnJvbSB0aGUgZGV2aWNlLiAgPEJSPgotICAgICAqCi0gICAgICogSW4gY2FzZSBvZiBhbnkgcnVudGltZSBmYWlsdXJlIFByb3ZpZGVyRXhjZXB0aW9uIGdldHMgdGhyb3duLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBieXRlW10gZ2V0VW5peERldmljZVJhbmRvbShpbnQgbnVtQnl0ZXMpIHsKLQotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtudW1CeXRlc107Ci0KLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgaW50IGJ5dGVzUmVhZDsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKCA7IDsgKSB7Ci0KLSAgICAgICAgICAgICAgICBieXRlc1JlYWQgPSBmaXMucmVhZChieXRlcywgb2Zmc2V0LCBudW1CeXRlcy10b3RhbCk7Ci0KLQotICAgICAgICAgICAgICAgIC8vIHRoZSBiZWxvdyBjYXNlIHNob3VsZCBub3Qgb2NjdXIgYmVjYXVzZSAvZGV2L3JhbmRvbSBvciAvZGV2L3VyYW5kb20gaXMgYSBzcGVjaWFsIGZpbGUKLSAgICAgICAgICAgICAgICAvLyBoZW5jZSwgaWYgaXQgaXMgaGFwcGVuZWQgdGhlcmUgaXMgc29tZSBpbnRlcm5hbCBwcm9ibGVtCi0gICAgICAgICAgICAgICAgaWYgKCBieXRlc1JlYWQgPT0gLTEgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiYnl0ZXNSZWFkID09IC0xIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdG90YWwgICs9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNSZWFkOwotCi0gICAgICAgICAgICAgICAgaWYgKCB0b3RhbCA+PSBudW1CeXRlcyApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZXJlIHNob3VsZCBiZSBubyBJT0V4Y2VwdGlvbiBiZWNhdXNlIGRldmljZSBpcyBhIHNwZWNpYWwgZmlsZTsKLSAgICAgICAgICAgIC8vIGhlbmNlLCB0aGVyZSBpcyBlaXRoZXIgc29tZSBpbnRlcm5hbCBwcm9ibGVtIG9yLCBmb3IgaW5zdGFuY2UsCi0gICAgICAgICAgICAvLyBkZXZpY2Ugd2FzIHJlbW92ZWQgaW4gcnVudGltZSwgb3Igc29tZXRoaW5nIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiQVRURU5USU9OOiBJT0V4Y2VwdGlvbiBpbiBSYW5kb21CaXRzU3VwcGxpZXIuZ2V0TGludXhSYW5kb21CaXRzKCk6ICIgKyBlKTsKKyAgICAgICAgICAgIGRldlVSYW5kb20gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKCIvZGV2L3VyYW5kb20iKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgcmV0dXJucyBieXRlIGFycmF5IG9mIHJlcXVlc3RlZCBsZW5ndGggcHJvdmlkZWQgc2VydmljZSBpcyBhdmFpbGFibGUuCi0gICAgICogUHJvdmlkZXJFeGNlcHRpb24gZ2V0cyB0aHJvd24gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHBhcmFtCi0gICAgICogICAgICAgbnVtQnl0ZXMgLSBsZW5ndGggb2YgYnl0ZXMgcmVxdWVzdGVkCi0gICAgICogQHJldHVybgotICAgICAqICAgICAgIGJ5dGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzCi0gICAgICogICAgICAgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIC0gaWYgbnVtQnl0ZXMgPD0gMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFJhbmRvbUJpdHMoaW50IG51bUJ5dGVzKSB7Ci0gICAgICAgIGlmIChudW1CeXRlcyA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEludGVnZXIudG9TdHJpbmcobnVtQnl0ZXMpKTsKLSAgICAgICAgfQorICAgIHN0YXRpYyBib29sZWFuIGlzU2VydmljZUF2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIChkZXZVUmFuZG9tICE9IG51bGwpOworICAgIH0KIAotICAgICAgICAvLyBXZSBoYXZlIGJlZW4gdW5hYmxlIHRvIGdldCBhIHJhbmRvbSBkZXZpY2Ugb3IgZmFsbCBiYWNrIHRvIHRoZQotICAgICAgICAvLyBuYXRpdmUgc2VjdXJpdHkgbW9kdWxlIGNvZGUgLSB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgIGlmICggIXNlcnZpY2VBdmFpbGFibGUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oIkFUVEVOVElPTjogc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIDogbm8gcmFuZG9tIGRldmljZXMiKTsKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRSYW5kb21CaXRzKGludCBieXRlQ291bnQpIHsKKyAgICAgICAgaWYgKGJ5dGVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb28gZmV3IGJ5dGVzIHJlcXVlc3RlZDogIiArIGJ5dGVDb3VudCk7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0VW5peERldmljZVJhbmRvbShudW1CeXRlcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbYnl0ZUNvdW50XTsKKyAgICAgICAgICAgIFN0cmVhbXMucmVhZEZ1bGx5KGRldlVSYW5kb20sIHJlc3VsdCwgMCwgYnl0ZUNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJDb3VsZG4ndCByZWFkICIgKyBieXRlQ291bnQgKyAiIHJhbmRvbSBieXRlcyIsIGV4KTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdXRpbHMvQWxnTmFtZU1hcHBlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS91dGlscy9BbGdOYW1lTWFwcGVyLmphdmEKaW5kZXggOWFkNTM3My4uNDY1NzQ4ZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS91dGlscy9BbGdOYW1lTWFwcGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS91dGlscy9BbGdOYW1lTWFwcGVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuT2JqZWN0SWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk5hdGl2ZUNyeXB0bzsKIAogLyoqCiAgKiBQcm92aWRlcyBBbGdvcml0aG0gTmFtZSB0byBPSUQgYW5kIE9JRCB0byBBbGdvcml0aG0gTmFtZSBtYXBwaW5ncy4gU29tZSBrbm93bgpAQCAtMTEzLDcgKzExNCwxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcDJPSUQoU3RyaW5nIGFsZ05hbWUpIHsKICAgICAgICAgLy8gYWxnMk9pZE1hcCBtYXAgY29udGFpbnMgdXBwZXIgY2FzZSBrZXlzCi0gICAgICAgIHJldHVybiBhbGcyT2lkTWFwLmdldChhbGdOYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gYWxnMk9pZE1hcC5nZXQoYWxnTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5PQkpfdHh0Mm5pZF9vaWQoYWxnTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjYsNyArMTMyLDEyIEBACiAgICAgICAgIC8vIG9pZDJBbGdNYXAgbWFwIGNvbnRhaW5zIHVwcGVyIGNhc2UgdmFsdWVzCiAgICAgICAgIFN0cmluZyBhbGdVQyA9IG9pZDJBbGdNYXAuZ2V0KG9pZCk7CiAgICAgICAgIC8vIGlmIG5vdCBudWxsIHRoZXJlIGlzIGFsd2F5cyBtYXAgVUMtPk9yaWcKLSAgICAgICAgcmV0dXJuIGFsZ1VDID09IG51bGwgPyBudWxsIDogYWxnQWxpYXNlc01hcC5nZXQoYWxnVUMpOworICAgICAgICBpZiAoYWxnVUMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFsZ0FsaWFzZXNNYXAuZ2V0KGFsZ1VDKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcyBPSUQsIGFzayBPcGVuU1NMIGlmIGl0IGRvZXMuCisgICAgICAgIHJldHVybiBOYXRpdmVDcnlwdG8uT0JKX3R4dDJuaWRfbG9uZ05hbWUob2lkKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdXRpbHMvSmFyVXRpbHMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdXRpbHMvSmFyVXRpbHMuamF2YQppbmRleCBmNmVmYjhhLi5mMzE3NTRiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3V0aWxzL0phclV0aWxzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS91dGlscy9KYXJVdGlscy5qYXZhCkBAIC0xMTQsMjcgKzExNCw1NiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gR2V0IFNpZ25hdHVyZSBpbnN0YW5jZQotICAgICAgICBTaWduYXR1cmUgc2lnID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGRhID0gc2lnSW5mby5nZXREaWdlc3RBbGdvcml0aG0oKTsKLSAgICAgICAgU3RyaW5nIGRlYSA9IHNpZ0luZm8uZ2V0RGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGFPaWQgPSBzaWdJbmZvLmdldERpZ2VzdEFsZ29yaXRobSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGFOYW1lID0gc2lnSW5mby5nZXREaWdlc3RBbGdvcml0aG1OYW1lKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBkZWFPaWQgPSBzaWdJbmZvLmdldERpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG0oKTsKKwogICAgICAgICBTdHJpbmcgYWxnID0gbnVsbDsKLSAgICAgICAgaWYgKGRhICE9IG51bGwgJiYgZGVhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsZyA9IGRhICsgIndpdGgiICsgIGRlYTsKKyAgICAgICAgU2lnbmF0dXJlIHNpZyA9IG51bGw7CisKKyAgICAgICAgaWYgKGRhT2lkICE9IG51bGwgJiYgZGVhT2lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFsZyA9IGRhT2lkICsgIndpdGgiICsgZGVhT2lkOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoYWxnLCBPcGVuU1NMUHJvdmlkZXIuUFJPVklERVJfTkFNRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgICAgICBpZiAoc2lnID09IG51bGwpIHsKLSAgICAgICAgICAgIGFsZyA9IGRhOwotICAgICAgICAgICAgaWYgKGFsZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShhbGcsIE9wZW5TU0xQcm92aWRlci5QUk9WSURFUl9OQU1FKTsKKyAgICAgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoYWxnKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBjb252ZXJ0IHRvIG5hbWVzIGluc3RlYWQgb2YgT0lELgorICAgICAgICAgICAgaWYgKHNpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlYU5hbWUgPSBzaWdJbmZvLmdldERpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG1OYW1lKCk7CisgICAgICAgICAgICAgICAgYWxnID0gZGFOYW1lICsgIndpdGgiICsgZGVhTmFtZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoYWxnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE8gZmlndXJlIG91dCB0aGUgY2FzZSBpbiB3aGljaCB3ZSdkIG9ubHkgdXNlIGRpZ2VzdEFsZ29yaXRobSBhbmQKKyAgICAgICAgICogYWRkIGEgdGVzdCBmb3IgaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2lnID09IG51bGwgJiYgZGFPaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWxnID0gZGFPaWQ7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShhbGcpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZyA9PSBudWxsICYmIGRhTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWxnID0gZGFOYW1lOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShhbGcpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgY291bGRuJ3QgZmluZCBhIHZhbGlkIFNpZ25hdHVyZSB0eXBlLgorICAgICAgICBpZiAoc2lnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKICAgICAgICAgc2lnLmluaXRWZXJpZnkoY2VydHNbaXNzdWVyU2VydEluZGV4XSk7CiAKICAgICAgICAgLy8gSWYgdGhlIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzIGZpZWxkIG9mIFNpZ25lckluZm8gY29udGFpbnMgbW9yZSB0aGFuIHplcm8gYXR0cmlidXRlcywKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9BbGdvcml0aG1JZGVudGlmaWVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQWxnb3JpdGhtSWRlbnRpZmllci5qYXZhCmluZGV4IDFhYjEyZTYuLjE4NTE1MWMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9BbGdvcml0aG1JZGVudGlmaWVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0FsZ29yaXRobUlkZW50aWZpZXIuamF2YQpAQCAtNzIsNiArNzIsMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBGb3IgdGVzdGluZyB3aGVuIGFsZ29yaXRobU5hbWUgaXMgbm90IGtub3duLCBidXQgYWxnb3JpdGhtIE9JRCBpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWxnb3JpdGhtSWRlbnRpZmllcihTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgYWxnb3JpdGhtTmFtZSkgeworICAgICAgICB0aGlzKGFsZ29yaXRobSwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRoaXMuYWxnb3JpdGhtTmFtZSA9IGFsZ29yaXRobU5hbWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYWxnb3JpdGhtIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQmFzaWNDb25zdHJhaW50cy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0Jhc2ljQ29uc3RyYWludHMuamF2YQppbmRleCA2YTQ3M2Y1Li5mYmRhZWM0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQmFzaWNDb25zdHJhaW50cy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9CYXNpY0NvbnN0cmFpbnRzLmphdmEKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYSgpIHsKKyAgICAgICAgcmV0dXJuIGNhOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgZ2V0UGF0aExlbkNvbnN0cmFpbnQoKSB7CiAgICAgICAgIHJldHVybiBwYXRoTGVuQ29uc3RyYWludDsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRE5QYXJzZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9ETlBhcnNlci5qYXZhCmluZGV4IDk4MGFiMDUuLjQ5NDY0MTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9ETlBhcnNlci5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9ETlBhcnNlci5qYXZhCkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgY2FzZSAnLCc6CiAgICAgICAgICAgICBjYXNlICc7JzoKLSAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3IgY2hhciBoYXMgYmVlZCBmb3VuZAorICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvciBjaGFyIGhhcyBiZWVuIGZvdW5kCiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMsIGJlZywgZW5kIC0gYmVnKTsKICAgICAgICAgICAgIGNhc2UgJ1xcJzoKICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIGNoYXIKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocG9zID09IGNoYXJzLmxlbmd0aCB8fCBjaGFyc1twb3NdID09ICcsJyB8fCBjaGFyc1twb3NdID09ICcrJwogICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhcnNbcG9zXSA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9yIGNoYXIgb3IgdGhlIGVuZCBvZiBETiBoYXMgYmVlZCBmb3VuZAorICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3IgY2hhciBvciB0aGUgZW5kIG9mIEROIGhhcyBiZWVuIGZvdW5kCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCBiZWcsIGN1ciAtIGJlZyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIEROCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBSZWxhdGl2ZSBEaXN0aW5ndWlzaGVkIE5hbWVzKFJORCksCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgUmVsYXRpdmUgRGlzdGluZ3Vpc2hlZCBOYW1lcyhSRE4pLAogICAgICAqICAgICAgICAgZWFjaCBSRE4gaXMgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSBvYmplY3RzCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8TGlzdDxBdHRyaWJ1dGVUeXBlQW5kVmFsdWU+PiBwYXJzZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRXh0ZW5zaW9ucy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0V4dGVuc2lvbnMuamF2YQppbmRleCAzMzM2YjBkLi45NTM5MDU0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRXh0ZW5zaW9ucy5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9FeHRlbnNpb25zLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMjIyLDE0ICsyMjMsMjAgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKiAoYXMgc3BlY2lmaWVkIGluIFJGQyAzMjgwKQogICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgcGF0aExlbkNvbnN0cmFpbnQgZmllbGQgaWYgZXh0ZW5zaW9uIHByZXNlbnRzLAotICAgICAqIGFuZCBJbnRlZ2VyLk1BWF9WQUxVRSBpZiBkb2VzIG5vdC4KKyAgICAgKiBAcmV0dXJuLTEgaWYgdGhlIEJhc2ljIENvbnN0cmFpbnRzIEV4dGVuc2lvbiBpcyBub3QgcHJlc2VudCBvcgorICAgICAqIGl0IGlzIHByZXNlbnQgYnV0IGl0IGluZGljYXRlcyB0aGUgY2VydGlmaWNhdGUgaXMgbm90IGEKKyAgICAgKiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuIElmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBhIGNlcnRpZmljYXRlCisgICAgICogYXV0aG9yaXR5LCByZXR1cm5zIHRoZSBwYXRoIGxlbmd0aCBjb25zdHJhaW50IGlmIHByZXNlbnQsIG9yCisgICAgICogSW50ZWdlci5NQVhfVkFMVUUgaWYgaXQgaXMgbm90LgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgdmFsdWVPZkJhc2ljQ29uc3RyYWlucygpIHsKKyAgICBwdWJsaWMgaW50IHZhbHVlT2ZCYXNpY0NvbnN0cmFpbnRzKCkgewogICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uQnlPSUQoIjIuNS4yOS4xOSIpOwotICAgICAgICBCYXNpY0NvbnN0cmFpbnRzIGJjOwotICAgICAgICBpZiAoKGV4dGVuc2lvbiA9PSBudWxsKSB8fCAoKGJjID0gZXh0ZW5zaW9uLmdldEJhc2ljQ29uc3RyYWludHNWYWx1ZSgpKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBCYXNpY0NvbnN0cmFpbnRzIGJjID0gZXh0ZW5zaW9uLmdldEJhc2ljQ29uc3RyYWludHNWYWx1ZSgpOworICAgICAgICBpZiAoYmMgPT0gbnVsbCB8fCAhYmMuZ2V0Q2EoKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiYy5nZXRQYXRoTGVuQ29uc3RyYWludCgpOwogICAgIH0KQEAgLTI1MCwxMSArMjU3LDcgQEAKICAgICAgKiBudWxsIGlmIGRvZXMgbm90LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPExpc3Q8Pz4+IHZhbHVlT2ZTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbkJ5T0lEKCIyLjUuMjkuMTciKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChHZW5lcmFsTmFtZXMpIEdlbmVyYWxOYW1lcy5BU04xLmRlY29kZShleHRlbnNpb24uZ2V0RXh0blZhbHVlKCkpKS5nZXRQYWlyc0xpc3QoKTsKKyAgICAgICAgcmV0dXJuIGRlY29kZUdlbmVyYWxOYW1lcyhnZXRFeHRlbnNpb25CeU9JRCgiMi41LjI5LjE3IikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjczLDExICsyNzYsMzEgQEAKICAgICAgKiBudWxsIGlmIGRvZXMgbm90LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPExpc3Q8Pz4+IHZhbHVlT2ZJc3N1ZXJBbHRlcm5hdGl2ZU5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uQnlPSUQoIjIuNS4yOS4xOCIpOworICAgICAgICByZXR1cm4gZGVjb2RlR2VuZXJhbE5hbWVzKGdldEV4dGVuc2lvbkJ5T0lEKCIyLjUuMjkuMTgiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYW4gWC41MDkgZXh0ZW5zaW9uIHRoYXQgZW5jb2RlcyBHZW5lcmFsTmFtZXMsIHJldHVybiBpdCBpbiB0aGUKKyAgICAgKiBmb3JtYXQgZXhwZWN0ZWQgYnkgQVBJcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPExpc3Q8Pz4+IGRlY29kZUdlbmVyYWxOYW1lcyhFeHRlbnNpb24gZXh0ZW5zaW9uKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKChHZW5lcmFsTmFtZXMpIEdlbmVyYWxOYW1lcy5BU04xLmRlY29kZShleHRlbnNpb24uZ2V0RXh0blZhbHVlKCkpKS5nZXRQYWlyc0xpc3QoKTsKKworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbGxlY3Rpb24gPSAoKEdlbmVyYWxOYW1lcykgR2VuZXJhbE5hbWVzLkFTTjEuZGVjb2RlKGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIC5nZXRFeHRuVmFsdWUoKSkpLmdldFBhaXJzTGlzdCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBleHRlbnNpb24gaGFkIGFueSBpbnZhbGlkIGVudHJpZXMsIHdlIG1heSBoYXZlIGFuIGVtcHR5CisgICAgICAgICAqIGNvbGxlY3Rpb24gYXQgdGhpcyBwb2ludCwgc28ganVzdCByZXR1cm4gbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0dlbmVyYWxOYW1lLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvR2VuZXJhbE5hbWUuamF2YQppbmRleCBlMjE2MDI5Li45OWJkMGVmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvR2VuZXJhbE5hbWUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvR2VuZXJhbE5hbWUuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKQEAgLTM3LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xSW1wbGljaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPaWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlT2Y7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW07CkBAIC0yMTksMTAgKzIyMSw2IEBACiAgICAgICogIGNvbXBvbmVudCBpcyBkb3VibGVkICh0byA4IGFuZCAzMiBieXRlcyByZXNwZWN0aXZlbHkpLgogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsTmFtZShieXRlW10gbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsZW5ndGggPSBuYW1lLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbmd0aCAhPSA0ICYmIGxlbmd0aCAhPSA4ICYmIGxlbmd0aCAhPSAxNiAmJiBsZW5ndGggIT0gMzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUubGVuZ3RoIGludmFsaWQiKTsKLSAgICAgICAgfQogICAgICAgICB0aGlzLnRhZyA9IElQX0FERFI7CiAgICAgICAgIHRoaXMubmFtZSA9IG5ldyBieXRlW25hbWUubGVuZ3RoXTsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCB0aGlzLm5hbWUsIDAsIG5hbWUubGVuZ3RoKTsKQEAgLTM5MCw2ICszODgsMjAgQEAKICAgICAgICAgICAgICAgICBieXRlW10gYWRkcmVzcyA9IChieXRlW10pIG5hbWU7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIF9hZGRyZXNzID0gKGJ5dGVbXSkgZ25hbWUuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBhZGRyZXNzLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRm9yIElQIHY0LCBhcyBzcGVjaWZpZWQgaW4gUkZDIDc5MSwgdGhlIGFkZHJlc3MgbXVzdCBjb250YWluCisgICAgICAgICAgICAgICAgICogZXhhY3RseSA0IGJ5dGUgY29tcG9uZW50LiBGb3IgSVAgdjYsIGFzIHNwZWNpZmllZCBpbiBSRkMKKyAgICAgICAgICAgICAgICAgKiAxODgzLCB0aGUgYWRkcmVzcyBtdXN0IGNvbnRhaW4gZXhhY3RseSAxNiBieXRlIGNvbXBvbmVudC4gSWYKKyAgICAgICAgICAgICAgICAgKiBHZW5lcmFsTmFtZSBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyBhIHBhcnQgb2YgTmFtZSBDb25zdHJhaW50cworICAgICAgICAgICAgICAgICAqIGV4dGVuc2lvbiwgdG8gcmVwcmVzZW50IGFuIGFkZHJlc3MgcmFuZ2UgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAqIGFkZHJlc3MgY29tcG9uZW50IGlzIGRvdWJsZWQgKHRvIDggYW5kIDMyIGJ5dGVzCisgICAgICAgICAgICAgICAgICogcmVzcGVjdGl2ZWx5KS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9IDQgJiYgbGVuZ3RoICE9IDggJiYgbGVuZ3RoICE9IDE2ICYmIGxlbmd0aCAhPSAzMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaW50IF9sZW5ndGggPSBfYWRkcmVzcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGFkZHJlc3MsIF9hZGRyZXNzKTsKQEAgLTY0NCw4ICs2NTYsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBmb3JtIG9mIHRoZSBnaXZlbiBJUCBhZGRyZXNzLiBBZGRyZXNzZXMgb2YgbGVuZ3RoIDJ4Ci0gICAgICogdGhlIGNhbm9uaWNhbCBsZW5ndGggYXJlIHRyZWF0ZWQgYXMgYSByb3V0ZS9tYXNrIHBhaXIuCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIGdpdmVuIElQIGFkZHJlc3MuIElmIHRoZSBhZGRyZXNzIGlzIG5vdCA0CisgICAgICogb2N0ZXRzIGZvciBJUHY0IG9yIDE2IG9jdGV0cyBmb3IgSVB2NiwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwKKyAgICAgKiBiZSB0aHJvd24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaXBCeXRlc1RvU3RyKGJ5dGVbXSBpcCkgewogICAgICAgICB0cnkgewpAQCAtNjU1LDEyICs2NjgsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoZSAiTmFtZSIgaXMgYWN0dWFsbHkgYSBDSE9JQ0Ugb2Ygb25lIGVudHJ5LCBzbyB3ZSBuZWVkIHRvIHByZXRlbmQgaXQncworICAgICAqIGEgU0VRVUVOQ0UgT0YgYW5kIGp1c3QgZ3JhYiB0aGUgZmlyc3QgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQVNOMVNlcXVlbmNlT2YgTkFNRV9BU04xID0gbmV3IEFTTjFTZXF1ZW5jZU9mKE5hbWUuQVNOMSkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBkZWNvZGUoQmVySW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gKChMaXN0PD8+KSBzdXBlci5kZWNvZGUoaW4pKS5nZXQoMCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBU04xQ2hvaWNlIEFTTjEgPSBuZXcgQVNOMUNob2ljZShuZXcgQVNOMVR5cGVbXSB7CiAgICAgICAgICAgIG5ldyBBU04xSW1wbGljaXQoMCwgT3RoZXJOYW1lLkFTTjEpLAogICAgICAgICAgICBuZXcgQVNOMUltcGxpY2l0KDEsIEFTTjFTdHJpbmdUeXBlLklBNVNUUklORyksCiAgICAgICAgICAgIG5ldyBBU04xSW1wbGljaXQoMiwgQVNOMVN0cmluZ1R5cGUuSUE1U1RSSU5HKSwKICAgICAgICAgICAgbmV3IEFTTjFJbXBsaWNpdCgzLCBPUkFkZHJlc3MuQVNOMSksCi0gICAgICAgICAgIG5ldyBBU04xSW1wbGljaXQoNCwgTmFtZS5BU04xKSwKKyAgICAgICAgICAgbmV3IEFTTjFJbXBsaWNpdCg0LCBOQU1FX0FTTjEpLAogICAgICAgICAgICBuZXcgQVNOMUltcGxpY2l0KDUsIEVESVBhcnR5TmFtZS5BU04xKSwKICAgICAgICAgICAgbmV3IEFTTjFJbXBsaWNpdCg2LCBBU04xU3RyaW5nVHlwZS5JQTVTVFJJTkcpLAogICAgICAgICAgICBuZXcgQVNOMUltcGxpY2l0KDcsIEFTTjFPY3RldFN0cmluZy5nZXRJbnN0YW5jZSgpKSwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9HZW5lcmFsTmFtZXMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9HZW5lcmFsTmFtZXMuamF2YQppbmRleCA5M2M0YWYxLi5lOGE3OGRkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvR2VuZXJhbE5hbWVzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0dlbmVyYWxOYW1lcy5qYXZhCkBAIC04NCw3ICs4NCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgICAgICBmb3IgKEdlbmVyYWxOYW1lIGdlbmVyYWxOYW1lIDogZ2VuZXJhbE5hbWVzKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGdlbmVyYWxOYW1lLmdldEFzTGlzdCgpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB3ZSBoYXZlIGFuIGVycm9yIGRlY29kaW5nIG9uZSBvZiB0aGUgR2VuZXJhbE5hbWVzLCB3ZSdsbCBqdXN0CisgICAgICAgICAgICAgKiBvbWl0IGl0IGZyb20gdGhlIGZpbmFsIGxpc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBnZW5OYW1lTGlzdDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2VuTmFtZUxpc3QgPSBnZW5lcmFsTmFtZS5nZXRBc0xpc3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoZ2VuTmFtZUxpc3QpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L1N1YmplY3RQdWJsaWNLZXlJbmZvLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvU3ViamVjdFB1YmxpY0tleUluZm8uamF2YQppbmRleCA1NDVkNDg5Li5hZWY3YTY1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvU3ViamVjdFB1YmxpY0tleUluZm8uamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvU3ViamVjdFB1YmxpY0tleUluZm8uamF2YQpAQCAtMjYsMTMgKzI2LDEzIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5YNTA5RW5jb2RlZEtleVNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUJpdFN0cmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQml0U3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5BbGdOYW1lTWFwcGVyOwogCiAvKioKICAqIFRoZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIEFTTi4xIERFUiBlbmNvZGluZy9kZWNvZGluZyB3b3JrCkBAIC0xMDMsMzIgKzEwMyw1NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgVGhlIFB1YmxpY0tleSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgU3ViamVjdFB1YmxpY0tleUluZm8KKyAgICAgKiBSZXR1cm5zIHRoZSBQdWJsaWNLZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIFN1YmplY3RQdWJsaWNLZXlJbmZvCiAgICAgICogaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKSB7CiAgICAgICAgIGlmIChwdWJsaWNLZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGFsZ19vaWQgPSBhbGdvcml0aG1JRC5nZXRBbGdvcml0aG0oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFsZyA9Ci0gICAgICAgICAgICAgICAgICAgIEFsZ05hbWVNYXBwZXIubWFwMkFsZ05hbWUoYWxnX29pZCk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gZW5jb2RlZCA9IGdldEVuY29kZWQoKTsKKyAgICAgICAgICAgIGZpbmFsIEtleVNwZWMga2V5U3BlYyA9IG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZW5jb2RlZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoYWxnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxnID0gYWxnX29pZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljS2V5ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShhbGcpCi0gICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZVB1YmxpYyhuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGdldEVuY29kZWQoKSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIC8qIFRyeSB1c2luZyB0aGUgYWxnb3JpdGhtIG5hbWUgZmlyc3QuICovCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWxnTmFtZSA9IGFsZ29yaXRobUlELmdldEFsZ29yaXRobU5hbWUoKTsKKyAgICAgICAgICAgIHB1YmxpY0tleSA9IGdlbmVyYXRlS2V5Rm9yQWxnb3JpdGhtKGtleVNwZWMsIGFsZ05hbWUpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBhbGdvcml0aG0gT0lEIGlmIGl0J3Mgbm90IHRoZSBzYW1lIGFzIHRoZQorICAgICAgICAgICAgICogYWxnb3JpdGhtIG5hbWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhbGdPaWQgPSBhbGdvcml0aG1JRC5nZXRBbGdvcml0aG0oKTsKKyAgICAgICAgICAgIGlmIChwdWJsaWNLZXkgPT0gbnVsbCAmJiAhYWxnT2lkLmVxdWFscyhhbGdOYW1lKSkgeworICAgICAgICAgICAgICAgIHB1YmxpY0tleSA9IGdlbmVyYXRlS2V5Rm9yQWxnb3JpdGhtKGtleVNwZWMsIGFsZ09pZCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBFbmNvZGUgdGhpcyBhcyBhbiBYLjUwOSBwdWJsaWMga2V5IHNpbmNlIHdlIGRpZG4ndCBoYXZlIGFueQorICAgICAgICAgICAgICogS2V5RmFjdG9yeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIGFsZ29yaXRobSBuYW1lIG9yIE9JRC4gUGVyaGFwcworICAgICAgICAgICAgICogdGhlIHRoaW5nIHRoYXQncyB1c2luZyB0aGlzIGNhbiBkZWNvZGUgaXQuCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChwdWJsaWNLZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB1YmxpY0tleSA9IG5ldyBYNTA5UHVibGljS2V5KGFsZ19vaWQsIGdldEVuY29kZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RQdWJsaWNLZXkpOworICAgICAgICAgICAgICAgIHB1YmxpY0tleSA9IG5ldyBYNTA5UHVibGljS2V5KGFsZ09pZCwgZW5jb2RlZCwgc3ViamVjdFB1YmxpY0tleSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHB1YmxpY0tleTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZ2VuZXJhdGUgYSBQdWJsaWNLZXkgZm9yIGEgZ2l2ZW4ge0Bjb2RlIGtleVNwZWN9IGFuZAorICAgICAqIHtAY29kZSBhbGdvcml0aG19IGlkZW50aWZpZXIuIElmIHRoZXJlIGEgcHJvYmxlbSBnZW5lcmF0aW5nIHRoZSBrZXkgbGlrZQorICAgICAqIGEgbWlzc2luZyB7QGNvZGUgS2V5RmFjdG9yeX0gb3IgaW52YWxpZCB7QGNvZGUgS2V5U3BlY30sIGl0IHdpbGwgcmV0dXJuCisgICAgICoge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFB1YmxpY0tleSBnZW5lcmF0ZUtleUZvckFsZ29yaXRobShLZXlTcGVjIGtleVNwZWMsIFN0cmluZyBhbGdvcml0aG0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSkuZ2VuZXJhdGVQdWJsaWMoa2V5U3BlYyk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFTTjFTZXF1ZW5jZSBBU04xID0gbmV3IEFTTjFTZXF1ZW5jZShuZXcgQVNOMVR5cGVbXSB7CiAgICAgICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyLkFTTjEsIEFTTjFCaXRTdHJpbmcuZ2V0SW5zdGFuY2UoKSB9KSB7CiAgICAgICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgT2JqZWN0IGdldERlY29kZWRPYmplY3QoQmVySW5wdXRTdHJlYW0gaW4pIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0QXR0cmlidXRlcy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRBdHRyaWJ1dGVzLmphdmEKaW5kZXggNWVjNjMyYy4uOWNlOGU4MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRBdHRyaWJ1dGVzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRBdHRyaWJ1dGVzLmphdmEKQEAgLTM3LDEzICszNywxMyBAQAogICAgICAqIEdldHMgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcnNlci4gV2UgbmVlZCB0aGlzIHNvIHdlIGNhbiBnZXQgdG8gdGhlCiAgICAgICogaW50ZXJuZWQgc3RyaW5nIHBvb2wuCiAgICAgICovCi0gICAgYWJzdHJhY3QgaW50IGdldFBhcnNlclBvaW50ZXIoKTsKKyAgICBhYnN0cmFjdCBsb25nIGdldFBhcnNlclBvaW50ZXIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgYXR0cmlidXRlIGFycmF5LiBDYW4gYmUgMCBpZiB0aGUKICAgICAgKiBsZW5ndGggaXMgMC4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvaW50ZXIoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRQb2ludGVyKCk7CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFVSSShpbnQgaW5kZXgpIHsKICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnZXRMZW5ndGgoKSkgewpAQCAtODEsNyArODEsNyBAQAogICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibG9jYWxOYW1lID09IG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpbnQgcG9pbnRlciA9IGdldFBvaW50ZXIoKTsKKyAgICAgICAgbG9uZyBwb2ludGVyID0gZ2V0UG9pbnRlcigpOwogICAgICAgICBpZiAocG9pbnRlciA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicU5hbWUgPT0gbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGludCBwb2ludGVyID0gZ2V0UG9pbnRlcigpOworICAgICAgICBsb25nIHBvaW50ZXIgPSBnZXRQb2ludGVyKCk7CiAgICAgICAgIGlmIChwb2ludGVyID09IDApIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJsb2NhbE5hbWUgPT0gbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGludCBwb2ludGVyID0gZ2V0UG9pbnRlcigpOworICAgICAgICBsb25nIHBvaW50ZXIgPSBnZXRQb2ludGVyKCk7CiAgICAgICAgIGlmIChwb2ludGVyID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CkBAIC0xMzEsMjAgKzEzMSwyMCBAQAogICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJxTmFtZSA9PSBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaW50IHBvaW50ZXIgPSBnZXRQb2ludGVyKCk7CisgICAgICAgIGxvbmcgcG9pbnRlciA9IGdldFBvaW50ZXIoKTsKICAgICAgICAgaWYgKHBvaW50ZXIgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdldFZhbHVlRm9yUU5hbWUocG9pbnRlciwgcU5hbWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VVJJKGludCBwb2ludGVyLCBpbnQgYXR0cmlidXRlUG9pbnRlciwgaW50IGluZGV4KTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldExvY2FsTmFtZShpbnQgcG9pbnRlciwgaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGludCBpbmRleCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRRTmFtZShpbnQgcG9pbnRlciwgaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGludCBpbmRleCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRWYWx1ZUJ5SW5kZXgoaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGludCBpbmRleCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRJbmRleChpbnQgYXR0cmlidXRlUG9pbnRlciwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRJbmRleEZvclFOYW1lKGludCBhdHRyaWJ1dGVQb2ludGVyLCBTdHJpbmcgcU5hbWUpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VmFsdWUoaW50IGF0dHJpYnV0ZVBvaW50ZXIsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VmFsdWVGb3JRTmFtZShpbnQgYXR0cmlidXRlUG9pbnRlciwgU3RyaW5nIHFOYW1lKTsKLSAgICBwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgZnJlZUF0dHJpYnV0ZXMoaW50IHBvaW50ZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VVJJKGxvbmcgcG9pbnRlciwgbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBpbnQgaW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0TG9jYWxOYW1lKGxvbmcgcG9pbnRlciwgbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBpbnQgaW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0UU5hbWUobG9uZyBwb2ludGVyLCBsb25nIGF0dHJpYnV0ZVBvaW50ZXIsIGludCBpbmRleCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBnZXRWYWx1ZUJ5SW5kZXgobG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBpbnQgaW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0SW5kZXgobG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEluZGV4Rm9yUU5hbWUobG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBTdHJpbmcgcU5hbWUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0VmFsdWUobG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldFZhbHVlRm9yUU5hbWUobG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBTdHJpbmcgcU5hbWUpOworICAgIHByb3RlY3RlZCBuYXRpdmUgdm9pZCBmcmVlQXR0cmlidXRlcyhsb25nIHBvaW50ZXIpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQYXJzZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UGFyc2VyLmphdmEKaW5kZXggODJjOGUyYS4uZGI2ZjRlZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQYXJzZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlci5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODA5NjsgLy8gaW4gYnl0ZXMKIAogICAgIC8qKiBQb2ludGVyIHRvIFhNTF9QYXJzZXIgaW5zdGFuY2UuICovCi0gICAgcHJpdmF0ZSBpbnQgcG9pbnRlcjsKKyAgICBwcml2YXRlIGxvbmcgcG9pbnRlcjsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpblN0YXJ0RWxlbWVudCA9IGZhbHNlOwogICAgIHByaXZhdGUgaW50IGF0dHJpYnV0ZUNvdW50ID0gLTE7CkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAvKioKICAgICAgKiBVc2VkIGJ5IHtAbGluayBFbnRpdHlQYXJzZXJ9LgogICAgICAqLwotICAgIHByaXZhdGUgRXhwYXRQYXJzZXIoU3RyaW5nIGVuY29kaW5nLCBFeHBhdFJlYWRlciB4bWxSZWFkZXIsIGludCBwb2ludGVyLAorICAgIHByaXZhdGUgRXhwYXRQYXJzZXIoU3RyaW5nIGVuY29kaW5nLCBFeHBhdFJlYWRlciB4bWxSZWFkZXIsIGxvbmcgcG9pbnRlciwKICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7CiAgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgdGhpcy54bWxSZWFkZXIgPSB4bWxSZWFkZXI7CkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIG5hdGl2ZSBwYXJzZXIKICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgaW5pdGlhbGl6ZShTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gbmFtZXNwYWNlc0VuYWJsZWQpOworICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgaW5pdGlhbGl6ZShTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gbmFtZXNwYWNlc0VuYWJsZWQpOwogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LgpAQCAtMzAyLDcgKzMwMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBwaWNrRW5jb2RpbmcoaW5wdXRTb3VyY2UpOwotICAgICAgICBpbnQgcG9pbnRlciA9IGNyZWF0ZUVudGl0eVBhcnNlcih0aGlzLnBvaW50ZXIsIGNvbnRleHQpOworICAgICAgICBsb25nIHBvaW50ZXIgPSBjcmVhdGVFbnRpdHlQYXJzZXIodGhpcy5wb2ludGVyLCBjb250ZXh0KTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEVudGl0eVBhcnNlciBlbnRpdHlQYXJzZXIgPSBuZXcgRW50aXR5UGFyc2VyKGVuY29kaW5nLCB4bWxSZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIsIGlucHV0U291cmNlLmdldFB1YmxpY0lkKCksCkBAIC0zOTIsNyArMzkyLDcgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBwYXNzZWQgdG8ge0BsaW5rICNoYW5kbGVFeHRlcm5hbEVudGl0eX0KICAgICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gbmF0aXZlIHBhcnNlcgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY3JlYXRlRW50aXR5UGFyc2VyKGludCBwYXJlbnRQb2ludGVyLCBTdHJpbmcgY29udGV4dCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgY3JlYXRlRW50aXR5UGFyc2VyKGxvbmcgcGFyZW50UG9pbnRlciwgU3RyaW5nIGNvbnRleHQpOwogCiAgICAgLyoqCiAgICAgICogQXBwZW5kcyBwYXJ0IG9mIGFuIFhNTCBkb2N1bWVudC4gVGhpcyBwYXJzZXIgd2lsbCBwYXJzZSB0aGUgZ2l2ZW4gWE1MIHRvCkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgYXBwZW5kU3RyaW5nKGludCBwb2ludGVyLCBTdHJpbmcgeG1sLCBib29sZWFuIGlzRmluYWwpCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBhcHBlbmRTdHJpbmcobG9uZyBwb2ludGVyLCBTdHJpbmcgeG1sLCBib29sZWFuIGlzRmluYWwpCiAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBFeHBhdEV4Y2VwdGlvbjsKIAogICAgIC8qKgpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGFwcGVuZENoYXJzKGludCBwb2ludGVyLCBjaGFyW10geG1sLCBpbnQgb2Zmc2V0LAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgYXBwZW5kQ2hhcnMobG9uZyBwb2ludGVyLCBjaGFyW10geG1sLCBpbnQgb2Zmc2V0LAogICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgRXhwYXRFeGNlcHRpb247CiAKICAgICAvKioKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBhcHBlbmRCeXRlcyhpbnQgcG9pbnRlciwgYnl0ZVtdIHhtbCwgaW50IG9mZnNldCwKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGFwcGVuZEJ5dGVzKGxvbmcgcG9pbnRlciwgYnl0ZVtdIHhtbCwgaW50IG9mZnNldCwKICAgICAgICAgICAgIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24sIEV4cGF0RXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC01NjAsMTIgKzU2MCwxMiBAQAogICAgIC8qKgogICAgICAqIFJlbGVhc2VzIGFsbCBuYXRpdmUgb2JqZWN0cy4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHJlbGVhc2UoaW50IHBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcmVsZWFzZShsb25nIHBvaW50ZXIpOwogCiAgICAgLyoqCiAgICAgICogUmVsZWFzZXMgbmF0aXZlIHBhcnNlciBvbmx5LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHJlbGVhc2VQYXJzZXIoaW50IHBvaW50ZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHJlbGVhc2VQYXJzZXIobG9uZyBwb2ludGVyKTsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgc3RhdGljIHJlc291cmNlcy4KQEAgLTU4Myw3ICs1ODMsNyBAQAogICAgICAgICByZXR1cm4gbGluZSh0aGlzLnBvaW50ZXIpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbGluZShpbnQgcG9pbnRlcik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBsaW5lKGxvbmcgcG9pbnRlcik7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNvbHVtbiBudW1iZXIgd2l0aGluIHRoZSBYTUwgZmlsZS4KQEAgLTU5Miw3ICs1OTIsNyBAQAogICAgICAgICByZXR1cm4gY29sdW1uKHRoaXMucG9pbnRlcik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjb2x1bW4oaW50IHBvaW50ZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY29sdW1uKGxvbmcgcG9pbnRlcik7CiAKICAgICAvKioKICAgICAgKiBDbG9uZXMgdGhlIGN1cnJlbnQgYXR0cmlidXRlcyBzbyB0aGV5IGNhbiBiZSB1c2VkIG91dHNpZGUgb2YKQEAgLTYwNywxMiArNjA3LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gQ2xvbmVkQXR0cmlidXRlcy5FTVBUWTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBjbG9uZVBvaW50ZXIKKyAgICAgICAgbG9uZyBjbG9uZVBvaW50ZXIKICAgICAgICAgICAgICAgICA9IGNsb25lQXR0cmlidXRlcyh0aGlzLmF0dHJpYnV0ZVBvaW50ZXIsIHRoaXMuYXR0cmlidXRlQ291bnQpOwogICAgICAgICByZXR1cm4gbmV3IENsb25lZEF0dHJpYnV0ZXMocG9pbnRlciwgY2xvbmVQb2ludGVyLCBhdHRyaWJ1dGVDb3VudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjbG9uZUF0dHJpYnV0ZXMoaW50IHBvaW50ZXIsIGludCBhdHRyaWJ1dGVDb3VudCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgY2xvbmVBdHRyaWJ1dGVzKGxvbmcgcG9pbnRlciwgaW50IGF0dHJpYnV0ZUNvdW50KTsKIAogICAgIC8qKgogICAgICAqIFVzZWQgZm9yIGNsb25lZCBhdHRyaWJ1dGVzLgpAQCAtNjIxLDggKzYyMSw4IEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlcyBFTVBUWSA9IG5ldyBDbG9uZWRBdHRyaWJ1dGVzKDAsIDAsIDApOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IHBhcnNlclBvaW50ZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IHBvaW50ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBwYXJzZXJQb2ludGVyOworICAgICAgICBwcml2YXRlIGxvbmcgcG9pbnRlcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOwogCiAgICAgICAgIC8qKgpAQCAtNjMzLDE5ICs2MzMsMTkgQEAKICAgICAgICAgICogIGxlbmd0aCBpcyAwLgogICAgICAgICAgKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIENsb25lZEF0dHJpYnV0ZXMoaW50IHBhcnNlclBvaW50ZXIsIGludCBwb2ludGVyLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHByaXZhdGUgQ2xvbmVkQXR0cmlidXRlcyhsb25nIHBhcnNlclBvaW50ZXIsIGxvbmcgcG9pbnRlciwgaW50IGxlbmd0aCkgewogICAgICAgICAgICAgdGhpcy5wYXJzZXJQb2ludGVyID0gcGFyc2VyUG9pbnRlcjsKICAgICAgICAgICAgIHRoaXMucG9pbnRlciA9IHBvaW50ZXI7CiAgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBhcnNlclBvaW50ZXIoKSB7CisgICAgICAgIHB1YmxpYyBsb25nIGdldFBhcnNlclBvaW50ZXIoKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZXJQb2ludGVyOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9pbnRlcigpIHsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UG9pbnRlcigpIHsKICAgICAgICAgICAgIHJldHVybiBwb2ludGVyOwogICAgICAgICB9CiAKQEAgLTY5OCwxMiArNjk4LDEyIEBACiAgICAgcHJpdmF0ZSBjbGFzcyBDdXJyZW50QXR0cmlidXRlcyBleHRlbmRzIEV4cGF0QXR0cmlidXRlcyB7CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFyc2VyUG9pbnRlcigpIHsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UGFyc2VyUG9pbnRlcigpIHsKICAgICAgICAgICAgIHJldHVybiBwb2ludGVyOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9pbnRlcigpIHsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UG9pbnRlcigpIHsKICAgICAgICAgICAgIGlmICghaW5TdGFydEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE9VVFNJREVfU1RBUlRfRUxFTUVOVCk7CiAgICAgICAgICAgICB9CkBAIC03NjYsNyArNzY2LDcgQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgZGVwdGggPSAwOwogCiAgICAgICAgIHByaXZhdGUgRW50aXR5UGFyc2VyKFN0cmluZyBlbmNvZGluZywgRXhwYXRSZWFkZXIgeG1sUmVhZGVyLAotICAgICAgICAgICAgICAgIGludCBwb2ludGVyLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICAgICAgICAgIGxvbmcgcG9pbnRlciwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKICAgICAgICAgICAgIHN1cGVyKGVuY29kaW5nLCB4bWxSZWFkZXIsIHBvaW50ZXIsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRSZWFkZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UmVhZGVyLmphdmEKaW5kZXggOTBmYTE4MS4uZTA1NDJiMSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRSZWFkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFJlYWRlci5qYXZhCkBAIC0zMDksMTUgKzMwOSwxMCBAQAogICAgICAgICBwYXJzZXIucGFyc2VEb2N1bWVudChpbik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBFeHBhdFBhcnNlciBwYXJzZXIgPSBuZXcgRXhwYXRQYXJzZXIoCi0gICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZXNwYWNlcywKLSAgICAgICAgICAgICAgICBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICBzeXN0ZW1JZAotICAgICAgICApOworICAgIHByaXZhdGUgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNoYXJzZXROYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRXhwYXRQYXJzZXIgcGFyc2VyID0KKyAgICAgICAgICAgIG5ldyBFeHBhdFBhcnNlcihjaGFyc2V0TmFtZSwgdGhpcywgcHJvY2Vzc05hbWVzcGFjZXMsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7CiAgICAgICAgIHBhcnNlci5wYXJzZURvY3VtZW50KGluKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG1sL2RvbS9Jbm5lck5vZGVJbXBsLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vSW5uZXJOb2RlSW1wbC5qYXZhCmluZGV4IDQxODc4OWQuLjRiZWExYjQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG1sL2RvbS9Jbm5lck5vZGVJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bWwvZG9tL0lubmVyTm9kZUltcGwuamF2YQpAQCAtODUsNiArODUsMTAgQEAKICAgICBwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIExlYWZOb2RlSW1wbCByZWZDaGlsZEltcGwgPSAoTGVhZk5vZGVJbXBsKSByZWZDaGlsZDsKIAorICAgICAgICBpZiAocmVmQ2hpbGRJbXBsID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVmQ2hpbGRJbXBsLmRvY3VtZW50ICE9IGRvY3VtZW50KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5XUk9OR19ET0NVTUVOVF9FUlIsIG51bGwpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9BYnN0cmFjdFNlc3Npb25Db250ZXh0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9BYnN0cmFjdFNlc3Npb25Db250ZXh0LmphdmEKaW5kZXggMjQ5NmE5My4uOTcxZTI5MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQWJzdHJhY3RTZXNzaW9uQ29udGV4dC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Fic3RyYWN0U2Vzc2lvbkNvbnRleHQuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgIHZvbGF0aWxlIGludCBtYXhpbXVtU2l6ZTsKICAgICB2b2xhdGlsZSBpbnQgdGltZW91dDsKIAotICAgIGZpbmFsIGludCBzc2xDdHhOYXRpdmVQb2ludGVyID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgZmluYWwgbG9uZyBzc2xDdHhOYXRpdmVQb2ludGVyID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CiAKICAgICAvKiogSWRlbnRpZmllcyBPcGVuU1NMIHNlc3Npb25zLiAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9TU0wgPSAxOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ2hhaW5TdHJlbmd0aEFuYWx5emVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9DaGFpblN0cmVuZ3RoQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ2hhaW5TdHJlbmd0aEFuYWx5emVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDaGFpblN0cmVuZ3RoQW5hbHl6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9NT0RVTFVTID0gMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPSURfQkxBQ0tMSVNUID0geyIxLjIuODQwLjExMzU0OS4xLjEuNCJ9OyAvLyBNRDV3aXRoUlNBCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2hlY2soWDUwOUNlcnRpZmljYXRlW10gY2hhaW4pIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoWDUwOUNlcnRpZmljYXRlIGNlcnQgOiBjaGFpbikgeworICAgICAgICAgICAgY2hlY2tDZXJ0KGNlcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBjaGVja0NlcnQoWDUwOUNlcnRpZmljYXRlIGNlcnQpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTW9kdWx1c0xlbmd0aChjZXJ0KTsKKyAgICAgICAgY2hlY2tOb3RNRDUoY2VydCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBjaGVja01vZHVsdXNMZW5ndGgoWDUwOUNlcnRpZmljYXRlIGNlcnQpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBwdWJrZXkgPSBjZXJ0LmdldFB1YmxpY0tleSgpOworICAgICAgICBpZiAocHVia2V5IGluc3RhbmNlb2YgUlNBUHVibGljS2V5KSB7CisgICAgICAgICAgICBpbnQgbW9kdWx1c0xlbmd0aCA9ICgoUlNBUHVibGljS2V5KSBwdWJrZXkpLmdldE1vZHVsdXMoKS5iaXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmKCEobW9kdWx1c0xlbmd0aCA+PSBNSU5fTU9EVUxVUykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVFeGNlcHRpb24oIk1vZHVsdXMgaXMgPCAxMDI0IGJpdHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgY2hlY2tOb3RNRDUoWDUwOUNlcnRpZmljYXRlIGNlcnQpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvaWQgPSBjZXJ0LmdldFNpZ0FsZ09JRCgpOworICAgICAgICBmb3IgKFN0cmluZyBibGFja2xpc3RlZCA6IE9JRF9CTEFDS0xJU1QpIHsKKyAgICAgICAgICAgIGlmIChvaWQuZXF1YWxzKGJsYWNrbGlzdGVkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigiU2lnbmF0dXJlIHVzZXMgYW4gaW5zZWN1cmUgaGFzaCBmdW5jdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9Db25uZWN0aW9uU3RhdGUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZS5qYXZhCmluZGV4IDA2OWQ1ZGIuLmVlZDZkZWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZS5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbWFsIHBvc3NpYmxlIHNpemUgb2YgdGhlCi0gICAgICogR2VuZXJpY1tTdHJlYW18R2VuZXJpY11DaXBoZXIgc3RydWN0dXJlIHVuZGVyIHRoaXMKKyAgICAgKiBHZW5lcmljW1N0cmVhbXxCbG9ja11DaXBoZXIgc3RydWN0dXJlIHVuZGVyIHRoaXMKICAgICAgKiBjb25uZWN0aW9uIHN0YXRlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZ2V0TWluRnJhZ21lbnRTaXplKCkgewpAQCAtNzAsNyArNzAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIEdlbmVyaWNbU3RyZWFtfEdlbmVyaWNdQ2lwaGVyIHN0cnVjdHVyZQorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIEdlbmVyaWNbU3RyZWFtfEJsb2NrXUNpcGhlciBzdHJ1Y3R1cmUKICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50IGRhdGEgb2Ygc3BlY2lmaWVkIHNpemUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBnZXRGcmFnbWVudFNpemUoaW50IGNvbnRlbnRfc2l6ZSkgewpAQCAtNzksNyArNzksNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWluaW1hbCB1cHBlciBib3VuZCBvZiB0aGUgY29udGVudCBzaXplIGVuY2xvc2VkCi0gICAgICogaW50byB0aGUgR2VuZXJpY1tTdHJlYW18R2VuZXJpY11DaXBoZXIgc3RydWN0dXJlIG9mIHNwZWNpZmllZCBzaXplLgorICAgICAqIGludG8gdGhlIEdlbmVyaWNbU3RyZWFtfEJsb2NrXUNpcGhlciBzdHJ1Y3R1cmUgb2Ygc3BlY2lmaWVkIHNpemUuCiAgICAgICogRm9yIHN0cmVhbSBjaXBoZXJzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIGV4YWN0IHZhbHVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZ2V0Q29udGVudFNpemUoaW50IGdlbmVyaWNfY2lwaGVyX3NpemUpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZVNTTHYzLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9Db25uZWN0aW9uU3RhdGVTU0x2My5qYXZhCmluZGV4IDAwNzA1Y2MuLjQ4MGQ3N2QgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZVNTTHYzLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ29ubmVjdGlvblN0YXRlU1NMdjMuamF2YQpAQCAtMjk0LDkgKzI5NCw5IEBACiAgICAgICAgIGJ5dGVbXSBjb250ZW50OwogICAgICAgICBpZiAoYmxvY2tfc2l6ZSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBjaGVjayBwYWRkaW5nCi0gICAgICAgICAgICBpbnQgcGFkZGluZ19sZW5ndGggPSBkYXRhW2RhdGEubGVuZ3RoLTFdOworICAgICAgICAgICAgaW50IHBhZGRpbmdfbGVuZ3RoID0gZGF0YVtkYXRhLmxlbmd0aC0xXSAmIDB4RkY7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cGFkZGluZ19sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChkYXRhW2RhdGEubGVuZ3RoLTItaV0gIT0gcGFkZGluZ19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRhdGFbZGF0YS5sZW5ndGgtMi1pXSAmIDB4RkYpICE9IHBhZGRpbmdfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGVydEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGVydFByb3RvY29sLkRFQ1JZUFRJT05fRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0Nvbm5lY3Rpb25TdGF0ZVRMUy5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ29ubmVjdGlvblN0YXRlVExTLmphdmEKaW5kZXggNGUwNTE5Mi4uNDIxNjlkYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ29ubmVjdGlvblN0YXRlVExTLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ29ubmVjdGlvblN0YXRlVExTLmphdmEKQEAgLTMwNCw5ICszMDQsOSBAQAogICAgICAgICBieXRlW10gY29udGVudDsKICAgICAgICAgaWYgKGJsb2NrX3NpemUgIT0gMCkgewogICAgICAgICAgICAgLy8gY2hlY2sgcGFkZGluZwotICAgICAgICAgICAgaW50IHBhZGRpbmdfbGVuZ3RoID0gZGF0YVtkYXRhLmxlbmd0aC0xXTsKKyAgICAgICAgICAgIGludCBwYWRkaW5nX2xlbmd0aCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXSAmIDB4RkY7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cGFkZGluZ19sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChkYXRhW2RhdGEubGVuZ3RoLTItaV0gIT0gcGFkZGluZ19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRhdGFbZGF0YS5sZW5ndGgtMi1pXSAmIDB4RkYpICE9IHBhZGRpbmdfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbGVydEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGVydFByb3RvY29sLkRFQ1JZUFRJT05fRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0RlZmF1bHRTU0xDb250ZXh0SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvRGVmYXVsdFNTTENvbnRleHRJbXBsLmphdmEKaW5kZXggNTA1NzUxOC4uNjZiOWViZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvRGVmYXVsdFNTTENvbnRleHRJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvRGVmYXVsdFNTTENvbnRleHRJbXBsLmphdmEKQEAgLTgzLDExICs4Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcga21mQWxnID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoInNzbC5LZXlNYW5hZ2VyRmFjdG9yeS5hbGdvcml0aG0iKTsKLSAgICAgICAgaWYgKGttZkFsZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBrbWZBbGcgPSAiU3VuWDUwOSI7Ci0gICAgICAgIH0KLQorICAgICAgICBTdHJpbmcga21mQWxnID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShrbWZBbGcpOwogICAgICAgICBrbWYuaW5pdChrcywgcHdkKTsKICAgICAgICAgS0VZX01BTkFHRVJTID0ga21mLmdldEtleU1hbmFnZXJzKCk7CkBAIC0xMTksMTEgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG1mQWxnID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoInNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5LmFsZ29yaXRobSIpOwotICAgICAgICBpZiAodG1mQWxnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRtZkFsZyA9ICJQS0lYIjsKLSAgICAgICAgfQotCisgICAgICAgIFN0cmluZyB0bWZBbGcgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKHRtZkFsZyk7CiAgICAgICAgIHRtZi5pbml0KGtzKTsKICAgICAgICAgVFJVU1RfTUFOQUdFUlMgPSB0bWYuZ2V0VHJ1c3RNYW5hZ2VycygpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvSlNTRVByb3ZpZGVyLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9KU1NFUHJvdmlkZXIuamF2YQppbmRleCBkOWI3NjU5Li41OGRhZDQ1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9KU1NFUHJvdmlkZXIuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9KU1NFUHJvdmlkZXIuamF2YQpAQCAtMTEyLDggKzExMiwxMiBAQAogICAgICAgICBwdXQoIlNTTENvbnRleHQuVExTIiwgU1NMQ29udGV4dEltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgcHV0KCJTU0xDb250ZXh0LlRMU3YxIiwgU1NMQ29udGV4dEltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKIAotICAgICAgICBwdXQoIktleU1hbmFnZXJGYWN0b3J5Llg1MDkiLCBLZXlNYW5hZ2VyRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHV0KCJUcnVzdE1hbmFnZXJGYWN0b3J5Llg1MDkiLCBUcnVzdE1hbmFnZXJGYWN0b3J5SW1wbC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIktleU1hbmFnZXJGYWN0b3J5LlBLSVgiLCBLZXlNYW5hZ2VyRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuS2V5TWFuYWdlckZhY3RvcnkuWDUwOSIsICJQS0lYIik7CisKKyAgICAgICAgcHV0KCJUcnVzdE1hbmFnZXJGYWN0b3J5LlBLSVgiLCBUcnVzdE1hbmFnZXJGYWN0b3J5SW1wbC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5UcnVzdE1hbmFnZXJGYWN0b3J5Llg1MDkiLCAiUEtJWCIpOworCiAgICAgICAgIHB1dCgiS2V5U3RvcmUuQW5kcm9pZENBU3RvcmUiLCBUcnVzdGVkQ2VydGlmaWNhdGVLZXlTdG9yZVNwaS5jbGFzcy5nZXROYW1lKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL05hdGl2ZUNyeXB0by5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvLmphdmEKaW5kZXggNjUzNzNmZi4uZWQ3MTJkZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CkBAIC0yNywxMiArMjgsMTQgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKIGltcG9ydCBsaWJjb3JlLmlvLk1lbW9yeTsKQEAgLTUyLDEzNyArNTUsMjU0IEBACiAgICAgLy8gLS0tIEVOR0lORSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRU5HSU5FX2xvYWRfZHluYW1pYygpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVOR0lORV9ieV9pZChTdHJpbmcgaWQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRU5HSU5FX2J5X2lkKFN0cmluZyBpZCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRU5HSU5FX2FkZChpbnQgZSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVOR0lORV9hZGQobG9uZyBlKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFTkdJTkVfaW5pdChpbnQgZSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVOR0lORV9pbml0KGxvbmcgZSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRU5HSU5FX2ZpbmlzaChpbnQgZSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVOR0lORV9maW5pc2gobG9uZyBlKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFTkdJTkVfZnJlZShpbnQgZSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVOR0lORV9mcmVlKGxvbmcgZSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkoaW50IGUsIFN0cmluZyBrZXlfaWQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkobG9uZyBlLCBTdHJpbmcga2V5X2lkKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBFTkdJTkVfZ2V0X2lkKGxvbmcgZW5naW5lUmVmKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGxvbmcgZW5naW5lUmVmLCBTdHJpbmcgY21kLCBTdHJpbmcgYXJnLAorICAgICAgICAgICAgaW50IGNtZF9vcHRpb25hbCk7CiAKICAgICAvLyAtLS0gRFNBL1JTQSBwdWJsaWMvcHJpdmF0ZSBrZXkgaGFuZGxpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1BLRVlfbmV3X0RTQShieXRlW10gcCwgYnl0ZVtdIHEsIGJ5dGVbXSBnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwdWJfa2V5LCBieXRlW10gcHJpdl9rZXkpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRVZQX1BLRVlfbmV3X0RTQShieXRlW10gcCwgYnl0ZVtdIHEsIGJ5dGVbXSBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcHViX2tleSwgYnl0ZVtdIHByaXZfa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfUEtFWV9uZXdfUlNBKGJ5dGVbXSBuLCBieXRlW10gZSwgYnl0ZVtdIGQsIGJ5dGVbXSBwLCBieXRlW10gcSwKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVWUF9QS0VZX25ld19SU0EoYnl0ZVtdIG4sIGJ5dGVbXSBlLCBieXRlW10gZCwgYnl0ZVtdIHAsIGJ5dGVbXSBxLAogICAgICAgICAgICAgYnl0ZVtdIGRtcDEsIGJ5dGVbXSBkbXExLCBieXRlW10gaXFtcCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1BLRVlfc2l6ZShpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfUEtFWV9uZXdfbWFjX2tleShpbnQgdHlwZSwgYnl0ZVtdIGtleSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1BLRVlfdHlwZShpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX3NpemUobG9uZyBwa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1BLRVlfZnJlZShpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX3R5cGUobG9uZyBwa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfUEtFWV9jbXAoaW50IHBrZXkxLCBpbnQgcGtleTIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBFVlBfUEtFWV9wcmludF9wdWJsaWMobG9uZyBwa2V5UmVmKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIEVWUF9QS0VZX3ByaW50X3ByaXZhdGUobG9uZyBwa2V5UmVmKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhieXRlW10gZGF0YSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfUEtFWV9mcmVlKGxvbmcgcGtleSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gaTJkX1BVQktFWShpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX2NtcChsb25nIHBrZXkxLCBsb25nIHBrZXkyKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBkMmlfUFVCS0VZKGJ5dGVbXSBkYXRhKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8obG9uZyBwa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0FfZ2VuZXJhdGVfa2V5X2V4KGludCBtb2R1bHVzQml0cywgYnl0ZVtdIHB1YmxpY0V4cG9uZW50KTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKGJ5dGVbXSBkYXRhKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0Ffc2l6ZShpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGkyZF9QVUJLRVkobG9uZyBwa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBieXRlW10gZnJvbSwgYnl0ZVtdIHRvLCBpbnQgcGtleSwKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGQyaV9QVUJLRVkoYnl0ZVtdIGRhdGEpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBSU0FfZ2VuZXJhdGVfa2V5X2V4KGludCBtb2R1bHVzQml0cywgYnl0ZVtdIHB1YmxpY0V4cG9uZW50KTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0Ffc2l6ZShsb25nIHBrZXkpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFJTQV9wcml2YXRlX2VuY3J5cHQoaW50IGZsZW4sIGJ5dGVbXSBmcm9tLCBieXRlW10gdG8sIGxvbmcgcGtleSwKICAgICAgICAgICAgIGludCBwYWRkaW5nKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0FfcHVibGljX2RlY3J5cHQoaW50IGZsZW4sIGJ5dGVbXSBmcm9tLCBieXRlW10gdG8sIGludCBwa2V5LAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0FfcHVibGljX2RlY3J5cHQoaW50IGZsZW4sIGJ5dGVbXSBmcm9tLCBieXRlW10gdG8sIGxvbmcgcGtleSwKICAgICAgICAgICAgIGludCBwYWRkaW5nKSB0aHJvd3MgQmFkUGFkZGluZ0V4Y2VwdGlvbiwgU2lnbmF0dXJlRXhjZXB0aW9uOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFJTQV9wdWJsaWNfZW5jcnlwdChpbnQgZmxlbiwgYnl0ZVtdIGZyb20sIGJ5dGVbXSB0bywgaW50IHBrZXksCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFJTQV9wdWJsaWNfZW5jcnlwdChpbnQgZmxlbiwgYnl0ZVtdIGZyb20sIGJ5dGVbXSB0bywgbG9uZyBwa2V5LAogICAgICAgICAgICAgaW50IHBhZGRpbmcpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFJTQV9wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIGJ5dGVbXSBmcm9tLCBieXRlW10gdG8sIGludCBwa2V5LAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBSU0FfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCBieXRlW10gZnJvbSwgYnl0ZVtdIHRvLCBsb25nIHBrZXksCiAgICAgICAgICAgICBpbnQgcGFkZGluZykgdGhyb3dzIEJhZFBhZGRpbmdFeGNlcHRpb24sIFNpZ25hdHVyZUV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYXJyYXkgb2Yge24sIGV9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdW10gZ2V0X1JTQV9wdWJsaWNfcGFyYW1zKGludCByc2EpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIGdldF9SU0FfcHVibGljX3BhcmFtcyhsb25nIHJzYSk7CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHtuLCBlLCBkLCBwLCBxLCBkbXAxLCBkbXExLCBpcW1wfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIGdldF9SU0FfcHJpdmF0ZV9wYXJhbXMoaW50IHJzYSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdW10gZ2V0X1JTQV9wcml2YXRlX3BhcmFtcyhsb25nIHJzYSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRFNBX2dlbmVyYXRlX2tleShpbnQgcHJpbWVCaXRzLCBieXRlW10gc2VlZCwgYnl0ZVtdIGcsIGJ5dGVbXSBwLAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRFNBX2dlbmVyYXRlX2tleShpbnQgcHJpbWVCaXRzLCBieXRlW10gc2VlZCwgYnl0ZVtdIGcsIGJ5dGVbXSBwLAogICAgICAgICAgICAgYnl0ZVtdIHEpOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBhcnJheSBvZiB7ZywgcCwgcSwgeShwdWIpLCB4KHByaXYpfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIGdldF9EU0FfcGFyYW1zKGludCBkc2EpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIGdldF9EU0FfcGFyYW1zKGxvbmcgZHNhKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfUlNBUHVibGljS2V5KGludCByc2EpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfUlNBUHVibGljS2V5KGxvbmcgcnNhKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfUlNBUHJpdmF0ZUtleShpbnQgcnNhKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gaTJkX1JTQVByaXZhdGVLZXkobG9uZyByc2EpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGkyZF9EU0FQdWJsaWNLZXkoaW50IGRzYSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGkyZF9EU0FQdWJsaWNLZXkobG9uZyBkc2EpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGkyZF9EU0FQcml2YXRlS2V5KGludCBkc2EpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfRFNBUHJpdmF0ZUtleShsb25nIGRzYSk7CisKKyAgICAvLyAtLS0gRUMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHJlcXVlc3QgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCB0byBFQ19HUk9VUF9uZXdfY3VydmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQ19DVVJWRV9HRlAgPSAxOworCisgICAgLyoqCisgICAgICogVXNlZCB0byByZXF1ZXN0IEVDX0dST1VQX25ld19jdXJ2ZV9HRjJtIHRvIEVDX0dST1VQX25ld19jdXJ2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVDX0NVUlZFX0dGMk0gPSAyOworCisgICAgLyoqCisgICAgICogRUNfR1JPVVBfc2V0X2FzbjFfZmxhZzogaW5kaWNhdGVzIGFuIEVDX0dST1VQIGlzIGEgTmFtZWRDdXJ2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOU1NMX0VDX05BTUVEX0NVUlZFID0gMHgwMDE7CisKKyAgICAvKioKKyAgICAgKiBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtOiBpbmRpY2F0ZXMgY29tcHJlc3NlZCBBU04uMSBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgPSAyOworCisgICAgLyoqCisgICAgICogRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybTogaW5kaWNhdGVzIHVuY29tcHJlc3NlZCBBU04uMSBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtOiBpbmRpY2F0ZXMgaHlicmlkIEFTTi4xIGZvcm1hdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEID0gNDsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRVZQX1BLRVlfbmV3X0VDX0tFWShsb25nIGdyb3VwUmVmLCBsb25nIHB1YmtleVJlZiwgYnl0ZVtdIHByaXZrZXkpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShTdHJpbmcgY3VydmVOYW1lKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRUNfR1JPVVBfbmV3X2N1cnZlKGludCB0eXBlLCBieXRlW10gcCwgYnl0ZVtdIGEsIGJ5dGVbXSBiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRUNfR1JPVVBfZHVwKGxvbmcgZ3JvdXBSZWYpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKGxvbmcgZ3JvdXBSZWYsIGludCBmbGFnKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShsb25nIGdyb3VwUmVmLCBpbnQgZm9ybSk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUobG9uZyBncm91cFJlZik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW11bXSBFQ19HUk9VUF9nZXRfY3VydmUobG9uZyBncm91cFJlZik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVDX0dST1VQX2NsZWFyX2ZyZWUobG9uZyBjdHgpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBFQ19HUk9VUF9jbXAobG9uZyBjdHgxLCBsb25nIGN0eDIpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGxvbmcgZ3JvdXBDdHgsIGxvbmcgcG9pbnRDdHgsIGJ5dGVbXSBuLCBieXRlW10gaCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVDX0dST1VQX2dldF9nZW5lcmF0b3IobG9uZyBncm91cEN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0X0VDX0dST1VQX3R5cGUobG9uZyBncm91cEN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gRUNfR1JPVVBfZ2V0X29yZGVyKGxvbmcgZ3JvdXBDdHgpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIEVDX0dST1VQX2dldF9jb2ZhY3Rvcihsb25nIGdyb3VwQ3R4KTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRUNfUE9JTlRfbmV3KGxvbmcgZ3JvdXBSZWYpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFQ19QT0lOVF9jbGVhcl9mcmVlKGxvbmcgcG9pbnRSZWYpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBFQ19QT0lOVF9jbXAobG9uZyBncm91cFJlZiwgbG9uZyBwb2ludFJlZjEsIGxvbmcgcG9pbnRSZWYyKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXMobG9uZyBncm91cEN0eCwgbG9uZyBwb2ludEN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXMobG9uZyBncm91cEN0eCwgbG9uZyBwb2ludEN0eCwgYnl0ZVtdIHgsCisgICAgICAgICAgICBieXRlW10geSk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVDX0tFWV9nZW5lcmF0ZV9rZXkobG9uZyBncm91cFJlZik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVDX0tFWV9nZXQwX2dyb3VwKGxvbmcgcGtleVJlZik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gRUNfS0VZX2dldF9wcml2YXRlX2tleShsb25nIGtleVJlZik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVDX0tFWV9nZXRfcHVibGljX2tleShsb25nIGtleVJlZik7CiAKICAgICAvLyAtLS0gTWVzc2FnZSBkaWdlc3QgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tCiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX2dldF9kaWdlc3RieW5hbWUoU3RyaW5nIG5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgRVZQX2dldF9kaWdlc3RieW5hbWUoU3RyaW5nIG5hbWUpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9NRF9zaXplKGludCBldnBfbWQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfTURfc2l6ZShsb25nIGV2cF9tZCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX01EX2Jsb2NrX3NpemUoaW50IGV2cF9tZCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9NRF9ibG9ja19zaXplKGxvbmcgZXZwX21kKTsKIAogICAgIC8vIC0tLSBNZXNzYWdlIGRpZ2VzdCBjb250ZXh0IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLQogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfTURfQ1RYX2Rlc3Ryb3koaW50IGN0eCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfTURfQ1RYX2NyZWF0ZSgpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9NRF9DVFhfY29weShpbnQgY3R4KTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9NRF9DVFhfaW5pdChsb25nIGN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9NRF9DVFhfZGVzdHJveShsb25nIGN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVWUF9NRF9DVFhfY29weShsb25nIGN0eCk7CiAKICAgICAvLyAtLS0gRGlnZXN0IGhhbmRsaW5nIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX0RpZ2VzdEluaXQoaW50IGV2cF9tZCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfRGlnZXN0SW5pdChsb25nIGV2cF9tZCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9EaWdlc3RVcGRhdGUoaW50IGN0eCwgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfRGlnZXN0VXBkYXRlKGxvbmcgY3R4LCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfRGlnZXN0RmluYWwoaW50IGN0eCwgYnl0ZVtdIGhhc2gsIGludCBvZmZzZXQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfRGlnZXN0RmluYWwobG9uZyBjdHgsIGJ5dGVbXSBoYXNoLCBpbnQgb2Zmc2V0KTsKKworICAgIC8vIC0tLSBNQUMgaGFuZGxpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX0RpZ2VzdFNpZ25Jbml0KGxvbmcgZXZwX21kX2N0eCwgbG9uZyBldnBfbWQsIGxvbmcgZXZwX3BrZXkpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfRGlnZXN0U2lnblVwZGF0ZShsb25nIGV2cF9tZF9jdHgsIGJ5dGVbXSBpbik7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gRVZQX0RpZ2VzdFNpZ25GaW5hbChsb25nIGV2cF9tZF9jdHgpOwogCiAgICAgLy8gLS0tIFNpZ25hdHVyZSBoYW5kbGluZyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9TaWduSW5pdChTdHJpbmcgYWxnb3JpdGhtKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEVWUF9TaWduSW5pdChTdHJpbmcgYWxnb3JpdGhtKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1NpZ25VcGRhdGUoaW50IGN0eCwgYnl0ZVtdIGJ1ZmZlciwKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9TaWduVXBkYXRlKGxvbmcgY3R4LCBieXRlW10gYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfU2lnbkZpbmFsKGludCBjdHgsIGJ5dGVbXSBzaWduYXR1cmUsIGludCBvZmZzZXQsIGludCBrZXkpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfU2lnbkZpbmFsKGxvbmcgY3R4LCBieXRlW10gc2lnbmF0dXJlLCBpbnQgb2Zmc2V0LCBsb25nIGtleSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1ZlcmlmeUluaXQoU3RyaW5nIGFsZ29yaXRobSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfVmVyaWZ5SW5pdChTdHJpbmcgYWxnb3JpdGhtKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1ZlcmlmeVVwZGF0ZShpbnQgY3R4LCBieXRlW10gYnVmZmVyLAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1ZlcmlmeVVwZGF0ZShsb25nIGN0eCwgYnl0ZVtdIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1ZlcmlmeUZpbmFsKGludCBjdHgsIGJ5dGVbXSBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQga2V5KTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1ZlcmlmeUZpbmFsKGxvbmcgY3R4LCBieXRlW10gc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgbG9uZyBrZXkpOwogCiAKICAgICAvLyAtLS0gQmxvY2sgY2lwaGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX2dldF9jaXBoZXJieW5hbWUoU3RyaW5nIHN0cmluZyk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShTdHJpbmcgc3RyaW5nKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ2lwaGVySW5pdF9leChpbnQgY2lwaGVyTmlkLCBieXRlW10ga2V5LCBieXRlW10gaXYsCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfQ2lwaGVySW5pdF9leChsb25nIGN0eCwgbG9uZyBldnBDaXBoZXIsIGJ5dGVbXSBrZXksIGJ5dGVbXSBpdiwKICAgICAgICAgICAgIGJvb2xlYW4gZW5jcnlwdGluZyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX0NpcGhlclVwZGF0ZShpbnQgY3R4LCBieXRlW10gb3V0LCBpbnQgb3V0T2Zmc2V0LCBieXRlW10gaW4sCi0gICAgICAgICAgICBpbnQgaW5PZmZzZXQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ2lwaGVyVXBkYXRlKGxvbmcgY3R4LCBieXRlW10gb3V0LCBpbnQgb3V0T2Zmc2V0LCBieXRlW10gaW4sCisgICAgICAgICAgICBpbnQgaW5PZmZzZXQsIGludCBpbkxlbmd0aCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX0NpcGhlckZpbmFsX2V4KGludCBjdHgsIGJ5dGVbXSBvdXQsIGludCBvdXRPZmZzZXQpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ2lwaGVyRmluYWxfZXgobG9uZyBjdHgsIGJ5dGVbXSBvdXQsIGludCBvdXRPZmZzZXQpCisgICAgICAgICAgICB0aHJvd3MgQmFkUGFkZGluZ0V4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChpbnQgY3R4KTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX0NJUEhFUl9pdl9sZW5ndGgobG9uZyBldnBDaXBoZXIpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFVlBfQ0lQSEVSX0NUWF9uZXcoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKGxvbmcgY3R4KTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRfRVZQX0NJUEhFUl9DVFhfYnVmX2xlbihsb25nIGN0eCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKGxvbmcgY3R4LCBib29sZWFuIGVuYWJsZVBhZGRpbmcpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChsb25nIGN0eCwgaW50IGtleUJpdFNpemUpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKGxvbmcgY3R4KTsKIAogICAgIC8vIC0tLSBSQU5EIHNlZWRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTk0LDYgKzMxNCwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBSQU5EX2J5dGVzKGJ5dGVbXSBvdXRwdXQpOwogCisgICAgLy8gLS0tIEFTTi4xIG9iamVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IE9CSl90eHQybmlkKFN0cmluZyBvaWQpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIE9CSl90eHQybmlkX2xvbmdOYW1lKFN0cmluZyBvaWQpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIE9CSl90eHQybmlkX29pZChTdHJpbmcgb2lkKTsKKwogICAgIC8vIC0tLSBYNTA5X05BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IFg1MDlfTkFNRV9oYXNoKFg1MDBQcmluY2lwYWwgcHJpbmNpcGFsKSB7CkBAIC0yMTAsNiArMzM4LDE4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gLS0tIEJJTyBzdHJlYW0gY3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBjcmVhdGVfQklPX0lucHV0U3RyZWFtKE9wZW5TU0xCSU9JbnB1dFN0cmVhbSBpcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGNyZWF0ZV9CSU9fT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQklPX3JlYWQobG9uZyBiaW9SZWYsIGJ5dGVbXSBidWZmZXIpOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBCSU9fd3JpdGUobG9uZyBiaW9SZWYsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEJJT19mcmVlKGxvbmcgYmlvUmVmKTsKIAogICAgIC8vIC0tLSBTU0wgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzUwLDE3ICs0OTAsMTkgQEAKICAgICB9CiAKICAgICAvLyBFVlBfUEtFWSB0eXBlcyBmcm9tIGV2cC5oIGFuZCBvYmplY3RzLmgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlBfUEtFWV9SU0EgPSA2OyAgIC8vIE5JRF9yc2FFY25yeXB0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZQX1BLRVlfRFNBID0gMTE2OyAvLyBOSURfZHNhCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZQX1BLRVlfREggID0gMjg7ICAvLyBOSURfZGhLZXlBZ3JlZW1lbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlBfUEtFWV9FQyAgPSA0MDg7IC8vIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWUF9QS0VZX1JTQSAgPSA2OyAgIC8vIE5JRF9yc2FFY25yeXB0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZQX1BLRVlfRFNBICA9IDExNjsgLy8gTklEX2RzYQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWUF9QS0VZX0RIICAgPSAyODsgIC8vIE5JRF9kaEtleUFncmVlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWUF9QS0VZX0VDICAgPSA0MDg7IC8vIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWUF9QS0VZX0hNQUMgPSA4NTU7IC8vIE5JRF9obWFjCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZQX1BLRVlfQ01BQyA9IDg5NDsgLy8gTklEX2NtYWMKIAogICAgIC8vIFJTQSBwYWRkaW5nIG1vZGVzIGZyb20gcnNhLmgKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU0FfUEtDUzFfUEFERElORyA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNBX05PX1BBRERJTkcgICAgPSAzOwogCiAgICAgLy8gU1NMIG1vZGUgZnJvbSBzc2wuaAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCA9IDB4MDAwMDAwNDBMOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCA9IDB4MDAwMDAwMjBMOwogCiAgICAgLy8gU1NMIG9wdGlvbnMgZnJvbSBzc2wuaAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTU0xfT1BfTk9fVElDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA0MDAwTDsKQEAgLTM3MCw3ICs1MTIsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTU0xfT1BfTk9fVExTdjFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEwMDAwMDAwTDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU1NMX09QX05PX1RMU3YxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwMDAwMEw7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU1NMX0NUWF9uZXcoKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9DVFhfbmV3KCk7CiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10gewpAQCAtNDE2LDExICs1NTgsMzcgQEAKICAgICAgICAgcmV0dXJuIFNVUFBPUlRFRF9DSVBIRVJfU1VJVEVTLmNsb25lKCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfQ1RYX2ZyZWUoaW50IHNzbF9jdHgpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX0NUWF9mcmVlKGxvbmcgc3NsX2N0eCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChpbnQgc3NsX2N0eCwgYnl0ZVtdIHNpZF9jdHgpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGxvbmcgc3NsX2N0eCwgYnl0ZVtdIHNpZF9jdHgpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFNTTF9uZXcoaW50IHNzbF9jdHgpIHRocm93cyBTU0xFeGNlcHRpb247CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfbmV3KGxvbmcgc3NsX2N0eCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZChsb25nIHNzbCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKGxvbmcgc3NsKSB0aHJvd3MgU1NMRXhjZXB0aW9uOworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQobG9uZyBzc2wsIGxvbmcgcGtleSkKKyAgICAgICAgICAgIHRocm93cyBTU0xFeGNlcHRpb247CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF91c2VfUEtDUzhfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQoCisgICAgICAgICAgICBsb25nIHNzbCwgYnl0ZVtdIHBrY3M4RW5jb2RlZFByaXZhdGVLZXkpIHRocm93cyBTU0xFeGNlcHRpb247CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgU1NMX3NldDFfdGxzX2NoYW5uZWxfaWQobG9uZyBzc2wsIEVDUHJpdmF0ZUtleSBwcml2YXRlS2V5KQorICAgICAgICAgICAgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcml2YXRlS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJpdmF0ZUtleSA9PSBudWxsIik7CisgICAgICAgIH0gZWxzZSBpZiAocHJpdmF0ZUtleSBpbnN0YW5jZW9mIE9wZW5TU0xFQ1ByaXZhdGVLZXkpIHsKKyAgICAgICAgICAgIE9wZW5TU0xLZXkgb3BlblNzbFByaXZhdGVLZXkgPSAoKE9wZW5TU0xFQ1ByaXZhdGVLZXkpIHByaXZhdGVLZXkpLmdldE9wZW5TU0xLZXkoKTsKKyAgICAgICAgICAgIFNTTF91c2VfT3BlblNTTF9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZChzc2wsIG9wZW5Tc2xQcml2YXRlS2V5LmdldFBrZXlDb250ZXh0KCkpOworICAgICAgICB9IGVsc2UgaWYgKCJQS0NTIzgiLmVxdWFscyhwcml2YXRlS2V5LmdldEZvcm1hdCgpKSkgeworICAgICAgICAgICAgYnl0ZVtdIHBrY3M4RW5jb2RlZEtleSA9IHByaXZhdGVLZXkuZ2V0RW5jb2RlZCgpOworICAgICAgICAgICAgU1NMX3VzZV9QS0NTOF9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZChzc2wsIHBrY3M4RW5jb2RlZEtleSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBDaGFubmVsIElEIHByaXZhdGUga2V5IHR5cGU6IiArCisgICAgICAgICAgICAgICAgICAgICIgY2xhc3M6ICIgKyBwcml2YXRlS2V5LmdldENsYXNzKCkgKyAiLCBmb3JtYXQ6ICIgKyBwcml2YXRlS2V5LmdldEZvcm1hdCgpKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdW10gZW5jb2RlQ2VydGlmaWNhdGVzKENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtNDMxLDEzICs1OTksMTMgQEAKICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQnl0ZXM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfdXNlX2NlcnRpZmljYXRlKGludCBzc2wsIGJ5dGVbXVtdIGFzbjFEZXJFbmNvZGVkQ2VydGlmaWNhdGVDaGFpbik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfdXNlX2NlcnRpZmljYXRlKGxvbmcgc3NsLCBieXRlW11bXSBhc24xRGVyRW5jb2RlZENlcnRpZmljYXRlQ2hhaW4pOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleShpbnQgc3NsLCBpbnQgcGtleSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleShsb25nIHNzbCwgbG9uZyBwa2V5KTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3VzZV9Qcml2YXRlS2V5KGludCBzc2wsIGJ5dGVbXSBwa2NzOEVuY29kZWRQcml2YXRlS2V5KTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF91c2VfUHJpdmF0ZUtleShsb25nIHNzbCwgYnl0ZVtdIHBrY3M4RW5jb2RlZFByaXZhdGVLZXkpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXkoaW50IHNzbCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9jaGVja19wcml2YXRlX2tleShsb25nIHNzbCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdW10gZW5jb2RlSXNzdWVyWDUwOVByaW5jaXBhbHMoWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKQogICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gewpAQCAtNDQ4LDE5ICs2MTYsMTkgQEAKICAgICAgICAgcmV0dXJuIHByaW5jaXBhbEJ5dGVzOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3NldF9jbGllbnRfQ0FfbGlzdChpbnQgc3NsLCBieXRlW11bXSBhc24xRGVyRW5jb2RlZFg1MDBQcmluY2lwYWxzKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QobG9uZyBzc2wsIGJ5dGVbXVtdIGFzbjFEZXJFbmNvZGVkWDUwMFByaW5jaXBhbHMpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfZ2V0X21vZGUoaW50IHNzbCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfZ2V0X21vZGUobG9uZyBzc2wpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfc2V0X21vZGUoaW50IHNzbCwgbG9uZyBtb2RlKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9zZXRfbW9kZShsb25nIHNzbCwgbG9uZyBtb2RlKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgU1NMX2NsZWFyX21vZGUoaW50IHNzbCwgbG9uZyBtb2RlKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9jbGVhcl9tb2RlKGxvbmcgc3NsLCBsb25nIG1vZGUpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfZ2V0X29wdGlvbnMoaW50IHNzbCk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfZ2V0X29wdGlvbnMobG9uZyBzc2wpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfc2V0X29wdGlvbnMoaW50IHNzbCwgbG9uZyBvcHRpb25zKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9zZXRfb3B0aW9ucyhsb25nIHNzbCwgbG9uZyBvcHRpb25zKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgU1NMX2NsZWFyX29wdGlvbnMoaW50IHNzbCwgbG9uZyBvcHRpb25zKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9jbGVhcl9vcHRpb25zKGxvbmcgc3NsLCBsb25nIG9wdGlvbnMpOwogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXREZWZhdWx0UHJvdG9jb2xzKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgU1VQUE9SVEVEX1BST1RPQ09MX1NTTFYzLApAQCAtNDc2LDcgKzY0NCw3IEBACiAgICAgICAgIH07CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoaW50IHNzbCwgU3RyaW5nW10gcHJvdG9jb2xzKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMobG9uZyBzc2wsIFN0cmluZ1tdIHByb3RvY29scykgewogICAgICAgICBjaGVja0VuYWJsZWRQcm90b2NvbHMocHJvdG9jb2xzKTsKICAgICAgICAgLy8gb3BlbnNzbCB1c2VzIG5lZ2F0aXZlIGxvZ2ljIGxldHRpbmcgeW91IGRpc2FibGUgcHJvdG9jb2xzLgogICAgICAgICAvLyBzbyBmaXJzdCwgYXNzdW1lIHdlIG5lZWQgdG8gc2V0IGFsbCAoZGlzYWJsZSBhbGwpIGFuZCBjbGVhciBub25lIChlbmFibGUgbm9uZSkuCkBAIC01MjcsOSArNjk1LDkgQEAKICAgICAgICAgcmV0dXJuIHByb3RvY29sczsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9zZXRfY2lwaGVyX2xpc3RzKGludCBzc2wsIFN0cmluZ1tdIGNpcGhlcnMpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3NldF9jaXBoZXJfbGlzdHMobG9uZyBzc2wsIFN0cmluZ1tdIGNpcGhlcnMpOwogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoaW50IHNzbCwgU3RyaW5nW10gY2lwaGVyU3VpdGVzKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMobG9uZyBzc2wsIFN0cmluZ1tdIGNpcGhlclN1aXRlcykgewogICAgICAgICBjaGVja0VuYWJsZWRDaXBoZXJTdWl0ZXMoY2lwaGVyU3VpdGVzKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IG9wZW5zc2xTdWl0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaXBoZXJTdWl0ZXMubGVuZ3RoOyBpKyspIHsKQEAgLTU3NiwxNyArNzQ0LDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX1ZFUklGWV9QRUVSID0gICAgICAgICAgICAgICAgIDB4MDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCA9IDB4MDI7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9zZXRfdmVyaWZ5KGludCBzc2xOYXRpdmVQb2ludGVyLCBpbnQgbW9kZSk7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfc2V0X3ZlcmlmeShsb25nIHNzbE5hdGl2ZVBvaW50ZXIsIGludCBtb2RlKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3NldF9zZXNzaW9uKGludCBzc2xOYXRpdmVQb2ludGVyLCBpbnQgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIpCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfc2V0X3Nlc3Npb24obG9uZyBzc2xOYXRpdmVQb2ludGVyLCBsb25nIHNzbFNlc3Npb25OYXRpdmVQb2ludGVyKQogICAgICAgICB0aHJvd3MgU1NMRXhjZXB0aW9uOwogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfc2V0X3Nlc3Npb25fY3JlYXRpb25fZW5hYmxlZCgKLSAgICAgICAgICAgIGludCBzc2xOYXRpdmVQb2ludGVyLCBib29sZWFuIGNyZWF0aW9uRW5hYmxlZCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvbmcgc3NsTmF0aXZlUG9pbnRlciwgYm9vbGVhbiBjcmVhdGlvbkVuYWJsZWQpIHRocm93cyBTU0xFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShpbnQgc3NsTmF0aXZlUG9pbnRlciwgU3RyaW5nIGhvc3RuYW1lKQorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKGxvbmcgc3NsTmF0aXZlUG9pbnRlciwgU3RyaW5nIGhvc3RuYW1lKQogICAgICAgICAgICAgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgU1NMX2dldF9zZXJ2ZXJuYW1lKGludCBzc2xOYXRpdmVQb2ludGVyKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgU1NMX2dldF9zZXJ2ZXJuYW1lKGxvbmcgc3NsTmF0aXZlUG9pbnRlcik7CiAKICAgICAvKioKICAgICAgKiBFbmFibGVzIE5QTiBmb3IgYWxsIFNTTCBjb25uZWN0aW9ucyBpbiB0aGUgY29udGV4dC4KQEAgLTYwMiwxNyArNzcwLDE3IEBACiAgICAgICogPHA+SW4gZWl0aGVyIGNhc2UgdGhlIGNhbGxlciBzaG91bGQgcGFzcyBhIG5vbi1udWxsIGJ5dGUgYXJyYXkgb2YgTlBOCiAgICAgICogcHJvdG9jb2xzIHRvIHtAbGluayAjU1NMX2RvX2hhbmRzaGFrZX0uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfQ1RYX2VuYWJsZV9ucG4oaW50IHNzbEN0eE5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX0NUWF9lbmFibGVfbnBuKGxvbmcgc3NsQ3R4TmF0aXZlUG9pbnRlcik7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyBOUE4gZm9yIGFsbCBTU0wgY29ubmVjdGlvbnMgaW4gdGhlIGNvbnRleHQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfQ1RYX2Rpc2FibGVfbnBuKGludCBzc2xDdHhOYXRpdmVQb2ludGVyKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9DVFhfZGlzYWJsZV9ucG4obG9uZyBzc2xDdHhOYXRpdmVQb2ludGVyKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNzbFNlc3Npb25OYXRpdmVQb2ludGVyIG9mIHRoZSBuZWdvdGlhdGVkIHNlc3Npb24KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU1NMX2RvX2hhbmRzaGFrZShpbnQgc3NsTmF0aXZlUG9pbnRlciwKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU1NMX2RvX2hhbmRzaGFrZShsb25nIHNzbE5hdGl2ZVBvaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIHNoYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dE1pbGxpcywKQEAgLTYyMCwyOSArNzg4LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIG5wblByb3RvY29scykKICAgICAgICAgdGhyb3dzIFNTTEV4Y2VwdGlvbiwgU29ja2V0VGltZW91dEV4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gU1NMX2dldF9ucG5fbmVnb3RpYXRlZF9wcm90b2NvbChpbnQgc3NsTmF0aXZlUG9pbnRlcik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIFNTTF9nZXRfbnBuX25lZ290aWF0ZWRfcHJvdG9jb2wobG9uZyBzc2xOYXRpdmVQb2ludGVyKTsKIAogICAgIC8qKgogICAgICAqIEN1cnJlbnRseSBvbmx5IGludGVuZGVkIGZvciBmb3JjaW5nIHJlbmVnb3RpYXRpb24gZm9yIHRlc3RpbmcuCiAgICAgICogTm90IHVzZWQgd2l0aGluIE9wZW5TU0xTb2NrZXRJbXBsLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3JlbmVnb3RpYXRlKGludCBzc2xOYXRpdmVQb2ludGVyKSB0aHJvd3MgU1NMRXhjZXB0aW9uOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX3JlbmVnb3RpYXRlKGxvbmcgc3NsTmF0aXZlUG9pbnRlcikgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGxvY2FsIEFTTi4xIERFUiBlbmNvZGVkIFg1MDkgY2VydGlmaWNhdGVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIFNTTF9nZXRfY2VydGlmaWNhdGUoaW50IHNzbE5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIFNTTF9nZXRfY2VydGlmaWNhdGUobG9uZyBzc2xOYXRpdmVQb2ludGVyKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHBlZXIgQVNOLjEgREVSIGVuY29kZWQgWDUwOSBjZXJ0aWZpY2F0ZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdW10gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oaW50IHNzbE5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGxvbmcgc3NsTmF0aXZlUG9pbnRlcik7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB3aXRoIHRoZSBuYXRpdmUgU1NMX3JlYWQgZnVuY3Rpb24gZnJvbSB0aGUgZW5jcnlwdGVkIGRhdGEgc3RyZWFtCiAgICAgICogQHJldHVybiAtMSBpZiBlcnJvciBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU1NMX3JlYWQoaW50IHNzbE5hdGl2ZVBvaW50ZXIsCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFNTTF9yZWFkKGxvbmcgc3NsTmF0aXZlUG9pbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBzaGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgcmVhZFRpbWVvdXRNaWxsaXMpCkBAIC02NTEsMzIgKzgxOSwzMiBAQAogICAgIC8qKgogICAgICAqIFdyaXRlcyB3aXRoIHRoZSBuYXRpdmUgU1NMX3dyaXRlIGZ1bmN0aW9uIHRvIHRoZSBlbmNyeXB0ZWQgZGF0YSBzdHJlYW0uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfd3JpdGUoaW50IHNzbE5hdGl2ZVBvaW50ZXIsCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfd3JpdGUobG9uZyBzc2xOYXRpdmVQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBzaGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4sIGludCB3cml0ZVRpbWVvdXRNaWxsaXMpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX2ludGVycnVwdChpbnQgc3NsTmF0aXZlUG9pbnRlcik7Ci0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfc2h1dGRvd24oaW50IHNzbE5hdGl2ZVBvaW50ZXIsCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfaW50ZXJydXB0KGxvbmcgc3NsTmF0aXZlUG9pbnRlcik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfc2h1dGRvd24obG9uZyBzc2xOYXRpdmVQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBzaGMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX2ZyZWUoaW50IHNzbE5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU1NMX2ZyZWUobG9uZyBzc2xOYXRpdmVQb2ludGVyKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBTU0xfU0VTU0lPTl9zZXNzaW9uX2lkKGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIFNTTF9TRVNTSU9OX3Nlc3Npb25faWQobG9uZyBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcik7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9TRVNTSU9OX2dldF90aW1lKGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfU0VTU0lPTl9nZXRfdGltZShsb25nIHNzbFNlc3Npb25OYXRpdmVQb2ludGVyKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbihpbnQgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbihsb25nIHNzbFNlc3Npb25OYXRpdmVQb2ludGVyKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBTU0xfU0VTU0lPTl9jaXBoZXIoaW50IHNzbFNlc3Npb25OYXRpdmVQb2ludGVyKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgU1NMX1NFU1NJT05fY2lwaGVyKGxvbmcgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfU0VTU0lPTl9mcmVlKGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcik7CisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfU0VTU0lPTl9mcmVlKGxvbmcgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIpOwogCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGkyZF9TU0xfU0VTU0lPTihpbnQgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBpMmRfU1NMX1NFU1NJT04obG9uZyBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcik7CiAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZDJpX1NTTF9TRVNTSU9OKGJ5dGVbXSBkYXRhKTsKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGQyaV9TU0xfU0VTU0lPTihieXRlW10gZGF0YSk7CiAKICAgICAvKioKICAgICAgKiBBIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIGZyb20gdGhlIG5hdGl2ZSBPcGVuU1NMIGNvZGUgdGhhdCBhcmUKQEAgLTcxNiw0ICs4ODQsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgaGFuZHNoYWtlQ29tcGxldGVkKCk7CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBFUlJfcGVla19sYXN0X2Vycm9yKCk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMQklPSW5wdXRTdHJlYW0uamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xCSU9JbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTA5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMQklPSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogUHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIE9wZW5TU0wncyBCSU8gc3lzdGVtIGRpcmVjdGx5IGZyb20gYSBKYXZhCisgKiBJbnB1dFN0cmVhbS4gSXQgYWxsb3dzIGFuIE9wZW5TU0wgQVBJIHRvIHJlYWQgZGlyZWN0bHkgZnJvbSBzb21ldGhpbmcgbW9yZQorICogZmxleGlibGUgaW50ZXJmYWNlIHRoYW4gYSBieXRlIGFycmF5LgorICovCitwdWJsaWMgY2xhc3MgT3BlblNTTEJJT0lucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0geworICAgIHByaXZhdGUgbG9uZyBjdHg7CisKKyAgICBwdWJsaWMgT3BlblNTTEJJT0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIHN1cGVyKGlzKTsKKworICAgICAgICBjdHggPSBOYXRpdmVDcnlwdG8uY3JlYXRlX0JJT19JbnB1dFN0cmVhbSh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRCaW9Db250ZXh0KCkgeworICAgICAgICByZXR1cm4gY3R4OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZExpbmUoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlci5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IGlucHV0Qnl0ZSA9IHJlYWQoKTsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1ZmZlci5sZW5ndGggJiYgaW5wdXRCeXRlICE9ICdcbicgJiYgaW5wdXRCeXRlICE9IC0xKSB7CisgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gKGJ5dGUpIGlucHV0Qnl0ZTsKKyAgICAgICAgICAgIGlucHV0Qnl0ZSA9IHJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dEJ5dGUgPT0gJ1xuJykgeworICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9ICdcbic7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xDaXBoZXIuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xDaXBoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E4ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTENpcGhlci5qYXZhCkBAIC0wLDAgKzEsODEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5YNTA5RW5jb2RlZEtleVNwZWM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyU3BpOworaW1wb3J0IGphdmF4LmNyeXB0by5JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNob3J0QnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworCitpbXBvcnQgbGliY29yZS51dGlsLkVtcHR5QXJyYXk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVuU1NMQ2lwaGVyIGV4dGVuZHMgQ2lwaGVyU3BpIHsKKworICAgIC8qKgorICAgICAqIE1vZGVzIHRoYXQgYSBibG9jayBjaXBoZXIgbWF5IHN1cHBvcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBlbnVtIE1vZGUgeworICAgICAgICBDQkMsCisgICAgICAgIENGQiwgQ0ZCMSwgQ0ZCOCwgQ0ZCMTI4LAorICAgICAgICBDVFIsCisgICAgICAgIENUUywKKyAgICAgICAgRUNCLAorICAgICAgICBPRkIsIE9GQjY0LCBPRkIxMjgsCisgICAgICAgIFBDQkMsCisgICAgfQorCisgICAgLyoqCisgICAgICogUGFkZGluZ3MgdGhhdCBhIGJsb2NrIGNpcGhlciBtYXkgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGVudW0gUGFkZGluZyB7CisgICAgICAgIE5PUEFERElORywKKyAgICAgICAgUEtDUzVQQURESU5HLAorICAgICAgICBJU08xMDEyNlBBRERJTkcsCisgICAgfQorCisgICAgLyoqCisgICAgICogTmF0aXZlIHBvaW50ZXIgZm9yIHRoZSBPcGVuU1NMIEVWUF9DSVBIRVIgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wZW5TU0xDaXBoZXJDb250ZXh0IGNpcGhlckN0eCA9IG5ldyBPcGVuU1NMQ2lwaGVyQ29udGV4dCgKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX0NUWF9uZXcoKSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBjaXBoZXIgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1vZGUgbW9kZSA9IE1vZGUuRUNCOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgY2lwaGVyIHBhZGRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBQYWRkaW5nIHBhZGRpbmcgPSBQYWRkaW5nLlBLQ1M1UEFERElORzsKKworICAgIC8qKgorICAgICAqIFRoZSBJbml0aWFsIFZlY3RvciAoSVYpIHVzZWQgZm9yIHRoZSBjdXJyZW50IGNpcGhlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBpdjsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY2lwaGVyIG1vZGU6IGVuY3J5cHRpbmcgb3IgZGVjcnlwdGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5jcnlwdGluZzsKKworICAgIC8qKgorICAgICAqIFRoZSBibG9jayBzaXplIG9mIHRoZSBjdXJyZW50IGNpcGhlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBibG9ja1NpemU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgY3VycmVudCBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1vZGVCbG9ja1NpemU7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBjaXBoZXIgaGFzIHByb2Nlc3NlZCBhbnkgZGF0YSB5ZXQuIE9wZW5TU0wgZG9lc24ndCBsaWtlCisgICAgICogY2FsbGluZyAiZG9GaW5hbCgpIiBpbiBkZWNyeXB0aW9uIG1vZGUgd2l0aG91dCBwcm9jZXNzaW5nIGFueSB1cGRhdGVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsZWRVcGRhdGU7CisKKyAgICBwcm90ZWN0ZWQgT3BlblNTTENpcGhlcigpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT3BlblNTTENpcGhlcihNb2RlIG1vZGUsIFBhZGRpbmcgcGFkZGluZykgeworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgICAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nOworICAgICAgICBibG9ja1NpemUgPSBnZXRDaXBoZXJCbG9ja1NpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuU1NMIGNpcGhlciBuYW1lIGZvciB0aGUgcGFydGljdWxhciB7QGNvZGUga2V5U2l6ZX0gYW5kCisgICAgICogY2lwaGVyIHtAY29kZSBtb2RlfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENpcGhlck5hbWUoaW50IGtleVNpemUsIE1vZGUgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY2lwaGVyIHN1cHBvcnRzIHRoaXMgcGFydGljdWxhciB7QGNvZGUga2V5U2l6ZX0gKGluCisgICAgICogYnl0ZXMpIGFuZCB0aHJvd3Mge0Bjb2RlIEludmFsaWRLZXlFeGNlcHRpb259IGlmIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hlY2tTdXBwb3J0ZWRLZXlTaXplKGludCBrZXlTaXplKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjaXBoZXIgc3VwcG9ydHMgdGhpcyBwYXJ0aWN1bGFyIGNpcGhlciB7QGNvZGUgbW9kZX0KKyAgICAgKiBhbmQgdGhyb3dzIHtAY29kZSBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb259IGlmIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hlY2tTdXBwb3J0ZWRNb2RlKE1vZGUgbW9kZSkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjaXBoZXIgc3VwcG9ydHMgdGhpcyBwYXJ0aWN1bGFyIGNpcGhlciB7QGNvZGUgcGFkZGluZ30KKyAgICAgKiBhbmQgdGhyb3dzIHtAY29kZSBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9ufSBpZiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrU3VwcG9ydGVkUGFkZGluZyhQYWRkaW5nIHBhZGRpbmcpIHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRDaXBoZXJCbG9ja1NpemUoKTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVmFyaWFibGVTaXplS2V5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZShTdHJpbmcgbW9kZVN0cikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1vZGUgbW9kZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vZGUgPSBNb2RlLnZhbHVlT2YobW9kZVN0ci50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBuZXdFID0gbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbigiTm8gc3VjaCBtb2RlOiAiCisgICAgICAgICAgICAgICAgICAgICsgbW9kZVN0cik7CisgICAgICAgICAgICBuZXdFLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ld0U7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tTdXBwb3J0ZWRNb2RlKG1vZGUpOworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhZGRpbmcoU3RyaW5nIHBhZGRpbmdTdHIpIHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhZGRpbmdTdHJVcHBlciA9IHBhZGRpbmdTdHIudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgZmluYWwgUGFkZGluZyBwYWRkaW5nOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFkZGluZyA9IFBhZGRpbmcudmFsdWVPZihwYWRkaW5nU3RyVXBwZXIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiBuZXdFID0gbmV3IE5vU3VjaFBhZGRpbmdFeGNlcHRpb24oIk5vIHN1Y2ggcGFkZGluZzogIgorICAgICAgICAgICAgICAgICAgICArIHBhZGRpbmdTdHIpOworICAgICAgICAgICAgbmV3RS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXdFOworICAgICAgICB9CisgICAgICAgIGNoZWNrU3VwcG9ydGVkUGFkZGluZyhwYWRkaW5nKTsKKyAgICAgICAgdGhpcy5wYWRkaW5nID0gcGFkZGluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiBvdXRwdXQgaWYge0Bjb2RlIGRvRmluYWwoKX0gaXMgY2FsbGVkIHdpdGggdGhpcworICAgICAqIHtAY29kZSBpbnB1dExlbn0uIElmIHBhZGRpbmcgaXMgZW5hYmxlZCBhbmQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHB1dHMgaXQKKyAgICAgKiByaWdodCBhdCB0aGUgYmxvY2sgc2l6ZSwgaXQgd2lsbCBhZGQgYW5vdGhlciBibG9jayBmb3IgdGhlIHBhZGRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0T3V0cHV0U2l6ZShpbnQgaW5wdXRMZW4pIHsKKyAgICAgICAgaWYgKG1vZGVCbG9ja1NpemUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0TGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IGJ1ZmZlcmVkID0gTmF0aXZlQ3J5cHRvLmdldF9FVlBfQ0lQSEVSX0NUWF9idWZfbGVuKGNpcGhlckN0eC5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT0gUGFkZGluZy5OT1BBRERJTkcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyZWQgKyBpbnB1dExlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRvdGFsTGVuID0gaW5wdXRMZW4gKyBidWZmZXJlZCArIG1vZGVCbG9ja1NpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsTGVuIC0gKHRvdGFsTGVuICUgbW9kZUJsb2NrU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoaW50IGlucHV0TGVuKSB7CisgICAgICAgIHJldHVybiBnZXRPdXRwdXRTaXplKGlucHV0TGVuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldElWKCkgeworICAgICAgICByZXR1cm4gaXY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZ2luZUluaXRJbnRlcm5hbChpbnQgb3Btb2RlLCBLZXkga2V5LCBieXRlW10gaXYpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLCBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9wbW9kZSA9PSBDaXBoZXIuRU5DUllQVF9NT0RFIHx8IG9wbW9kZSA9PSBDaXBoZXIuV1JBUF9NT0RFKSB7CisgICAgICAgICAgICBlbmNyeXB0aW5nID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChvcG1vZGUgPT0gQ2lwaGVyLkRFQ1JZUFRfTU9ERSB8fCBvcG1vZGUgPT0gQ2lwaGVyLlVOV1JBUF9NT0RFKSB7CisgICAgICAgICAgICBlbmNyeXB0aW5nID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgb3Btb2RlICIgKyBvcG1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgU2VjcmV0S2V5KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIk9ubHkgU2VjcmV0S2V5IGlzIHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGVuY29kZWRLZXkgPSBrZXkuZ2V0RW5jb2RlZCgpOworICAgICAgICBpZiAoZW5jb2RlZEtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigia2V5LmdldEVuY29kZWQoKSA9PSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBjaGVja1N1cHBvcnRlZEtleVNpemUoZW5jb2RlZEtleS5sZW5ndGgpOworCisgICAgICAgIGZpbmFsIGxvbmcgY2lwaGVyVHlwZSA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2NpcGhlcmJ5bmFtZShnZXRDaXBoZXJOYW1lKGVuY29kZWRLZXkubGVuZ3RoLAorICAgICAgICAgICAgICAgIG1vZGUpKTsKKyAgICAgICAgaWYgKGNpcGhlclR5cGUgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oIkNhbm5vdCBmaW5kIG5hbWUgZm9yIGtleSBsZW5ndGggPSAiCisgICAgICAgICAgICAgICAgICAgICsgKGVuY29kZWRLZXkubGVuZ3RoICogOCkgKyAiIGFuZCBtb2RlID0gIiArIG1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGl2TGVuZ3RoID0gTmF0aXZlQ3J5cHRvLkVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlclR5cGUpOworICAgICAgICBpZiAoaXYgPT0gbnVsbCkgeworICAgICAgICAgICAgaXYgPSBuZXcgYnl0ZVtpdkxlbmd0aF07CisgICAgICAgIH0gZWxzZSBpZiAoaXYubGVuZ3RoICE9IGl2TGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigiZXhwZWN0ZWQgSVYgbGVuZ3RoIG9mICIgKyBpdkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLml2ID0gaXY7CisKKyAgICAgICAgaWYgKHN1cHBvcnRzVmFyaWFibGVTaXplS2V5KCkpIHsKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ2lwaGVySW5pdF9leChjaXBoZXJDdHguZ2V0Q29udGV4dCgpLCBjaXBoZXJUeXBlLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW5nKTsKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChjaXBoZXJDdHguZ2V0Q29udGV4dCgpLCBlbmNvZGVkS2V5Lmxlbmd0aCk7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlckluaXRfZXgoY2lwaGVyQ3R4LmdldENvbnRleHQoKSwgMCwgZW5jb2RlZEtleSwgaXYsIGVuY3J5cHRpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9DaXBoZXJJbml0X2V4KGNpcGhlckN0eC5nZXRDb250ZXh0KCksIGNpcGhlclR5cGUsIGVuY29kZWRLZXksIGl2LAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE9wZW5TU0wgb25seSBzdXBwb3J0cyBQS0NTNSBQYWRkaW5nLgorICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoY2lwaGVyQ3R4LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nID09IFBhZGRpbmcuUEtDUzVQQURESU5HKTsKKyAgICAgICAgbW9kZUJsb2NrU2l6ZSA9IE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKGNpcGhlckN0eC5nZXRDb250ZXh0KCkpOworICAgICAgICBjYWxsZWRVcGRhdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KGludCBvcG1vZGUsIEtleSBrZXksIFNlY3VyZVJhbmRvbSByYW5kb20pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuZ2luZUluaXRJbnRlcm5hbChvcG1vZGUsIGtleSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KGludCBvcG1vZGUsIEtleSBrZXksIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLAorICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBieXRlW10gaXY7CisgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBJdlBhcmFtZXRlclNwZWMpIHsKKyAgICAgICAgICAgIEl2UGFyYW1ldGVyU3BlYyBpdlBhcmFtcyA9IChJdlBhcmFtZXRlclNwZWMpIHBhcmFtczsKKyAgICAgICAgICAgIGl2ID0gaXZQYXJhbXMuZ2V0SVYoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl2ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGVuZ2luZUluaXRJbnRlcm5hbChvcG1vZGUsIGtleSwgaXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IG9wbW9kZSwgS2V5IGtleSwgQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMsIFNlY3VyZVJhbmRvbSByYW5kb20pCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgc3BlYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNwZWMgPSBwYXJhbXMuZ2V0UGFyYW1ldGVyU3BlYyhJdlBhcmFtZXRlclNwZWMuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIGVuZ2luZUluaXQob3Btb2RlLCBrZXksIHNwZWMsIHJhbmRvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdXBkYXRlSW50ZXJuYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwgYnl0ZVtdIG91dHB1dCwKKyAgICAgICAgICAgIGludCBvdXRwdXRPZmZzZXQsIGludCBtYXhpbXVtTGVuKSB0aHJvd3MgU2hvcnRCdWZmZXJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgaW50aWFsT3V0cHV0T2Zmc2V0ID0gb3V0cHV0T2Zmc2V0OworCisgICAgICAgIGZpbmFsIGludCBieXRlc0xlZnQgPSBvdXRwdXQubGVuZ3RoIC0gb3V0cHV0T2Zmc2V0OworICAgICAgICBpZiAoYnl0ZXNMZWZ0IDwgbWF4aW11bUxlbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNob3J0QnVmZmVyRXhjZXB0aW9uKCJvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBkdXJpbmcgdXBkYXRlOiAiICsgYnl0ZXNMZWZ0CisgICAgICAgICAgICAgICAgICAgICsgIiA8ICIgKyBtYXhpbXVtTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dE9mZnNldCArPSBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlclVwZGF0ZShjaXBoZXJDdHguZ2V0Q29udGV4dCgpLCBvdXRwdXQsIG91dHB1dE9mZnNldCwKKyAgICAgICAgICAgICAgICBpbnB1dCwgaW5wdXRPZmZzZXQsIGlucHV0TGVuKTsKKworICAgICAgICBjYWxsZWRVcGRhdGUgPSB0cnVlOworCisgICAgICAgIHJldHVybiBvdXRwdXRPZmZzZXQgLSBpbnRpYWxPdXRwdXRPZmZzZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbikgeworICAgICAgICBmaW5hbCBpbnQgbWF4aW11bUxlbiA9IGdldE91dHB1dFNpemUoaW5wdXRMZW4pOworCisgICAgICAgIC8qIFNlZSBob3cgbGFyZ2Ugb3VyIG91dHB1dCBidWZmZXIgd291bGQgbmVlZCB0byBiZS4gKi8KKyAgICAgICAgZmluYWwgYnl0ZVtdIG91dHB1dDsKKyAgICAgICAgaWYgKG1heGltdW1MZW4gPiAwKSB7CisgICAgICAgICAgICBvdXRwdXQgPSBuZXcgYnl0ZVttYXhpbXVtTGVuXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dCA9IEVtcHR5QXJyYXkuQllURTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBieXRlc1dyaXR0ZW47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSB1cGRhdGVJbnRlcm5hbChpbnB1dCwgaW5wdXRPZmZzZXQsIGlucHV0TGVuLCBvdXRwdXQsIDAsIG1heGltdW1MZW4pOworICAgICAgICB9IGNhdGNoIChTaG9ydEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICovCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FsY3VsYXRlZCBidWZmZXIgc2l6ZSB3YXMgd3Jvbmc6ICIgKyBtYXhpbXVtTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID09IGJ5dGVzV3JpdHRlbikgeworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfSBlbHNlIGlmIChieXRlc1dyaXR0ZW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVtcHR5QXJyYXkuQllURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mUmFuZ2Uob3V0cHV0LCAwLCBieXRlc1dyaXR0ZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwgYnl0ZVtdIG91dHB1dCwKKyAgICAgICAgICAgIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBtYXhpbXVtTGVuID0gZ2V0T3V0cHV0U2l6ZShpbnB1dExlbik7CisgICAgICAgIHJldHVybiB1cGRhdGVJbnRlcm5hbChpbnB1dCwgaW5wdXRPZmZzZXQsIGlucHV0TGVuLCBvdXRwdXQsIG91dHB1dE9mZnNldCwgbWF4aW11bUxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhpcyBDaXBoZXIgaW5zdGFuY2Ugc3RhdGUgdG8gcHJvY2VzcyBhIG5ldyBjaHVuayBvZiBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9DaXBoZXJJbml0X2V4KGNpcGhlckN0eC5nZXRDb250ZXh0KCksIDAsIG51bGwsIG51bGwsIGVuY3J5cHRpbmcpOworICAgICAgICBjYWxsZWRVcGRhdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkb0ZpbmFsSW50ZXJuYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwgYnl0ZVtdIG91dHB1dCwKKyAgICAgICAgICAgIGludCBvdXRwdXRPZmZzZXQsIGludCBtYXhpbXVtTGVuKSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgICAgLyogUmVtZW1iZXIgdGhpcyBzbyB3ZSBjYW4gdGVsbCBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgd3JpdHRlbi4gKi8KKyAgICAgICAgZmluYWwgaW50IGluaXRpYWxPdXRwdXRPZmZzZXQgPSBvdXRwdXRPZmZzZXQ7CisKKyAgICAgICAgaWYgKGlucHV0TGVuID4gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHVwZGF0ZUJ5dGVzV3JpdHRlbiA9IHVwZGF0ZUludGVybmFsKGlucHV0LCBpbnB1dE9mZnNldCwgaW5wdXRMZW4sIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0T2Zmc2V0LCBtYXhpbXVtTGVuKTsKKyAgICAgICAgICAgIG91dHB1dE9mZnNldCArPSB1cGRhdGVCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICBtYXhpbXVtTGVuIC09IHVwZGF0ZUJ5dGVzV3JpdHRlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHdlJ3JlIGRlY3J5cHRpbmcgYW5kIGhhdmVuJ3QgaGFkIGFueSBpbnB1dCwgd2Ugc2hvdWxkIHJldHVybiBudWxsLgorICAgICAgICAgKiBPdGhlcndpc2UgT3BlblNTTCB3aWxsIGNvbXBsYWluIGlmIHdlIGNhbGwgZmluYWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIWVuY3J5cHRpbmcgJiYgIWNhbGxlZFVwZGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBBbGxvdyBPcGVuU1NMIHRvIHBhZCBpZiBuZWNlc3NhcnkgYW5kIGNsZWFuIHVwIHN0YXRlLiAqLworICAgICAgICBmaW5hbCBpbnQgYnl0ZXNMZWZ0ID0gb3V0cHV0Lmxlbmd0aCAtIG91dHB1dE9mZnNldDsKKyAgICAgICAgZmluYWwgaW50IHdyaXR0ZW5CeXRlczsKKyAgICAgICAgaWYgKGJ5dGVzTGVmdCA+PSBtYXhpbXVtTGVuKSB7CisgICAgICAgICAgICB3cml0dGVuQnl0ZXMgPSBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlckZpbmFsX2V4KGNpcGhlckN0eC5nZXRDb250ZXh0KCksIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0T2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBsYXN0QmxvY2sgPSBuZXcgYnl0ZVttYXhpbXVtTGVuXTsKKyAgICAgICAgICAgIHdyaXR0ZW5CeXRlcyA9IE5hdGl2ZUNyeXB0by5FVlBfQ2lwaGVyRmluYWxfZXgoY2lwaGVyQ3R4LmdldENvbnRleHQoKSwgbGFzdEJsb2NrLCAwKTsKKyAgICAgICAgICAgIGlmICh3cml0dGVuQnl0ZXMgPiBieXRlc0xlZnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2hvcnRCdWZmZXJFeGNlcHRpb24oImJ1ZmZlciBpcyB0b28gc2hvcnQ6ICIgKyB3cml0dGVuQnl0ZXMgKyAiID4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBieXRlc0xlZnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3cml0dGVuQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsYXN0QmxvY2ssIDAsIG91dHB1dCwgb3V0cHV0T2Zmc2V0LCB3cml0dGVuQnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dHB1dE9mZnNldCArPSB3cml0dGVuQnl0ZXM7CisKKyAgICAgICAgcmVzZXQoKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0T2Zmc2V0IC0gaW5pdGlhbE91dHB1dE9mZnNldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbikKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLCBCYWRQYWRkaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogT3RoZXIgaW1wbGVtZW50YXRpb25zIHJldHVybiBudWxsIGlmIHdlJ3ZlIG5ldmVyIGNhbGxlZCB1cGRhdGUoKQorICAgICAgICAgKiB3aGlsZSBkZWNyeXB0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFlbmNyeXB0aW5nICYmICFjYWxsZWRVcGRhdGUgJiYgaW5wdXRMZW4gPT0gMCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IG1heGltdW1MZW4gPSBnZXRPdXRwdXRTaXplKGlucHV0TGVuKTsKKyAgICAgICAgLyogQXNzdW1lIHRoYXQgd2UnbGwgb3V0cHV0IGV4YWN0bHkgb24gYSBieXRlIGJvdW5kYXJ5LiAqLworICAgICAgICBmaW5hbCBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbbWF4aW11bUxlbl07CisgICAgICAgIGZpbmFsIGludCBieXRlc1dyaXR0ZW47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBkb0ZpbmFsSW50ZXJuYWwoaW5wdXQsIGlucHV0T2Zmc2V0LCBpbnB1dExlbiwgb3V0cHV0LCAwLCBtYXhpbXVtTGVuKTsKKyAgICAgICAgfSBjYXRjaCAoU2hvcnRCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSBzaXplZCBvdXIgb3duIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvdXIgY2FsY3VsYXRlZCBidWZmZXIgd2FzIHRvbyBzbWFsbCIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzV3JpdHRlbiA9PSBvdXRwdXQubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzV3JpdHRlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRW1wdHlBcnJheS5CWVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShvdXRwdXQsIDAsIGJ5dGVzV3JpdHRlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoYnl0ZVtdIGlucHV0LCBpbnQgaW5wdXRPZmZzZXQsIGludCBpbnB1dExlbiwgYnl0ZVtdIG91dHB1dCwKKyAgICAgICAgICAgIGludCBvdXRwdXRPZmZzZXQpIHRocm93cyBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24geworICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0cHV0ID09IG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBtYXhpbXVtTGVuID0gZ2V0T3V0cHV0U2l6ZShpbnB1dExlbik7CisgICAgICAgIHJldHVybiBkb0ZpbmFsSW50ZXJuYWwoaW5wdXQsIGlucHV0T2Zmc2V0LCBpbnB1dExlbiwgb3V0cHV0LCBvdXRwdXRPZmZzZXQsIG1heGltdW1MZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZW5naW5lV3JhcChLZXkga2V5KSB0aHJvd3MgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gZW5jb2RlZCA9IGtleS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICByZXR1cm4gZW5naW5lRG9GaW5hbChlbmNvZGVkLCAwLCBlbmNvZGVkLmxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKEJhZFBhZGRpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBuZXdFID0gbmV3IElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIG5ld0UuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3RTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBLZXkgZW5naW5lVW53cmFwKGJ5dGVbXSB3cmFwcGVkS2V5LCBTdHJpbmcgd3JhcHBlZEtleUFsZ29yaXRobSwgaW50IHdyYXBwZWRLZXlUeXBlKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gZW5jb2RlZCA9IGVuZ2luZURvRmluYWwod3JhcHBlZEtleSwgMCwgd3JhcHBlZEtleS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHdyYXBwZWRLZXlUeXBlID09IENpcGhlci5QVUJMSUNfS0VZKSB7CisgICAgICAgICAgICAgICAgS2V5RmFjdG9yeSBrZXlGYWN0b3J5ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSh3cmFwcGVkS2V5QWxnb3JpdGhtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5RmFjdG9yeS5nZW5lcmF0ZVB1YmxpYyhuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGVuY29kZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod3JhcHBlZEtleVR5cGUgPT0gQ2lwaGVyLlBSSVZBVEVfS0VZKSB7CisgICAgICAgICAgICAgICAgS2V5RmFjdG9yeSBrZXlGYWN0b3J5ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSh3cmFwcGVkS2V5QWxnb3JpdGhtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5RmFjdG9yeS5nZW5lcmF0ZVByaXZhdGUobmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoZW5jb2RlZCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkS2V5VHlwZSA9PSBDaXBoZXIuU0VDUkVUX0tFWSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VjcmV0S2V5U3BlYyhlbmNvZGVkLCB3cmFwcGVkS2V5QWxnb3JpdGhtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ3cmFwcGVkS2V5VHlwZSA9PSAiICsgd3JhcHBlZEtleVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChCYWRQYWRkaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQUVTIGV4dGVuZHMgT3BlblNTTENpcGhlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRVNfQkxPQ0tfU0laRSA9IDE2OworCisgICAgICAgIHByb3RlY3RlZCBBRVMoTW9kZSBtb2RlLCBQYWRkaW5nIHBhZGRpbmcpIHsKKyAgICAgICAgICAgIHN1cGVyKG1vZGUsIHBhZGRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDQkMgZXh0ZW5kcyBBRVMgeworICAgICAgICAgICAgcHVibGljIENCQyhQYWRkaW5nIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihNb2RlLkNCQywgcGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9QYWRkaW5nIGV4dGVuZHMgQ0JDIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgTm9QYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLk5PUEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBLQ1M1UGFkZGluZyBleHRlbmRzIENCQyB7CisgICAgICAgICAgICAgICAgcHVibGljIFBLQ1M1UGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5QS0NTNVBBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ0ZCIGV4dGVuZHMgQUVTIHsKKyAgICAgICAgICAgIHB1YmxpYyBDRkIoUGFkZGluZyBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoTW9kZS5DRkIsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUGFkZGluZyBleHRlbmRzIENGQiB7CisgICAgICAgICAgICAgICAgcHVibGljIE5vUGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5OT1BBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQS0NTNVBhZGRpbmcgZXh0ZW5kcyBDRkIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBQS0NTNVBhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuUEtDUzVQQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENUUiBleHRlbmRzIEFFUyB7CisgICAgICAgICAgICBwdWJsaWMgQ1RSKFBhZGRpbmcgcGFkZGluZykgeworICAgICAgICAgICAgICAgIHN1cGVyKE1vZGUuQ1RSLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1BhZGRpbmcgZXh0ZW5kcyBDVFIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBOb1BhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuTk9QQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUEtDUzVQYWRkaW5nIGV4dGVuZHMgQ1RSIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgUEtDUzVQYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLlBLQ1M1UEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFQ0IgZXh0ZW5kcyBBRVMgeworICAgICAgICAgICAgcHVibGljIEVDQihQYWRkaW5nIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihNb2RlLkVDQiwgcGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9QYWRkaW5nIGV4dGVuZHMgRUNCIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgTm9QYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLk5PUEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBLQ1M1UGFkZGluZyBleHRlbmRzIEVDQiB7CisgICAgICAgICAgICAgICAgcHVibGljIFBLQ1M1UGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5QS0NTNVBBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT0ZCIGV4dGVuZHMgQUVTIHsKKyAgICAgICAgICAgIHB1YmxpYyBPRkIoUGFkZGluZyBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoTW9kZS5PRkIsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUGFkZGluZyBleHRlbmRzIE9GQiB7CisgICAgICAgICAgICAgICAgcHVibGljIE5vUGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5OT1BBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQS0NTNVBhZGRpbmcgZXh0ZW5kcyBPRkIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBQS0NTNVBhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuUEtDUzVQQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdXBwb3J0ZWRLZXlTaXplKGludCBrZXlMZW5ndGgpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxNjogLy8gQUVTIDEyOAorICAgICAgICAgICAgICAgIGNhc2UgMjQ6IC8vIEFFUyAxOTIKKyAgICAgICAgICAgICAgICBjYXNlIDMyOiAvLyBBRVMgMjU2CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQga2V5IHNpemU6ICIgKyBrZXlMZW5ndGggKyAiIGJ5dGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdXBwb3J0ZWRNb2RlKE1vZGUgbW9kZSkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENCQzoKKyAgICAgICAgICAgICAgICBjYXNlIENGQjoKKyAgICAgICAgICAgICAgICBjYXNlIENGQjE6CisgICAgICAgICAgICAgICAgY2FzZSBDRkI4OgorICAgICAgICAgICAgICAgIGNhc2UgQ0ZCMTI4OgorICAgICAgICAgICAgICAgIGNhc2UgQ1RSOgorICAgICAgICAgICAgICAgIGNhc2UgRUNCOgorICAgICAgICAgICAgICAgIGNhc2UgT0ZCOgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgbW9kZSAiICsgbW9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1cHBvcnRlZFBhZGRpbmcoUGFkZGluZyBwYWRkaW5nKSB0aHJvd3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PUEFERElORzoKKyAgICAgICAgICAgICAgICBjYXNlIFBLQ1M1UEFERElORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBwYWRkaW5nICIgKyBwYWRkaW5nLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2lwaGVyTmFtZShpbnQga2V5TGVuZ3RoLCBNb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiYWVzLSIgKyAoa2V5TGVuZ3RoICogOCkgKyAiLSIgKyBtb2RlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldENpcGhlckJsb2NrU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBRVNfQkxPQ0tfU0laRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgREVTRURFIGV4dGVuZHMgT3BlblNTTENpcGhlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBERVNfQkxPQ0tfU0laRSA9IDg7CisKKyAgICAgICAgcHVibGljIERFU0VERShNb2RlIG1vZGUsIFBhZGRpbmcgcGFkZGluZykgeworICAgICAgICAgICAgc3VwZXIobW9kZSwgcGFkZGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENCQyBleHRlbmRzIERFU0VERSB7CisgICAgICAgICAgICBwdWJsaWMgQ0JDKFBhZGRpbmcgcGFkZGluZykgeworICAgICAgICAgICAgICAgIHN1cGVyKE1vZGUuQ0JDLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1BhZGRpbmcgZXh0ZW5kcyBDQkMgeworICAgICAgICAgICAgICAgIHB1YmxpYyBOb1BhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuTk9QQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUEtDUzVQYWRkaW5nIGV4dGVuZHMgQ0JDIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgUEtDUzVQYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLlBLQ1M1UEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDRkIgZXh0ZW5kcyBERVNFREUgeworICAgICAgICAgICAgcHVibGljIENGQihQYWRkaW5nIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihNb2RlLkNGQiwgcGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9QYWRkaW5nIGV4dGVuZHMgQ0ZCIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgTm9QYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLk5PUEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBLQ1M1UGFkZGluZyBleHRlbmRzIENGQiB7CisgICAgICAgICAgICAgICAgcHVibGljIFBLQ1M1UGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5QS0NTNVBBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRUNCIGV4dGVuZHMgREVTRURFIHsKKyAgICAgICAgICAgIHB1YmxpYyBFQ0IoUGFkZGluZyBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoTW9kZS5FQ0IsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUGFkZGluZyBleHRlbmRzIEVDQiB7CisgICAgICAgICAgICAgICAgcHVibGljIE5vUGFkZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoUGFkZGluZy5OT1BBRERJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQS0NTNVBhZGRpbmcgZXh0ZW5kcyBFQ0IgeworICAgICAgICAgICAgICAgIHB1YmxpYyBQS0NTNVBhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuUEtDUzVQQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9GQiBleHRlbmRzIERFU0VERSB7CisgICAgICAgICAgICBwdWJsaWMgT0ZCKFBhZGRpbmcgcGFkZGluZykgeworICAgICAgICAgICAgICAgIHN1cGVyKE1vZGUuT0ZCLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1BhZGRpbmcgZXh0ZW5kcyBPRkIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBOb1BhZGRpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFBhZGRpbmcuTk9QQURESU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUEtDUzVQYWRkaW5nIGV4dGVuZHMgT0ZCIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgUEtDUzVQYWRkaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBzdXBlcihQYWRkaW5nLlBLQ1M1UEFERElORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2lwaGVyTmFtZShpbnQga2V5U2l6ZSwgTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZUNpcGhlck5hbWU7CisgICAgICAgICAgICBpZiAoa2V5U2l6ZSA9PSAxNikgeworICAgICAgICAgICAgICAgIGJhc2VDaXBoZXJOYW1lID0gImRlcy1lZGUiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlQ2lwaGVyTmFtZSA9ICJkZXMtZWRlMyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1vZGUuRUNCKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VDaXBoZXJOYW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUNpcGhlck5hbWUgKyAiLSIgKyBtb2RlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1cHBvcnRlZEtleVNpemUoaW50IGtleVNpemUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChrZXlTaXplICE9IDE2ICYmIGtleVNpemUgIT0gMjQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigia2V5IHNpemUgbXVzdCBiZSAxMjggb3IgMTkyIGJpdHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1cHBvcnRlZE1vZGUoTW9kZSBtb2RlKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ0JDOgorICAgICAgICAgICAgICAgIGNhc2UgQ0ZCOgorICAgICAgICAgICAgICAgIGNhc2UgQ0ZCMToKKyAgICAgICAgICAgICAgICBjYXNlIENGQjg6CisgICAgICAgICAgICAgICAgY2FzZSBFQ0I6CisgICAgICAgICAgICAgICAgY2FzZSBPRkI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBtb2RlICIgKyBtb2RlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3VwcG9ydGVkUGFkZGluZyhQYWRkaW5nIHBhZGRpbmcpIHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN3aXRjaCAocGFkZGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgTk9QQURESU5HOgorICAgICAgICAgICAgICAgIGNhc2UgUEtDUzVQQURESU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaFBhZGRpbmdFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHBhZGRpbmcgIiArIHBhZGRpbmcudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBnZXRDaXBoZXJCbG9ja1NpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gREVTX0JMT0NLX1NJWkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFSQzQgZXh0ZW5kcyBPcGVuU1NMQ2lwaGVyIHsKKyAgICAgICAgcHVibGljIEFSQzQoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaXBoZXJOYW1lKGludCBrZXlTaXplLCBNb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiAicmM0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1cHBvcnRlZEtleVNpemUoaW50IGtleVNpemUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1N1cHBvcnRlZE1vZGUoTW9kZSBtb2RlKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oIkFSQzQgZG9lcyBub3Qgc3VwcG9ydCBtb2RlcyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3VwcG9ydGVkUGFkZGluZyhQYWRkaW5nIHBhZGRpbmcpIHRocm93cyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uKCJBUkM0IGRvZXMgbm90IHN1cHBvcnQgcGFkZGluZyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgZ2V0Q2lwaGVyQmxvY2tTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNWYXJpYWJsZVNpemVLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xDaXBoZXJDb250ZXh0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMQ2lwaGVyQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTkzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMQ2lwaGVyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2NsYXNzIE9wZW5TU0xDaXBoZXJDb250ZXh0IHsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGV4dDsKKworICAgIE9wZW5TU0xDaXBoZXJDb250ZXh0KGxvbmcgY3R4KSB7CisgICAgICAgIGlmIChjdHggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjdHggPT0gMCIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY3R4OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjb250ZXh0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb25nIGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FLZXlGYWN0b3J5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRFNBS2V5RmFjdG9yeS5qYXZhCmluZGV4IGUzZjZlZDUuLjJiZjZmNTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FLZXlGYWN0b3J5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERTQUtleUZhY3RvcnkuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIk11c3QgdXNlIERTQVB1YmxpY0tleVNwZWMgb3IgUEtDUzhFbmNvZGVkS2V5U3BlYzsgd2FzICIKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJNdXN0IHVzZSBEU0FQcml2YXRlS2V5U3BlYyBvciBQS0NTOEVuY29kZWRLZXlTcGVjOyB3YXMgIgogICAgICAgICAgICAgICAgICsga2V5U3BlYy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgfQogCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBEU0FQdWJsaWNLZXkpIHsKICAgICAgICAgICAgIERTQVB1YmxpY0tleSBkc2FLZXkgPSAoRFNBUHVibGljS2V5KSBrZXk7CiAKLSAgICAgICAgICAgIGlmIChEU0FQdWJsaWNLZXlTcGVjLmNsYXNzLmVxdWFscyhrZXlTcGVjKSkgeworICAgICAgICAgICAgaWYgKERTQVB1YmxpY0tleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgewogICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgeSA9IGRzYUtleS5nZXRZKCk7CiAKICAgICAgICAgICAgICAgICBEU0FQYXJhbXMgcGFyYW1zID0gZHNhS2V5LmdldFBhcmFtcygpOwpAQCAtOTksMTUgKzk5LDE2IEBACiAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBnID0gcGFyYW1zLmdldEcoKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IERTQVB1YmxpY0tleVNwZWMoeSwgcCwgcSwgZyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFBLQ1M4RW5jb2RlZEtleVNwZWMuY2xhc3MuZXF1YWxzKGtleVNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhrZXkuZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoWDUwOUVuY29kZWRLZXlTcGVjLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2V5U3BlYykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoa2V5LmdldEVuY29kZWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiTXVzdCBiZSBEU0FQdWJsaWNLZXlTcGVjIG9yIFBLQ1M4RW5jb2RlZEtleVNwZWMiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBEU0FQdWJsaWNLZXlTcGVjIG9yIFg1MDlFbmNvZGVkS2V5U3BlYzsgd2FzICIgKyBrZXlTcGVjLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoa2V5IGluc3RhbmNlb2YgRFNBUHJpdmF0ZUtleSkgewogICAgICAgICAgICAgRFNBUHJpdmF0ZUtleSBkc2FLZXkgPSAoRFNBUHJpdmF0ZUtleSkga2V5OwogCi0gICAgICAgICAgICBpZiAoRFNBUHJpdmF0ZUtleVNwZWMuY2xhc3MuZXF1YWxzKGtleVNwZWMpKSB7CisgICAgICAgICAgICBpZiAoRFNBUHJpdmF0ZUtleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgewogICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgeCA9IGRzYUtleS5nZXRYKCk7CiAKICAgICAgICAgICAgICAgICBEU0FQYXJhbXMgcGFyYW1zID0gZHNhS2V5LmdldFBhcmFtcygpOwpAQCAtMTE2LDEzICsxMTcsMTYgQEAKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGcgPSBwYXJhbXMuZ2V0RygpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgRFNBUHJpdmF0ZUtleVNwZWMoeCwgcCwgcSwgZyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzcy5lcXVhbHMoa2V5U3BlYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZHNhS2V5LmdldEVuY29kZWQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFBLQ1M4RW5jb2RlZEtleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoZHNhS2V5LmdldEVuY29kZWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiTXVzdCBiZSBEU0FQcml2YXRlS2V5U3BlYyBvciBYNTA5RW5jb2RlZEtleVNwZWMiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBEU0FQcml2YXRlS2V5U3BlYyBvciBQS0NTOEVuY29kZWRLZXlTcGVjOyB3YXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleVNwZWMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbigiTXVzdCBiZSBEU0FQdWJsaWNLZXkgb3IgRFNBUHJpdmF0ZUtleSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJNdXN0IGJlIERTQVB1YmxpY0tleSBvciBEU0FQcml2YXRlS2V5OyB3YXMgIgorICAgICAgICAgICAgICAgICAgICArIGtleS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1OCwxMiArMTYyLDEzIEBACiAgICAgICAgICAgICBCaWdJbnRlZ2VyIGcgPSBwYXJhbXMuZ2V0RygpOwogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmVHZW5lcmF0ZVB1YmxpYyhuZXcgRFNBUHJpdmF0ZUtleVNwZWMoeCwgcCwgcSwgZykpOworICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmVHZW5lcmF0ZVByaXZhdGUobmV3IERTQVByaXZhdGVLZXlTcGVjKHgsIHAsIHEsIGcpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJLZXkgaXMgbm90IERTQVB1YmxpY0tleSBvciBEU0FQcml2YXRlS2V5Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiS2V5IG11c3QgYmUgRFNBUHVibGljS2V5IG9yIERTQVByaXZhdGVLZXk7IHdhcyAiCisgICAgICAgICAgICAgICAgICAgICsga2V5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQYXJhbXMuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQYXJhbXMuamF2YQppbmRleCAwOGFlYmYwLi5kZjk5NjhiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRFNBUGFyYW1zLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERTQVBhcmFtcy5qYXZhCkBAIC01MCw5ICs1MCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgYnl0ZVtdW10gcGFyYW1zID0gTmF0aXZlQ3J5cHRvLmdldF9EU0FfcGFyYW1zKGtleS5nZXRQa2V5Q29udGV4dCgpKTsKLSAgICAgICAgZyA9IG5ldyBCaWdJbnRlZ2VyKHBhcmFtc1swXSk7Ci0gICAgICAgIHAgPSBuZXcgQmlnSW50ZWdlcihwYXJhbXNbMV0pOwotICAgICAgICBxID0gbmV3IEJpZ0ludGVnZXIocGFyYW1zWzJdKTsKKyAgICAgICAgaWYgKHBhcmFtc1swXSAhPSBudWxsKSB7CisgICAgICAgICAgICBnID0gbmV3IEJpZ0ludGVnZXIocGFyYW1zWzBdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zWzFdICE9IG51bGwpIHsKKyAgICAgICAgICAgIHAgPSBuZXcgQmlnSW50ZWdlcihwYXJhbXNbMV0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXNbMl0gIT0gbnVsbCkgeworICAgICAgICAgICAgcSA9IG5ldyBCaWdJbnRlZ2VyKHBhcmFtc1syXSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtc1szXSAhPSBudWxsKSB7CiAgICAgICAgICAgICB5ID0gbmV3IEJpZ0ludGVnZXIocGFyYW1zWzNdKTsKICAgICAgICAgfQpAQCAtODEsNiArODcsMTEgQEAKICAgICAgICAgcmV0dXJuIHE7CiAgICAgfQogCisgICAgYm9vbGVhbiBoYXNQYXJhbXMoKSB7CisgICAgICAgIGVuc3VyZVJlYWRQYXJhbXMoKTsKKyAgICAgICAgcmV0dXJuIChnICE9IG51bGwpICYmIChwICE9IG51bGwpICYmIChxICE9IG51bGwpOworICAgIH0KKwogICAgIEJpZ0ludGVnZXIgZ2V0WSgpIHsKICAgICAgICAgZW5zdXJlUmVhZFBhcmFtcygpOwogICAgICAgICByZXR1cm4geTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQcml2YXRlS2V5LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRFNBUHJpdmF0ZUtleS5qYXZhCmluZGV4IDc2MWIwOGUuLjZlY2Q2YWIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQcml2YXRlS2V5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERTQVByaXZhdGVLZXkuamF2YQpAQCAtMTYsNiArMTYsMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zOwpAQCAtMjMsMTggKzI3LDE5IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVByaXZhdGVLZXlTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKIAotcHVibGljIGNsYXNzIE9wZW5TU0xEU0FQcml2YXRlS2V5IGltcGxlbWVudHMgRFNBUHJpdmF0ZUtleSB7CitwdWJsaWMgY2xhc3MgT3BlblNTTERTQVByaXZhdGVLZXkgaW1wbGVtZW50cyBEU0FQcml2YXRlS2V5LCBPcGVuU1NMS2V5SG9sZGVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTI0NzM0NTc2MTg3NDI0NjI4TDsKIAotICAgIHByaXZhdGUgZmluYWwgT3BlblNTTEtleSBrZXk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT3BlblNTTEtleSBrZXk7CiAKLSAgICBwcml2YXRlIE9wZW5TU0xEU0FQYXJhbXMgcGFyYW1zOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZW5TU0xEU0FQYXJhbXMgcGFyYW1zOwogCiAgICAgT3BlblNTTERTQVByaXZhdGVLZXkoT3BlblNTTEtleSBrZXkpIHsKICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgfQogCi0gICAgT3BlblNTTEtleSBnZXRPcGVuU1NMS2V5KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcGVuU1NMS2V5IGdldE9wZW5TU0xLZXkoKSB7CiAgICAgICAgIHJldHVybiBrZXk7CiAgICAgfQogCkBAIC0xMTYsMTQgKzEyMSw2IEBACiAgICAgICAgIHJldHVybiBwYXJhbXMuZ2V0WCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0UGtleUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBrZXkuZ2V0UGtleUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBrZXlBbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIGtleS5nZXRBbGlhcygpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICBpZiAobyA9PSB0aGlzKSB7CkBAIC0yMDAsNCArMTk3LDMzIEBACiAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIGcgPSAoQmlnSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBwID0gKEJpZ0ludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgcSA9IChCaWdJbnRlZ2VyKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIHggPSAoQmlnSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKTsKKworICAgICAgICBrZXkgPSBuZXcgT3BlblNTTEtleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfbmV3X0RTQSgKKyAgICAgICAgICAgICAgICBwLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgcS50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIGcudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIHgudG9CeXRlQXJyYXkoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0T3BlblNTTEtleSgpLmlzRW5naW5lQmFzZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbigiZW5naW5lLWJhc2VkIGtleXMgY2FuIG5vdCBiZSBzZXJpYWxpemVkIik7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOworCisgICAgICAgIGVuc3VyZVJlYWRQYXJhbXMoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHBhcmFtcy5nZXRHKCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QocGFyYW1zLmdldFAoKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChwYXJhbXMuZ2V0USgpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHBhcmFtcy5nZXRYKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQdWJsaWNLZXkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xEU0FQdWJsaWNLZXkuamF2YQppbmRleCAyNTg2OWJiLi5iZTlmZjgzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRFNBUHVibGljS2V5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERTQVB1YmxpY0tleS5qYXZhCkBAIC0xNiw2ICsxNiwxMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXM7CkBAIC0yMywxOCArMjcsMTkgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHVibGljS2V5U3BlYzsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CiAKLXB1YmxpYyBjbGFzcyBPcGVuU1NMRFNBUHVibGljS2V5IGltcGxlbWVudHMgRFNBUHVibGljS2V5IHsKK3B1YmxpYyBjbGFzcyBPcGVuU1NMRFNBUHVibGljS2V5IGltcGxlbWVudHMgRFNBUHVibGljS2V5LCBPcGVuU1NMS2V5SG9sZGVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjM4NjA5NTAwMzUzNzkyMjMyTDsKIAotICAgIHByaXZhdGUgZmluYWwgT3BlblNTTEtleSBrZXk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT3BlblNTTEtleSBrZXk7CiAKLSAgICBwcml2YXRlIE9wZW5TU0xEU0FQYXJhbXMgcGFyYW1zOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZW5TU0xEU0FQYXJhbXMgcGFyYW1zOwogCiAgICAgT3BlblNTTERTQVB1YmxpY0tleShPcGVuU1NMS2V5IGtleSkgewogICAgICAgICB0aGlzLmtleSA9IGtleTsKICAgICB9CiAKLSAgICBPcGVuU1NMS2V5IGdldE9wZW5TU0xLZXkoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wZW5TU0xLZXkgZ2V0T3BlblNTTEtleSgpIHsKICAgICAgICAgcmV0dXJuIGtleTsKICAgICB9CiAKQEAgLTc0LDYgKzc5LDE1IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERTQVBhcmFtcyBnZXRQYXJhbXMoKSB7CiAgICAgICAgIGVuc3VyZVJlYWRQYXJhbXMoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBEU0Ega2V5cyBjYW4gbGFjayBwYXJhbWV0ZXJzIGlmIHRoZXkncmUgcGFydCBvZiBhIGNlcnRpZmljYXRlCisgICAgICAgICAqIGNoYWluLiBJbiB0aGlzIGNhc2UsIHdlIGp1c3QgcmV0dXJuIG51bGwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXBhcmFtcy5oYXNQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgIH0KIApAQCAtMTQ3LDQgKzE2MSwzMyBAQAogCiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBnID0gKEJpZ0ludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgcCA9IChCaWdJbnRlZ2VyKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIHEgPSAoQmlnSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciB5ID0gKEJpZ0ludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisKKyAgICAgICAga2V5ID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX25ld19EU0EoCisgICAgICAgICAgICAgICAgcC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHEudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBnLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgeS50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIG51bGwpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldE9wZW5TU0xLZXkoKS5pc0VuZ2luZUJhc2VkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oImVuZ2luZS1iYXNlZCBrZXlzIGNhbiBub3QgYmUgc2VyaWFsaXplZCIpOworICAgICAgICB9CisgICAgICAgIHN0cmVhbS5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKworICAgICAgICBlbnN1cmVSZWFkUGFyYW1zKCk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChwYXJhbXMuZ2V0RygpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHBhcmFtcy5nZXRQKCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QocGFyYW1zLmdldFEoKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChwYXJhbXMuZ2V0WSgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRGlnZXN0Q29udGV4dC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERpZ2VzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JkMWEwCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTERpZ2VzdENvbnRleHQuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitwdWJsaWMgY2xhc3MgT3BlblNTTERpZ2VzdENvbnRleHQgeworICAgIHByaXZhdGUgZmluYWwgbG9uZyBjb250ZXh0OworCisgICAgcHVibGljIE9wZW5TU0xEaWdlc3RDb250ZXh0KGxvbmcgY3R4KSB7CisgICAgICAgIGlmIChjdHggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjdHggPT0gMCIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY3R4OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX01EX0NUWF9kZXN0cm95KGNvbnRleHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxvbmcgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDR3JvdXBDb250ZXh0LmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNHcm91cENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzNjZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDR3JvdXBDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRjJtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRnA7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRWxsaXB0aWNDdXJ2ZTsKKworcHVibGljIGZpbmFsIGNsYXNzIE9wZW5TU0xFQ0dyb3VwQ29udGV4dCB7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGdyb3VwQ3R4OworCisgICAgcHVibGljIE9wZW5TU0xFQ0dyb3VwQ29udGV4dChsb25nIGdyb3VwQ3R4KSB7CisgICAgICAgIHRoaXMuZ3JvdXBDdHggPSBncm91cEN0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBnZXRDdXJ2ZUJ5TmFtZShTdHJpbmcgY3VydmVOYW1lKSB7CisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE9wZW5TU0wgbm90IHN1cHBvcnRpbmcgU0VDRyBuYW1lcyBmb3IgTklTVCBQLTE5MiBhbmQgUC0yNTYKKyAgICAgICAgLy8gKGFrYSBBTlNJIFg5LjYyIHByaW1lMTkydjEgYW5kIHByaW1lMjU2djEpIGN1cnZlIG5hbWVzLgorICAgICAgICBpZiAoInNlY3AyNTZyMSIuZXF1YWxzKGN1cnZlTmFtZSkpIHsKKyAgICAgICAgICAgIGN1cnZlTmFtZSA9ICJwcmltZTI1NnYxIjsKKyAgICAgICAgfSBlbHNlIGlmICgic2VjcDE5MnIxIi5lcXVhbHMoY3VydmVOYW1lKSkgeworICAgICAgICAgICAgY3VydmVOYW1lID0gInByaW1lMTkydjEiOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBjdHggPSBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoY3VydmVOYW1lKTsKKyAgICAgICAgaWYgKGN0eCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKGN0eCwKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpOworICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyhjdHgsIE5hdGl2ZUNyeXB0by5PUEVOU1NMX0VDX05BTUVEX0NVUlZFKTsKKworICAgICAgICByZXR1cm4gbmV3IE9wZW5TU0xFQ0dyb3VwQ29udGV4dChjdHgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdldEluc3RhbmNlKGludCB0eXBlLCBCaWdJbnRlZ2VyIHAsIEJpZ0ludGVnZXIgYSwKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgYiwgQmlnSW50ZWdlciB4LCBCaWdJbnRlZ2VyIHksIEJpZ0ludGVnZXIgbiwgQmlnSW50ZWdlciBoKSB7CisgICAgICAgIGZpbmFsIGxvbmcgY3R4ID0gTmF0aXZlQ3J5cHRvLkVDX0dST1VQX25ld19jdXJ2ZSh0eXBlLCBwLnRvQnl0ZUFycmF5KCksIGEudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBiLnRvQnl0ZUFycmF5KCkpOworICAgICAgICBpZiAoY3R4ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oY3R4LAorICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5QT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCk7CisKKyAgICAgICAgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdyb3VwID0gbmV3IE9wZW5TU0xFQ0dyb3VwQ29udGV4dChjdHgpOworCisgICAgICAgIE9wZW5TU0xFQ1BvaW50Q29udGV4dCBnZW5lcmF0b3IgPSBuZXcgT3BlblNTTEVDUG9pbnRDb250ZXh0KGdyb3VwLAorICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19QT0lOVF9uZXcoY3R4KSk7CisKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXMoY3R4LCBnZW5lcmF0b3IuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIHgudG9CeXRlQXJyYXkoKSwgeS50b0J5dGVBcnJheSgpKTsKKworICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfc2V0X2dlbmVyYXRvcihjdHgsIGdlbmVyYXRvci5nZXRDb250ZXh0KCksIG4udG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBoLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgIHJldHVybiBncm91cDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGdyb3VwQ3R4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfY2xlYXJfZnJlZShncm91cEN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBPcGVuU1NMRUNHcm91cENvbnRleHQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPcGVuU1NMRUNHcm91cENvbnRleHQgb3RoZXIgPSAoT3BlblNTTEVDR3JvdXBDb250ZXh0KSBvOworICAgICAgICByZXR1cm4gTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2NtcChncm91cEN0eCwgb3RoZXIuZ3JvdXBDdHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwQ3R4OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdldEluc3RhbmNlKEVDUGFyYW1ldGVyU3BlYyBwYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjdXJ2ZU5hbWUgPSBwYXJhbXMuZ2V0Q3VydmVOYW1lKCk7CisgICAgICAgIGlmIChjdXJ2ZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIE9wZW5TU0xFQ0dyb3VwQ29udGV4dC5nZXRDdXJ2ZUJ5TmFtZShjdXJ2ZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRWxsaXB0aWNDdXJ2ZSBjdXJ2ZSA9IHBhcmFtcy5nZXRDdXJ2ZSgpOworICAgICAgICBmaW5hbCBFQ0ZpZWxkIGZpZWxkID0gY3VydmUuZ2V0RmllbGQoKTsKKworICAgICAgICBmaW5hbCBpbnQgdHlwZTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBwOworICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBFQ0ZpZWxkRnApIHsKKyAgICAgICAgICAgIHR5cGUgPSBOYXRpdmVDcnlwdG8uRUNfQ1VSVkVfR0ZQOworICAgICAgICAgICAgcCA9ICgoRUNGaWVsZEZwKSBmaWVsZCkuZ2V0UCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgRUNGaWVsZEYybSkgeworICAgICAgICAgICAgdHlwZSA9IE5hdGl2ZUNyeXB0by5FQ19DVVJWRV9HRjJNOworICAgICAgICAgICAgcCA9ICgoRUNGaWVsZEYybSkgZmllbGQpLmdldFJlZHVjdGlvblBvbHlub21pYWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKCJ1bmhhbmRsZWQgZmllbGQgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICArIGZpZWxkLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEVDUG9pbnQgZ2VuZXJhdG9yID0gcGFyYW1zLmdldEdlbmVyYXRvcigpOworICAgICAgICByZXR1cm4gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEluc3RhbmNlKHR5cGUsIHAsIGN1cnZlLmdldEEoKSwgY3VydmUuZ2V0QigpLAorICAgICAgICAgICAgICAgIGdlbmVyYXRvci5nZXRBZmZpbmVYKCksIGdlbmVyYXRvci5nZXRBZmZpbmVZKCksIHBhcmFtcy5nZXRPcmRlcigpLAorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihwYXJhbXMuZ2V0Q29mYWN0b3IoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBFQ1BhcmFtZXRlclNwZWMgZ2V0RUNQYXJhbWV0ZXJTcGVjKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY3VydmVOYW1lID0gTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwQ3R4KTsKKworICAgICAgICBmaW5hbCBieXRlW11bXSBjdXJ2ZVBhcmFtcyA9IE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9nZXRfY3VydmUoZ3JvdXBDdHgpOworICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIHAgPSBuZXcgQmlnSW50ZWdlcihjdXJ2ZVBhcmFtc1swXSk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgYSA9IG5ldyBCaWdJbnRlZ2VyKGN1cnZlUGFyYW1zWzFdKTsKKyAgICAgICAgZmluYWwgQmlnSW50ZWdlciBiID0gbmV3IEJpZ0ludGVnZXIoY3VydmVQYXJhbXNbMl0pOworCisgICAgICAgIGZpbmFsIEVDRmllbGQgZmllbGQ7CisgICAgICAgIGZpbmFsIGludCB0eXBlID0gTmF0aXZlQ3J5cHRvLmdldF9FQ19HUk9VUF90eXBlKGdyb3VwQ3R4KTsKKyAgICAgICAgaWYgKHR5cGUgPT0gTmF0aXZlQ3J5cHRvLkVDX0NVUlZFX0dGUCkgeworICAgICAgICAgICAgZmllbGQgPSBuZXcgRUNGaWVsZEZwKHApOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTmF0aXZlQ3J5cHRvLkVDX0NVUlZFX0dGMk0pIHsKKyAgICAgICAgICAgIGZpZWxkID0gbmV3IEVDRmllbGRGMm0ocC5iaXRMZW5ndGgoKSAtIDEsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVua25vd24gY3VydmUgdHlwZSAiICsgdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbGxpcHRpY0N1cnZlIGN1cnZlID0gbmV3IEVsbGlwdGljQ3VydmUoZmllbGQsIGEsIGIpOworCisgICAgICAgIGZpbmFsIE9wZW5TU0xFQ1BvaW50Q29udGV4dCBnZW5lcmF0b3JDdHggPSBuZXcgT3BlblNTTEVDUG9pbnRDb250ZXh0KHRoaXMsCisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2dldF9nZW5lcmF0b3IoZ3JvdXBDdHgpKTsKKyAgICAgICAgZmluYWwgRUNQb2ludCBnZW5lcmF0b3IgPSBnZW5lcmF0b3JDdHguZ2V0RUNQb2ludCgpOworCisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgb3JkZXIgPSBuZXcgQmlnSW50ZWdlcihOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwQ3R4KSk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgY29mYWN0b3IgPSBuZXcgQmlnSW50ZWdlcihOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKGdyb3VwQ3R4KSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBFQ1BhcmFtZXRlclNwZWMoY3VydmUsIGdlbmVyYXRvciwgb3JkZXIsIGNvZmFjdG9yLmludFZhbHVlKCksIGN1cnZlTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDS2V5RmFjdG9yeS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDS2V5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmVjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNLZXlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5U3BpOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1ByaXZhdGVLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1B1YmxpY0tleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5YNTA5RW5jb2RlZEtleVNwZWM7CisKK3B1YmxpYyBjbGFzcyBPcGVuU1NMRUNLZXlGYWN0b3J5IGV4dGVuZHMgS2V5RmFjdG9yeVNwaSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUHVibGljS2V5IGVuZ2luZUdlbmVyYXRlUHVibGljKEtleVNwZWMga2V5U3BlYykgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGtleVNwZWMgaW5zdGFuY2VvZiBFQ1B1YmxpY0tleVNwZWMpIHsKKyAgICAgICAgICAgIEVDUHVibGljS2V5U3BlYyBlY0tleVNwZWMgPSAoRUNQdWJsaWNLZXlTcGVjKSBrZXlTcGVjOworCisgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5TU0xFQ1B1YmxpY0tleShlY0tleVNwZWMpOworICAgICAgICB9IGVsc2UgaWYgKGtleVNwZWMgaW5zdGFuY2VvZiBYNTA5RW5jb2RlZEtleVNwZWMpIHsKKyAgICAgICAgICAgIFg1MDlFbmNvZGVkS2V5U3BlYyB4NTA5S2V5U3BlYyA9IChYNTA5RW5jb2RlZEtleVNwZWMpIGtleVNwZWM7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgT3BlblNTTEtleSBrZXkgPSBuZXcgT3BlblNTTEtleSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5kMmlfUFVCS0VZKHg1MDlLZXlTcGVjLmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEVDUHVibGljS2V5KGtleSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIk11c3QgdXNlIEVDUHVibGljS2V5U3BlYyBvciBYNTA5RW5jb2RlZEtleVNwZWM7IHdhcyAiCisgICAgICAgICAgICAgICAgKyBrZXlTcGVjLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUHJpdmF0ZUtleSBlbmdpbmVHZW5lcmF0ZVByaXZhdGUoS2V5U3BlYyBrZXlTcGVjKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgICAgICBpZiAoa2V5U3BlYyBpbnN0YW5jZW9mIEVDUHJpdmF0ZUtleVNwZWMpIHsKKyAgICAgICAgICAgIEVDUHJpdmF0ZUtleVNwZWMgZWNLZXlTcGVjID0gKEVDUHJpdmF0ZUtleVNwZWMpIGtleVNwZWM7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEVDUHJpdmF0ZUtleShlY0tleVNwZWMpOworICAgICAgICB9IGVsc2UgaWYgKGtleVNwZWMgaW5zdGFuY2VvZiBQS0NTOEVuY29kZWRLZXlTcGVjKSB7CisgICAgICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIHBrY3M4S2V5U3BlYyA9IChQS0NTOEVuY29kZWRLZXlTcGVjKSBrZXlTcGVjOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9wZW5TU0xLZXkga2V5ID0gbmV3IE9wZW5TU0xLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8ocGtjczhLZXlTcGVjLmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEVDUHJpdmF0ZUtleShrZXkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJNdXN0IHVzZSBFQ1ByaXZhdGVLZXlTcGVjIG9yIFBLQ1M4RW5jb2RlZEtleVNwZWM7IHdhcyAiCisgICAgICAgICAgICAgICAgKyBrZXlTcGVjLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBLZXlTcGVjPiBUIGVuZ2luZUdldEtleVNwZWMoS2V5IGtleSwgQ2xhc3M8VD4ga2V5U3BlYykKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJrZXkgPT0gbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJrZXlTcGVjID09IG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBFQ1B1YmxpY0tleSkgeworICAgICAgICAgICAgRUNQdWJsaWNLZXkgZWNLZXkgPSAoRUNQdWJsaWNLZXkpIGtleTsKKworICAgICAgICAgICAgaWYgKEVDUHVibGljS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CisgICAgICAgICAgICAgICAgRUNQYXJhbWV0ZXJTcGVjIHBhcmFtcyA9IGVjS2V5LmdldFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgRUNQb2ludCB3ID0gZWNLZXkuZ2V0VygpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgRUNQdWJsaWNLZXlTcGVjKHcsIHBhcmFtcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGtleS5nZXRFbmNvZGVkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBFQ1B1YmxpY0tleVNwZWMgb3IgWDUwOUVuY29kZWRLZXlTcGVjOyB3YXMgIiArIGtleVNwZWMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBFQ1ByaXZhdGVLZXkpIHsKKyAgICAgICAgICAgIEVDUHJpdmF0ZUtleSBlY0tleSA9IChFQ1ByaXZhdGVLZXkpIGtleTsKKworICAgICAgICAgICAgaWYgKEVDUHJpdmF0ZUtleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgeworICAgICAgICAgICAgICAgIEVDUGFyYW1ldGVyU3BlYyBwYXJhbXMgPSBlY0tleS5nZXRQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcyA9IGVjS2V5LmdldFMoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IEVDUHJpdmF0ZUtleVNwZWMocywgcGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUEtDUzhFbmNvZGVkS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhlY0tleS5nZXRFbmNvZGVkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBFQ1ByaXZhdGVLZXlTcGVjIG9yIFBLQ1M4RW5jb2RlZEtleVNwZWM7IHdhcyAiICsga2V5U3BlYy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKCJNdXN0IGJlIEVDUHVibGljS2V5IG9yIEVDUHJpdmF0ZUtleTsgd2FzICIKKyAgICAgICAgICAgICAgICAgICAgKyBrZXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEtleSBlbmdpbmVUcmFuc2xhdGVLZXkoS2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJrZXkgPT0gbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIEVDUHVibGljS2V5KSB7CisgICAgICAgICAgICBFQ1B1YmxpY0tleSBlY0tleSA9IChFQ1B1YmxpY0tleSkga2V5OworCisgICAgICAgICAgICBFQ1BvaW50IHcgPSBlY0tleS5nZXRXKCk7CisKKyAgICAgICAgICAgIEVDUGFyYW1ldGVyU3BlYyBwYXJhbXMgPSBlY0tleS5nZXRQYXJhbXMoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5naW5lR2VuZXJhdGVQdWJsaWMobmV3IEVDUHVibGljS2V5U3BlYyh3LCBwYXJhbXMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBFQ1ByaXZhdGVLZXkpIHsKKyAgICAgICAgICAgIEVDUHJpdmF0ZUtleSBlY0tleSA9IChFQ1ByaXZhdGVLZXkpIGtleTsKKworICAgICAgICAgICAgQmlnSW50ZWdlciBzID0gZWNLZXkuZ2V0UygpOworCisgICAgICAgICAgICBFQ1BhcmFtZXRlclNwZWMgcGFyYW1zID0gZWNLZXkuZ2V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZUdlbmVyYXRlUHJpdmF0ZShuZXcgRUNQcml2YXRlS2V5U3BlYyhzLCBwYXJhbXMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBFQ1B1YmxpY0tleSBvciBFQ1ByaXZhdGVLZXk7IHdhcyAiCisgICAgICAgICAgICAgICAgICAgICsga2V5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDS2V5UGFpckdlbmVyYXRvci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDS2V5UGFpckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTQ2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNLZXlQYWlyR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDR2VuUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPcGVuU1NMRUNLZXlQYWlyR2VuZXJhdG9yIGV4dGVuZHMgS2V5UGFpckdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMR09SSVRITSA9ICJFQyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9LRVlfU0laRSA9IDE5MjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IFNJWkVfVE9fQ1VSVkVfTkFNRSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8qIE5JU1QgY3VydmVzICovCisgICAgICAgIFNJWkVfVE9fQ1VSVkVfTkFNRS5wdXQoMTkyLCAicHJpbWUxOTJ2MSIpOworICAgICAgICBTSVpFX1RPX0NVUlZFX05BTUUucHV0KDIyNCwgInNlY3AyMjRyMSIpOworICAgICAgICBTSVpFX1RPX0NVUlZFX05BTUUucHV0KDI1NiwgInByaW1lMjU2djEiKTsKKyAgICAgICAgU0laRV9UT19DVVJWRV9OQU1FLnB1dCgzODQsICJzZWNwMzg0cjEiKTsKKyAgICAgICAgU0laRV9UT19DVVJWRV9OQU1FLnB1dCg1MjEsICJzZWNwNTIxcjEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBncm91cDsKKworICAgIHB1YmxpYyBPcGVuU1NMRUNLZXlQYWlyR2VuZXJhdG9yKCkgeworICAgICAgICBzdXBlcihBTEdPUklUSE0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBLZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpIHsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjdXJ2ZU5hbWUgPSBTSVpFX1RPX0NVUlZFX05BTUUuZ2V0KERFRkFVTFRfS0VZX1NJWkUpOworICAgICAgICAgICAgZ3JvdXAgPSBPcGVuU1NMRUNHcm91cENvbnRleHQuZ2V0Q3VydmVCeU5hbWUoY3VydmVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE9wZW5TU0xLZXkga2V5ID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLkVDX0tFWV9nZW5lcmF0ZV9rZXkoZ3JvdXAuZ2V0Q29udGV4dCgpKSk7CisgICAgICAgIHJldHVybiBuZXcgS2V5UGFpcihuZXcgT3BlblNTTEVDUHVibGljS2V5KGdyb3VwLCBrZXkpLCBuZXcgT3BlblNTTEVDUHJpdmF0ZUtleShncm91cCwga2V5KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShpbnQga2V5c2l6ZSwgU2VjdXJlUmFuZG9tIHJhbmRvbSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNJWkVfVE9fQ1VSVkVfTkFNRS5nZXQoa2V5c2l6ZSk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKCJ1bmtub3duIGtleSBzaXplICIgKyBrZXlzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN0b3JlIHRoZSBncm91cCBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZSB1bnRpbCB3ZSBrbm93IHRoaXMgaXMgYSB2YWxpZAorICAgICAgICAgKiBncm91cC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBwb3NzaWJsZUdyb3VwID0gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEN1cnZlQnlOYW1lKG5hbWUpOworICAgICAgICBpZiAocG9zc2libGVHcm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigidW5rbm93biBjdXJ2ZSAiICsgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBncm91cCA9IHBvc3NpYmxlR3JvdXA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtLCBTZWN1cmVSYW5kb20gcmFuZG9tKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBFQ1BhcmFtZXRlclNwZWMpIHsKKyAgICAgICAgICAgIEVDUGFyYW1ldGVyU3BlYyBlY1BhcmFtID0gKEVDUGFyYW1ldGVyU3BlYykgcGFyYW07CisKKyAgICAgICAgICAgIGdyb3VwID0gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEluc3RhbmNlKGVjUGFyYW0pOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgRUNHZW5QYXJhbWV0ZXJTcGVjKSB7CisgICAgICAgICAgICBFQ0dlblBhcmFtZXRlclNwZWMgZWNQYXJhbSA9IChFQ0dlblBhcmFtZXRlclNwZWMpIHBhcmFtOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY3VydmVOYW1lID0gZWNQYXJhbS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTdG9yZSB0aGUgZ3JvdXAgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUgdW50aWwgd2Uga25vdyB0aGlzIGlzIGEKKyAgICAgICAgICAgICAqIHZhbGlkIGdyb3VwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmaW5hbCBPcGVuU1NMRUNHcm91cENvbnRleHQgcG9zc2libGVHcm91cCA9IE9wZW5TU0xFQ0dyb3VwQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VydmVCeU5hbWUoY3VydmVOYW1lKTsKKyAgICAgICAgICAgIGlmIChwb3NzaWJsZUdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigidW5rbm93biBjdXJ2ZSBuYW1lOiAiICsgY3VydmVOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JvdXAgPSBwb3NzaWJsZUdyb3VwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgbXVzdCBiZSBFQ1BhcmFtZXRlclNwZWMgb3IgRUNHZW5QYXJhbWV0ZXJTcGVjIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNQb2ludENvbnRleHQuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xFQ1BvaW50Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNWMwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNQb2ludENvbnRleHQuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQ7CisKK2ZpbmFsIGNsYXNzIE9wZW5TU0xFQ1BvaW50Q29udGV4dCB7CisgICAgcHJpdmF0ZSBmaW5hbCBPcGVuU1NMRUNHcm91cENvbnRleHQgZ3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHBvaW50Q3R4OworCisgICAgT3BlblNTTEVDUG9pbnRDb250ZXh0KE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBncm91cCwgbG9uZyBwb2ludEN0eCkgeworICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7CisgICAgICAgIHRoaXMucG9pbnRDdHggPSBwb2ludEN0eDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHBvaW50Q3R4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfUE9JTlRfY2xlYXJfZnJlZShwb2ludEN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBPcGVuU1NMRUNQb2ludENvbnRleHQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPcGVuU1NMRUNQb2ludENvbnRleHQgb3RoZXIgPSAoT3BlblNTTEVDUG9pbnRDb250ZXh0KSBvOworICAgICAgICBpZiAoIU5hdGl2ZUNyeXB0by5FQ19HUk9VUF9jbXAoZ3JvdXAuZ2V0Q29udGV4dCgpLCBvdGhlci5ncm91cC5nZXRDb250ZXh0KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTmF0aXZlQ3J5cHRvLkVDX1BPSU5UX2NtcChncm91cC5nZXRDb250ZXh0KCksIHBvaW50Q3R4LCBvdGhlci5wb2ludEN0eCk7CisgICAgfQorCisgICAgcHVibGljIEVDUG9pbnQgZ2V0RUNQb2ludCgpIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdW10gZ2VuZXJhdG9yQ29vcmRzID0gTmF0aXZlQ3J5cHRvLkVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoCisgICAgICAgICAgICAgICAgZ3JvdXAuZ2V0Q29udGV4dCgpLCBwb2ludEN0eCk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgeCA9IG5ldyBCaWdJbnRlZ2VyKGdlbmVyYXRvckNvb3Jkc1swXSk7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgeSA9IG5ldyBCaWdJbnRlZ2VyKGdlbmVyYXRvckNvb3Jkc1sxXSk7CisgICAgICAgIHJldHVybiBuZXcgRUNQb2ludCh4LCB5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBwb2ludEN0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wZW5TU0xFQ1BvaW50Q29udGV4dCBnZXRJbnN0YW5jZShpbnQgY3VydmVUeXBlLCBPcGVuU1NMRUNHcm91cENvbnRleHQgZ3JvdXAsCisgICAgICAgICAgICBFQ1BvaW50IGphdmFQb2ludCkgeworICAgICAgICBPcGVuU1NMRUNQb2ludENvbnRleHQgcG9pbnQgPSBuZXcgT3BlblNTTEVDUG9pbnRDb250ZXh0KGdyb3VwLAorICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19QT0lOVF9uZXcoZ3JvdXAuZ2V0Q29udGV4dCgpKSk7CisgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBwb2ludC5nZXRDb250ZXh0KCksIGphdmFQb2ludC5nZXRBZmZpbmVYKCkudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBqYXZhUG9pbnQuZ2V0QWZmaW5lWSgpLnRvQnl0ZUFycmF5KCkpOworICAgICAgICByZXR1cm4gcG9pbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDUHJpdmF0ZUtleS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDUHJpdmF0ZUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRUNQcml2YXRlS2V5LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUHJpdmF0ZUtleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPcGVuU1NMRUNQcml2YXRlS2V5IGltcGxlbWVudHMgRUNQcml2YXRlS2V5LCBPcGVuU1NMS2V5SG9sZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDAzNjYzMzU5NTAwMTA4MzkyMkw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNID0gIkVDIjsKKworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgT3BlblNTTEtleSBrZXk7CisKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBncm91cDsKKworICAgIHB1YmxpYyBPcGVuU1NMRUNQcml2YXRlS2V5KE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBncm91cCwgT3BlblNTTEtleSBrZXkpIHsKKyAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlblNTTEVDUHJpdmF0ZUtleShPcGVuU1NMS2V5IGtleSkgeworICAgICAgICBmaW5hbCBsb25nIG9yaWdHcm91cCA9IE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2V0MF9ncm91cChrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgICAgIHRoaXMuZ3JvdXAgPSBuZXcgT3BlblNTTEVDR3JvdXBDb250ZXh0KE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9kdXAob3JpZ0dyb3VwKSk7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBPcGVuU1NMRUNQcml2YXRlS2V5KEVDUHJpdmF0ZUtleVNwZWMgZWNLZXlTcGVjKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdyb3VwID0gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEluc3RhbmNlKGVjS2V5U3BlYworICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1zKCkpOworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBwcml2S2V5ID0gZWNLZXlTcGVjLmdldFMoKTsKKyAgICAgICAgICAgIGtleSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfRUNfS0VZKGdyb3VwLmdldENvbnRleHQoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdktleS50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wZW5TU0xLZXkgZ2V0SW5zdGFuY2UoRUNQcml2YXRlS2V5IGVjUHJpdmF0ZUtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdyb3VwID0gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEluc3RhbmNlKGVjUHJpdmF0ZUtleQorICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1zKCkpOworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBwcml2S2V5ID0gZWNQcml2YXRlS2V5LmdldFMoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEtleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfbmV3X0VDX0tFWShncm91cC5nZXRDb250ZXh0KCksIDAsCisgICAgICAgICAgICAgICAgICAgIHByaXZLZXkudG9CeXRlQXJyYXkoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgcmV0dXJuIEFMR09SSVRITTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuICJQS0NTIzgiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5pMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVDUGFyYW1ldGVyU3BlYyBnZXRQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiBncm91cC5nZXRFQ1BhcmFtZXRlclNwZWMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRTKCkgeworICAgICAgICByZXR1cm4gZ2V0UHJpdmF0ZUtleSgpOworICAgIH0KKworICAgIHByaXZhdGUgQmlnSW50ZWdlciBnZXRQcml2YXRlS2V5KCkgeworICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoTmF0aXZlQ3J5cHRvLkVDX0tFWV9nZXRfcHJpdmF0ZV9rZXkoa2V5LmdldFBrZXlDb250ZXh0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3BlblNTTEtleSBnZXRPcGVuU1NMS2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgT3BlblNTTEVDUHJpdmF0ZUtleSkgeworICAgICAgICAgICAgT3BlblNTTEVDUHJpdmF0ZUtleSBvdGhlciA9IChPcGVuU1NMRUNQcml2YXRlS2V5KSBvOworICAgICAgICAgICAgcmV0dXJuIGtleS5lcXVhbHMob3RoZXIua2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFQ1ByaXZhdGVLZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFQ1ByaXZhdGVLZXkgb3RoZXIgPSAoRUNQcml2YXRlS2V5KSBvOworICAgICAgICBpZiAoIWdldFByaXZhdGVLZXkoKS5lcXVhbHMob3RoZXIuZ2V0UygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIHNwZWMgPSBnZXRQYXJhbXMoKTsKKyAgICAgICAgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIG90aGVyU3BlYyA9IG90aGVyLmdldFBhcmFtcygpOworCisgICAgICAgIHJldHVybiBzcGVjLmdldEN1cnZlKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRDdXJ2ZSgpKQorICAgICAgICAgICAgICAgICYmIHNwZWMuZ2V0R2VuZXJhdG9yKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRHZW5lcmF0b3IoKSkKKyAgICAgICAgICAgICAgICAmJiBzcGVjLmdldE9yZGVyKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRPcmRlcigpKQorICAgICAgICAgICAgICAgICYmIHNwZWMuZ2V0Q29mYWN0b3IoKSA9PSBvdGhlclNwZWMuZ2V0Q29mYWN0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKE5hdGl2ZUNyeXB0by5pMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhrZXkuZ2V0UGtleUNvbnRleHQoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICBieXRlW10gZW5jb2RlZCA9IChieXRlW10pIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisKKyAgICAgICAga2V5ID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKGVuY29kZWQpKTsKKworICAgICAgICBmaW5hbCBsb25nIG9yaWdHcm91cCA9IE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2V0MF9ncm91cChrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgICAgIGdyb3VwID0gbmV3IE9wZW5TU0xFQ0dyb3VwQ29udGV4dChOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZHVwKG9yaWdHcm91cCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoa2V5LmlzRW5naW5lQmFzZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbigiZW5naW5lLWJhc2VkIGtleXMgY2FuIG5vdCBiZSBzZXJpYWxpemVkIik7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChnZXRFbmNvZGVkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xFQ1B1YmxpY0tleS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVDUHVibGljS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NjdhZAotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xFQ1B1YmxpY0tleS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkVDUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUHVibGljS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGZpbmFsIGNsYXNzIE9wZW5TU0xFQ1B1YmxpY0tleSBpbXBsZW1lbnRzIEVDUHVibGljS2V5LCBPcGVuU1NMS2V5SG9sZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjE1ODQyOTI2ODA4Mjk4MDIwTDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTEdPUklUSE0gPSAiRUMiOworCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBPcGVuU1NMS2V5IGtleTsKKworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgT3BlblNTTEVDR3JvdXBDb250ZXh0IGdyb3VwOworCisgICAgcHVibGljIE9wZW5TU0xFQ1B1YmxpY0tleShPcGVuU1NMRUNHcm91cENvbnRleHQgZ3JvdXAsIE9wZW5TU0xLZXkga2V5KSB7CisgICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIE9wZW5TU0xFQ1B1YmxpY0tleShPcGVuU1NMS2V5IGtleSkgeworICAgICAgICBmaW5hbCBsb25nIG9yaWdHcm91cCA9IE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2V0MF9ncm91cChrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgICAgIHRoaXMuZ3JvdXAgPSBuZXcgT3BlblNTTEVDR3JvdXBDb250ZXh0KE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9kdXAob3JpZ0dyb3VwKSk7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBPcGVuU1NMRUNQdWJsaWNLZXkoRUNQdWJsaWNLZXlTcGVjIGVjS2V5U3BlYykgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9wZW5TU0xFQ0dyb3VwQ29udGV4dCBncm91cCA9IE9wZW5TU0xFQ0dyb3VwQ29udGV4dC5nZXRJbnN0YW5jZShlY0tleVNwZWMuZ2V0UGFyYW1zKCkpOworICAgICAgICAgICAgT3BlblNTTEVDUG9pbnRDb250ZXh0IHB1YktleSA9IE9wZW5TU0xFQ1BvaW50Q29udGV4dC5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLmdldF9FQ19HUk9VUF90eXBlKGdyb3VwLmdldENvbnRleHQoKSksIGdyb3VwLCBlY0tleVNwZWMuZ2V0VygpKTsKKyAgICAgICAgICAgIGtleSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfRUNfS0VZKGdyb3VwLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgcHViS2V5LmdldENvbnRleHQoKSwgbnVsbCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcGVuU1NMS2V5IGdldEluc3RhbmNlKEVDUHVibGljS2V5IGVjUHVibGljS2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPcGVuU1NMRUNHcm91cENvbnRleHQgZ3JvdXAgPSBPcGVuU1NMRUNHcm91cENvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKGVjUHVibGljS2V5LmdldFBhcmFtcygpKTsKKyAgICAgICAgICAgIE9wZW5TU0xFQ1BvaW50Q29udGV4dCBwdWJLZXkgPSBPcGVuU1NMRUNQb2ludENvbnRleHQuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5nZXRfRUNfR1JPVVBfdHlwZShncm91cC5nZXRDb250ZXh0KCkpLCBncm91cCwgZWNQdWJsaWNLZXkuZ2V0VygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEtleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfbmV3X0VDX0tFWShncm91cC5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIHB1YktleS5nZXRDb250ZXh0KCksIG51bGwpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgIHJldHVybiBBTEdPUklUSE07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiAiWC41MDkiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5pMmRfUFVCS0VZKGtleS5nZXRQa2V5Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRUNQYXJhbWV0ZXJTcGVjIGdldFBhcmFtcygpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwLmdldEVDUGFyYW1ldGVyU3BlYygpOworICAgIH0KKworICAgIHByaXZhdGUgRUNQb2ludCBnZXRQdWJsaWNLZXkoKSB7CisgICAgICAgIGZpbmFsIE9wZW5TU0xFQ1BvaW50Q29udGV4dCBwdWJLZXkgPSBuZXcgT3BlblNTTEVDUG9pbnRDb250ZXh0KGdyb3VwLAorICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2V0X3B1YmxpY19rZXkoa2V5LmdldFBrZXlDb250ZXh0KCkpKTsKKworICAgICAgICByZXR1cm4gcHViS2V5LmdldEVDUG9pbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRUNQb2ludCBnZXRXKCkgeworICAgICAgICByZXR1cm4gZ2V0UHVibGljS2V5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wZW5TU0xLZXkgZ2V0T3BlblNTTEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE9wZW5TU0xFQ1ByaXZhdGVLZXkpIHsKKyAgICAgICAgICAgIE9wZW5TU0xFQ1ByaXZhdGVLZXkgb3RoZXIgPSAoT3BlblNTTEVDUHJpdmF0ZUtleSkgbzsKKyAgICAgICAgICAgIHJldHVybiBrZXkuZXF1YWxzKG90aGVyLmtleSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRUNQdWJsaWNLZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFQ1B1YmxpY0tleSBvdGhlciA9IChFQ1B1YmxpY0tleSkgbzsKKyAgICAgICAgaWYgKCFnZXRQdWJsaWNLZXkoKS5lcXVhbHMob3RoZXIuZ2V0VygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIHNwZWMgPSBnZXRQYXJhbXMoKTsKKyAgICAgICAgZmluYWwgRUNQYXJhbWV0ZXJTcGVjIG90aGVyU3BlYyA9IG90aGVyLmdldFBhcmFtcygpOworCisgICAgICAgIHJldHVybiBzcGVjLmdldEN1cnZlKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRDdXJ2ZSgpKQorICAgICAgICAgICAgICAgICYmIHNwZWMuZ2V0R2VuZXJhdG9yKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRHZW5lcmF0b3IoKSkKKyAgICAgICAgICAgICAgICAmJiBzcGVjLmdldE9yZGVyKCkuZXF1YWxzKG90aGVyU3BlYy5nZXRPcmRlcigpKQorICAgICAgICAgICAgICAgICYmIHNwZWMuZ2V0Q29mYWN0b3IoKSA9PSBvdGhlclNwZWMuZ2V0Q29mYWN0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKE5hdGl2ZUNyeXB0by5pMmRfUFVCS0VZKGtleS5nZXRQa2V5Q29udGV4dCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9wcmludF9wdWJsaWMoa2V5LmdldFBrZXlDb250ZXh0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSAoYnl0ZVtdKSBzdHJlYW0ucmVhZE9iamVjdCgpOworCisgICAgICAgIGtleSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5kMmlfUFVCS0VZKGVuY29kZWQpKTsKKworICAgICAgICBmaW5hbCBsb25nIG9yaWdHcm91cCA9IE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2V0MF9ncm91cChrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisgICAgICAgIGdyb3VwID0gbmV3IE9wZW5TU0xFQ0dyb3VwQ29udGV4dChOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZHVwKG9yaWdHcm91cCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoa2V5LmlzRW5naW5lQmFzZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbigiZW5naW5lLWJhc2VkIGtleXMgY2FuIG5vdCBiZSBzZXJpYWxpemVkIik7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChnZXRFbmNvZGVkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xFbmdpbmUuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xFbmdpbmUuamF2YQppbmRleCBkMDFkYzYyLi40ZTAyYWFkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMRW5naW5lLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEVuZ2luZS5qYXZhCkBAIC0xNyw4ICsxNywxMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKIAoraW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CisKIHB1YmxpYyBjbGFzcyBPcGVuU1NMRW5naW5lIHsKICAgICBzdGF0aWMgewogICAgICAgICBOYXRpdmVDcnlwdG8uRU5HSU5FX2xvYWRfZHluYW1pYygpOwpAQCAtMjcsMTQgKzMwLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IG1Mb2FkaW5nTG9jayA9IG5ldyBPYmplY3QoKTsKIAogICAgIC8qKiBUaGUgRU5HSU5FJ3MgbmF0aXZlIGhhbmRsZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBjdHg7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGN0eDsKIAogICAgIHB1YmxpYyBzdGF0aWMgT3BlblNTTEVuZ2luZSBnZXRJbnN0YW5jZShTdHJpbmcgZW5naW5lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGVuZ2luZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZ2luZSA9PSBudWxsIik7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBpbnQgZW5naW5lQ3R4OworICAgICAgICBmaW5hbCBsb25nIGVuZ2luZUN0eDsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGluZ0xvY2spIHsKICAgICAgICAgICAgIGVuZ2luZUN0eCA9IE5hdGl2ZUNyeXB0by5FTkdJTkVfYnlfaWQoZW5naW5lKTsKICAgICAgICAgICAgIGlmIChlbmdpbmVDdHggPT0gMCkgewpAQCAtNDcsNyArNTAsNyBAQAogICAgICAgICByZXR1cm4gbmV3IE9wZW5TU0xFbmdpbmUoZW5naW5lQ3R4KTsKICAgICB9CiAKLSAgICBwcml2YXRlIE9wZW5TU0xFbmdpbmUoaW50IGVuZ2luZUN0eCkgeworICAgIHByaXZhdGUgT3BlblNTTEVuZ2luZShsb25nIGVuZ2luZUN0eCkgewogICAgICAgICBjdHggPSBlbmdpbmVDdHg7CiAKICAgICAgICAgaWYgKE5hdGl2ZUNyeXB0by5FTkdJTkVfaW5pdChlbmdpbmVDdHgpID09IDApIHsKQEAgLTYxLDIzICs2NCwzOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpZCA9PSBudWxsIik7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBpbnQga2V5UmVmID0gTmF0aXZlQ3J5cHRvLkVOR0lORV9sb2FkX3ByaXZhdGVfa2V5KGN0eCwgaWQpOworICAgICAgICBmaW5hbCBsb25nIGtleVJlZiA9IE5hdGl2ZUNyeXB0by5FTkdJTkVfbG9hZF9wcml2YXRlX2tleShjdHgsIGlkKTsKICAgICAgICAgaWYgKGtleVJlZiA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIGludCBrZXlUeXBlID0gTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX3R5cGUoa2V5UmVmKTsKLSAgICAgICAgc3dpdGNoIChrZXlUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9SU0E6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9wZW5TU0xSU0FQcml2YXRlS2V5LmdldEluc3RhbmNlKG5ldyBPcGVuU1NMS2V5KGtleVJlZiwgdGhpcywgaWQpKTsKLSAgICAgICAgICAgIGNhc2UgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0RTQToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5TU0xEU0FQcml2YXRlS2V5KG5ldyBPcGVuU1NMS2V5KGtleVJlZiwgdGhpcywgaWQpKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlVua25vd24ga2V5IHR5cGU6ICIgKyBrZXlUeXBlKTsKKyAgICAgICAgT3BlblNTTEtleSBwa2V5ID0gbmV3IE9wZW5TU0xLZXkoa2V5UmVmLCB0aGlzLCBpZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGtleS5nZXRQcml2YXRlS2V5KCk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGludCBnZXRFbmdpbmVDb250ZXh0KCkgeworICAgIHB1YmxpYyBTZWNyZXRLZXkgZ2V0U2VjcmV0S2V5QnlJZChTdHJpbmcgaWQsIFN0cmluZyBhbGdvcml0aG0pIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaWQgPT0gbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBrZXlSZWYgPSBOYXRpdmVDcnlwdG8uRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkoY3R4LCBpZCk7CisgICAgICAgIGlmIChrZXlSZWYgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBPcGVuU1NMS2V5IHBrZXkgPSBuZXcgT3BlblNTTEtleShrZXlSZWYsIHRoaXMsIGlkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwa2V5LmdldFNlY3JldEtleShhbGdvcml0aG0pOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb25nIGdldEVuZ2luZUNvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiBjdHg7CiAgICAgfQogCkBAIC0xMDMsMTEgKzEyMSwyMCBAQAogCiAgICAgICAgIE9wZW5TU0xFbmdpbmUgb3RoZXIgPSAoT3BlblNTTEVuZ2luZSkgbzsKIAotICAgICAgICByZXR1cm4gb3RoZXIuZ2V0RW5naW5lQ29udGV4dCgpID09IGN0eDsKKyAgICAgICAgaWYgKG90aGVyLmdldEVuZ2luZUNvbnRleHQoKSA9PSBjdHgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gTmF0aXZlQ3J5cHRvLkVOR0lORV9nZXRfaWQoY3R4KTsKKyAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpZC5lcXVhbHMoTmF0aXZlQ3J5cHRvLkVOR0lORV9nZXRfaWQob3RoZXIuZ2V0RW5naW5lQ29udGV4dCgpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGN0eDsKKyAgICAgIHJldHVybiAoaW50KSBjdHg7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEtleS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEtleS5qYXZhCmluZGV4IGI4YjlmNjkuLmJkYzA2ZTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xLZXkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMS2V5LmphdmEKQEAgLTE2LDI2ICsxNiwzNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CiAKLWNsYXNzIE9wZW5TU0xLZXkgewotICAgIHByaXZhdGUgZmluYWwgaW50IGN0eDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworCitwdWJsaWMgY2xhc3MgT3BlblNTTEtleSB7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGN0eDsKIAogICAgIHByaXZhdGUgZmluYWwgT3BlblNTTEVuZ2luZSBlbmdpbmU7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGlhczsKIAotICAgIE9wZW5TU0xLZXkoaW50IGN0eCkgeworICAgIHB1YmxpYyBPcGVuU1NMS2V5KGxvbmcgY3R4KSB7CiAgICAgICAgIHRoaXMuY3R4ID0gY3R4OwogICAgICAgICBlbmdpbmUgPSBudWxsOwogICAgICAgICBhbGlhcyA9IG51bGw7CiAgICAgfQogCi0gICAgT3BlblNTTEtleShpbnQgY3R4LCBPcGVuU1NMRW5naW5lIGVuZ2luZSwgU3RyaW5nIGFsaWFzKSB7CisgICAgcHVibGljIE9wZW5TU0xLZXkobG9uZyBjdHgsIE9wZW5TU0xFbmdpbmUgZW5naW5lLCBTdHJpbmcgYWxpYXMpIHsKICAgICAgICAgdGhpcy5jdHggPSBjdHg7CiAgICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lOwogICAgICAgICB0aGlzLmFsaWFzID0gYWxpYXM7CiAgICAgfQogCi0gICAgaW50IGdldFBrZXlDb250ZXh0KCkgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhdyBwb2ludGVyIHRvIHRoZSBFVlBfUEtFWSBjb250ZXh0IGZvciB1c2UgaW4gSk5JIGNhbGxzLiBUaGUKKyAgICAgKiBsaWZlIGN5Y2xlIG9mIHRoaXMgbmF0aXZlIHBvaW50ZXIgaXMgbWFuYWdlZCBieSB0aGUge0Bjb2RlIE9wZW5TU0xLZXl9CisgICAgICogaW5zdGFuY2UgYW5kIG11c3Qgbm90IGJlIGRlc3Ryb3llZCBvciBmcmVlZCBieSB1c2VycyBvZiB0aGlzIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRQa2V5Q29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIGN0eDsKICAgICB9CiAKQEAgLTQ3LDEwICs1OCw0NiBAQAogICAgICAgICByZXR1cm4gZW5naW5lICE9IG51bGw7CiAgICAgfQogCi0gICAgU3RyaW5nIGdldEFsaWFzKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CiAgICAgICAgIHJldHVybiBhbGlhczsKICAgICB9CiAKKyAgICBwdWJsaWMgUHVibGljS2V5IGdldFB1YmxpY0tleSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBzd2l0Y2ggKE5hdGl2ZUNyeXB0by5FVlBfUEtFWV90eXBlKGN0eCkpIHsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX1JTQToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5TU0xSU0FQdWJsaWNLZXkodGhpcyk7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9EU0E6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuU1NMRFNBUHVibGljS2V5KHRoaXMpOworICAgICAgICAgICAgY2FzZSBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfRUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuU1NMRUNQdWJsaWNLZXkodGhpcyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24oInVua25vd24gUEtFWSB0eXBlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUHJpdmF0ZUtleSBnZXRQcml2YXRlS2V5KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAoTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX3R5cGUoY3R4KSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfUlNBOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTFJTQVByaXZhdGVLZXkodGhpcyk7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9EU0E6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuU1NMRFNBUHJpdmF0ZUtleSh0aGlzKTsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0VDOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTEVDUHJpdmF0ZUtleSh0aGlzKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbigidW5rbm93biBQS0VZIHR5cGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZWNyZXRLZXkgZ2V0U2VjcmV0S2V5KFN0cmluZyBhbGdvcml0aG0pIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBzd2l0Y2ggKE5hdGl2ZUNyeXB0by5FVlBfUEtFWV90eXBlKGN0eCkpIHsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0hNQUM6CisgICAgICAgICAgICBjYXNlIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9DTUFDOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3BlblNTTFNlY3JldEtleShhbGdvcml0aG0sIHRoaXMpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKCJ1bmtub3duIFBLRVkgdHlwZSIpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgdHJ5IHsKQEAgLTczLDIyICsxMjAsMzUgQEAKICAgICAgICAgfQogCiAgICAgICAgIE9wZW5TU0xLZXkgb3RoZXIgPSAoT3BlblNTTEtleSkgbzsKLSAgICAgICAgaWYgKGN0eCAhPSBvdGhlci5nZXRQa2V5Q29udGV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjdHggPT0gb3RoZXIuZ2V0UGtleUNvbnRleHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBFTkdJTkUtYmFzZWQga2V5cyBtdXN0IGJlIGNoZWNrZWQgaW4gYSBzcGVjaWFsIHdheS4KKyAgICAgICAgICovCiAgICAgICAgIGlmIChlbmdpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG90aGVyLmdldEVuZ2luZSgpID09IG51bGw7CisgICAgICAgICAgICBpZiAob3RoZXIuZ2V0RW5naW5lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZW5naW5lLmVxdWFscyhvdGhlci5nZXRFbmdpbmUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBlbmdpbmUuZXF1YWxzKG90aGVyLmdldEVuZ2luZSgpKTsKKyAgICAgICAgICAgIGlmIChhbGlhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLmVxdWFscyhvdGhlci5nZXRBbGlhcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuZ2V0QWxpYXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9jbXAoY3R4LCBvdGhlci5nZXRQa2V5Q29udGV4dCgpKSA9PSAxOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgaGFzaCA9IGhhc2ggKiAxNyArIGN0eDsKLSAgICAgICAgaGFzaCA9IGhhc2ggKiAzMSArIChlbmdpbmUgPT0gbnVsbCA/IDAgOiBlbmdpbmUuZ2V0RW5naW5lQ29udGV4dCgpKTsKKyAgICAgICAgaGFzaCA9IGhhc2ggKiAxNyArIChpbnQpIGN0eDsKKyAgICAgICAgaGFzaCA9IGhhc2ggKiAzMSArIChpbnQpIChlbmdpbmUgPT0gbnVsbCA/IDAgOiBlbmdpbmUuZ2V0RW5naW5lQ29udGV4dCgpKTsKICAgICAgICAgcmV0dXJuIGhhc2g7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEtleUhvbGRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEtleUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGU5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMS2V5SG9sZGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZTsKKworcHVibGljIGludGVyZmFjZSBPcGVuU1NMS2V5SG9sZGVyIHsKKyAgICBwdWJsaWMgT3BlblNTTEtleSBnZXRPcGVuU1NMS2V5KCk7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMTWFjLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMTWFjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkOWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xNYWMuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uTWFjU3BpOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVuU1NMTWFjIGV4dGVuZHMgTWFjU3BpIHsKKyAgICBwcml2YXRlIGZpbmFsIE9wZW5TU0xEaWdlc3RDb250ZXh0IGN0eCA9IG5ldyBPcGVuU1NMRGlnZXN0Q29udGV4dCgKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfTURfQ1RYX2NyZWF0ZSgpKTsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSBFVlBfTUQgZm9yIHRoZSBoYXNoaW5nIGFsZ29yaXRobSwgZS5nLgorICAgICAqIEVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGExIik7CisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGV2cF9tZDsKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgdHlwZSBvZiB0aGUgc2VjcmV0IGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBldnBfcGtleV90eXBlOworCisgICAgLyoqCisgICAgICogVGhlIHNlY3JldCBrZXkgdXNlZCBpbiB0aGlzIGtleWVkIE1BQy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wZW5TU0xLZXkgbWFjS2V5OworCisgICAgLyoqCisgICAgICogSG9sZHMgdGhlIG91dHB1dCBzaXplIG9mIHRoZSBtZXNzYWdlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBzaXplOworCisgICAgLyoqCisgICAgICogSG9sZHMgYSBkdW1teSBidWZmZXIgZm9yIHdyaXRpbmcgc2luZ2xlIGJ5dGVzIHRvIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gc2luZ2xlQnl0ZSA9IG5ldyBieXRlWzFdOworCisgICAgcHJvdGVjdGVkIE9wZW5TU0xNYWMobG9uZyBldnBfbWQsIGludCBzaXplLCBpbnQgZXZwX3BrZXlfdHlwZSkgeworICAgICAgICB0aGlzLmV2cF9tZCA9IGV2cF9tZDsKKyAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgdGhpcy5ldnBfcGtleV90eXBlID0gZXZwX3BrZXlfdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXkga2V5LCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgU2VjcmV0S2V5KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oImtleSBtdXN0IGJlIGEgU2VjcmV0S2V5Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKCJ1bmtub3duIHBhcmFtZXRlciB0eXBlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgT3BlblNTTEtleUhvbGRlcikgeworICAgICAgICAgICAgbWFjS2V5ID0gKChPcGVuU1NMS2V5SG9sZGVyKSBrZXkpLmdldE9wZW5TU0xLZXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBrZXlCeXRlcyA9IGtleS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICBpZiAoa2V5Qnl0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJrZXkgY2Fubm90IGJlIGVuY29kZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWFjS2V5ID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX25ld19tYWNfa2V5KGV2cF9wa2V5X3R5cGUsIGtleUJ5dGVzKSk7CisgICAgICAgIH0KKworICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX01EX0NUWF9pbml0KGN0eC5nZXRDb250ZXh0KCkpOworCisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0RpZ2VzdFNpZ25Jbml0KGN0eC5nZXRDb250ZXh0KCksIGV2cF9tZCwgbWFjS2V5LmdldFBrZXlDb250ZXh0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlIGlucHV0KSB7CisgICAgICAgIHNpbmdsZUJ5dGVbMF0gPSBpbnB1dDsKKyAgICAgICAgZW5naW5lVXBkYXRlKHNpbmdsZUJ5dGUsIDAsIDEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZShieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4pIHsKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9EaWdlc3RVcGRhdGUoY3R4LmdldENvbnRleHQoKSwgaW5wdXQsIG9mZnNldCwgbGVuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoKSB7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRwdXQgPSBOYXRpdmVDcnlwdG8uRVZQX0RpZ2VzdFNpZ25GaW5hbChjdHguZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhtYWNNRDUgZXh0ZW5kcyBPcGVuU1NMTWFjIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFVlBfTUQgPSBOYXRpdmVDcnlwdG8uRVZQX2dldF9kaWdlc3RieW5hbWUoIm1kNSIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IE5hdGl2ZUNyeXB0by5FVlBfTURfc2l6ZShFVlBfTUQpOworCisgICAgICAgIHB1YmxpYyBIbWFjTUQ1KCkgeworICAgICAgICAgICAgc3VwZXIoRVZQX01ELCBTSVpFLCBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfSE1BQyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhtYWNTSEExIGV4dGVuZHMgT3BlblNTTE1hYyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVZQX01EID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGExIik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFID0gTmF0aXZlQ3J5cHRvLkVWUF9NRF9zaXplKEVWUF9NRCk7CisKKyAgICAgICAgcHVibGljIEhtYWNTSEExKCkgeworICAgICAgICAgICAgc3VwZXIoRVZQX01ELCBTSVpFLCBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfSE1BQyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhtYWNTSEEyNTYgZXh0ZW5kcyBPcGVuU1NMTWFjIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFVlBfTUQgPSBOYXRpdmVDcnlwdG8uRVZQX2dldF9kaWdlc3RieW5hbWUoInNoYTI1NiIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IE5hdGl2ZUNyeXB0by5FVlBfTURfc2l6ZShFVlBfTUQpOworCisgICAgICAgIHB1YmxpYyBIbWFjU0hBMjU2KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihFVlBfTUQsIFNJWkUsIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9ITUFDKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG1hY1NIQTM4NCBleHRlbmRzIE9wZW5TU0xNYWMgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic2hhMzg0Iik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFID0gTmF0aXZlQ3J5cHRvLkVWUF9NRF9zaXplKEVWUF9NRCk7CisKKyAgICAgICAgcHVibGljIEhtYWNTSEEzODQoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKEVWUF9NRCwgU0laRSwgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0hNQUMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIbWFjU0hBNTEyIGV4dGVuZHMgT3BlblNTTE1hYyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVZQX01EID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGE1MTIiKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSBOYXRpdmVDcnlwdG8uRVZQX01EX3NpemUoRVZQX01EKTsKKworICAgICAgICBwdWJsaWMgSG1hY1NIQTUxMigpIHsKKyAgICAgICAgICAgIHN1cGVyKEVWUF9NRCwgU0laRSwgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0hNQUMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xNZXNzYWdlRGlnZXN0SkRLLmphdmEKaW5kZXggYmE0MzFiZC4uOWQ1OWE3YyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMTWVzc2FnZURpZ2VzdEpESy5qYXZhCkBAIC0yNywxMiArMjcsMTIgQEAKICAgICAvKioKICAgICAgKiBIb2xkcyBhIHBvaW50ZXIgdG8gdGhlIG5hdGl2ZSBtZXNzYWdlIGRpZ2VzdCBjb250ZXh0LgogICAgICAqLwotICAgIHByaXZhdGUgaW50IGN0eDsKKyAgICBwcml2YXRlIGxvbmcgY3R4OwogCiAgICAgLyoqCiAgICAgICogSG9sZHMgdGhlIEVWUF9NRCBmb3IgdGhlIGhhc2hpbmcgYWxnb3JpdGhtLCBlLmcuIEVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGExIik7CiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXZwX21kOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBldnBfbWQ7CiAKICAgICAvKioKICAgICAgKiBIb2xkcyB0aGUgb3V0cHV0IHNpemUgb2YgdGhlIG1lc3NhZ2UgZGlnZXN0LgpAQCAtNDgsNyArNDgsNyBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcgT3BlblNTTE1lc3NhZ2VEaWdlc3QgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBhbGdvcml0aG0KICAgICAgKiBuYW1lLgogICAgICAqLwotICAgIHByaXZhdGUgT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsoU3RyaW5nIGFsZ29yaXRobSwgaW50IGV2cF9tZCwgaW50IHNpemUpCisgICAgcHJpdmF0ZSBPcGVuU1NMTWVzc2FnZURpZ2VzdEpESyhTdHJpbmcgYWxnb3JpdGhtLCBsb25nIGV2cF9tZCwgaW50IHNpemUpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIoYWxnb3JpdGhtKTsKICAgICAgICAgdGhpcy5ldnBfbWQgPSBldnBfbWQ7CkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIHJldHVybiBkOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldEN0eCgpIHsKKyAgICBwcml2YXRlIGxvbmcgZ2V0Q3R4KCkgewogICAgICAgICBpZiAoY3R4ID09IDApIHsKICAgICAgICAgICAgIGN0eCA9IE5hdGl2ZUNyeXB0by5FVlBfRGlnZXN0SW5pdChldnBfbWQpOwogICAgICAgICB9CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ENSBleHRlbmRzIE9wZW5TU0xNZXNzYWdlRGlnZXN0SkRLIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgibWQ1Iik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVZQX01EID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJtZDUiKTsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSBOYXRpdmVDcnlwdG8uRVZQX01EX3NpemUoRVZQX01EKTsKICAgICAgICAgcHVibGljIE1ENSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICAgICAgc3VwZXIoIk1ENSIsRVZQX01ELCBTSVpFKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU0hBMSBleHRlbmRzIE9wZW5TU0xNZXNzYWdlRGlnZXN0SkRLIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic2hhMSIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic2hhMSIpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IE5hdGl2ZUNyeXB0by5FVlBfTURfc2l6ZShFVlBfTUQpOwogICAgICAgICBwdWJsaWMgU0hBMSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICAgICAgc3VwZXIoIlNIQS0xIiwgRVZQX01ELCBTSVpFKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU0hBMjU2IGV4dGVuZHMgT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZQX01EID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGEyNTYiKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFVlBfTUQgPSBOYXRpdmVDcnlwdG8uRVZQX2dldF9kaWdlc3RieW5hbWUoInNoYTI1NiIpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IE5hdGl2ZUNyeXB0by5FVlBfTURfc2l6ZShFVlBfTUQpOwogICAgICAgICBwdWJsaWMgU0hBMjU2KCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBzdXBlcigiU0hBLTI1NiIsIEVWUF9NRCwgU0laRSk7CkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNIQTM4NCBleHRlbmRzIE9wZW5TU0xNZXNzYWdlRGlnZXN0SkRLIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic2hhMzg0Iik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVZQX01EID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGEzODQiKTsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSBOYXRpdmVDcnlwdG8uRVZQX01EX3NpemUoRVZQX01EKTsKICAgICAgICAgcHVibGljIFNIQTM4NCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICAgICAgc3VwZXIoIlNIQS0zODQiLCBFVlBfTUQsIFNJWkUpOwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTSEE1MTIgZXh0ZW5kcyBPcGVuU1NMTWVzc2FnZURpZ2VzdEpESyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVlBfTUQgPSBOYXRpdmVDcnlwdG8uRVZQX2dldF9kaWdlc3RieW5hbWUoInNoYTUxMiIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVWUF9NRCA9IE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic2hhNTEyIik7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFID0gTmF0aXZlQ3J5cHRvLkVWUF9NRF9zaXplKEVWUF9NRCk7CiAgICAgICAgIHB1YmxpYyBTSEE1MTIoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHN1cGVyKCJTSEEtNTEyIiwgRVZQX01ELCBTSVpFKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xQcm92aWRlci5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFByb3ZpZGVyLmphdmEKaW5kZXggZDRhYTU3Zi4uMWM2YTg2ZSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFByb3ZpZGVyLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFByb3ZpZGVyLmphdmEKQEAgLTE4LDEzICsxOCwyMyBAQAogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKIAorLyoqCisgKiBQcm92aWRlciB0aGF0IGdvZXMgdGhyb3VnaCBPcGVuU1NMIGZvciBvcGVyYXRpb25zLgorICogPHA+CisgKiBFdmVyeSBhbGdvcml0aG0gc2hvdWxkIGhhdmUgaXRzIElBTkEgYXNzaWduZWQgT0lEIGFzIGFuIGFsaWFzLiBTZWUgdGhlIGZvbGxvd2luZyBVUkxzIGZvciBlYWNoIHR5cGU6CisgKiA8dWw+CisgKiA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9oYXNoLWZ1bmN0aW9uLXRleHQtbmFtZXMvaGFzaC1mdW5jdGlvbi10ZXh0LW5hbWVzLnhtbCI+SGFzaCBmdW5jdGlvbnM8L2E+PC9saT4KKyAqIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2Rzc2MvZHNzYy54bWwiPlNpZ25hdHVyZSBhbGdvcml0aG1zPC9hPjwvbGk+CisgKiA8bGk+PGEgaHJlZj0iaHR0cDovL2NzcmMubmlzdC5nb3YvZ3JvdXBzL1NUL2NyeXB0b19hcHBzX2luZnJhL2Nzb3IvYWxnb3JpdGhtcy5odG1sIj5OSVNUIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtczwvYT48L2xpPgorICogPC91bD4KKyAqLwogcHVibGljIGZpbmFsIGNsYXNzIE9wZW5TU0xQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9OQU1FID0gIkFuZHJvaWRPcGVuU1NMIjsKIAogICAgIHB1YmxpYyBPcGVuU1NMUHJvdmlkZXIoKSB7CiAgICAgICAgIHN1cGVyKFBST1ZJREVSX05BTUUsIDEuMCwgIkFuZHJvaWQncyBPcGVuU1NMLWJhY2tlZCBzZWN1cml0eSBwcm92aWRlciIpOwogCi0gICAgICAgIC8vIFNTTCBDb250ZXh0cworICAgICAgICAvKiA9PT0gU1NMIENvbnRleHRzID09PSAqLwogICAgICAgICBwdXQoIlNTTENvbnRleHQuU1NMIiwgT3BlblNTTENvbnRleHRJbXBsLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiU1NMQ29udGV4dC5TU0x2MyIsIE9wZW5TU0xDb250ZXh0SW1wbC5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBwdXQoIlNTTENvbnRleHQuVExTIiwgT3BlblNTTENvbnRleHRJbXBsLmNsYXNzLmdldE5hbWUoKSk7CkBAIC0zMyw3ICs0Myw3IEBACiAgICAgICAgIHB1dCgiU1NMQ29udGV4dC5UTFN2MS4yIiwgT3BlblNTTENvbnRleHRJbXBsLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiU1NMQ29udGV4dC5EZWZhdWx0IiwgRGVmYXVsdFNTTENvbnRleHRJbXBsLmNsYXNzLmdldE5hbWUoKSk7CiAKLSAgICAgICAgLy8gTWVzc2FnZSBEaWdlc3RzCisgICAgICAgIC8qID09PSBNZXNzYWdlIERpZ2VzdHMgPT09ICovCiAgICAgICAgIHB1dCgiTWVzc2FnZURpZ2VzdC5TSEEtMSIsCiAgICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMTWVzc2FnZURpZ2VzdEpESyRTSEExIik7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1lc3NhZ2VEaWdlc3QuU0hBMSIsICJTSEEtMSIpOwpAQCAtNTUsMjQgKzY1LDI4IEBACiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1lc3NhZ2VEaWdlc3QuU0hBNTEyIiwgIlNIQS01MTIiKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuTWVzc2FnZURpZ2VzdC4yLjE2Ljg0MC4xLjEwMS4zLjQuMi4zIiwgIlNIQS01MTIiKTsKIAorICAgICAgICAvLyBpc28oMSkgbWVtYmVyLWJvZHkoMikgVVMoODQwKSByc2Fkc2koMTEzNTQ5KSBkaWdlc3RBbGdvcml0aG0oMikgbWQ1KDUpCiAgICAgICAgIHB1dCgiTWVzc2FnZURpZ2VzdC5NRDUiLAogICAgICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTE1lc3NhZ2VEaWdlc3RKREskTUQ1Iik7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1lc3NhZ2VEaWdlc3QuMS4yLjg0MC4xMTM1NDkuMi41IiwgIk1ENSIpOwogCi0gICAgICAgIC8vIEtleVBhaXJHZW5lcmF0b3JzCisgICAgICAgIC8qID09IEtleVBhaXJHZW5lcmF0b3JzID09ICovCiAgICAgICAgIHB1dCgiS2V5UGFpckdlbmVyYXRvci5SU0EiLCBPcGVuU1NMUlNBS2V5UGFpckdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBwdXQoIkFsZy5BbGlhcy5LZXlQYWlyR2VuZXJhdG9yLjEuMi44NDAuMTEzNTQ5LjEuMS4xIiwgIlJTQSIpOwogCiAgICAgICAgIHB1dCgiS2V5UGFpckdlbmVyYXRvci5EU0EiLCBPcGVuU1NMRFNBS2V5UGFpckdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOwogCi0gICAgICAgIC8vIEtleUZhY3RvcnkKKyAgICAgICAgcHV0KCJLZXlQYWlyR2VuZXJhdG9yLkVDIiwgT3BlblNTTEVDS2V5UGFpckdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOwogCisgICAgICAgIC8qID09IEtleUZhY3RvcnkgPT0gKi8KICAgICAgICAgcHV0KCJLZXlGYWN0b3J5LlJTQSIsIE9wZW5TU0xSU0FLZXlGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLktleUZhY3RvcnkuMS4yLjg0MC4xMTM1NDkuMS4xLjEiLCAiUlNBIik7CiAKLSAgICAgICAgLy8gcHV0KCJLZXlGYWN0b3J5LkRTQSIsIE9wZW5TU0xEU0FLZXlGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiS2V5RmFjdG9yeS5EU0EiLCBPcGVuU1NMRFNBS2V5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwogCi0gICAgICAgIC8vIFNpZ25hdHVyZXMKKyAgICAgICAgcHV0KCJLZXlGYWN0b3J5LkVDIiwgT3BlblNTTEVDS2V5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIC8qID09IFNpZ25hdHVyZXMgPT0gKi8KICAgICAgICAgcHV0KCJTaWduYXR1cmUuTUQ1V2l0aFJTQSIsIE9wZW5TU0xTaWduYXR1cmUuTUQ1UlNBLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS5NRDVXaXRoUlNBRW5jcnlwdGlvbiIsICJNRDVXaXRoUlNBIik7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS5NRDUvUlNBIiwgIk1ENVdpdGhSU0EiKTsKQEAgLTgwLDcgKzk0LDcgQEAKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjEuMi44NDAuMTEzNTQ5LjIuNXdpdGgxLjIuODQwLjExMzU0OS4xLjEuMSIsICJNRDVXaXRoUlNBIik7CiAKICAgICAgICAgcHV0KCJTaWduYXR1cmUuU0hBMVdpdGhSU0EiLCBPcGVuU1NMU2lnbmF0dXJlLlNIQTFSU0EuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLlNIQTFXaXRoUlNBIiwgIlNIQTFXaXRoUlNBIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS5TSEExV2l0aFJTQUVuY3J5cHRpb24iLCAiU0hBMVdpdGhSU0EiKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLlNIQTEvUlNBIiwgIlNIQTFXaXRoUlNBIik7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS5TSEEtMS9SU0EiLCAiU0hBMVdpdGhSU0EiKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjEuMi44NDAuMTEzNTQ5LjEuMS41IiwgIlNIQTFXaXRoUlNBIik7CkBAIC05MSwxNCArMTA1LDIyIEBACiAgICAgICAgIHB1dCgiU2lnbmF0dXJlLlNIQTI1NldpdGhSU0EiLCBPcGVuU1NMU2lnbmF0dXJlLlNIQTI1NlJTQS5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuU0hBMjU2V2l0aFJTQUVuY3J5cHRpb24iLCAiU0hBMjU2V2l0aFJTQSIpOwogICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4yLjg0MC4xMTM1NDkuMS4xLjExIiwgIlNIQTI1NldpdGhSU0EiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjIuMTYuODQwLjEuMTAxLjMuNC4yLjF3aXRoMS4yLjg0MC4xMTM1NDkuMS4xLjEiLAorICAgICAgICAgICAgICAgICJTSEEyNTZXaXRoUlNBIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS4yLjE2Ljg0MC4xLjEwMS4zLjQuMi4xd2l0aDEuMi44NDAuMTEzNTQ5LjEuMS4xMSIsCisgICAgICAgICAgICAgICAgIlNIQTI1NldpdGhSU0EiKTsKIAogICAgICAgICBwdXQoIlNpZ25hdHVyZS5TSEEzODRXaXRoUlNBIiwgT3BlblNTTFNpZ25hdHVyZS5TSEEzODRSU0EuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLlNIQTM4NFdpdGhSU0FFbmNyeXB0aW9uIiwgIlNIQTM4NFdpdGhSU0EiKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjEuMi44NDAuMTEzNTQ5LjEuMS4xMiIsICJTSEEzODRXaXRoUlNBIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS4yLjE2Ljg0MC4xLjEwMS4zLjQuMi4yd2l0aDEuMi44NDAuMTEzNTQ5LjEuMS4xIiwKKyAgICAgICAgICAgICAgICAiU0hBMzg0V2l0aFJTQSIpOwogCiAgICAgICAgIHB1dCgiU2lnbmF0dXJlLlNIQTUxMldpdGhSU0EiLCBPcGVuU1NMU2lnbmF0dXJlLlNIQTUxMlJTQS5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuU0hBNTEyV2l0aFJTQUVuY3J5cHRpb24iLCAiU0hBNTEyV2l0aFJTQSIpOwogICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4yLjg0MC4xMTM1NDkuMS4xLjEzIiwgIlNIQTUxMldpdGhSU0EiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjIuMTYuODQwLjEuMTAxLjMuNC4yLjN3aXRoMS4yLjg0MC4xMTM1NDkuMS4xLjEiLAorICAgICAgICAgICAgICAgICJTSEE1MTJXaXRoUlNBIik7CiAKICAgICAgICAgcHV0KCJTaWduYXR1cmUuU0hBMXdpdGhEU0EiLCBPcGVuU1NMU2lnbmF0dXJlLlNIQTFEU0EuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLlNIQS9EU0EiLCAiU0hBMXdpdGhEU0EiKTsKQEAgLTExMCw3ICsxMzIsMzAgQEAKIAogICAgICAgICBwdXQoIlNpZ25hdHVyZS5OT05Fd2l0aFJTQSIsIE9wZW5TU0xTaWduYXR1cmVSYXdSU0EuY2xhc3MuZ2V0TmFtZSgpKTsKIAotICAgICAgICAvLyBTZWN1cmVSYW5kb20KKyAgICAgICAgcHV0KCJTaWduYXR1cmUuRUNEU0EiLCBPcGVuU1NMU2lnbmF0dXJlLlNIQTFFQ0RTQS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuU0hBMXdpdGhFQ0RTQSIsICJFQ0RTQSIpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuRUNEU0F3aXRoU0hBMSIsICJFQ0RTQSIpOworICAgICAgICAvLyBpc28oMSkgbWVtYmVyLWJvZHkoMikgdXMoODQwKSBhbnNpLXg5NjIoMTAwNDUpIHNpZ25hdHVyZXMoNCkgZWNkc2Etd2l0aC1TSEExKDEpCisgICAgICAgIHB1dCgiQWxnLkFsaWFzLlNpZ25hdHVyZS4xLjIuODQwLjEwMDQ1LjQuMSIsICJFQ0RTQSIpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4zLjE0LjMuMi4yNndpdGgxLjIuODQwLjEwMDQ1LjIuMSIsICJFQ0RTQSIpOworCisgICAgICAgIC8vIGlzbygxKSBtZW1iZXItYm9keSgyKSB1cyg4NDApIGFuc2kteDk2MigxMDA0NSkgc2lnbmF0dXJlcyg0KSBlY2RzYS13aXRoLVNIQTIoMykKKyAgICAgICAgcHV0KCJTaWduYXR1cmUuU0hBMjU2d2l0aEVDRFNBIiwgT3BlblNTTFNpZ25hdHVyZS5TSEEyNTZFQ0RTQS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAvLyBlY2RzYS13aXRoLVNIQTI1NigyKQorICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4yLjg0MC4xMDA0NS40LjMuMiIsICJTSEEyNTZ3aXRoRUNEU0EiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjIuMTYuODQwLjEuMTAxLjMuNC4yLjF3aXRoMS4yLjg0MC4xMDA0NS4yLjEiLCAiU0hBMjU2d2l0aEVDRFNBIik7CisKKyAgICAgICAgcHV0KCJTaWduYXR1cmUuU0hBMzg0d2l0aEVDRFNBIiwgT3BlblNTTFNpZ25hdHVyZS5TSEEzODRFQ0RTQS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAvLyBlY2RzYS13aXRoLVNIQTM4NCgzKQorICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4yLjg0MC4xMDA0NS40LjMuMyIsICJTSEEzODR3aXRoRUNEU0EiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjIuMTYuODQwLjEuMTAxLjMuNC4yLjJ3aXRoMS4yLjg0MC4xMDA0NS4yLjEiLCAiU0hBMzg0d2l0aEVDRFNBIik7CisKKyAgICAgICAgcHV0KCJTaWduYXR1cmUuU0hBNTEyd2l0aEVDRFNBIiwgT3BlblNTTFNpZ25hdHVyZS5TSEE1MTJFQ0RTQS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAvLyBlY2RzYS13aXRoLVNIQTUxMig0KQorICAgICAgICBwdXQoIkFsZy5BbGlhcy5TaWduYXR1cmUuMS4yLjg0MC4xMDA0NS40LjMuNCIsICJTSEE1MTJ3aXRoRUNEU0EiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuU2lnbmF0dXJlLjIuMTYuODQwLjEuMTAxLjMuNC4yLjN3aXRoMS4yLjg0MC4xMDA0NS4yLjEiLCAiU0hBNTEyd2l0aEVDRFNBIik7CisKKyAgICAgICAgLyogPT09IFNlY3VyZVJhbmRvbSA9PT0gKi8KICAgICAgICAgLyoKICAgICAgICAgICogV2UgaGF2ZSB0byBzcGVjaWZ5IFNIQTFQUk5HIGJlY2F1c2UgdmFyaW91cyBkb2N1bWVudGF0aW9uIG1lbnRpb25zCiAgICAgICAgICAqIHRoYXQgYWxnb3JpdGhtIGJ5IG5hbWUgaW5zdGVhZCBvZiBqdXN0IHJlY29tbWVuZGluZyBjYWxsaW5nCkBAIC0xMTksMTAgKzE2NCw2NyBAQAogICAgICAgICBwdXQoIlNlY3VyZVJhbmRvbS5TSEExUFJORyIsIE9wZW5TU0xSYW5kb20uY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgcHV0KCJTZWN1cmVSYW5kb20uU0hBMVBSTkcgSW1wbGVtZW50ZWRJbiIsICJTb2Z0d2FyZSIpOwogCi0gICAgICAgIC8vIENpcGhlcgorICAgICAgICAvKiA9PT0gQ2lwaGVyID09PSAqLwogICAgICAgICBwdXQoIkNpcGhlci5SU0EvRUNCL05vUGFkZGluZyIsIE9wZW5TU0xDaXBoZXJSU0EuUmF3LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLkNpcGhlci5SU0EvTm9uZS9Ob1BhZGRpbmciLCAiUlNBL0VDQi9Ob1BhZGRpbmciKTsKICAgICAgICAgcHV0KCJDaXBoZXIuUlNBL0VDQi9QS0NTMVBhZGRpbmciLCBPcGVuU1NMQ2lwaGVyUlNBLlBLQ1MxLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIHB1dCgiQWxnLkFsaWFzLkNpcGhlci5SU0EvTm9uZS9QS0NTMVBhZGRpbmciLCAiUlNBL0VDQi9QS0NTMVBhZGRpbmciKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPcGVuU1NMIG9ubHkgc3VwcG9ydHMgYSBzdWJzZXQgb2YgbW9kZXMsIHNvIHdlJ2xsIG5hbWUgdGhlbQorICAgICAgICAgKiBleHBsaWNpdGx5IGhlcmUuCisgICAgICAgICAqLworICAgICAgICBwdXQoIkNpcGhlci5BRVMvRUNCL05vUGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuQUVTLkVDQi5Ob1BhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuQUVTL0VDQi9QS0NTNVBhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkFFUy5FQ0IuUEtDUzVQYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiQ2lwaGVyLkFFUy9DQkMvTm9QYWRkaW5nIiwgT3BlblNTTENpcGhlci5BRVMuQ0JDLk5vUGFkZGluZy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkNpcGhlci5BRVMvQ0JDL1BLQ1M1UGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuQUVTLkNCQy5QS0NTNVBhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuQUVTL0NGQi9Ob1BhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkFFUy5DRkIuTm9QYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiQ2lwaGVyLkFFUy9DRkIvUEtDUzVQYWRkaW5nIiwgT3BlblNTTENpcGhlci5BRVMuQ0ZCLlBLQ1M1UGFkZGluZy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkNpcGhlci5BRVMvQ1RSL05vUGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuQUVTLkNUUi5Ob1BhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuQUVTL0NUUi9QS0NTNVBhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkFFUy5DVFIuUEtDUzVQYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiQ2lwaGVyLkFFUy9PRkIvTm9QYWRkaW5nIiwgT3BlblNTTENpcGhlci5BRVMuT0ZCLk5vUGFkZGluZy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkNpcGhlci5BRVMvT0ZCL1BLQ1M1UGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuQUVTLk9GQi5QS0NTNVBhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBwdXQoIkNpcGhlci5ERVNFREUvQ0JDL05vUGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuREVTRURFLkNCQy5Ob1BhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuREVTRURFL0NCQy9QS0NTNVBhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkRFU0VERS5DQkMuUEtDUzVQYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiQ2lwaGVyLkRFU0VERS9DRkIvTm9QYWRkaW5nIiwgT3BlblNTTENpcGhlci5ERVNFREUuQ0ZCLk5vUGFkZGluZy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkNpcGhlci5ERVNFREUvQ0ZCL1BLQ1M1UGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuREVTRURFLkNGQi5QS0NTNVBhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuREVTRURFL0VDQi9Ob1BhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkRFU0VERS5FQ0IuTm9QYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHB1dCgiQ2lwaGVyLkRFU0VERS9FQ0IvUEtDUzVQYWRkaW5nIiwgT3BlblNTTENpcGhlci5ERVNFREUuRUNCLlBLQ1M1UGFkZGluZy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkNpcGhlci5ERVNFREUvT0ZCL05vUGFkZGluZyIsIE9wZW5TU0xDaXBoZXIuREVTRURFLk9GQi5Ob1BhZGRpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJDaXBoZXIuREVTRURFL09GQi9QS0NTNVBhZGRpbmciLCBPcGVuU1NMQ2lwaGVyLkRFU0VERS5PRkIuUEtDUzVQYWRkaW5nLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHV0KCJDaXBoZXIuQVJDNCIsIE9wZW5TU0xDaXBoZXIuQVJDNC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIC8qID09PSBNYWMgPT09ICovCisKKyAgICAgICAgcHV0KCJNYWMuSG1hY01ENSIsIE9wZW5TU0xNYWMuSG1hY01ENS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIC8vIFBLQ1MjMiAtIGlzbygxKSBtZW1iZXItYm9keSgyKSBVUyg4NDApIHJzYWRzaSgxMTM1NDkpIGRpZ2VzdEFsZ29yaXRobSgyKQorICAgICAgICAvLyBodHRwOi8vd3d3Lm9pZC1pbmZvLmNvbS9nZXQvMS4yLjg0MC4xMTM1NDkuMgorCisgICAgICAgIC8vIEhNQUMtU0hBLTEgUFJGICg3KQorICAgICAgICBwdXQoIk1hYy5IbWFjU0hBMSIsIE9wZW5TU0xNYWMuSG1hY1NIQTEuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuTWFjLjEuMi44NDAuMTEzNTQ5LjIuNyIsICJIbWFjU0hBMSIpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5NYWMuSE1BQy1TSEExIiwgIkhtYWNTSEExIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1hYy5ITUFDL1NIQTEiLCAiSG1hY1NIQTEiKTsKKworICAgICAgICAvLyBpZC1obWFjV2l0aFNIQTI1NiAoOSkKKyAgICAgICAgcHV0KCJNYWMuSG1hY1NIQTI1NiIsIE9wZW5TU0xNYWMuSG1hY1NIQTI1Ni5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5NYWMuMS4yLjg0MC4xMTM1NDkuMi45IiwgIkhtYWNTSEEyNTYiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuTWFjLkhNQUMtU0hBMjU2IiwgIkhtYWNTSEEyNTYiKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuTWFjLkhNQUMvU0hBMjU2IiwgIkhtYWNTSEEyNTYiKTsKKworICAgICAgICAvLyBpZC1obWFjV2l0aFNIQTM4NCAoMTApCisgICAgICAgIHB1dCgiTWFjLkhtYWNTSEEzODQiLCBPcGVuU1NMTWFjLkhtYWNTSEEzODQuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHV0KCJBbGcuQWxpYXMuTWFjLjEuMi44NDAuMTEzNTQ5LjIuMTAiLCAiSG1hY1NIQTM4NCIpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5NYWMuSE1BQy1TSEEzODQiLCAiSG1hY1NIQTM4NCIpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5NYWMuSE1BQy9TSEEzODQiLCAiSG1hY1NIQTM4NCIpOworCisgICAgICAgIC8vIGlkLWhtYWNXaXRoU0hBMzg0ICgxMSkKKyAgICAgICAgcHV0KCJNYWMuSG1hY1NIQTUxMiIsIE9wZW5TU0xNYWMuSG1hY1NIQTUxMi5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBwdXQoIkFsZy5BbGlhcy5NYWMuMS4yLjg0MC4xMTM1NDkuMi4xMSIsICJIbWFjU0hBNTEyIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1hYy5ITUFDLVNIQTUxMiIsICJIbWFjU0hBNTEyIik7CisgICAgICAgIHB1dCgiQWxnLkFsaWFzLk1hYy5ITUFDL1NIQTUxMiIsICJIbWFjU0hBNTEyIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQUtleUZhY3RvcnkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xSU0FLZXlGYWN0b3J5LmphdmEKaW5kZXggNDlkMzFkMy4uZThiMGFmYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQUtleUZhY3RvcnkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMUlNBS2V5RmFjdG9yeS5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVB1YmxpY0tleVNwZWM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlg1MDlFbmNvZGVkS2V5U3BlYzsKIAotcHVibGljIGNsYXNzIE9wZW5TU0xSU0FLZXlGYWN0b3J5PFQsIFM+IGV4dGVuZHMgS2V5RmFjdG9yeVNwaSB7CitwdWJsaWMgY2xhc3MgT3BlblNTTFJTQUtleUZhY3RvcnkgZXh0ZW5kcyBLZXlGYWN0b3J5U3BpIHsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBQdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoS2V5U3BlYyBrZXlTcGVjKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24gewpAQCAtOTUsMTEgKzk1LDExIEBACiAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FQdWJsaWNLZXkpIHsKICAgICAgICAgICAgIFJTQVB1YmxpY0tleSByc2FLZXkgPSAoUlNBUHVibGljS2V5KSBrZXk7CiAKLSAgICAgICAgICAgIGlmIChSU0FQdWJsaWNLZXlTcGVjLmNsYXNzLmVxdWFscyhrZXlTcGVjKSkgeworICAgICAgICAgICAgaWYgKFJTQVB1YmxpY0tleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgewogICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbW9kdWx1cyA9IHJzYUtleS5nZXRNb2R1bHVzKCk7CiAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudCA9IHJzYUtleS5nZXRQdWJsaWNFeHBvbmVudCgpOwogICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IFJTQVB1YmxpY0tleVNwZWMobW9kdWx1cywgcHVibGljRXhwb25lbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChYNTA5RW5jb2RlZEtleVNwZWMuY2xhc3MuZXF1YWxzKGtleVNwZWMpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGtleS5nZXRFbmNvZGVkKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIk11c3QgYmUgUlNBUHVibGljS2V5U3BlYyBvciBYNTA5RW5jb2RlZEtleVNwZWMiKTsKQEAgLTEwNywxMSArMTA3LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FQcml2YXRlQ3J0S2V5KSB7CiAgICAgICAgICAgICBSU0FQcml2YXRlQ3J0S2V5IHJzYUtleSA9IChSU0FQcml2YXRlQ3J0S2V5KSBrZXk7CiAKLSAgICAgICAgICAgIGlmIChSU0FQcml2YXRlS2V5U3BlYy5jbGFzcy5lcXVhbHMoa2V5U3BlYykpIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1vZHVsdXMgPSByc2FLZXkuZ2V0TW9kdWx1cygpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50ID0gcnNhS2V5LmdldFByaXZhdGVFeHBvbmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IFJTQVByaXZhdGVLZXlTcGVjKG1vZHVsdXMsIHByaXZhdGVFeHBvbmVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFJTQVByaXZhdGVDcnRLZXlTcGVjLmNsYXNzLmVxdWFscyhrZXlTcGVjKSkgeworICAgICAgICAgICAgaWYgKFJTQVByaXZhdGVDcnRLZXlTcGVjLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2V5U3BlYykpIHsKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1vZHVsdXMgPSByc2FLZXkuZ2V0TW9kdWx1cygpOwogICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQgPSByc2FLZXkuZ2V0UHVibGljRXhwb25lbnQoKTsKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCA9IHJzYUtleS5nZXRQcml2YXRlRXhwb25lbnQoKTsKQEAgLTEyMiw3ICsxMTgsMTEgQEAKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50ID0gcnNhS2V5LmdldENydENvZWZmaWNpZW50KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgUlNBUHJpdmF0ZUNydEtleVNwZWMobW9kdWx1cywgcHVibGljRXhwb25lbnQsIHByaXZhdGVFeHBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1lUCwgcHJpbWVRLCBwcmltZUV4cG9uZW50UCwgcHJpbWVFeHBvbmVudFEsIGNydENvZWZmaWNpZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoUEtDUzhFbmNvZGVkS2V5U3BlYy5jbGFzcy5lcXVhbHMoa2V5U3BlYykpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUlNBUHJpdmF0ZUtleVNwZWMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrZXlTcGVjKSkgeworICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbW9kdWx1cyA9IHJzYUtleS5nZXRNb2R1bHVzKCk7CisgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQgPSByc2FLZXkuZ2V0UHJpdmF0ZUV4cG9uZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgUlNBUHJpdmF0ZUtleVNwZWMobW9kdWx1cywgcHJpdmF0ZUV4cG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUEtDUzhFbmNvZGVkS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhyc2FLZXkuZ2V0RW5jb2RlZCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlTcGVjRXhjZXB0aW9uKApAQCAtMTMxLDE2ICsxMzEsMTEgQEAKICAgICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FQcml2YXRlS2V5KSB7CiAgICAgICAgICAgICBSU0FQcml2YXRlS2V5IHJzYUtleSA9IChSU0FQcml2YXRlS2V5KSBrZXk7CiAKLSAgICAgICAgICAgIGlmIChSU0FQcml2YXRlS2V5U3BlYy5jbGFzcy5lcXVhbHMoa2V5U3BlYykpIHsKKyAgICAgICAgICAgIGlmIChSU0FQcml2YXRlS2V5U3BlYy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtleVNwZWMpKSB7CiAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBtb2R1bHVzID0gcnNhS2V5LmdldE1vZHVsdXMoKTsKICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudCA9IHJzYUtleS5nZXRQcml2YXRlRXhwb25lbnQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBSU0FQcml2YXRlS2V5U3BlYyhtb2R1bHVzLCBwcml2YXRlRXhwb25lbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChSU0FQcml2YXRlQ3J0S2V5U3BlYy5jbGFzcy5lcXVhbHMoa2V5U3BlYykpIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1vZHVsdXMgPSByc2FLZXkuZ2V0TW9kdWx1cygpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50ID0gcnNhS2V5LmdldFByaXZhdGVFeHBvbmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IFJTQVByaXZhdGVDcnRLZXlTcGVjKG1vZHVsdXMsIG51bGwsIHByaXZhdGVFeHBvbmVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChQS0NTOEVuY29kZWRLZXlTcGVjLmNsYXNzLmVxdWFscyhrZXlTcGVjKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChQS0NTOEVuY29kZWRLZXlTcGVjLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2V5U3BlYykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKHJzYUtleS5nZXRFbmNvZGVkKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMUlNBUHJpdmF0ZUNydEtleS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQVByaXZhdGVDcnRLZXkuamF2YQppbmRleCA0MzAzZTVhLi44NjJiMjAxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMUlNBUHJpdmF0ZUNydEtleS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xSU0FQcml2YXRlQ3J0S2V5LmphdmEKQEAgLTE2LDYgKzE2LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXk7CkBAIC0yNCw2ICsyOCw4IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVDcnRLZXlTcGVjOwogCiBwdWJsaWMgY2xhc3MgT3BlblNTTFJTQVByaXZhdGVDcnRLZXkgZXh0ZW5kcyBPcGVuU1NMUlNBUHJpdmF0ZUtleSBpbXBsZW1lbnRzIFJTQVByaXZhdGVDcnRLZXkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3ODUyOTE5NDQ4Njg3MDcxOTdMOworCiAgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50OwogCiAgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHByaW1lUDsKQEAgLTE5MywxNiArMTk5LDcgQEAKIAogICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE9wZW5TU0xSU0FQcml2YXRlS2V5KSB7CiAgICAgICAgICAgICBPcGVuU1NMUlNBUHJpdmF0ZUtleSBvdGhlciA9IChPcGVuU1NMUlNBUHJpdmF0ZUtleSkgbzsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIGNhbiBzaG9ydGN1dCB0aGUgdHJ1ZSBjYXNlLCBidXQgaXQgc3RpbGwgbWF5IGJlIGVxdWl2YWxlbnQgYnV0Ci0gICAgICAgICAgICAgKiBkaWZmZXJlbnQgY29waWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZ2V0T3BlblNTTEtleSgpLmVxdWFscyhvdGhlci5nZXRPcGVuU1NMS2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfY21wKGdldFBrZXlDb250ZXh0KCksIG90aGVyLmdldFBrZXlDb250ZXh0KCkpID09IDE7CisgICAgICAgICAgICByZXR1cm4gZ2V0T3BlblNTTEtleSgpLmVxdWFscyhvdGhlci5nZXRPcGVuU1NMS2V5KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSU0FQcml2YXRlQ3J0S2V5KSB7CkBAIC0zMDUsNCArMzAyLDI3IEBACiAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICBrZXkgPSBuZXcgT3BlblNTTEtleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfbmV3X1JTQSgKKyAgICAgICAgICAgICAgICBtb2R1bHVzLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgcHVibGljRXhwb25lbnQgPT0gbnVsbCA/IG51bGwgOiBwdWJsaWNFeHBvbmVudC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHByaXZhdGVFeHBvbmVudC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHByaW1lUCA9PSBudWxsID8gbnVsbCA6IHByaW1lUC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHByaW1lUSA9PSBudWxsID8gbnVsbCA6IHByaW1lUS50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHByaW1lRXhwb25lbnRQID09IG51bGwgPyBudWxsIDogcHJpbWVFeHBvbmVudFAudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBwcmltZUV4cG9uZW50USA9PSBudWxsID8gbnVsbCA6IHByaW1lRXhwb25lbnRRLnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgY3J0Q29lZmZpY2llbnQgPT0gbnVsbCA/IG51bGwgOiBjcnRDb2VmZmljaWVudC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIGZldGNoZWRQYXJhbXMgPSB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0T3BlblNTTEtleSgpLmlzRW5naW5lQmFzZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbigiZW5naW5lLWJhc2VkIGtleXMgY2FuIG5vdCBiZSBzZXJpYWxpemVkIik7CisgICAgICAgIH0KKyAgICAgICAgZW5zdXJlUmVhZFBhcmFtcygpOworICAgICAgICBzdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQVByaXZhdGVLZXkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xSU0FQcml2YXRlS2V5LmphdmEKaW5kZXggYWRiMDVhOS4uMjY5YzM1NSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQVByaXZhdGVLZXkuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMUlNBUHJpdmF0ZUtleS5qYXZhCkBAIC0xNiwyMiArMTYsMjYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUtleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVLZXlTcGVjOwogCi1wdWJsaWMgY2xhc3MgT3BlblNTTFJTQVByaXZhdGVLZXkgaW1wbGVtZW50cyBSU0FQcml2YXRlS2V5IHsKK3B1YmxpYyBjbGFzcyBPcGVuU1NMUlNBUHJpdmF0ZUtleSBpbXBsZW1lbnRzIFJTQVByaXZhdGVLZXksIE9wZW5TU0xLZXlIb2xkZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NzIxNzAyNTQ0Mzk1Nzg3MzVMOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBPcGVuU1NMS2V5IGtleTsKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE9wZW5TU0xLZXkga2V5OwogCi0gICAgcHJpdmF0ZSBib29sZWFuIGZldGNoZWRQYXJhbXM7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBib29sZWFuIGZldGNoZWRQYXJhbXM7CiAKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgbW9kdWx1czsKKyAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBtb2R1bHVzOwogCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHByaXZhdGVFeHBvbmVudDsKKyAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQ7CiAKICAgICBPcGVuU1NMUlNBUHJpdmF0ZUtleShPcGVuU1NMS2V5IGtleSkgewogICAgICAgICB0aGlzLmtleSA9IGtleTsKQEAgLTQzLDcgKzQ3LDggQEAKICAgICAgICAgZmV0Y2hlZFBhcmFtcyA9IHRydWU7CiAgICAgfQogCi0gICAgZmluYWwgT3BlblNTTEtleSBnZXRPcGVuU1NMS2V5KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcGVuU1NMS2V5IGdldE9wZW5TU0xLZXkoKSB7CiAgICAgICAgIHJldHVybiBrZXk7CiAgICAgfQogCkBAIC0xNzYsMTQgKzE4MSw2IEBACiAgICAgICAgIHJldHVybiAiUlNBIjsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGdldFBrZXlDb250ZXh0KCkgewotICAgICAgICByZXR1cm4ga2V5LmdldFBrZXlDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQa2V5QWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiBrZXkuZ2V0QWxpYXMoKTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgaWYgKG8gPT0gdGhpcykgewpAQCAtMTkyLDE2ICsxODksNyBAQAogCiAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgT3BlblNTTFJTQVByaXZhdGVLZXkpIHsKICAgICAgICAgICAgIE9wZW5TU0xSU0FQcml2YXRlS2V5IG90aGVyID0gKE9wZW5TU0xSU0FQcml2YXRlS2V5KSBvOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogV2UgY2FuIHNob3J0Y3V0IHRoZSB0cnVlIGNhc2UsIGJ1dCBpdCBzdGlsbCBtYXkgYmUgZXF1aXZhbGVudCBidXQKLSAgICAgICAgICAgICAqIGRpZmZlcmVudCBjb3BpZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKG90aGVyLmdldE9wZW5TU0xLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9jbXAoZ2V0UGtleUNvbnRleHQoKSwgb3RoZXIuZ2V0UGtleUNvbnRleHQoKSkgPT0gMTsKKyAgICAgICAgICAgIHJldHVybiBrZXkuZXF1YWxzKG90aGVyLmdldE9wZW5TU0xLZXkoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXkpIHsKQEAgLTI1Miw0ICsyNDAsMjcgQEAKIAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5kZWZhdWx0UmVhZE9iamVjdCgpOworCisgICAgICAgIGtleSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfUlNBKAorICAgICAgICAgICAgICAgIG1vZHVsdXMudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIHByaXZhdGVFeHBvbmVudC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICBmZXRjaGVkUGFyYW1zID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldE9wZW5TU0xLZXkoKS5pc0VuZ2luZUJhc2VkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oImVuZ2luZS1iYXNlZCBrZXlzIGNhbiBub3QgYmUgc2VyaWFsaXplZCIpOworICAgICAgICB9CisgICAgICAgIGVuc3VyZVJlYWRQYXJhbXMoKTsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xSU0FQdWJsaWNLZXkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xSU0FQdWJsaWNLZXkuamF2YQppbmRleCAxNjEzY2YwLi4wOGIxOTIwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMUlNBUHVibGljS2V5LmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFJTQVB1YmxpY0tleS5qYXZhCkBAIC0xNiwyOCArMTYsMzIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHVibGljS2V5U3BlYzsKIAotcHVibGljIGNsYXNzIE9wZW5TU0xSU0FQdWJsaWNLZXkgaW1wbGVtZW50cyBSU0FQdWJsaWNLZXkgeworcHVibGljIGNsYXNzIE9wZW5TU0xSU0FQdWJsaWNLZXkgaW1wbGVtZW50cyBSU0FQdWJsaWNLZXksIE9wZW5TU0xLZXlIb2xkZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyMzEyNTAwNTgyNDY4ODI5Mkw7CiAKLSAgICBwcml2YXRlIGZpbmFsIE9wZW5TU0xLZXkga2V5OworICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZW5TU0xLZXkga2V5OwogCiAgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50OwogCiAgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIG1vZHVsdXM7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gZmV0Y2hlZFBhcmFtczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGZldGNoZWRQYXJhbXM7CiAKICAgICBPcGVuU1NMUlNBUHVibGljS2V5KE9wZW5TU0xLZXkga2V5KSB7CiAgICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgIH0KIAotICAgIE9wZW5TU0xLZXkgZ2V0T3BlblNTTEtleSgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3BlblNTTEtleSBnZXRPcGVuU1NMS2V5KCkgewogICAgICAgICByZXR1cm4ga2V5OwogICAgIH0KIApAQCAtMTYyLDQgKzE2NiwyNCBAQAogCiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAga2V5ID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX25ld19SU0EoCisgICAgICAgICAgICAgICAgbW9kdWx1cy50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50LnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwpKTsKKyAgICAgICAgZmV0Y2hlZFBhcmFtcyA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZVJlYWRQYXJhbXMoKTsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZWNyZXRLZXkuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZWNyZXRLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM1OWRjCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNlY3JldEtleS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKKworcHVibGljIGNsYXNzIE9wZW5TU0xTZWNyZXRLZXkgaW1wbGVtZW50cyBTZWNyZXRLZXksIE9wZW5TU0xLZXlIb2xkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE4MzEwNTMwNjI5MTE1MTQ1ODlMOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxnb3JpdGhtOworICAgIHByaXZhdGUgZmluYWwgaW50IHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gZW5jb2RlZDsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZW5TU0xLZXkga2V5OworCisgICAgcHVibGljIE9wZW5TU0xTZWNyZXRLZXkoU3RyaW5nIGFsZ29yaXRobSwgYnl0ZVtdIGVuY29kZWQpIHsKKyAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgICAgIHRoaXMuZW5jb2RlZCA9IGVuY29kZWQ7CisKKyAgICAgICAgdHlwZSA9IE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9ITUFDOworICAgICAgICBrZXkgPSBuZXcgT3BlblNTTEtleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfbmV3X21hY19rZXkodHlwZSwgZW5jb2RlZCkpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuU1NMU2VjcmV0S2V5KFN0cmluZyBhbGdvcml0aG0sIE9wZW5TU0xLZXkga2V5KSB7CisgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKworICAgICAgICB0eXBlID0gTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX3R5cGUoa2V5LmdldFBrZXlDb250ZXh0KCkpOworICAgICAgICBlbmNvZGVkID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wZW5TU0xLZXkgZ2V0SW5zdGFuY2UoU2VjcmV0S2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfbWFjX2tleShOYXRpdmVDcnlwdG8uRVZQX1BLRVlfSE1BQywKKyAgICAgICAgICAgICAgICAgICAga2V5LmdldEVuY29kZWQoKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgaWYgKGtleS5pc0VuZ2luZUJhc2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICJSQVciOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgaWYgKGtleS5pc0VuZ2luZUJhc2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVuY29kZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wZW5TU0xLZXkgZ2V0T3BlblNTTEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2VjcmV0S2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU2VjcmV0S2V5IG90aGVyID0gKFNlY3JldEtleSkgbzsKKyAgICAgICAgaWYgKCFhbGdvcml0aG0uZXF1YWxzKG90aGVyLmdldEFsZ29yaXRobSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBPcGVuU1NMU2VjcmV0S2V5KSB7CisgICAgICAgICAgICBPcGVuU1NMU2VjcmV0S2V5IG90aGVyT3BlblNTTCA9IChPcGVuU1NMU2VjcmV0S2V5KSBvOworICAgICAgICAgICAgcmV0dXJuIGtleS5lcXVhbHMob3RoZXJPcGVuU1NMLmdldE9wZW5TU0xLZXkoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmlzRW5naW5lQmFzZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRGb3JtYXQoKS5lcXVhbHMob3RoZXIuZ2V0Rm9ybWF0KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhlbmNvZGVkLCBvdGhlci5nZXRFbmNvZGVkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5kZWZhdWx0UmVhZE9iamVjdCgpOworCisgICAgICAgIGtleSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfbWFjX2tleSh0eXBlLCBlbmNvZGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRPcGVuU1NMS2V5KCkuaXNFbmdpbmVCYXNlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKCJlbmdpbmUtYmFzZWQga2V5cyBjYW4gbm90IGJlIHNlcmlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbS5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2VydmVyU29ja2V0SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNlcnZlclNvY2tldEltcGwuamF2YQppbmRleCAyZjVmZTU5Li45NzQ0ZmUwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2VydmVyU29ja2V0SW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZXJ2ZXJTb2NrZXRJbXBsLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBwcml2YXRlIGZpbmFsIFNTTFBhcmFtZXRlcnNJbXBsIHNzbFBhcmFtZXRlcnM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBlbmFibGVkUHJvdG9jb2xzID0gTmF0aXZlQ3J5cHRvLmdldFN1cHBvcnRlZFByb3RvY29scygpOwogICAgIHByaXZhdGUgU3RyaW5nW10gZW5hYmxlZENpcGhlclN1aXRlcyA9IE5hdGl2ZUNyeXB0by5nZXREZWZhdWx0Q2lwaGVyU3VpdGVzKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGNoYW5uZWxJZEVuYWJsZWQ7CiAKICAgICBwcm90ZWN0ZWQgT3BlblNTTFNlcnZlclNvY2tldEltcGwoU1NMUGFyYW1ldGVyc0ltcGwgc3NsUGFyYW1ldGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5zc2xQYXJhbWV0ZXJzID0gc3NsUGFyYW1ldGVyczsKQEAgLTExMyw2ICsxMTQsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSBUTFMgQ2hhbm5lbCBJRCBleHRlbnNpb24gZm9yIHRoaXMgc2VydmVyIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsSWRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgY2hhbm5lbElkRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIFRMUyBDaGFubmVsIElEIGV4dGVuc2lvbiBpcyBlbmFibGVkIGZvciB0aGlzIHNlcnZlciBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFubmVsSWRFbmFibGVkKCkgeworICAgICAgcmV0dXJuIGNoYW5uZWxJZEVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyB0aGUgY2lwaGVyIHN1aXRlcyBsaXN0ZWQgYnkKICAgICAgKiBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKS4KICAgICAgKgpAQCAtMTY1LDYgKzE4MCw3IEBACiAgICAgICAgIE9wZW5TU0xTb2NrZXRJbXBsIHNvY2tldCA9IG5ldyBPcGVuU1NMU29ja2V0SW1wbChzc2xQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFByb3RvY29scy5jbG9uZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZENpcGhlclN1aXRlcy5jbG9uZSgpKTsKKyAgICAgICAgc29ja2V0LnNldENoYW5uZWxJZEVuYWJsZWQoY2hhbm5lbElkRW5hYmxlZCk7CiAgICAgICAgIGltcGxBY2NlcHQoc29ja2V0KTsKICAgICAgICAgcmV0dXJuIHNvY2tldDsKICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2Vzc2lvbkltcGwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZXNzaW9uSW1wbC5qYXZhCmluZGV4IDAwMzEyMmYuLjE0NjUwMjcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZXNzaW9uSW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTZXNzaW9uSW1wbC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKICAgICBwcml2YXRlIHZvbGF0aWxlIGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gcGVlckNlcnRpZmljYXRlQ2hhaW47Ci0gICAgcHJvdGVjdGVkIGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcjsKKyAgICBwcm90ZWN0ZWQgbG9uZyBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcjsKICAgICBwcml2YXRlIFN0cmluZyBwZWVySG9zdDsKICAgICBwcml2YXRlIGludCBwZWVyUG9ydCA9IC0xOwogICAgIHByaXZhdGUgU3RyaW5nIGNpcGhlclN1aXRlOwpAQCAtNTYsNyArNTYsNyBAQAogICAgICAqIENsYXNzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gU1NMIHNlc3Npb24gY29udGV4dCBnaXZlbiB0aGUgYXBwcm9wcmlhdGUKICAgICAgKiBTU0wgcGFyYW1ldGVycy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3BlblNTTFNlc3Npb25JbXBsKGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlciwgWDUwOUNlcnRpZmljYXRlW10gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgcHJvdGVjdGVkIE9wZW5TU0xTZXNzaW9uSW1wbChsb25nIHNzbFNlc3Npb25OYXRpdmVQb2ludGVyLCBYNTA5Q2VydGlmaWNhdGVbXSBsb2NhbENlcnRpZmljYXRlcywKICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIHBlZXJDZXJ0aWZpY2F0ZXMsIFN0cmluZyBwZWVySG9zdCwgaW50IHBlZXJQb3J0LAogICAgICAgICAgICAgQWJzdHJhY3RTZXNzaW9uQ29udGV4dCBzZXNzaW9uQ29udGV4dCkgewogICAgICAgICB0aGlzLnNzbFNlc3Npb25OYXRpdmVQb2ludGVyID0gc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXI7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2lnbmF0dXJlLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2lnbmF0dXJlLmphdmEKaW5kZXggZDk3NDZjNi4uMzQxMTVlYSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNpZ25hdHVyZS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTaWduYXR1cmUuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkVDUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQdWJsaWNLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVB1YmxpY0tleTsKQEAgLTM1LDEzICszNywxMyBAQAogICovCiBwdWJsaWMgY2xhc3MgT3BlblNTTFNpZ25hdHVyZSBleHRlbmRzIFNpZ25hdHVyZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBFbmdpbmVUeXBlIHsKLSAgICAgICAgUlNBLCBEU0EsCisgICAgICAgIFJTQSwgRFNBLCBFQywKICAgICB9OwogCiAgICAgLyoqCiAgICAgICogSG9sZHMgYSBwb2ludGVyIHRvIHRoZSBuYXRpdmUgbWVzc2FnZSBkaWdlc3QgY29udGV4dC4KICAgICAgKi8KLSAgICBwcml2YXRlIGludCBjdHg7CisgICAgcHJpdmF0ZSBsb25nIGN0eDsKIAogICAgIC8qKgogICAgICAqIFRoZSBjdXJyZW50IE9wZW5TU0wga2V5IHdlJ3JlIG9wZXJhdGluZyBvbi4KQEAgLTExNywzMSArMTE5LDM4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjaGVja0VuZ2luZVR5cGUoT3BlblNTTEtleSBwa2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBwa2V5VHlwZSA9IE5hdGl2ZUNyeXB0by5FVlBfUEtFWV90eXBlKHBrZXkuZ2V0UGtleUNvbnRleHQoKSk7CisKKyAgICAgICAgc3dpdGNoIChlbmdpbmVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTQToKKyAgICAgICAgICAgICAgICBpZiAocGtleVR5cGUgIT0gTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX1JTQSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBSU0EiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERTQToKKyAgICAgICAgICAgICAgICBpZiAocGtleVR5cGUgIT0gTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX0RTQSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBEU0EiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVDOgorICAgICAgICAgICAgICAgIGlmIChwa2V5VHlwZSAhPSBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfRUMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgRUMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJOZWVkIERTQSBvciBSU0Egb3IgRUMgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRTaWduKFByaXZhdGVLZXkgcHJpdmF0ZUtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICBkZXN0cm95Q29udGV4dElmRXhpc3RzKCk7CiAKLSAgICAgICAgaWYgKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBPcGVuU1NMRFNBUHJpdmF0ZUtleSkgewotICAgICAgICAgICAgaWYgKGVuZ2luZVR5cGUgIT0gRW5naW5lVHlwZS5EU0EpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBEU0EiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT3BlblNTTERTQVByaXZhdGVLZXkgZHNhUHJpdmF0ZUtleSA9IChPcGVuU1NMRFNBUHJpdmF0ZUtleSkgcHJpdmF0ZUtleTsKLSAgICAgICAgICAgIGtleSA9IGRzYVByaXZhdGVLZXkuZ2V0T3BlblNTTEtleSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBEU0FQcml2YXRlS2V5KSB7Ci0gICAgICAgICAgICBpZiAoZW5naW5lVHlwZSAhPSBFbmdpbmVUeXBlLkRTQSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJTaWduYXR1cmUgbm90IGluaXRpYWxpemVkIGFzIERTQSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEU0FQcml2YXRlS2V5IGRzYVByaXZhdGVLZXkgPSAoRFNBUHJpdmF0ZUtleSkgcHJpdmF0ZUtleTsKLSAgICAgICAgICAgIGtleSA9IE9wZW5TU0xEU0FQcml2YXRlS2V5LmdldEluc3RhbmNlKGRzYVByaXZhdGVLZXkpOwotICAgICAgICB9IGVsc2UgaWYgKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBPcGVuU1NMUlNBUHJpdmF0ZUtleSkgewotICAgICAgICAgICAgaWYgKGVuZ2luZVR5cGUgIT0gRW5naW5lVHlwZS5SU0EpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBSU0EiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT3BlblNTTFJTQVByaXZhdGVLZXkgcnNhUHJpdmF0ZUtleSA9IChPcGVuU1NMUlNBUHJpdmF0ZUtleSkgcHJpdmF0ZUtleTsKLSAgICAgICAgICAgIGtleSA9IHJzYVByaXZhdGVLZXkuZ2V0T3BlblNTTEtleSgpOworICAgICAgICBpZiAocHJpdmF0ZUtleSBpbnN0YW5jZW9mIE9wZW5TU0xLZXlIb2xkZXIpIHsKKyAgICAgICAgICAgIE9wZW5TU0xLZXkgcGtleSA9ICgoT3BlblNTTEtleUhvbGRlcikgcHJpdmF0ZUtleSkuZ2V0T3BlblNTTEtleSgpOworICAgICAgICAgICAgY2hlY2tFbmdpbmVUeXBlKHBrZXkpOworICAgICAgICAgICAga2V5ID0gcGtleTsKICAgICAgICAgfSBlbHNlIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgUlNBUHJpdmF0ZUNydEtleSkgewogICAgICAgICAgICAgaWYgKGVuZ2luZVR5cGUgIT0gRW5naW5lVHlwZS5SU0EpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBSU0EiKTsKQEAgLTE1Niw4ICsxNjUsMjIgQEAKIAogICAgICAgICAgICAgUlNBUHJpdmF0ZUtleSByc2FQcml2YXRlS2V5ID0gKFJTQVByaXZhdGVLZXkpIHByaXZhdGVLZXk7CiAgICAgICAgICAgICBrZXkgPSBPcGVuU1NMUlNBUHJpdmF0ZUtleS5nZXRJbnN0YW5jZShyc2FQcml2YXRlS2V5KTsKKyAgICAgICAgfSBlbHNlIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgRFNBUHJpdmF0ZUtleSkgeworICAgICAgICAgICAgaWYgKGVuZ2luZVR5cGUgIT0gRW5naW5lVHlwZS5EU0EpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiU2lnbmF0dXJlIG5vdCBpbml0aWFsaXplZCBhcyBEU0EiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRFNBUHJpdmF0ZUtleSBkc2FQcml2YXRlS2V5ID0gKERTQVByaXZhdGVLZXkpIHByaXZhdGVLZXk7CisgICAgICAgICAgICBrZXkgPSBPcGVuU1NMRFNBUHJpdmF0ZUtleS5nZXRJbnN0YW5jZShkc2FQcml2YXRlS2V5KTsKKyAgICAgICAgfSBlbHNlIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgRUNQcml2YXRlS2V5KSB7CisgICAgICAgICAgICBpZiAoZW5naW5lVHlwZSAhPSBFbmdpbmVUeXBlLkVDKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgRUMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRUNQcml2YXRlS2V5IGVjUHJpdmF0ZUtleSA9IChFQ1ByaXZhdGVLZXkpIHByaXZhdGVLZXk7CisgICAgICAgICAgICBrZXkgPSBPcGVuU1NMRUNQcml2YXRlS2V5LmdldEluc3RhbmNlKGVjUHJpdmF0ZUtleSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTmVlZCBEU0Egb3IgUlNBIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTmVlZCBEU0Egb3IgUlNBIG9yIEVDIHByaXZhdGUga2V5Iik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NiwyNyArMTg5LDEwIEBACiAgICAgICAgIC8vIElmIHdlIGhhZCBhbiBleGlzdGluZyBjb250ZXh0LCBkZXN0cm95IGl0IGZpcnN0LgogICAgICAgICBkZXN0cm95Q29udGV4dElmRXhpc3RzKCk7CiAKLSAgICAgICAgaWYgKHB1YmxpY0tleSBpbnN0YW5jZW9mIE9wZW5TU0xEU0FQdWJsaWNLZXkpIHsKLSAgICAgICAgICAgIGlmIChlbmdpbmVUeXBlICE9IEVuZ2luZVR5cGUuRFNBKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgRFNBIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9wZW5TU0xEU0FQdWJsaWNLZXkgZHNhUHVibGljS2V5ID0gKE9wZW5TU0xEU0FQdWJsaWNLZXkpIHB1YmxpY0tleTsKLSAgICAgICAgICAgIGtleSA9IGRzYVB1YmxpY0tleS5nZXRPcGVuU1NMS2V5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHVibGljS2V5IGluc3RhbmNlb2YgRFNBUHVibGljS2V5KSB7Ci0gICAgICAgICAgICBpZiAoZW5naW5lVHlwZSAhPSBFbmdpbmVUeXBlLkRTQSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJTaWduYXR1cmUgbm90IGluaXRpYWxpemVkIGFzIERTQSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEU0FQdWJsaWNLZXkgZHNhUHVibGljS2V5ID0gKERTQVB1YmxpY0tleSkgcHVibGljS2V5OwotICAgICAgICAgICAga2V5ID0gT3BlblNTTERTQVB1YmxpY0tleS5nZXRJbnN0YW5jZShkc2FQdWJsaWNLZXkpOwotICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY0tleSBpbnN0YW5jZW9mIE9wZW5TU0xSU0FQdWJsaWNLZXkpIHsKLSAgICAgICAgICAgIGlmIChlbmdpbmVUeXBlICE9IEVuZ2luZVR5cGUuUlNBKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgUlNBIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9wZW5TU0xSU0FQdWJsaWNLZXkgcnNhUHVibGljS2V5ID0gKE9wZW5TU0xSU0FQdWJsaWNLZXkpIHB1YmxpY0tleTsKLSAgICAgICAgICAgIGtleSA9IHJzYVB1YmxpY0tleS5nZXRPcGVuU1NMS2V5KCk7CisgICAgICAgIGlmIChwdWJsaWNLZXkgaW5zdGFuY2VvZiBPcGVuU1NMS2V5SG9sZGVyKSB7CisgICAgICAgICAgICBPcGVuU1NMS2V5IHBrZXkgPSAoKE9wZW5TU0xLZXlIb2xkZXIpIHB1YmxpY0tleSkuZ2V0T3BlblNTTEtleSgpOworICAgICAgICAgICAgY2hlY2tFbmdpbmVUeXBlKHBrZXkpOworICAgICAgICAgICAga2V5ID0gcGtleTsKICAgICAgICAgfSBlbHNlIGlmIChwdWJsaWNLZXkgaW5zdGFuY2VvZiBSU0FQdWJsaWNLZXkpIHsKICAgICAgICAgICAgIGlmIChlbmdpbmVUeXBlICE9IEVuZ2luZVR5cGUuUlNBKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgUlNBIik7CkBAIC0xOTQsOCArMjAwLDIyIEBACiAKICAgICAgICAgICAgIFJTQVB1YmxpY0tleSByc2FQdWJsaWNLZXkgPSAoUlNBUHVibGljS2V5KSBwdWJsaWNLZXk7CiAgICAgICAgICAgICBrZXkgPSBPcGVuU1NMUlNBUHVibGljS2V5LmdldEluc3RhbmNlKHJzYVB1YmxpY0tleSk7CisgICAgICAgIH0gZWxzZSBpZiAocHVibGljS2V5IGluc3RhbmNlb2YgRFNBUHVibGljS2V5KSB7CisgICAgICAgICAgICBpZiAoZW5naW5lVHlwZSAhPSBFbmdpbmVUeXBlLkRTQSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJTaWduYXR1cmUgbm90IGluaXRpYWxpemVkIGFzIERTQSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEU0FQdWJsaWNLZXkgZHNhUHVibGljS2V5ID0gKERTQVB1YmxpY0tleSkgcHVibGljS2V5OworICAgICAgICAgICAga2V5ID0gT3BlblNTTERTQVB1YmxpY0tleS5nZXRJbnN0YW5jZShkc2FQdWJsaWNLZXkpOworICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY0tleSBpbnN0YW5jZW9mIEVDUHVibGljS2V5KSB7CisgICAgICAgICAgICBpZiAoZW5naW5lVHlwZSAhPSBFbmdpbmVUeXBlLkVDKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIlNpZ25hdHVyZSBub3QgaW5pdGlhbGl6ZWQgYXMgRUMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRUNQdWJsaWNLZXkgZWNQdWJsaWNLZXkgPSAoRUNQdWJsaWNLZXkpIHB1YmxpY0tleTsKKyAgICAgICAgICAgIGtleSA9IE9wZW5TU0xFQ1B1YmxpY0tleS5nZXRJbnN0YW5jZShlY1B1YmxpY0tleSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTmVlZCBEU0Egb3IgUlNBIHB1YmxpYyBrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJOZWVkIERTQSBvciBSU0Egb3IgRUMgcHVibGljIGtleSIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMDcsNyArMjI3LDcgQEAKICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVNpZ24oKSB0aHJvd3MgU2lnbmF0dXJlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGNhbid0IGFjdHVhbGx5IGhhcHBlbiwgYnV0IHlvdSBuZXZlciBrbm93Li4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgU2lnbmF0dXJlRXhjZXB0aW9uKCJOZWVkIERTQSBvciBSU0EgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oIk5lZWQgRFNBIG9yIFJTQSBvciBFQyBwcml2YXRlIGtleSIpOwogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKQEAgLTI5OSw1ICszMTksMjUgQEAKICAgICAgICAgICAgIHN1cGVyKCJEU0EtU0hBMSIsIEVuZ2luZVR5cGUuRFNBKTsKICAgICAgICAgfQogICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNIQTFFQ0RTQSBleHRlbmRzIE9wZW5TU0xTaWduYXR1cmUgeworICAgICAgICBwdWJsaWMgU0hBMUVDRFNBKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigiU0hBMSIsIEVuZ2luZVR5cGUuRUMpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU0hBMjU2RUNEU0EgZXh0ZW5kcyBPcGVuU1NMU2lnbmF0dXJlIHsKKyAgICAgICAgcHVibGljIFNIQTI1NkVDRFNBKCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigiU0hBMjU2IiwgRW5naW5lVHlwZS5FQyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTSEEzODRFQ0RTQSBleHRlbmRzIE9wZW5TU0xTaWduYXR1cmUgeworICAgICAgICBwdWJsaWMgU0hBMzg0RUNEU0EoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKCJTSEEzODQiLCBFbmdpbmVUeXBlLkVDKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNIQTUxMkVDRFNBIGV4dGVuZHMgT3BlblNTTFNpZ25hdHVyZSB7CisgICAgICAgIHB1YmxpYyBTSEE1MTJFQ0RTQSgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoIlNIQTUxMiIsIEVuZ2luZVR5cGUuRUMpOworICAgICAgICB9CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2lnbmF0dXJlUmF3UlNBLmphdmEgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU2lnbmF0dXJlUmF3UlNBLmphdmEKaW5kZXggMjg5YWYzMC4uZTVkMzNiMyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNpZ25hdHVyZVJhd1JTQS5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTaWduYXR1cmVSYXdSU0EuamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgICAgICBSU0FQcml2YXRlS2V5IHJzYVByaXZhdGVLZXkgPSAoUlNBUHJpdmF0ZUtleSkgcHJpdmF0ZUtleTsKICAgICAgICAgICAgIGtleSA9IE9wZW5TU0xSU0FQcml2YXRlS2V5LmdldEluc3RhbmNlKHJzYVByaXZhdGVLZXkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIk5lZWQgRFNBIG9yIFJTQSBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oIk5lZWQgUlNBIHByaXZhdGUga2V5Iik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBBbGxvY2F0ZSBidWZmZXIgYWNjb3JkaW5nIHRvIFJTQSBtb2R1bHVzIHNpemUuCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgICAgIFJTQVB1YmxpY0tleSByc2FQdWJsaWNLZXkgPSAoUlNBUHVibGljS2V5KSBwdWJsaWNLZXk7CiAgICAgICAgICAgICBrZXkgPSBPcGVuU1NMUlNBUHVibGljS2V5LmdldEluc3RhbmNlKHJzYVB1YmxpY0tleSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTmVlZCBEU0Egb3IgUlNBIHB1YmxpYyBrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKCJOZWVkIFJTQSBwdWJsaWMga2V5Iik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBBbGxvY2F0ZSBidWZmZXIgYWNjb3JkaW5nIHRvIFJTQSBtb2R1bHVzIHNpemUuCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU29ja2V0SW1wbC5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNvY2tldEltcGwuamF2YQppbmRleCA0Y2MxNmU2Li43NzdjNWIzIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU29ja2V0SW1wbC5qYXZhCisrKyBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTb2NrZXRJbXBsLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTYzLDcgKzY0LDcgQEAKICAgICAgICAgZXh0ZW5kcyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldAogICAgICAgICBpbXBsZW1lbnRzIE5hdGl2ZUNyeXB0by5TU0xIYW5kc2hha2VDYWxsYmFja3MgewogCi0gICAgcHJpdmF0ZSBpbnQgc3NsTmF0aXZlUG9pbnRlcjsKKyAgICBwcml2YXRlIGxvbmcgc3NsTmF0aXZlUG9pbnRlcjsKICAgICBwcml2YXRlIElucHV0U3RyZWFtIGlzOwogICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG9zOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGhhbmRzaGFrZUxvY2sgPSBuZXcgT2JqZWN0KCk7CkBAIC03NSw2ICs3NiwxMCBAQAogICAgIHByaXZhdGUgU3RyaW5nW10gZW5hYmxlZENpcGhlclN1aXRlczsKICAgICBwcml2YXRlIGJvb2xlYW4gdXNlU2Vzc2lvblRpY2tldHM7CiAgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdG5hbWU7CisgICAgLyoqIFdoZXRoZXIgdGhlIFRMUyBDaGFubmVsIElEIGV4dGVuc2lvbiBpcyBlbmFibGVkLiBUaGlzIGZpZWxkIGlzIHNlcnZlci1zaWRlIG9ubHkuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoYW5uZWxJZEVuYWJsZWQ7CisgICAgLyoqIFByaXZhdGUga2V5IGZvciB0aGUgVExTIENoYW5uZWwgSUQgZXh0ZW5zaW9uLiBUaGlzIGZpZWxkIGlzIGNsaWVudC1zaWRlIG9ubHkuICovCisgICAgcHJpdmF0ZSBFQ1ByaXZhdGVLZXkgY2hhbm5lbElkUHJpdmF0ZUtleTsKICAgICBwcml2YXRlIE9wZW5TU0xTZXNzaW9uSW1wbCBzc2xTZXNzaW9uOwogICAgIHByaXZhdGUgZmluYWwgU29ja2V0IHNvY2tldDsKICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b0Nsb3NlOwpAQCAtMjYxLDcgKzI2Niw3IEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBjbGllbnQgPSBzc2xQYXJhbWV0ZXJzLmdldFVzZUNsaWVudE1vZGUoKTsKIAotICAgICAgICBmaW5hbCBpbnQgc3NsQ3R4TmF0aXZlUG9pbnRlciA9IChjbGllbnQpID8KKyAgICAgICAgZmluYWwgbG9uZyBzc2xDdHhOYXRpdmVQb2ludGVyID0gKGNsaWVudCkgPwogICAgICAgICAgICAgc3NsUGFyYW1ldGVycy5nZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpLnNzbEN0eE5hdGl2ZVBvaW50ZXIgOgogICAgICAgICAgICAgc3NsUGFyYW1ldGVycy5nZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpLnNzbEN0eE5hdGl2ZVBvaW50ZXI7CiAKQEAgLTM3Myw2ICszNzgsMTkgQEAKICAgICAgICAgICAgICAgICBzZXRTb1dyaXRlVGltZW91dChoYW5kc2hha2VUaW1lb3V0TWlsbGlzZWNvbmRzKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gVExTIENoYW5uZWwgSUQKKyAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQtc2lkZSBUTFMgQ2hhbm5lbCBJRAorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsSWRQcml2YXRlS2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXQxX3Rsc19jaGFubmVsX2lkKHNzbE5hdGl2ZVBvaW50ZXIsIGNoYW5uZWxJZFByaXZhdGVLZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgVExTIENoYW5uZWwgSUQKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbElkRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZChzc2xOYXRpdmVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCBzc2xTZXNzaW9uTmF0aXZlUG9pbnRlcjsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgc3NsU2Vzc2lvbk5hdGl2ZVBvaW50ZXIgPSBOYXRpdmVDcnlwdG8uU1NMX2RvX2hhbmRzaGFrZShzc2xOYXRpdmVQb2ludGVyLApAQCAtNDczLDEzICs0OTEsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBPcGVuU1NMUlNBUHJpdmF0ZUtleSkgewotICAgICAgICAgICAgT3BlblNTTFJTQVByaXZhdGVLZXkgcnNhS2V5ID0gKE9wZW5TU0xSU0FQcml2YXRlS2V5KSBwcml2YXRlS2V5OwotICAgICAgICAgICAgT3BlblNTTEtleSBrZXkgPSByc2FLZXkuZ2V0T3BlblNTTEtleSgpOwotICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfT3BlblNTTF9Qcml2YXRlS2V5KHNzbE5hdGl2ZVBvaW50ZXIsIGtleS5nZXRQa2V5Q29udGV4dCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgT3BlblNTTERTQVByaXZhdGVLZXkpIHsKLSAgICAgICAgICAgIE9wZW5TU0xEU0FQcml2YXRlS2V5IGRzYUtleSA9IChPcGVuU1NMRFNBUHJpdmF0ZUtleSkgcHJpdmF0ZUtleTsKLSAgICAgICAgICAgIE9wZW5TU0xLZXkga2V5ID0gZHNhS2V5LmdldE9wZW5TU0xLZXkoKTsKKyAgICAgICAgaWYgKHByaXZhdGVLZXkgaW5zdGFuY2VvZiBPcGVuU1NMS2V5SG9sZGVyKSB7CisgICAgICAgICAgICBPcGVuU1NMS2V5IGtleSA9ICgoT3BlblNTTEtleUhvbGRlcikgcHJpdmF0ZUtleSkuZ2V0T3BlblNTTEtleSgpOwogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfT3BlblNTTF9Qcml2YXRlS2V5KHNzbE5hdGl2ZVBvaW50ZXIsIGtleS5nZXRQa2V5Q29udGV4dCgpKTsKICAgICAgICAgfSBlbHNlIGlmICgiUEtDUyM4Ii5lcXVhbHMocHJpdmF0ZUtleS5nZXRGb3JtYXQoKSkpIHsKICAgICAgICAgICAgIGJ5dGVbXSBwcml2YXRlS2V5Qnl0ZXMgPSBwcml2YXRlS2V5LmdldEVuY29kZWQoKTsKQEAgLTU5MywxMCArNjA2LDggQEAKIAogICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzk5LDYgKzgxMCw3MiBAQAogICAgICAgICB0aGlzLmhvc3RuYW1lID0gaG9zdG5hbWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRW5hYmxlcy9kaXNhYmxlcyBUTFMgQ2hhbm5lbCBJRCBmb3IgdGhpcyBzZXJ2ZXIgc29ja2V0LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW52b2tlZCBiZWZvcmUgdGhlIGhhbmRzaGFrZSBzdGFydHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGlzIGEgY2xpZW50IHNvY2tldCBvciBpZiB0aGUgaGFuZHNoYWtlIGhhcyBhbHJlYWR5CisgICAgICogICAgICAgICBzdGFydGVkLgorCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbElkRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKGdldFVzZUNsaWVudE1vZGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IG1vZGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZHNoYWtlU3RhcnRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBlbmFibGUvZGlzYWJsZSBDaGFubmVsIElEIGFmdGVyIHRoZSBpbml0aWFsIGhhbmRzaGFrZSBoYXMiCisgICAgICAgICAgICAgICAgICAgICsgIiBiZWd1bi4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNoYW5uZWxJZEVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFRMUyBDaGFubmVsIElEIGZvciB0aGlzIHNlcnZlciBzb2NrZXQuIENoYW5uZWwgSUQgaXMgb25seSBhdmFpbGFibGUgb25jZSB0aGUKKyAgICAgKiBoYW5kc2hha2UgY29tcGxldGVzLgorICAgICAqCisgICAgICogQHJldHVybiBjaGFubmVsIElEIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBpcyBhIGNsaWVudCBzb2NrZXQgb3IgaWYgdGhlIGhhbmRzaGFrZSBoYXMgbm90IHlldAorICAgICAqICAgICAgICAgY29tcGxldGVkLgorICAgICAqIEB0aHJvd3MgU1NMRXhjZXB0aW9uIGlmIGNoYW5uZWwgSUQgaXMgYXZhaWxhYmxlIGJ1dCBjb3VsZCBub3QgYmUgb2J0YWluZWQuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRDaGFubmVsSWQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFVzZUNsaWVudE1vZGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IG1vZGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhbmRzaGFrZUNvbXBsZXRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNoYW5uZWwgSUQgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgaGFuZHNoYWtlIGNvbXBsZXRlcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOYXRpdmVDcnlwdG8uU1NMX2dldF90bHNfY2hhbm5lbF9pZChzc2xOYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB7QGxpbmsgUHJpdmF0ZUtleX0gdG8gYmUgdXNlZCBmb3IgVExTIENoYW5uZWwgSUQgYnkgdGhpcyBjbGllbnQgc29ja2V0LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW52b2tlZCBiZWZvcmUgdGhlIGhhbmRzaGFrZSBzdGFydHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpdmF0ZUtleSBwcml2YXRlIGtleSAoZW5hYmxlcyBUTFMgQ2hhbm5lbCBJRCkgb3Ige0Bjb2RlIG51bGx9IGZvciBubyBrZXkgKGRpc2FibGVzCisgICAgICogICAgICAgIFRMUyBDaGFubmVsIElEKS4gVGhlIHByaXZhdGUga2V5IGlzIGFuIEVsbGlwdGljIEN1cnZlIChFQykga2V5IGJhc2VkIG9uIHRoZSBOSVNUCisgICAgICogICAgICAgIFAtMjU2IGN1cnZlIChha2EgU0VDRyBzZWNwMjU2cjEgb3IgQU5TSSBYOS42MiBwcmltZTI1NnYxKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgaXMgYSBzZXJ2ZXIgc29ja2V0IG9yIGlmIHRoZSBoYW5kc2hha2UgaGFzIGFscmVhZHkKKyAgICAgKiAgICAgICAgIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbElkUHJpdmF0ZUtleShFQ1ByaXZhdGVLZXkgcHJpdmF0ZUtleSkgeworICAgICAgICBpZiAoIWdldFVzZUNsaWVudE1vZGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2VydmVyIG1vZGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZHNoYWtlU3RhcnRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGFuZ2UgQ2hhbm5lbCBJRCBwcml2YXRlIGtleSBhZnRlciB0aGUgaW5pdGlhbCBoYW5kc2hha2UgaGFzIgorICAgICAgICAgICAgICAgICAgICArICIgYmVndW4uIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jaGFubmVsSWRQcml2YXRlS2V5ID0gcHJpdmF0ZUtleTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ2xpZW50TW9kZSgpIHsKICAgICAgICAgcmV0dXJuIHNzbFBhcmFtZXRlcnMuZ2V0VXNlQ2xpZW50TW9kZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1RydXN0TWFuYWdlckltcGwuamF2YSBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1RydXN0TWFuYWdlckltcGwuamF2YQppbmRleCAwMjE4MjQ5Li4xNjgyZGY3IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9UcnVzdE1hbmFnZXJJbXBsLmphdmEKKysrIGIvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvVHJ1c3RNYW5hZ2VySW1wbC5qYXZhCkBAIC0yNzcsNiArMjc3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICJUcnVzdCBhbmNob3IgZm9yIGNlcnRpZmljYXRpb24gcGF0aCBub3QgZm91bmQuIiwgbnVsbCwgY2VydFBhdGgsIC0xKSk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBUaGVyZSdzIG5vIHBvaW50IGluIGNoZWNraW5nIHRydXN0IGFuY2hvcnMgaGVyZSwgYW5kIGl0IHdpbGwgdGhyb3cgb2ZmIHRoZSBNRDUgY2hlY2ssCisgICAgICAgIC8vIHNvIHdlIGp1c3QgaGFuZCBpdCB0aGUgY2hhaW4gd2l0aG91dCBhbmNob3JzCisgICAgICAgIENoYWluU3RyZW5ndGhBbmFseXplci5jaGVjayhuZXdDaGFpbik7CisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFBLSVhQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQS0lYUGFyYW1ldGVycyh0cnVzdEFuY2hvcik7CiAgICAgICAgICAgICBwYXJhbXMuc2V0UmV2b2NhdGlvbkVuYWJsZWQoZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy93M2MvZG9tL3BhY2thZ2UuaHRtbCBiL2x1bmkvc3JjL21haW4vamF2YS9vcmcvdzNjL2RvbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjhmZjYuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy93M2MvZG9tL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxodG1sPgotICA8Ym9keT4KLSAgICA8cD4KLSAgICAgIFByb3ZpZGVzIHRoZSBvZmZpY2lhbCBXM0MgSmF2YSBiaW5kaW5ncyBmb3IgdGhlIERvY3VtZW50IE9iamVjdCBNb2RlbCwKLSAgICAgIGxldmVsIDIgY29yZS4gWE1MIGRvY3VtZW50cyByZXR1cm5lZCBieQotICAgICAge0BsaW5rIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcn0gYXJlIGFjY2Vzc2VkIGFuZCBtYW5pcHVsYXRlZAotICAgICAgdGhyb3VnaCB0aGVzZSBpbnRlcmZhY2VzLgotICAgIDwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy94bWwvc2F4L2V4dC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL3htbC9zYXgvZXh0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0M2RmNC4uMDAwMDAwMAotLS0gYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL3htbC9zYXgvZXh0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTxIVE1MPjxIRUFEPgotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuOCAyMDAyLzAxLzMwIDIxOjAwOjQ0IGRicm93bmVsbCBFeHAgJCAtLT4KLTwvSEVBRD48Qk9EWT4KLQotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyB0byBTQVgyIGZhY2lsaXRpZXMgdGhhdAotY29uZm9ybWFudCBTQVggZHJpdmVycyB3b24ndCBuZWNlc3NhcmlseSBzdXBwb3J0LgotCi08cD5TZWUgPGEgaHJlZj0naHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZyc+aHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZzwvYT4KLWZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFNBWC48L3A+Ci0KLTxwPiBUaGlzIHBhY2thZ2UgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIFNBWDIgY29yZSwgdGhvdWdoIHRoZSBmdW5jdGlvbmFsaXR5Ci1leHBvc2VkIGdlbmVyYWxseSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCB3aXRoaW4gYSBwYXJzZXIgY29yZS4KLVRoYXQgaW5kZXBlbmRlbmNlIGhhcyBzZXZlcmFsIGNvbnNlcXVlbmNlczo8L3A+Ci0KLTx1bD4KLQotPGxpPlNBWDIgZHJpdmVycyBhcmUgPGVtPm5vdDwvZW0+IHJlcXVpcmVkIHRvIHJlY29nbml6ZSB0aGVzZSBoYW5kbGVycy4KLTwvbGk+Ci0KLTxsaT5Zb3UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSBjbGFzcyBmaWxlcyB3aWxsIGJlIHByZXNlbnQgaW4gZXZlcnkgU0FYMgotaW5zdGFsbGF0aW9uLjwvbGk+Ci0KLTxsaT5UaGlzIHBhY2thZ2UgbWF5IGJlIHVwZGF0ZWQgaW5kZXBlbmRlbnRseSBvZiBTQVgyIChpLmUuIG5ldwotaGFuZGxlcnMgYW5kIGNsYXNzZXMgbWF5IGJlIGFkZGVkIHdpdGhvdXQgdXBkYXRpbmcgU0FYMiBpdHNlbGYpLjwvbGk+Ci0KLTxsaT5UaGUgbmV3IGhhbmRsZXJzIGFyZSBub3QgaW1wbGVtZW50ZWQgYnkgdGhlIFNBWDIKLTxjb2RlPm9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI8L2NvZGU+IG9yCi08Y29kZT5vcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw8L2NvZGU+IGNsYXNzZXMuCi1Zb3UgY2FuIHN1YmNsYXNzIHRoZXNlIGlmIHlvdSBuZWVkIHN1Y2ggYmVoYXZpb3IsIG9yCi11c2UgdGhlIGhlbHBlciBjbGFzc2VzIGZvdW5kIGhlcmUuPC9saT4KLQotPGxpPlRoZSBoYW5kbGVycyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgZGlmZmVyZW50bHkgdGhhbiBjb3JlIFNBWDIKLWhhbmRsZXJzLjwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlRoaXMgcGFja2FnZSwgU0FYMi1leHQsIGlzIGEgc3RhbmRhcmRpemVkIGV4dGVuc2lvbiB0byBTQVgyLiAgSXQgaXMKLWRlc2lnbmVkIGJvdGggdG8gYWxsb3cgU0FYIHBhcnNlcnMgdG8gcGFzcyBjZXJ0YWluIHR5cGVzIG9mIGluZm9ybWF0aW9uCi10byBhcHBsaWNhdGlvbnMsIGFuZCB0byBzZXJ2ZSBhcyBhIHNpbXBsZSBtb2RlbCBmb3Igb3RoZXIgU0FYMiBwYXJzZXIKLWV4dGVuc2lvbiBwYWNrYWdlcy4gIE5vdCBhbGwgc3VjaCBleHRlbnNpb24gcGFja2FnZXMgc2hvdWxkIG5lZWQgdG8KLWJlIHJlY29nbml6ZWQgZGlyZWN0bHkgYnkgcGFyc2VycywgaG93ZXZlci4KLUFzIGFuIGV4YW1wbGUsIG1vc3QgdmFsaWRhdGlvbiBzeXN0ZW1zIGNhbiBiZSBjbGVhbmx5IGxheWVyZWQgb24gdG9wCi1vZiBwYXJzZXJzIHN1cHBvcnRpbmcgdGhlIHN0YW5kYXJkaXplZCBTQVgyIGludGVyZmFjZXMuICA8L3A+Ci0KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL2phdmEvb3JnL3htbC9zYXgvaGVscGVycy9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL3htbC9zYXgvaGVscGVycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzIzYzAuLjAwMDAwMDAKLS0tIGEvbHVuaS9zcmMvbWFpbi9qYXZhL29yZy94bWwvc2F4L2hlbHBlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPEhUTUw+PEhFQUQ+Ci08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS42IDIwMDIvMDEvMzAgMjA6NTI6MzkgZGJyb3duZWxsIEV4cCAkIC0tPgotPC9IRUFEPjxCT0RZPgotCi08cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgImhlbHBlciIgY2xhc3NlcywgaW5jbHVkaW5nCi1zdXBwb3J0IGZvciBib290c3RyYXBwaW5nIFNBWC1iYXNlZCBhcHBsaWNhdGlvbnMuCi0KLTxwPlNlZSA8YSBocmVmPSdodHRwOi8vd3d3LnNheHByb2plY3Qub3JnJz5odHRwOi8vd3d3LnNheHByb2plY3Qub3JnPC9hPgotZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgU0FYLjwvcD4KLQotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcveG1sL3NheC9wYWNrYWdlLmh0bWwgYi9sdW5pL3NyYy9tYWluL2phdmEvb3JnL3htbC9zYXgvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDdmMjU3Li4wMDAwMDAwCi0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9vcmcveG1sL3NheC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotPGh0bWw+PGhlYWQ+Ci08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS4xOCAyMDA0LzA0LzIxIDEzOjA2OjAxIGRtZWdnaW5zb24gRXhwICQgLS0+Ci08L2hlYWQ+PGJvZHk+Ci0KLTxwPiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNvcmUgU0FYIEFQSXMuCi1Tb21lIFNBWDEgQVBJcyBhcmUgZGVwcmVjYXRlZCB0byBlbmNvdXJhZ2UgaW50ZWdyYXRpb24gb2YKLW5hbWVzcGFjZS1hd2FyZW5lc3MgaW50byBkZXNpZ25zIG9mIG5ldyBhcHBsaWNhdGlvbnMKLWFuZCBpbnRvIG1haW50ZW5hbmNlIG9mIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlLiA8L3A+Ci0KLTxwPlNlZSA8YSBocmVmPSdodHRwOi8vd3d3LnNheHByb2plY3Qub3JnJz5odHRwOi8vd3d3LnNheHByb2plY3Qub3JnPC9hPgotZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgU0FYLjwvcD4KLQotCi08aDI+IFNBWDIgU3RhbmRhcmQgRmVhdHVyZSBGbGFncyA8L2gyPgotCi08cD4gT25lIG9mIHRoZSBlc3NlbnRpYWwgY2hhcmFjdGVyaXN0aWNzIG9mIFNBWDIgaXMgdGhhdCBpdCBhZGRlZAotZmVhdHVyZSBmbGFncyB3aGljaCBjYW4gYmUgdXNlZCB0byBleGFtaW5lIGFuZCBwZXJoYXBzIG1vZGlmeQotcGFyc2VyIG1vZGVzLCBpbiBwYXJ0aWN1bGFyIG1vZGVzIHN1Y2ggYXMgdmFsaWRhdGlvbi4KLVNpbmNlIGZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IChhYnNvbHV0ZSkgVVJJcywgYW55b25lCi1jYW4gZGVmaW5lIHN1Y2ggZmVhdHVyZXMuICAgCi1DdXJyZW50bHkgZGVmaW5lZCBzdGFuZGFyZCBmZWF0dXJlIFVSSXMgaGF2ZSB0aGUgcHJlZml4Ci08Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvPC9jb2RlPiBiZWZvcmUgYW4gaWRlbnRpZmllciBzdWNoIGFzCi08Y29kZT52YWxpZGF0aW9uPC9jb2RlPi4gIFR1cm4gZmVhdHVyZXMgb24gb3Igb2ZmIHVzaW5nCi08ZW0+c2V0RmVhdHVyZTwvZW0+LiAgVGhvc2Ugc3RhbmRhcmQgaWRlbnRpZmllcnMgYXJlOiA8L3A+Ci0KLQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNjY2NjZmYiPgotCTx0aD5GZWF0dXJlIElEPC90aD4KLQk8dGg+QWNjZXNzPC90aD4KLQk8dGg+RGVmYXVsdDwvdGg+Ci0JPHRoPkRlc2NyaXB0aW9uPC90aD4KLQk8L3RyPgotCi0gICAgPHRyPgotCTx0ZD5leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzPC90ZD4KLQk8dGQ+PGVtPnJlYWQvd3JpdGU8L2VtPjwvdGQ+Ci0JPHRkPjxlbT51bnNwZWNpZmllZDwvZW0+PC90ZD4KLQk8dGQ+IFJlcG9ydHMgd2hldGhlciB0aGlzIHBhcnNlciBwcm9jZXNzZXMgZXh0ZXJuYWwKLQkgICAgZ2VuZXJhbCBlbnRpdGllczsgYWx3YXlzIHRydWUgaWYgdmFsaWRhdGluZy4KLQkJPC90ZD4KLQk8L3RyPgotCi0gICAgPHRyPgotCTx0ZD5leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXM8L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPnVuc3BlY2lmaWVkPC9lbT48L3RkPgotCTx0ZD4gUmVwb3J0cyB3aGV0aGVyIHRoaXMgcGFyc2VyIHByb2Nlc3NlcyBleHRlcm5hbAotCSAgICBwYXJhbWV0ZXIgZW50aXRpZXM7IGFsd2F5cyB0cnVlIGlmIHZhbGlkYXRpbmcuCi0JCTwvdGQ+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+aXMtc3RhbmRhbG9uZTwvdGQ+Ci0JPHRkPihwYXJzaW5nKSA8ZW0+cmVhZC1vbmx5PC9lbT4sIChub3QgcGFyc2luZykgPGVtPm5vbmU8L2VtPjwvdGQ+Ci0JPHRkPm5vdCBhcHBsaWNhYmxlPC90ZD4KLQk8dGQ+IE1heSBiZSBleGFtaW5lZCBvbmx5IGR1cmluZyBhIHBhcnNlLCBhZnRlciB0aGUKLQkgICAgPGVtPnN0YXJ0RG9jdW1lbnQoKTwvZW0+IGNhbGxiYWNrIGhhcyBiZWVuIGNvbXBsZXRlZDsgcmVhZC1vbmx5LgotCSAgICBUaGUgdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVkIHN0YW5kYWxvbmU9InllcyIgaW4gCi0JICAgIGl0cyBYTUwgZGVjbGFyYXRpb24sIGFuZCBvdGhlcndpc2UgaXMgZmFsc2UuCi0JCTwvdGQ+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+bGV4aWNhbC1oYW5kbGVyL3BhcmFtZXRlci1lbnRpdGllczwvdGQ+Ci0JPHRkPjxlbT5yZWFkL3dyaXRlPC9lbT48L3RkPgotCTx0ZD48ZW0+dW5zcGVjaWZpZWQ8L2VtPjwvdGQ+Ci0JPHRkPiBBIHZhbHVlIG9mICJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgTGV4aWNhbEhhbmRsZXIgd2lsbCByZXBvcnQKLQkgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHBhcmFtZXRlciBlbnRpdGllcy4KLQkJPC90ZD4KLQk8L3RyPgotCi0gICAgPHRyPgotCTx0ZD5uYW1lc3BhY2VzPC90ZD4KLQk8dGQ+PGVtPnJlYWQvd3JpdGU8L2VtPjwvdGQ+Ci0JPHRkPnRydWU8L3RkPgotCTx0ZD4gQSB2YWx1ZSBvZiAidHJ1ZSIgaW5kaWNhdGVzIG5hbWVzcGFjZSBVUklzIGFuZCB1bnByZWZpeGVkIGxvY2FsIG5hbWVzCi0JICAgIGZvciBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgd2lsbCBiZSBhdmFpbGFibGUuCi0JCTwvdGQ+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+bmFtZXNwYWNlLXByZWZpeGVzPC90ZD4KLQk8dGQ+PGVtPnJlYWQvd3JpdGU8L2VtPjwvdGQ+Ci0JPHRkPmZhbHNlPC90ZD4KLQk8dGQ+IEEgdmFsdWUgb2YgInRydWUiIGluZGljYXRlcyB0aGF0IFhNTCBxdWFsaWZpZWQgbmFtZXMgKHdpdGggcHJlZml4ZXMpIGFuZAotCSAgICBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgPGVtPnhtbG5zKjwvZW0+IGF0dHJpYnV0ZXMpIHdpbGwgYmUgYXZhaWxhYmxlLgotCQk8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0JPHRkPnJlc29sdmUtZHRkLXVyaXM8L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPnRydWU8L2VtPjwvdGQ+Ci0JPHRkPiBBIHZhbHVlIG9mICJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCBzeXN0ZW0gSURzIGluIGRlY2xhcmF0aW9ucyB3aWxsCi0JICAgIGJlIGFic29sdXRpemVkIChyZWxhdGl2ZSB0byB0aGVpciBiYXNlIFVSSXMpIGJlZm9yZSByZXBvcnRpbmcuCi0JICAgIChUaGF0IGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhbGwgU0FYMiBYTUwgcGFyc2Vycy4pCi0JICAgIEEgdmFsdWUgb2YgImZhbHNlIiBpbmRpY2F0ZXMgdGhvc2UgSURzIHdpbGwgbm90IGJlIGFic29sdXRpemVkOwotCSAgICBwYXJzZXJzIHdpbGwgcHJvdmlkZSB0aGUgYmFzZSBVUkkgZnJvbQotCSAgICA8ZW0+TG9jYXRvci5nZXRTeXN0ZW1JZCgpPC9lbT4uCi0JICAgIFRoaXMgYXBwbGllcyB0byBzeXN0ZW0gSURzIHBhc3NlZCBpbiA8dWw+Ci0JCTxsaT48ZW0+RFRESGFuZGxlci5ub3RhdGlvbkRlY2woKTwvZW0+LAotCQk8bGk+PGVtPkRUREhhbmRsZXIudW5wYXJzZWRFbnRpdHlEZWNsKCk8L2VtPiwgYW5kCi0JCTxsaT48ZW0+RGVjbEhhbmRsZXIuZXh0ZXJuYWxFbnRpdHlEZWNsKCk8L2VtPi4KLQkgICAgPC91bD4KLQkgICAgSXQgZG9lcyBub3QgYXBwbHkgdG8gPGVtPkVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkoKTwvZW0+LAotCSAgICB3aGljaCBpcyBub3QgdXNlZCB0byByZXBvcnQgZGVjbGFyYXRpb25zLCBvciB0bwotCSAgICA8ZW0+TGV4aWNhbEhhbmRsZXIuc3RhcnREVEQoKTwvZW0+LCB3aGljaCBhbHJlYWR5IHByb3ZpZGVzCi0JICAgIHRoZSBub24tYWJzb2x1dGl6ZWQgVVJJLgotCSAgICA8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0JPHRkPnN0cmluZy1pbnRlcm5pbmc8L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPnVuc3BlY2lmaWVkPC9lbT48L3RkPgotCTx0ZD4gSGFzIGEgdmFsdWUgb2YgInRydWUiIGlmIGFsbCBYTUwgbmFtZXMgKGZvciBlbGVtZW50cywgcHJlZml4ZXMsCi0JICAgIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBub3RhdGlvbnMsIGFuZCBsb2NhbCBuYW1lcyksCi0JICAgIGFzIHdlbGwgYXMgTmFtZXNwYWNlIFVSSXMsIHdpbGwgaGF2ZSBiZWVuIGludGVybmVkCi0JICAgIHVzaW5nIDxlbT5qYXZhLmxhbmcuU3RyaW5nLmludGVybjwvZW0+LiBUaGlzIHN1cHBvcnRzIGZhc3QKLQkgICAgdGVzdGluZyBvZiBlcXVhbGl0eS9pbmVxdWFsaXR5IGFnYWluc3Qgc3RyaW5nIGNvbnN0YW50cywKLQkgICAgcmF0aGVyIHRoYW4gZm9yY2luZyBzbG93ZXIgY2FsbHMgdG8gPGVtPlN0cmluZy5lcXVhbHMoKTwvZW0+LgotCSAgICA8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0gICAgPHRkPnVuaWNvZGUtbm9ybWFsaXphdGlvbi1jaGVja2luZzwvdGQ+Ci0gICAgPHRkPjxlbT5yZWFkL3dyaXRlPC9lbT48L3RkPgotICAgIDx0ZD48ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci0gICAgPHRkPiBDb250cm9scyB3aGV0aGVyIHRoZSBwYXJzZXIgcmVwb3J0cyBVbmljb2RlIG5vcm1hbGl6YXRpb24gCi0gICAgICAgIGVycm9ycyBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAyLjEzIGFuZCBBcHBlbmRpeCBCIG9mIHRoZSAKLSAgICAgICAgWE1MIDEuMSBSZWNvbW1lbmRhdGlvbi4gSWYgdHJ1ZSwgVW5pY29kZSBub3JtYWxpemF0aW9uCi0gICAgICAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdXNpbmcgdGhlIEVycm9ySGFuZGxlci5lcnJvcigpIGNhbGxiYWNrLgotICAgICAgICBTdWNoIGVycm9ycyBhcmUgbm90IGZhdGFsIGluIHRoZW1zZWx2ZXMgKHRob3VnaCwgb2J2aW91c2x5LAotICAgICAgICBvdGhlciBVbmljb2RlLXJlbGF0ZWQgZW5jb2RpbmcgZXJyb3JzIG1heSBiZSkuCi0JCTwvdGQ+Ci0gICAgPC90cj4KLSAgICAKLSAgICA8dHI+Ci0JPHRkPnVzZS1hdHRyaWJ1dGVzMjwvdGQ+Ci0JPHRkPjxlbT5yZWFkLW9ubHk8L2VtPjwvdGQ+Ci0JPHRkPm5vdCBhcHBsaWNhYmxlPC90ZD4KLQk8dGQ+IFJldHVybnMgInRydWUiIGlmIHRoZSA8ZW0+QXR0cmlidXRlczwvZW0+IG9iamVjdHMgcGFzc2VkIGJ5Ci0JICAgIHRoaXMgcGFyc2VyIGluIDxlbT5Db250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoKTwvZW0+Ci0JICAgIGltcGxlbWVudCB0aGUgPGEgaHJlZj0iZXh0L0F0dHJpYnV0ZXMyLmh0bWwiCi0JICAgID48ZW0+b3JnLnhtbC5zYXguZXh0LkF0dHJpYnV0ZXMyPC9lbT48L2E+IGludGVyZmFjZS4KLQkgICAgVGhhdCBpbnRlcmZhY2UgZXhwb3NlcyBhZGRpdGlvbmFsIERURC1yZWxhdGVkIGluZm9ybWF0aW9uLAotCSAgICBzdWNoIGFzIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkIGluIHRoZQotCSAgICBzb3VyY2UgdGV4dCByYXRoZXIgdGhhbiBkZWZhdWx0ZWQuCi0JCTwvdGQ+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+dXNlLWxvY2F0b3IyPC90ZD4KLQk8dGQ+PGVtPnJlYWQtb25seTwvZW0+PC90ZD4KLQk8dGQ+bm90IGFwcGxpY2FibGU8L3RkPgotCTx0ZD4gUmV0dXJucyAidHJ1ZSIgaWYgdGhlIDxlbT5Mb2NhdG9yPC9lbT4gb2JqZWN0cyBwYXNzZWQgYnkKLQkgICAgdGhpcyBwYXJzZXIgaW4gPGVtPkNvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcigpPC9lbT4KLQkgICAgaW1wbGVtZW50IHRoZSA8YSBocmVmPSJleHQvTG9jYXRvcjIuaHRtbCIKLQkgICAgPjxlbT5vcmcueG1sLnNheC5leHQuTG9jYXRvcjI8L2VtPjwvYT4gaW50ZXJmYWNlLgotCSAgICBUaGF0IGludGVyZmFjZSBleHBvc2VzIGFkZGl0aW9uYWwgZW50aXR5IGluZm9ybWF0aW9uLAotCSAgICBzdWNoIGFzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgYW5kIFhNTCB2ZXJzaW9uIHVzZWQuCi0JCTwvdGQ+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+dXNlLWVudGl0eS1yZXNvbHZlcjI8L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPnRydWU8L2VtPjwvdGQ+Ci0JPHRkPiBSZXR1cm5zICJ0cnVlIiBpZiwgd2hlbiA8ZW0+c2V0RW50aXR5UmVzb2x2ZXI8L2VtPiBpcyBnaXZlbgotCSAgICBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSA8YSBocmVmPSJleHQvRW50aXR5UmVzb2x2ZXIyLmh0bWwiCi0JICAgID48ZW0+b3JnLnhtbC5zYXguZXh0LkVudGl0eVJlc29sdmVyMjwvZW0+PC9hPiBpbnRlcmZhY2UsCi0JICAgIHRob3NlIG5ldyBtZXRob2RzIHdpbGwgYmUgdXNlZC4KLQkgICAgUmV0dXJucyAiZmFsc2UiIHRvIGluZGljYXRlIHRoYXQgdGhvc2UgbWV0aG9kcyB3aWxsIG5vdCBiZSB1c2VkLgotCQk8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0JPHRkPnZhbGlkYXRpb248L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPnVuc3BlY2lmaWVkPC9lbT48L3RkPgotCTx0ZD4gQ29udHJvbHMgd2hldGhlciB0aGUgcGFyc2VyIGlzIHJlcG9ydGluZyBhbGwgdmFsaWRpdHkKLQkgICAgZXJyb3JzOyBpZiB0cnVlLCBhbGwgZXh0ZXJuYWwgZW50aXRpZXMgd2lsbCBiZSByZWFkLgotCQk8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0JPHRkPnhtbG5zLXVyaXM8L3RkPgotCTx0ZD48ZW0+cmVhZC93cml0ZTwvZW0+PC90ZD4KLQk8dGQ+PGVtPmZhbHNlPC9lbT48L3RkPgotCTx0ZD4gQ29udHJvbHMgd2hldGhlciwgd2hlbiB0aGUgPGVtPm5hbWVzcGFjZS1wcmVmaXhlczwvZW0+IGZlYXR1cmUKLQkgICAgaXMgc2V0LCB0aGUgcGFyc2VyIHRyZWF0cyBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyBhcwotCSAgICBiZWluZyBpbiB0aGUgPGVtPmh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvPC9lbT4gbmFtZXNwYWNlLgotCSAgICBCeSBkZWZhdWx0LCBTQVgyIGNvbmZvcm1zIHRvIHRoZSBvcmlnaW5hbCAiTmFtZXNwYWNlcyBpbiBYTUwiCi0JICAgIFJlY29tbWVuZGF0aW9uLCB3aGljaCBleHBsaWNpdGx5IHN0YXRlcyB0aGF0IHN1Y2ggYXR0cmlidXRlcyBhcmUKLQkgICAgbm90IGluIGFueSBuYW1lc3BhY2UuCi0JICAgIFNldHRpbmcgdGhpcyBvcHRpb25hbCBmbGFnIHRvICJ0cnVlIiBtYWtlcyB0aGUgU0FYMiBldmVudHMgY29uZm9ybSB0bwotCSAgICBhIGxhdGVyIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgcmV2aXNpb24gb2YgdGhhdCByZWNvbW1lbmRhdGlvbiwKLQkgICAgcGxhY2luZyB0aG9zZSBhdHRyaWJ1dGVzIGluIGEgbmFtZXNwYWNlLgotCQk8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0gICAgPHRkPnhtbC0xLjE8L3RkPgotICAgIDx0ZD48ZW0+cmVhZC1vbmx5PC9lbT48L3RkPgotICAgIDx0ZD5ub3QgYXBwbGljYWJsZTwvdGQ+Ci0gICAgPHRkPiBSZXR1cm5zICJ0cnVlIiBpZiB0aGUgcGFyc2VyIHN1cHBvcnRzIGJvdGggWE1MIDEuMSBhbmQgWE1MIDEuMC4KLSAgICAgICAgUmV0dXJucyAiZmFsc2UiIGlmIHRoZSBwYXJzZXIgc3VwcG9ydHMgb25seSBYTUwgMS4wLgotCQk8L3RkPgotICAgIDwvdHI+Ci0KLTwvdGFibGU+Ci0KLTxwPiBTdXBwb3J0IGZvciB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlCi08ZW0+bmFtZXNwYWNlczwvZW0+IGFuZCA8ZW0+bmFtZXNwYWNlLXByZWZpeGVzPC9lbT4KLXByb3BlcnRpZXMgaXMgcmVxdWlyZWQuCi1TdXBwb3J0IGZvciBhbnkgb3RoZXIgZmVhdHVyZSBmbGFncyBpcyBlbnRpcmVseSBvcHRpb25hbC4KLTwvcD4KLQotPHA+IEZvciBkZWZhdWx0IHZhbHVlcyBub3Qgc3BlY2lmaWVkIGJ5IFNBWDIsCi1lYWNoIFhNTFJlYWRlciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZXMgaXRzIGRlZmF1bHQsCi1vciBtYXkgY2hvb3NlIG5vdCB0byBleHBvc2UgdGhlIGZlYXR1cmUgZmxhZy4KLVVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGhlcmUsCi1pbXBsZW1lbnRhdGlvbnMgbWF5IHN1cHBvcnQgY2hhbmdpbmcgY3VycmVudCB2YWx1ZXMKLW9mIHRoZXNlIHN0YW5kYXJkIGZlYXR1cmUgZmxhZ3MsIGJ1dCBub3Qgd2hpbGUgcGFyc2luZy4KLTwvcD4KLQotPGgyPiBTQVgyIFN0YW5kYXJkIEhhbmRsZXIgYW5kIFByb3BlcnR5IElEcyA8L2gyPgotCi08cD4gRm9yIHBhcnNlciBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzIHRoYXQgYXJlIGRlc2NyaWJlZAotYXMgb2JqZWN0cywgYSBzZXBhcmF0ZSBuYW1lc3BhY2UgaXMgZGVmaW5lZC4gIFRoZQotb2JqZWN0cyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgYWdhaW4gaWRlbnRpZmllZCBieSBVUkksIGFuZAotdGhlIHN0YW5kYXJkIHByb3BlcnR5IFVSSXMgaGF2ZSB0aGUgcHJlZml4Ci08Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy88L2NvZGU+IGJlZm9yZSBhbiBpZGVudGlmaWVyIHN1Y2ggYXMKLTxjb2RlPmxleGljYWwtaGFuZGxlcjwvY29kZT4gb3IKLTxjb2RlPmRvbS1ub2RlPC9jb2RlPi4gIE1hbmFnZSB0aG9zZSBwcm9wZXJ0aWVzIHVzaW5nCi08ZW0+c2V0UHJvcGVydHkoKTwvZW0+LiAgVGhvc2UgaWRlbnRpZmllcnMgYXJlOiA8L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICAgIDx0ciBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjY2NjY2ZmIj4KLQk8dGg+UHJvcGVydHkgSUQ8L3RoPgotCTx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0JPC90cj4KLQotICAgIDx0cj4KLQk8dGQ+ZGVjbGFyYXRpb24taGFuZGxlcjwvdGQ+Ci0JPHRkPiBVc2VkIHRvIHNlZSBtb3N0IERURCBkZWNsYXJhdGlvbnMgZXhjZXB0IHRob3NlIHRyZWF0ZWQKLQkgICAgYXMgbGV4aWNhbCAoImRvY3VtZW50IGVsZW1lbnQgbmFtZSBpcyAuLi4iKSBvciB3aGljaCBhcmUKLQkgICAgbWFuZGF0b3J5IGZvciBhbGwgU0FYIHBhcnNlcnMgKDxlbT5EVERIYW5kbGVyPC9lbT4pLgotCSAgICBUaGUgT2JqZWN0IG11c3QgaW1wbGVtZW50IDxhIGhyZWY9ImV4dC9EZWNsSGFuZGxlci5odG1sIgotCSAgICA+PGVtPm9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjwvZW0+PC9hPi4KLQkgICAgPC90ZD4KLQk8L3RyPgotCi0gICAgPHRyPgotICAgICAgICA8dGQ+ZG9jdW1lbnQteG1sLXZlcnNpb248L3RkPgotICAgICAgICA8dGQ+IE1heSBiZSBleGFtaW5lZCBvbmx5IGR1cmluZyBhIHBhcnNlLCBhZnRlciB0aGUgc3RhcnREb2N1bWVudCgpCi0gICAgICAgICAgICBjYWxsYmFjayBoYXMgYmVlbiBjb21wbGV0ZWQ7IHJlYWQtb25seS4gVGhpcyBwcm9wZXJ0eSBpcyBhIAotICAgICAgICAgICAgbGl0ZXJhbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYWN0dWFsIFhNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCwgCi0gICAgICAgICAgICBzdWNoIGFzICIxLjAiIG9yICIxLjEiLgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAKLSAgICA8dHI+Ci0JPHRkPmRvbS1ub2RlPC90ZD4KLQk8dGQ+IEZvciAiRE9NIFdhbGtlciIgc3R5bGUgcGFyc2Vycywgd2hpY2ggaWdub3JlIHRoZWlyCi0JICAgIDxlbT5wYXJzZXIucGFyc2UoKTwvZW0+IHBhcmFtZXRlcnMsIHRoaXMgaXMgdXNlZCB0bwotCSAgICBzcGVjaWZ5IHRoZSBET00gKHN1Yil0cmVlIGJlaW5nIHdhbGtlZCBieSB0aGUgcGFyc2VyLgotCSAgICBUaGUgT2JqZWN0IG11c3QgaW1wbGVtZW50IHRoZQotCSAgICA8ZW0+b3JnLnczYy5kb20uTm9kZTwvZW0+IGludGVyZmFjZS4KLQkgICAgPC90ZD4KLQk8L3RyPgotCi0gICAgPHRyPgotCTx0ZD5sZXhpY2FsLWhhbmRsZXI8L3RkPgotCTx0ZD4gVXNlZCB0byBzZWUgc29tZSBzeW50YXggZXZlbnRzIHRoYXQgYXJlIGVzc2VudGlhbCBpbiBzb21lCi0JICAgIGFwcGxpY2F0aW9uczogIGNvbW1lbnRzLCBDREFUQSBkZWxpbWl0ZXJzLCBzZWxlY3RlZCBnZW5lcmFsCi0JICAgIGVudGl0eSBpbmNsdXNpb25zLCBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIERURAotCSAgICAoYW5kIGRlY2xhcmF0aW9uIG9mIGRvY3VtZW50IGVsZW1lbnQgbmFtZSkuCi0JICAgIFRoZSBPYmplY3QgbXVzdCBpbXBsZW1lbnQgPGEgaHJlZj0iZXh0L0xleGljYWxIYW5kbGVyLmh0bWwiCi0JICAgID48ZW0+b3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyPC9lbT48L2E+LgotCSAgICA8L3RkPgotCTwvdHI+Ci0KLSAgICA8dHI+Ci0JPHRkPnhtbC1zdHJpbmc8L3RkPgotCTx0ZD4gUmVhZGFibGUgb25seSBkdXJpbmcgYSBwYXJzZXIgY2FsbGJhY2ssIHRoaXMgZXhwb3NlcyBhIDxiPlRCUzwvYj4KLQkgICAgY2h1bmsgb2YgY2hhcmFjdGVycyByZXNwb25zaWJsZSBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIDwvdGQ+Ci0JPC90cj4KLQotPC90YWJsZT4KLQotPHA+IEFsbCBvZiB0aGVzZSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbDsKLVhNTFJlYWRlciBpbXBsZW1lbnRhdGlvbnMgbmVlZCBub3Qgc3VwcG9ydCB0aGVtLgotPC9wPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9qYXZhL3N1bi9taXNjL1Vuc2FmZS5qYXZhIGIvbHVuaS9zcmMvbWFpbi9qYXZhL3N1bi9taXNjL1Vuc2FmZS5qYXZhCmluZGV4IDMzYmI5ZjEuLjg4NDM0MGIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vamF2YS9zdW4vbWlzYy9VbnNhZmUuamF2YQorKysgYi9sdW5pL3NyYy9tYWluL2phdmEvc3VuL21pc2MvVW5zYWZlLmphdmEKQEAgLTI3LDggKzI3LDEwIEBACiAgKiBvZiBKYXZhLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVW5zYWZlIHsKLSAgICAvKiogbm9uLW51bGw7IHVuaXF1ZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzICovCisgICAgLyoqIFRyYWRpdGlvbmFsIGRhbHZpayBuYW1lLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVuc2FmZSBUSEVfT05FID0gbmV3IFVuc2FmZSgpOworICAgIC8qKiBUcmFkaXRpb25hbCBSSSBuYW1lLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVuc2FmZSB0aGVVbnNhZmUgPSBUSEVfT05FOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyBvbmx5IHByaXZhdGVseSBpbnN0YW50aWFibGUuCkBAIC0zMzksNCArMzQxLDEwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWxpZCBmb3IgVGhyZWFkcyBvbmx5Iik7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzIHdpdGhvdXQgcnVubmluZyB0aGUgY29uc3RydWN0b3IuCisgICAgICogVGhlIGNsYXNzJyA8Y2xpbml0PiB3aWxsIGJlIHJ1biwgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgT2JqZWN0IGFsbG9jYXRlSW5zdGFuY2UoQ2xhc3M8Pz4gYyk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9Bc3luY2hyb25vdXNTb2NrZXRDbG9zZU1vbml0b3IuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvQXN5bmNocm9ub3VzU29ja2V0Q2xvc2VNb25pdG9yLmNwcAppbmRleCA3YjBmNjAyLi45NjE3ZTlkIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9Bc3luY2hyb25vdXNTb2NrZXRDbG9zZU1vbml0b3IuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL0FzeW5jaHJvbm91c1NvY2tldENsb3NlTW9uaXRvci5jcHAKQEAgLTM3LDcgKzM3LDExIEBACiAvKioKICAqIFRoZSBzcGVjaWZpYyBzaWduYWwgY2hvc2VuIGhlcmUgaXMgYXJiaXRyYXJ5LgogICovCisjaWYgZGVmaW5lZChfX0FQUExFX18pCitzdGF0aWMgY29uc3QgaW50IEJMT0NLRURfVEhSRUFEX1NJR05BTCA9IFNJR1VTUjI7CisjZWxzZQogc3RhdGljIGNvbnN0IGludCBCTE9DS0VEX1RIUkVBRF9TSUdOQUwgPSBTSUdSVE1JTiArIDI7CisjZW5kaWYKIAogc3RhdGljIHZvaWQgYmxvY2tlZFRocmVhZFNpZ25hbEhhbmRsZXIoaW50IC8qc2lnbmFsKi8pIHsKICAgICAvLyBEbyBub3RoaW5nLiBXZSBvbmx5IHNlbnQgdGhpcyBzaWduYWwgZm9yIGl0cyBzaWRlLWVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgc3lzY2FsbHMuCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9JY3VVdGlsaXRpZXMuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSWN1VXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjk5MDliCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSWN1VXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJJY3VVdGlsaXRpZXMiCisKKyNpbmNsdWRlICJJY3VVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIlNjb3BlZExvY2FsUmVmLmgiCisjaW5jbHVkZSAiU2NvcGVkVXRmQ2hhcnMuaCIKKyNpbmNsdWRlICJVbmlxdWVQdHIuaCIKKyNpbmNsdWRlICJjdXRpbHMvbG9nLmgiCisjaW5jbHVkZSAidW5pY29kZS9zdHJlbnVtLmgiCisjaW5jbHVkZSAidW5pY29kZS91bG9jLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKK0xvY2FsZSBnZXRMb2NhbGUoSk5JRW52KiBlbnYsIGpzdHJpbmcgbG9jYWxlTmFtZSkgeworICByZXR1cm4gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZShTY29wZWRVdGZDaGFycyhlbnYsIGxvY2FsZU5hbWUpLmNfc3RyKCkpOworfQorCitqb2JqZWN0QXJyYXkgZnJvbVN0cmluZ0VudW1lcmF0aW9uKEpOSUVudiogZW52LCBTdHJpbmdFbnVtZXJhdGlvbiogc2UpIHsKKyAgVW5pcXVlUHRyPFN0cmluZ0VudW1lcmF0aW9uPiBkZWxldGVyKHNlKTsKKyAgaWYgKHNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBpbnQzMl90IGNvdW50ID0gc2UtPmNvdW50KHN0YXR1cyk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIlN0cmluZ0VudW1lcmF0aW9uOjpjb3VudCIsIHN0YXR1cykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGpvYmplY3RBcnJheSByZXN1bHQgPSBlbnYtPk5ld09iamVjdEFycmF5KGNvdW50LCBKbmlDb25zdGFudHM6OnN0cmluZ0NsYXNzLCBOVUxMKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcqIHN0cmluZyA9IHNlLT5zbmV4dChzdGF0dXMpOworICAgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIlN0cmluZ0VudW1lcmF0aW9uOjpzbmV4dCIsIHN0YXR1cykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqYXZhU3RyaW5nKGVudiwgZW52LT5OZXdTdHJpbmcoc3RyaW5nLT5nZXRCdWZmZXIoKSwgc3RyaW5nLT5sZW5ndGgoKSkpOworICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJlc3VsdCwgaSwgamF2YVN0cmluZy5nZXQoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBtYXliZVRocm93SWN1RXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgVUVycm9yQ29kZSBlcnJvcikgeworICBpZiAoVV9TVUNDRVNTKGVycm9yKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBjaGFyKiBleGNlcHRpb25DbGFzcyA9ICJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiI7CisgIGlmIChlcnJvciA9PSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IpIHsKKyAgICBleGNlcHRpb25DbGFzcyA9ICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIjsKKyAgfSBlbHNlIGlmIChlcnJvciA9PSBVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SIHx8IGVycm9yID09IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKSB7CisgICAgZXhjZXB0aW9uQ2xhc3MgPSAiamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiI7CisgIH0gZWxzZSBpZiAoZXJyb3IgPT0gVV9VTlNVUFBPUlRFRF9FUlJPUikgeworICAgIGV4Y2VwdGlvbkNsYXNzID0gImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiI7CisgIH0KKyAgam5pVGhyb3dFeGNlcHRpb25GbXQoZW52LCBleGNlcHRpb25DbGFzcywgIiVzIGZhaWxlZDogJXMiLCBmdW5jdGlvbiwgdV9lcnJvck5hbWUoZXJyb3IpKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9JY3VVdGlsaXRpZXMuaCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL0ljdVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWQ2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9JY3VVdGlsaXRpZXMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJQ1VfVVRJTElUSUVTX0hfaW5jbHVkZWQKKyNkZWZpbmUgSUNVX1VUSUxJVElFU19IX2luY2x1ZGVkCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIiAvLyBGb3IgVUVycm9yQ29kZS4KKyNpbmNsdWRlICJ1bmljb2RlL2xvY2lkLmgiIC8vIEZvciBMb2NhbGUuCisKK2V4dGVybiBMb2NhbGUgZ2V0TG9jYWxlKEpOSUVudiogZW52LCBqc3RyaW5nIGxvY2FsZU5hbWUpOworZXh0ZXJuIGpvYmplY3RBcnJheSBmcm9tU3RyaW5nRW51bWVyYXRpb24oSk5JRW52KiBlbnYsIFN0cmluZ0VudW1lcmF0aW9uKik7Citib29sIG1heWJlVGhyb3dJY3VFeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBVRXJyb3JDb2RlIGVycm9yKTsKKworI2VuZGlmICAvLyBJQ1VfVVRJTElUSUVTX0hfaW5jbHVkZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUNvbnN0YW50cy5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9KbmlDb25zdGFudHMuY3BwCmluZGV4IDY4MTU3MzQuLmI4OGViYTkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUNvbnN0YW50cy5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pQ29uc3RhbnRzLmNwcApAQCAtMzcsMTggKzM3LDE5IEBACiBqY2xhc3MgSm5pQ29uc3RhbnRzOjppbmV0QWRkcmVzc0NsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6aW5ldFNvY2tldEFkZHJlc3NDbGFzczsKIGpjbGFzcyBKbmlDb25zdGFudHM6OmluZmxhdGVyQ2xhc3M7CitqY2xhc3MgSm5pQ29uc3RhbnRzOjppbnB1dFN0cmVhbUNsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6aW50ZWdlckNsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6bG9jYWxlRGF0YUNsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6bG9uZ0NsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6bWV0aG9kQ2xhc3M7CiBqY2xhc3MgSm5pQ29uc3RhbnRzOjptdXRhYmxlSW50Q2xhc3M7CiBqY2xhc3MgSm5pQ29uc3RhbnRzOjptdXRhYmxlTG9uZ0NsYXNzOworamNsYXNzIEpuaUNvbnN0YW50czo6b3V0cHV0U3RyZWFtQ2xhc3M7CiBqY2xhc3MgSm5pQ29uc3RhbnRzOjpwYXJzZVBvc2l0aW9uQ2xhc3M7CiBqY2xhc3MgSm5pQ29uc3RhbnRzOjpwYXR0ZXJuU3ludGF4RXhjZXB0aW9uQ2xhc3M7CiBqY2xhc3MgSm5pQ29uc3RhbnRzOjpyZWFsVG9TdHJpbmdDbGFzczsKIGpjbGFzcyBKbmlDb25zdGFudHM6OnNvY2tldENsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6c29ja2V0SW1wbENsYXNzOwotamNsYXNzIEpuaUNvbnN0YW50czo6c3RyaW5nQXJyYXlDbGFzczsKIGpjbGFzcyBKbmlDb25zdGFudHM6OnN0cmluZ0NsYXNzOwogamNsYXNzIEpuaUNvbnN0YW50czo6c3RydWN0QWRkcmluZm9DbGFzczsKIGpjbGFzcyBKbmlDb25zdGFudHM6OnN0cnVjdEZsb2NrQ2xhc3M7CkBAIC05MCwxOCArOTEsMTkgQEAKICAgICBpbmV0QWRkcmVzc0NsYXNzID0gZmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CiAgICAgaW5ldFNvY2tldEFkZHJlc3NDbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0U29ja2V0QWRkcmVzcyIpOwogICAgIGluZmxhdGVyQ2xhc3MgPSBmaW5kQ2xhc3MoZW52LCAiamF2YS91dGlsL3ppcC9JbmZsYXRlciIpOworICAgIGlucHV0U3RyZWFtQ2xhc3MgPSBmaW5kQ2xhc3MoZW52LCAiamF2YS9pby9JbnB1dFN0cmVhbSIpOwogICAgIGludGVnZXJDbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSW50ZWdlciIpOwogICAgIGxvY2FsZURhdGFDbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJsaWJjb3JlL2ljdS9Mb2NhbGVEYXRhIik7CiAgICAgbG9uZ0NsYXNzID0gZmluZENsYXNzKGVudiwgImphdmEvbGFuZy9Mb25nIik7CiAgICAgbWV0aG9kQ2xhc3MgPSBmaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kIik7CiAgICAgbXV0YWJsZUludENsYXNzID0gZmluZENsYXNzKGVudiwgImxpYmNvcmUvdXRpbC9NdXRhYmxlSW50Iik7CiAgICAgbXV0YWJsZUxvbmdDbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJsaWJjb3JlL3V0aWwvTXV0YWJsZUxvbmciKTsKKyAgICBvdXRwdXRTdHJlYW1DbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL091dHB1dFN0cmVhbSIpOwogICAgIHBhcnNlUG9zaXRpb25DbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL3RleHQvUGFyc2VQb3NpdGlvbiIpOwogICAgIHBhdHRlcm5TeW50YXhFeGNlcHRpb25DbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbiIpOwogICAgIHJlYWxUb1N0cmluZ0NsYXNzID0gZmluZENsYXNzKGVudiwgImphdmEvbGFuZy9SZWFsVG9TdHJpbmciKTsKICAgICBzb2NrZXRDbGFzcyA9IGZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9Tb2NrZXQiKTsKICAgICBzb2NrZXRJbXBsQ2xhc3MgPSBmaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvU29ja2V0SW1wbCIpOwotICAgIHN0cmluZ0FycmF5Q2xhc3MgPSBmaW5kQ2xhc3MoZW52LCAiW0xqYXZhL2xhbmcvU3RyaW5nOyIpOwogICAgIHN0cmluZ0NsYXNzID0gZmluZENsYXNzKGVudiwgImphdmEvbGFuZy9TdHJpbmciKTsKICAgICBzdHJ1Y3RBZGRyaW5mb0NsYXNzID0gZmluZENsYXNzKGVudiwgImxpYmNvcmUvaW8vU3RydWN0QWRkcmluZm8iKTsKICAgICBzdHJ1Y3RGbG9ja0NsYXNzID0gZmluZENsYXNzKGVudiwgImxpYmNvcmUvaW8vU3RydWN0RmxvY2siKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUNvbnN0YW50cy5oIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pQ29uc3RhbnRzLmgKaW5kZXggZGI1Mjc3NS4uYmI1YWViYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pQ29uc3RhbnRzLmgKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pQ29uc3RhbnRzLmgKQEAgLTU4LDE4ICs1OCwxOSBAQAogICAgIHN0YXRpYyBqY2xhc3MgaW5ldEFkZHJlc3NDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIGluZXRTb2NrZXRBZGRyZXNzQ2xhc3M7CiAgICAgc3RhdGljIGpjbGFzcyBpbmZsYXRlckNsYXNzOworICAgIHN0YXRpYyBqY2xhc3MgaW5wdXRTdHJlYW1DbGFzczsKICAgICBzdGF0aWMgamNsYXNzIGludGVnZXJDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIGxvY2FsZURhdGFDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIGxvbmdDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIG1ldGhvZENsYXNzOwogICAgIHN0YXRpYyBqY2xhc3MgbXV0YWJsZUludENsYXNzOwogICAgIHN0YXRpYyBqY2xhc3MgbXV0YWJsZUxvbmdDbGFzczsKKyAgICBzdGF0aWMgamNsYXNzIG91dHB1dFN0cmVhbUNsYXNzOwogICAgIHN0YXRpYyBqY2xhc3MgcGFyc2VQb3NpdGlvbkNsYXNzOwogICAgIHN0YXRpYyBqY2xhc3MgcGF0dGVyblN5bnRheEV4Y2VwdGlvbkNsYXNzOwogICAgIHN0YXRpYyBqY2xhc3MgcmVhbFRvU3RyaW5nQ2xhc3M7CiAgICAgc3RhdGljIGpjbGFzcyBzb2NrZXRDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIHNvY2tldEltcGxDbGFzczsKLSAgICBzdGF0aWMgamNsYXNzIHN0cmluZ0FycmF5Q2xhc3M7CiAgICAgc3RhdGljIGpjbGFzcyBzdHJpbmdDbGFzczsKICAgICBzdGF0aWMgamNsYXNzIHN0cnVjdEFkZHJpbmZvQ2xhc3M7CiAgICAgc3RhdGljIGpjbGFzcyBzdHJ1Y3RGbG9ja0NsYXNzOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pRXhjZXB0aW9uLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUV4Y2VwdGlvbi5jcHAKaW5kZXggYzczM2RiNC4uOGY5Nzg5MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvSm5pRXhjZXB0aW9uLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9KbmlFeGNlcHRpb24uY3BwCkBAIC0xNywyOSArMTcsNiBAQAogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKIAotYm9vbCBtYXliZVRocm93SWN1RXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgVUVycm9yQ29kZSBlcnJvcikgewotICAgIGlmIChVX1NVQ0NFU1MoZXJyb3IpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogZXhjZXB0aW9uQ2xhc3M7Ci0gICAgc3dpdGNoIChlcnJvcikgewotICAgIGNhc2UgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOgotICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SOgotICAgIGNhc2UgVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I6Ci0gICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFVfVU5TVVBQT1JURURfRVJST1I6Ci0gICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBqbmlUaHJvd0V4Y2VwdGlvbkZtdChlbnYsIGV4Y2VwdGlvbkNsYXNzLCAiJXMgZmFpbGVkOiAlcyIsIGZ1bmN0aW9uLCB1X2Vycm9yTmFtZShlcnJvcikpOwotfQotCiB2b2lkIGpuaVRocm93RXhjZXB0aW9uV2l0aEVycm5vKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBleGNlcHRpb25DbGFzc05hbWUsIGludCBlcnJvcikgewogICAgIGNoYXIgYnVmW0JVRlNJWl07CiAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCBleGNlcHRpb25DbGFzc05hbWUsIGpuaVN0ckVycm9yKGVycm9yLCBidWYsIHNpemVvZihidWYpKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9KbmlFeGNlcHRpb24uaCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUV4Y2VwdGlvbi5oCmluZGV4IGNlY2UyYWEuLjJkNGEwOTcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUV4Y2VwdGlvbi5oCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL0puaUV4Y2VwdGlvbi5oCkBAIC0xOCwxMyArMTgsMTAgQEAKICNkZWZpbmUgSk5JX0VYQ0VQVElPTl9IX2luY2x1ZGVkCiAKICNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIiAvLyBGb3IgVUVycm9yQ29kZS4KIAogdm9pZCBqbmlUaHJvd0V4Y2VwdGlvbldpdGhFcnJubyhKTklFbnYqIGVudiwgY29uc3QgY2hhciogZXhjZXB0aW9uQ2xhc3NOYW1lLCBpbnQgZXJyb3IpOwogCiB2b2lkIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWVzc2FnZSk7CiB2b2lkIGpuaVRocm93U29ja2V0RXhjZXB0aW9uKEpOSUVudiogZW52LCBpbnQgZXJyb3IpOwogCi1ib29sIG1heWJlVGhyb3dJY3VFeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBVRXJyb3JDb2RlIGVycm9yKTsKLQogI2VuZGlmICAvLyBKTklfRVhDRVBUSU9OX0hfaW5jbHVkZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL1BvcnRhYmlsaXR5LmggYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9Qb3J0YWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2Q1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9Qb3J0YWJpbGl0eS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBPUlRBQklMSVRZX0hfaW5jbHVkZWQKKyNkZWZpbmUgUE9SVEFCSUxJVFlfSF9pbmNsdWRlZAorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisKKy8vIE1hYyBPUy4KKyNpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4gLy8gRm9yIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQKKworI2luY2x1ZGUgPGxpYmtlcm4vT1NCeXRlT3JkZXIuaD4KKyNkZWZpbmUgYnN3YXBfMTYgT1NTd2FwSW50MTYKKyNkZWZpbmUgYnN3YXBfMzIgT1NTd2FwSW50MzIKKyNkZWZpbmUgYnN3YXBfNjQgT1NTd2FwSW50NjQKKworI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisKKy8vIE1hYyBPUyBoYXMgYSA2NC1iaXQgb2ZmX3QgYW5kIG5vIDMyLWJpdCBjb21wYXRpYmlsaXR5IGNydWZ0LgorI2RlZmluZSBmbG9jazY0IGZsb2NrCisjZGVmaW5lIGZ0cnVuY2F0ZTY0IGZ0cnVuY2F0ZQorI2RlZmluZSBpc25hbmYgX19pbmxpbmVfaXNuYW5mCisjZGVmaW5lIGxzZWVrNjQgbHNlZWsKKyNkZWZpbmUgcHJlYWQ2NCBwcmVhZAorI2RlZmluZSBwd3JpdGU2NCBwd3JpdGUKKworLy8gVE9ETzogRGFyd2luIGFwcGVhcnMgdG8gaGF2ZSBhbiBmZGF0YXN5bmMgc3lzY2FsbC4KK3N0YXRpYyBpbmxpbmUgaW50IGZkYXRhc3luYyhpbnQgZmQpIHsgcmV0dXJuIGZzeW5jKGZkKTsgfQorCisvLyBGb3IgTGludXgtY29tcGF0aWJsZSBzZW5kZmlsZSgzKS4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitzdGF0aWMgaW5saW5lIHNzaXplX3Qgc2VuZGZpbGUoaW50IG91dF9mZCwgaW50IGluX2ZkLCBvZmZfdCogb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgb2ZmX3QgaW5fb3V0X2NvdW50ID0gY291bnQ7CisgIGludCByZXN1bHQgPSBzZW5kZmlsZShpbl9mZCwgb3V0X2ZkLCAqb2Zmc2V0LCAmaW5fb3V0X2NvdW50LCBOVUxMLCAwKTsKKyAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gaW5fb3V0X2NvdW50OworfQorCisvLyBGb3IgbWluY29yZSgzKS4KKyNkZWZpbmUgX0RBUldJTl9DX1NPVVJDRQorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjdW5kZWYgX0RBUldJTl9DX1NPVVJDRQorc3RhdGljIGlubGluZSBpbnQgbWluY29yZSh2b2lkKiBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyKiB2ZWMpIHsKKyAgcmV0dXJuIG1pbmNvcmUoYWRkciwgbGVuZ3RoLCByZWludGVycHJldF9jYXN0PGNoYXIqPih2ZWMpKTsKK30KKworLy8gRm9yIHN0YXRmcygzKS4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNkZWZpbmUgZl9mcnNpemUgZl9ic2l6ZSAvLyBUT0RPOiBjbG9zZSBlbm91Z2g/CisKKyNlbHNlCisKKy8vIEJpb25pYyBvciBnbGliYy4KKworI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisKKy8vIEZvciBzdGF0ZnMoMykuCisjaW5jbHVkZSA8c3lzL3Zmcy5oPiAvLyBCaW9uaWMgZG9lc24ndCBoYXZlIDxzeXMvc3RhdHZmcy5oPgorCisjZW5kaWYKKworI2VuZGlmICAvLyBQT1JUQUJJTElUWV9IX2luY2x1ZGVkCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9SZWdpc3Rlci5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9SZWdpc3Rlci5jcHAKaW5kZXggMzZhYmQ3Yi4uYzk0Y2Q1ZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvUmVnaXN0ZXIuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL1JlZ2lzdGVyLmNwcApAQCAtNTQsNiArNTQsNyBAQAogICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2phdmFfdXRpbF96aXBfQ1JDMzIpOwogICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2phdmFfdXRpbF96aXBfRGVmbGF0ZXIpOwogICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2phdmFfdXRpbF96aXBfSW5mbGF0ZXIpOworICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2xpYmNvcmVfaWN1X0FscGhhYmV0aWNJbmRleCk7CiAgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pY3VfSUNVKTsKICAgICBSRUdJU1RFUihyZWdpc3Rlcl9saWJjb3JlX2ljdV9OYXRpdmVCcmVha0l0ZXJhdG9yKTsKICAgICBSRUdJU1RFUihyZWdpc3Rlcl9saWJjb3JlX2ljdV9OYXRpdmVDb2xsYXRpb24pOwpAQCAtNjIsNyArNjMsOCBAQAogICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2xpYmNvcmVfaWN1X05hdGl2ZUlETik7CiAgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pY3VfTmF0aXZlTm9ybWFsaXplcik7CiAgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pY3VfTmF0aXZlUGx1cmFsUnVsZXMpOwotICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2xpYmNvcmVfaWN1X1RpbWVab25lcyk7CisgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pY3VfVGltZVpvbmVOYW1lcyk7CisgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pY3VfVHJhbnNsaXRlcmF0b3IpOwogICAgIFJFR0lTVEVSKHJlZ2lzdGVyX2xpYmNvcmVfaW9fQXN5bmNocm9ub3VzQ2xvc2VNb25pdG9yKTsKICAgICBSRUdJU1RFUihyZWdpc3Rlcl9saWJjb3JlX2lvX01lbW9yeSk7CiAgICAgUkVHSVNURVIocmVnaXN0ZXJfbGliY29yZV9pb19Pc0NvbnN0YW50cyk7CkBAIC03MSw2ICs3Myw3IEBACiAgICAgUkVHSVNURVIocmVnaXN0ZXJfb3JnX2FwYWNoZV9oYXJtb255X2RhbHZpa19OYXRpdmVUZXN0VGFyZ2V0KTsKICAgICBSRUdJU1RFUihyZWdpc3Rlcl9vcmdfYXBhY2hlX2hhcm1vbnlfeG1sX0V4cGF0UGFyc2VyKTsKICAgICBSRUdJU1RFUihyZWdpc3Rlcl9vcmdfYXBhY2hlX2hhcm1vbnlfeG5ldF9wcm92aWRlcl9qc3NlX05hdGl2ZUNyeXB0byk7CisgICAgUkVHSVNURVIocmVnaXN0ZXJfc3VuX21pc2NfVW5zYWZlKTsKICN1bmRlZiBSRUdJU1RFUgogICAgIHJldHVybiBKTklfVkVSU0lPTl8xXzY7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS96aXAuaCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL1ppcFV0aWxpdGllcy5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGx1bmkvc3JjL21haW4vbmF0aXZlL3ppcC5oCnJlbmFtZSB0byBsdW5pL3NyYy9tYWluL25hdGl2ZS9aaXBVdGlsaXRpZXMuaAppbmRleCAzMDNjOTQwLi40Yzg2ZjMyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS96aXAuaAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9aaXBVdGlsaXRpZXMuaApAQCAtMTUsOCArMTUsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmICFkZWZpbmVkKHppcF9oKQotI2RlZmluZSB6aXBfaAorI2lmbmRlZiBaSVBfVVRJTElUSUVTX0hfaW5jbHVkZWQKKyNkZWZpbmUgWklQX1VUSUxJVElFU19IX2luY2x1ZGVkCiAKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiSm5pRXhjZXB0aW9uLmgiCkBAIC05Nyw0ICs5Nyw0IEBACiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TmF0aXZlWmlwU3RyZWFtKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihhZGRyZXNzKSk7CiB9CiAKLSNlbmRpZiAvKiB6aXBfaCAqLworI2VuZGlmICAvLyBaSVBfVVRJTElUSUVTX0hfaW5jbHVkZWQKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2NiaWdpbnQuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvY2JpZ2ludC5jcHAKaW5kZXggZGExNWZjYi4uNjk0M2NhMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvY2JpZ2ludC5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvY2JpZ2ludC5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJjYmlnaW50LmgiCiAKLSNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChGUkVFQlNEKSB8fCBkZWZpbmVkKFpPUykgfHwgZGVmaW5lZChNQUNPU1gpIHx8IGRlZmluZWQoQUlYKQorI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKICNkZWZpbmUgVVNFX0xMCiAjZW5kaWYKIApAQCAtMTIxLDcgKzEyMSw4IEBACiAgIGVsc2UgaWYgKGxlbmd0aCA9PSAxKQogICAgIHJldHVybiAxOwogCi0gIHdoaWxlICgrK2FyZzFbaW5kZXhdID09IDAgJiYgKytpbmRleCA8IGxlbmd0aCk7CisgIHdoaWxlICgrK2FyZzFbaW5kZXhdID09IDAgJiYgKytpbmRleCA8IGxlbmd0aCkgeworICB9CiAKICAgcmV0dXJuIGluZGV4ID09IGxlbmd0aDsKIH0KQEAgLTE2Niw3ICsxNjcsOCBAQAogICBlbHNlIGlmIChpbmRleCA9PSBsZW5ndGgxKQogICAgIHJldHVybiAxOwogCi0gIHdoaWxlICgrK2FyZzFbaW5kZXhdID09IDAgJiYgKytpbmRleCA8IGxlbmd0aDEpOworICB3aGlsZSAoKythcmcxW2luZGV4XSA9PSAwICYmICsraW5kZXggPCBsZW5ndGgxKSB7CisgIH0KIAogICByZXR1cm4gaW5kZXggPT0gbGVuZ3RoMTsKIH0KQEAgLTUzOSw4ICs1NDEsMTAgQEAKIGludDMyX3QKIGNvbXBhcmVIaWdoUHJlY2lzaW9uICh1aW50NjRfdCAqIGFyZzEsIGludDMyX3QgbGVuZ3RoMSwgdWludDY0X3QgKiBhcmcyLCBpbnQzMl90IGxlbmd0aDIpCiB7Ci0gIHdoaWxlICgtLWxlbmd0aDEgPj0gMCAmJiBhcmcxW2xlbmd0aDFdID09IDApOwotICB3aGlsZSAoLS1sZW5ndGgyID49IDAgJiYgYXJnMltsZW5ndGgyXSA9PSAwKTsKKyAgd2hpbGUgKC0tbGVuZ3RoMSA+PSAwICYmIGFyZzFbbGVuZ3RoMV0gPT0gMCkgeworICB9CisgIHdoaWxlICgtLWxlbmd0aDIgPj0gMCAmJiBhcmcyW2xlbmd0aDJdID09IDApIHsKKyAgfQogCiAgIGlmIChsZW5ndGgxID4gbGVuZ3RoMikKICAgICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfaW9fRmlsZS5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX0ZpbGUuY3BwCmluZGV4IGJhMWY1NWEuLmMyMTdlYTIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfaW9fRmlsZS5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9pb19GaWxlLmNwcApAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Zmcy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx1dGltZS5oPgpAQCAtMTA3LDEzICsxMDYsMTUgQEAKICAgICAgICAgaWYgKG1Jc0JhZCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgZGlyZW50KiByZXN1bHQgPSBOVUxMOwotICAgICAgICBpbnQgcmMgPSByZWFkZGlyX3IobURpclN0cmVhbSwgJm1FbnRyeSwgJnJlc3VsdCk7Ci0gICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICBtSXNCYWQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgZGlyZW50KiByZXN1bHQgPSByZWFkZGlyKG1EaXJTdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQtPmRfbmFtZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKHJlc3VsdCAhPSBOVUxMKSA/IHJlc3VsdC0+ZF9uYW1lIDogTlVMTDsKKyAgICAgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgICAgIG1Jc0JhZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLy8gSGFzIGFuIGVycm9yIG9jY3VycmVkIG9uIHRoaXMgc3RyZWFtPwpAQCAtMTIzLDcgKzEyNCw2IEBACiAKIHByaXZhdGU6CiAgICAgRElSKiBtRGlyU3RyZWFtOwotICAgIGRpcmVudCBtRW50cnk7CiAgICAgYm9vbCBtSXNCYWQ7CiAKICAgICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ25tZW50LgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9pb19PYmplY3RTdHJlYW1DbGFzcy5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX09iamVjdFN0cmVhbUNsYXNzLmNwcAppbmRleCBmNmJkNTYwLi45YTFiNjMyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX09iamVjdFN0cmVhbUNsYXNzLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2lvX09iamVjdFN0cmVhbUNsYXNzLmNwcApAQCAtNDcsMjEgKzQ3LDIxIEBACiAgICAgcmV0dXJuIChtaWQgIT0gMCk7CiB9CiAKLXN0YXRpYyBqaW50IE9iamVjdFN0cmVhbUNsYXNzX2dldENvbnN0cnVjdG9ySWQoSk5JRW52KiBlbnYsIGpjbGFzcywgamNsYXNzIGNvbnN0cnVjdG9yQ2xhc3MpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqaW50PihlbnYtPkdldE1ldGhvZElEKGNvbnN0cnVjdG9yQ2xhc3MsICI8aW5pdD4iLCAiKClWIikpOworc3RhdGljIGpsb25nIE9iamVjdFN0cmVhbUNsYXNzX2dldENvbnN0cnVjdG9ySWQoSk5JRW52KiBlbnYsIGpjbGFzcywgamNsYXNzIGNvbnN0cnVjdG9yQ2xhc3MpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqbG9uZz4oZW52LT5HZXRNZXRob2RJRChjb25zdHJ1Y3RvckNsYXNzLCAiPGluaXQ+IiwgIigpViIpKTsKIH0KIAotc3RhdGljIGpvYmplY3QgT2JqZWN0U3RyZWFtQ2xhc3NfbmV3SW5zdGFuY2UoSk5JRW52KiBlbnYsIGpjbGFzcywgamNsYXNzIGluc3RhbnRpYXRpb25DbGFzcywgamludCBtZXRob2RJZCkgeworc3RhdGljIGpvYmplY3QgT2JqZWN0U3RyZWFtQ2xhc3NfbmV3SW5zdGFuY2UoSk5JRW52KiBlbnYsIGpjbGFzcywgamNsYXNzIGluc3RhbnRpYXRpb25DbGFzcywgamxvbmcgbWV0aG9kSWQpIHsKICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoaW5zdGFudGlhdGlvbkNsYXNzLCByZWludGVycHJldF9jYXN0PGptZXRob2RJRD4obWV0aG9kSWQpKTsKIH0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIE5BVElWRV9NRVRIT0QoT2JqZWN0U3RyZWFtQ2xhc3MsIGdldENvbnN0cnVjdG9ySWQsICIoTGphdmEvbGFuZy9DbGFzczspSSIpLAorICAgIE5BVElWRV9NRVRIT0QoT2JqZWN0U3RyZWFtQ2xhc3MsIGdldENvbnN0cnVjdG9ySWQsICIoTGphdmEvbGFuZy9DbGFzczspSiIpLAogICAgIE5BVElWRV9NRVRIT0QoT2JqZWN0U3RyZWFtQ2xhc3MsIGdldENvbnN0cnVjdG9yU2lnbmF0dXJlLCAiKExqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjspTGphdmEvbGFuZy9TdHJpbmc7IiksCiAgICAgTkFUSVZFX01FVEhPRChPYmplY3RTdHJlYW1DbGFzcywgZ2V0RmllbGRTaWduYXR1cmUsICIoTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOylMamF2YS9sYW5nL1N0cmluZzsiKSwKICAgICBOQVRJVkVfTUVUSE9EKE9iamVjdFN0cmVhbUNsYXNzLCBnZXRNZXRob2RTaWduYXR1cmUsICIoTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDspTGphdmEvbGFuZy9TdHJpbmc7IiksCiAgICAgTkFUSVZFX01FVEhPRChPYmplY3RTdHJlYW1DbGFzcywgaGFzQ2xpbml0LCAiKExqYXZhL2xhbmcvQ2xhc3M7KVoiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE9iamVjdFN0cmVhbUNsYXNzLCBuZXdJbnN0YW5jZSwgIihMamF2YS9sYW5nL0NsYXNzO0kpTGphdmEvbGFuZy9PYmplY3Q7IiksCisgICAgTkFUSVZFX01FVEhPRChPYmplY3RTdHJlYW1DbGFzcywgbmV3SW5zdGFuY2UsICIoTGphdmEvbGFuZy9DbGFzcztKKUxqYXZhL2xhbmcvT2JqZWN0OyIpLAogfTsKIHZvaWQgcmVnaXN0ZXJfamF2YV9pb19PYmplY3RTdHJlYW1DbGFzcyhKTklFbnYqIGVudikgewogICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJqYXZhL2lvL09iamVjdFN0cmVhbUNsYXNzIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfUHJvY2Vzc01hbmFnZXIuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX1Byb2Nlc3NNYW5hZ2VyLmNwcAppbmRleCA2MzAyZDEzLi5lM2YwZjQ1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfUHJvY2Vzc01hbmFnZXIuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfbGFuZ19Qcm9jZXNzTWFuYWdlci5jcHAKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIlBvcnRhYmlsaXR5LmgiCiAjaW5jbHVkZSAiU2NvcGVkTG9jYWxSZWYuaCIKICNpbmNsdWRlICJjdXRpbHMvbG9nLmgiCisjaW5jbHVkZSAidG9TdHJpbmdBcnJheS5oIgogCiAvKiogQ2xvc2UgYWxsIG9wZW4gZmRzID4gMiAoaS5lLiBldmVyeXRoaW5nIGJ1dCBzdGRpbi9vdXQvZXJyKSwgIT0gc2tpcEZkLiAqLwogc3RhdGljIHZvaWQgY2xvc2VOb25TdGFuZGFyZEZkcyhpbnQgc2tpcEZkMSwgaW50IHNraXBGZDIpIHsKQEAgLTEwMSw5ICsxMDMsOSBAQAogICAgIC8vIElmIHRoaXMgaXMgdGhlIGNoaWxkIHByb2Nlc3MuLi4KICAgICBpZiAoY2hpbGRQaWQgPT0gMCkgewogICAgICAgICAvKgotICAgICAgICAgKiBOb3RlOiBXZSBjYW5ub3QgbWFsbG9jKCkgb3IgZnJlZSgpIGFmdGVyIHRoaXMgcG9pbnQhCi0gICAgICAgICAqIEEgbm8tbG9uZ2VyLXJ1bm5pbmcgdGhyZWFkIG1heSBiZSBob2xkaW5nIG9uIHRvIHRoZSBoZWFwIGxvY2ssIGFuZAotICAgICAgICAgKiBhbiBhdHRlbXB0IHRvIG1hbGxvYygpIG9yIGZyZWUoKSB3b3VsZCByZXN1bHQgaW4gZGVhZGxvY2suCisgICAgICAgICAqIE5vdGU6IFdlIGNhbm5vdCBtYWxsb2MoMykgb3IgZnJlZSgzKSBhZnRlciB0aGlzIHBvaW50IQorICAgICAgICAgKiBBIHRocmVhZCBpbiB0aGUgcGFyZW50IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGUgY2hpbGQgbWF5IGhhdmUgaGVsZCB0aGUgaGVhcCBsb2NrCisgICAgICAgICAqIHdoZW4gd2UgZm9ya2VkLCBzbyBhbiBhdHRlbXB0IHRvIG1hbGxvYygzKSBvciBmcmVlKDMpIHdvdWxkIHJlc3VsdCBpbiBkZWFkbG9jay4KICAgICAgICAgICovCiAKICAgICAgICAgLy8gUmVwbGFjZSBzdGRpbiwgb3V0LCBhbmQgZXJyIHdpdGggcGlwZXMuCkBAIC0xNDMsMTEgKzE0NSwxMSBAQAogICAgICAgICBleGVjdnAoY29tbWFuZHNbMF0sIGNvbW1hbmRzKTsKIAogICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXhlY3ZwKCkgZmFpbGVkIG9yIHRoZSB3b3JraW5nIGRpciB3YXMgaW52YWxpZC4KLSAgICAgICAgZXhlY0ZhaWxlZDoKLSAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOwotICAgICAgICAgICAgd3JpdGUoc3RhdHVzT3V0LCAmZXJyb3IsIHNpemVvZihpbnQpKTsKLSAgICAgICAgICAgIGNsb3NlKHN0YXR1c091dCk7Ci0gICAgICAgICAgICBleGl0KGVycm9yKTsKK2V4ZWNGYWlsZWQ6CisgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICB3cml0ZShzdGF0dXNPdXQsICZlcnJvciwgc2l6ZW9mKGludCkpOworICAgICAgICBjbG9zZShzdGF0dXNPdXQpOworICAgICAgICBleGl0KGVycm9yKTsKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIHRoZSBwYXJlbnQgcHJvY2Vzcy4KQEAgLTE4Miw0MCArMTg0LDYgQEAKICAgICByZXR1cm4gY2hpbGRQaWQ7CiB9CiAKLS8qKiBDb252ZXJ0cyBhIEphdmEgU3RyaW5nW10gdG8gYSAwLXRlcm1pbmF0ZWQgY2hhcioqLiAqLwotc3RhdGljIGNoYXIqKiBjb252ZXJ0U3RyaW5ncyhKTklFbnYqIGVudiwgam9iamVjdEFycmF5IGphdmFBcnJheSkgewotICAgIGlmIChqYXZhQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGphdmFBcnJheSk7Ci0gICAgY2hhcioqIGFycmF5ID0gbmV3IGNoYXIqW2xlbmd0aCArIDFdOwotICAgIGFycmF5W2xlbmd0aF0gPSAwOwotICAgIGZvciAoanNpemUgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqYXZhRW50cnkoZW52LCByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGphdmFBcnJheSwgaSkpKTsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoZXNlIHN0cmluZ3MgdG8gY29uc3QtdW5mcmllbmRseSBjb2RlLgotICAgICAgICBjaGFyKiBlbnRyeSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoamF2YUVudHJ5LmdldCgpLCBOVUxMKSk7Ci0gICAgICAgIGFycmF5W2ldID0gZW50cnk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFycmF5OwotfQotCi0vKiogRnJlZXMgYSBjaGFyKiogd2hpY2ggd2FzIGNvbnZlcnRlZCBmcm9tIGEgSmF2YSBTdHJpbmdbXS4gKi8KLXN0YXRpYyB2b2lkIGZyZWVTdHJpbmdzKEpOSUVudiogZW52LCBqb2JqZWN0QXJyYXkgamF2YUFycmF5LCBjaGFyKiogYXJyYXkpIHsKLSAgICBpZiAoamF2YUFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamF2YUFycmF5KTsKLSAgICBmb3IgKGpzaXplIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gamF2YUVudHJ5KGVudiwgcmVpbnRlcnByZXRfY2FzdDxqc3RyaW5nPihlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChqYXZhQXJyYXksIGkpKSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGphdmFFbnRyeS5nZXQoKSwgYXJyYXlbaV0pOwotICAgIH0KLQotICAgIGRlbGV0ZVtdIGFycmF5OwotfQotCiAvKioKICAqIENvbnZlcnRzIEphdmEgU3RyaW5nW10gdG8gY2hhcioqIGFuZCBkZWxlZ2F0ZXMgdG8gZXhlY3V0ZVByb2Nlc3MoKS4KICAqLwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX1N0cmljdE1hdGguY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX1N0cmljdE1hdGguY3BwCmluZGV4IDk1OWRkYzYuLmNmZTM3NWUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfbGFuZ19TdHJpY3RNYXRoLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfU3RyaWN0TWF0aC5jcHAKQEAgLTE0NCw3ICsxNDQsNiBAQAogICAgIE5BVElWRV9NRVRIT0QoU3RyaWN0TWF0aCwgdGFuLCAiIShEKUQiKSwKICAgICBOQVRJVkVfTUVUSE9EKFN0cmljdE1hdGgsIHRhbmgsICIhKEQpRCIpLAogfTsKLQogdm9pZCByZWdpc3Rlcl9qYXZhX2xhbmdfU3RyaWN0TWF0aChKTklFbnYqIGVudikgewogICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJqYXZhL2xhbmcvU3RyaWN0TWF0aCIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV9sYW5nX1N0cmluZ1RvUmVhbC5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfU3RyaW5nVG9SZWFsLmNwcAppbmRleCBkNDAxZTY1Li4xMDhmOTM5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfU3RyaW5nVG9SZWFsLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX2xhbmdfU3RyaW5nVG9SZWFsLmNwcApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgImNiaWdpbnQuaCIKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChGUkVFQlNEKQorI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKICNkZWZpbmUgVVNFX0xMCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV90ZXh0X0JpZGkuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV90ZXh0X0JpZGkuY3BwCmluZGV4IDAxYmNhMDkuLmQ5ZWYzNWQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdGV4dF9CaWRpLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX3RleHRfQmlkaS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJCaWRpIgogCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgpAQCAtMTQ0LDcgKzE0NSw4IEBACiAgICAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAidWJpZGlfY291bnRSdW5zIiwgc3RhdHVzKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgam1ldGhvZElEIGJpZGlSdW5Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoSm5pQ29uc3RhbnRzOjpiaWRpUnVuQ2xhc3MsICI8aW5pdD4iLCAiKElJSSlWIik7CisgICAgc3RhdGljIGptZXRob2RJRCBiaWRpUnVuQ29uc3RydWN0b3IgPQorICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChKbmlDb25zdGFudHM6OmJpZGlSdW5DbGFzcywgIjxpbml0PiIsICIoSUlJKVYiKTsKICAgICBqb2JqZWN0QXJyYXkgcnVucyA9IGVudi0+TmV3T2JqZWN0QXJyYXkocnVuQ291bnQsIEpuaUNvbnN0YW50czo6YmlkaVJ1bkNsYXNzLCBOVUxMKTsKICAgICBVQmlEaUxldmVsIGxldmVsID0gMDsKICAgICBpbnQgc3RhcnQgPSAwOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3JlZ2V4X01hdGNoZXIuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3JlZ2V4X01hdGNoZXIuY3BwCmluZGV4IDYxMTZkMmIuLjliNTgzMDEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF9yZWdleF9NYXRjaGVyLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX3V0aWxfcmVnZXhfTWF0Y2hlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgpAQCAtMjksOCArMzAsOCBAQAogCiAvLyBJQ1UgZG9jdW1lbnRhdGlvbjogaHR0cDovL2ljdS1wcm9qZWN0Lm9yZy9hcGlyZWYvaWN1NGMvY2xhc3NSZWdleE1hdGNoZXIuaHRtbAogCi1zdGF0aWMgUmVnZXhNYXRjaGVyKiB0b1JlZ2V4TWF0Y2hlcihqaW50IGFkZHIpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZWdleE1hdGNoZXIqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGFkZHIpKTsKK3N0YXRpYyBSZWdleE1hdGNoZXIqIHRvUmVnZXhNYXRjaGVyKGppbnQgYWRkcmVzcykgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlZ2V4TWF0Y2hlcio+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oYWRkcmVzcykpOwogfQogCiAvKioKQEAgLTQxLDggKzQyLDggQEAKICAqLwogY2xhc3MgTWF0Y2hlckFjY2Vzc29yIHsKIHB1YmxpYzoKLSAgICBNYXRjaGVyQWNjZXNzb3IoSk5JRW52KiBlbnYsIGppbnQgYWRkciwganN0cmluZyBqYXZhSW5wdXQsIGJvb2wgcmVzZXQpIHsKLSAgICAgICAgaW5pdChlbnYsIGFkZHIpOworICAgIE1hdGNoZXJBY2Nlc3NvcihKTklFbnYqIGVudiwgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCwgYm9vbCByZXNldCkgeworICAgICAgICBpbml0KGVudiwgYWRkcmVzcyk7CiAKICAgICAgICAgbUphdmFJbnB1dCA9IGphdmFJbnB1dDsKICAgICAgICAgbUNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyhtSmF2YUlucHV0LCBOVUxMKTsKQEAgLTYyLDggKzYzLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIE1hdGNoZXJBY2Nlc3NvcihKTklFbnYqIGVudiwgamludCBhZGRyKSB7Ci0gICAgICAgIGluaXQoZW52LCBhZGRyKTsKKyAgICBNYXRjaGVyQWNjZXNzb3IoSk5JRW52KiBlbnYsIGppbnQgYWRkcmVzcykgeworICAgICAgICBpbml0KGVudiwgYWRkcmVzcyk7CiAgICAgfQogCiAgICAgfk1hdGNoZXJBY2Nlc3NvcigpIHsKQEAgLTk1LDEwICs5NiwxMCBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIGluaXQoSk5JRW52KiBlbnYsIGppbnQgYWRkcikgeworICAgIHZvaWQgaW5pdChKTklFbnYqIGVudiwgamludCBhZGRyZXNzKSB7CiAgICAgICAgIG1FbnYgPSBlbnY7CiAgICAgICAgIG1KYXZhSW5wdXQgPSBOVUxMOwotICAgICAgICBtTWF0Y2hlciA9IHRvUmVnZXhNYXRjaGVyKGFkZHIpOworICAgICAgICBtTWF0Y2hlciA9IHRvUmVnZXhNYXRjaGVyKGFkZHJlc3MpOwogICAgICAgICBtQ2hhcnMgPSBOVUxMOwogICAgICAgICBtU3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgICAgICBtVVRleHQgPSBOVUxMOwpAQCAtMTE2LDggKzExNyw4IEBACiAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWF0Y2hlckFjY2Vzc29yJik7CiB9OwogCi1zdGF0aWMgdm9pZCBNYXRjaGVyX2Nsb3NlSW1wbChKTklFbnYqLCBqY2xhc3MsIGppbnQgYWRkcikgewotICAgIGRlbGV0ZSB0b1JlZ2V4TWF0Y2hlcihhZGRyKTsKK3N0YXRpYyB2b2lkIE1hdGNoZXJfY2xvc2VJbXBsKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyZXNzKSB7CisgICAgZGVsZXRlIHRvUmVnZXhNYXRjaGVyKGFkZHJlc3MpOwogfQogCiBzdGF0aWMgamludCBNYXRjaGVyX2ZpbmRJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkciwganN0cmluZyBqYXZhVGV4dCwgamludCBzdGFydEluZGV4LCBqaW50QXJyYXkgb2Zmc2V0cykgewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3JlZ2V4X1BhdHRlcm4uY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3JlZ2V4X1BhdHRlcm4uY3BwCmluZGV4IGNhZDE1NGYuLmJkMWYzMjYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF9yZWdleF9QYXR0ZXJuLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX3V0aWxfcmVnZXhfUGF0dGVybi5jcHAKQEAgLTgzLDYgKzgzLDkgQEAKICAgICBlcnJvci5vZmZzZXQgPSAtMTsKIAogICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHJlZ2V4KGVudiwgamF2YVJlZ2V4KTsKKyAgICBpZiAoIXJlZ2V4LnZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIFVuaWNvZGVTdHJpbmcmIHJlZ2V4U3RyaW5nKHJlZ2V4LnVuaWNvZGVTdHJpbmcoKSk7CiAgICAgUmVnZXhQYXR0ZXJuKiByZXN1bHQgPSBSZWdleFBhdHRlcm46OmNvbXBpbGUocmVnZXhTdHJpbmcsIGZsYWdzLCBlcnJvciwgc3RhdHVzKTsKICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9qYXZhX3V0aWxfemlwX0RlZmxhdGVyLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF96aXBfRGVmbGF0ZXIuY3BwCmluZGV4IGUxMjkxMzQuLmVkN2Q3NTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF96aXBfRGVmbGF0ZXIuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF96aXBfRGVmbGF0ZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKICNpbmNsdWRlICJTY29wZWRQcmltaXRpdmVBcnJheS5oIgotI2luY2x1ZGUgInppcC5oIgorI2luY2x1ZGUgIlppcFV0aWxpdGllcy5oIgogCiBzdGF0aWMgdm9pZCBEZWZsYXRlcl9zZXREaWN0aW9uYXJ5SW1wbChKTklFbnYqIGVudiwgam9iamVjdCwgamJ5dGVBcnJheSBkaWN0LCBpbnQgb2ZmLCBpbnQgbGVuLCBqbG9uZyBoYW5kbGUpIHsKICAgICB0b05hdGl2ZVppcFN0cmVhbShoYW5kbGUpLT5zZXREaWN0aW9uYXJ5KGVudiwgZGljdCwgb2ZmLCBsZW4sIGZhbHNlKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2phdmFfdXRpbF96aXBfSW5mbGF0ZXIuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3ppcF9JbmZsYXRlci5jcHAKaW5kZXggODkwYzZkYy4uNmFhM2UyNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3ppcF9JbmZsYXRlci5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvamF2YV91dGlsX3ppcF9JbmZsYXRlci5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIlNjb3BlZFByaW1pdGl2ZUFycmF5LmgiCi0jaW5jbHVkZSAiemlwLmgiCisjaW5jbHVkZSAiWmlwVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8ZXJybm8uaD4KIAogc3RhdGljIGpsb25nIEluZmxhdGVyX2NyZWF0ZVN0cmVhbShKTklFbnYqIGVudiwgam9iamVjdCwgamJvb2xlYW4gbm9IZWFkZXIpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X0FscGhhYmV0aWNJbmRleC5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9BbHBoYWJldGljSW5kZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTgwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9BbHBoYWJldGljSW5kZXguY3BwCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBbHBoYWJldGljSW5kZXgiCisKKyNpbmNsdWRlICJJY3VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiSm5pQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiSm5pRXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlICJTY29wZWRTdHJpbmdDaGFycy5oIgorI2luY2x1ZGUgInVuaWNvZGUvYWxwaGFpbmRleC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc2V0LmgiCisKK3N0YXRpYyBBbHBoYWJldGljSW5kZXgqIGZyb21QZWVyKGpsb25nIHBlZXIpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QWxwaGFiZXRpY0luZGV4Kj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihwZWVyKSk7Cit9CisKK3N0YXRpYyBqbG9uZyBBbHBoYWJldGljSW5kZXhfY3JlYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YUxvY2FsZSkgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgQWxwaGFiZXRpY0luZGV4KiBhaSA9IG5ldyBBbHBoYWJldGljSW5kZXgoZ2V0TG9jYWxlKGVudiwgamF2YUxvY2FsZSksIHN0YXR1cyk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIkFscGhhYmV0aWNJbmRleCIsIHN0YXR1cykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGFpKTsKK30KKworc3RhdGljIHZvaWQgQWxwaGFiZXRpY0luZGV4X2Rlc3Ryb3koSk5JRW52KiwgamNsYXNzLCBqbG9uZyBwZWVyKSB7CisgIGRlbGV0ZSBmcm9tUGVlcihwZWVyKTsKK30KKworc3RhdGljIHZvaWQgQWxwaGFiZXRpY0luZGV4X2FkZExhYmVscyhKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwZWVyLCBqc3RyaW5nIGphdmFMb2NhbGUpIHsKKyAgQWxwaGFiZXRpY0luZGV4KiBhaSA9IGZyb21QZWVyKHBlZXIpOworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgYWktPmFkZExhYmVscyhnZXRMb2NhbGUoZW52LCBqYXZhTG9jYWxlKSwgc3RhdHVzKTsKKyAgbWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsICJBbHBoYWJldGljSW5kZXg6OmFkZExhYmVscyIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhYmV0aWNJbmRleF9hZGRMYWJlbFJhbmdlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvZGVQb2ludFN0YXJ0LCBqaW50IGNvZGVQb2ludEVuZCkgeworICBBbHBoYWJldGljSW5kZXgqIGFpID0gZnJvbVBlZXIocGVlcik7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBhaS0+YWRkTGFiZWxzKFVuaWNvZGVTZXQoY29kZVBvaW50U3RhcnQsIGNvZGVQb2ludEVuZCksIHN0YXR1cyk7CisgIG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAiQWxwaGFiZXRpY0luZGV4OjphZGRMYWJlbHMiLCBzdGF0dXMpOworfQorCitzdGF0aWMgamludCBBbHBoYWJldGljSW5kZXhfZ2V0QnVja2V0Q291bnQoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGVlcikgeworICBBbHBoYWJldGljSW5kZXgqIGFpID0gZnJvbVBlZXIocGVlcik7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBqaW50IHJlc3VsdCA9IGFpLT5nZXRCdWNrZXRDb3VudChzdGF0dXMpOworICBpZiAobWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsICJBbHBoYWJldGljSW5kZXg6OmdldEJ1Y2tldENvdW50Iiwgc3RhdHVzKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgamludCBBbHBoYWJldGljSW5kZXhfZ2V0QnVja2V0SW5kZXgoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGVlciwganN0cmluZyBqYXZhU3RyaW5nKSB7CisgIEFscGhhYmV0aWNJbmRleCogYWkgPSBmcm9tUGVlcihwZWVyKTsKKyAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgc3RyaW5nKGVudiwgamF2YVN0cmluZyk7CisgIGlmICghc3RyaW5nLnZhbGlkKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGppbnQgcmVzdWx0ID0gYWktPmdldEJ1Y2tldEluZGV4KHN0cmluZy51bmljb2RlU3RyaW5nKCksIHN0YXR1cyk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIkFscGhhYmV0aWNJbmRleDo6Z2V0QnVja2V0SW5kZXgiLCBzdGF0dXMpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBqc3RyaW5nIEFscGhhYmV0aWNJbmRleF9nZXRCdWNrZXRMYWJlbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwZWVyLCBqaW50IGluZGV4KSB7CisgIGlmIChpbmRleCA8IDApIHsKKyAgICBqbmlUaHJvd0V4Y2VwdGlvbkZtdChlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIkludmFsaWQgaW5kZXg6ICVkIiwgaW5kZXgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gSXRlcmF0ZSB0byB0aGUgbnRoIGJ1Y2tldC4KKyAgQWxwaGFiZXRpY0luZGV4KiBhaSA9IGZyb21QZWVyKHBlZXIpOworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgYWktPnJlc2V0QnVja2V0SXRlcmF0b3Ioc3RhdHVzKTsKKyAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAiQWxwaGFiZXRpY0luZGV4OjpyZXNldEJ1Y2tldEl0ZXJhdG9yIiwgc3RhdHVzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoamludCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgaWYgKCFhaS0+bmV4dEJ1Y2tldChzdGF0dXMpKSB7CisgICAgICBqbmlUaHJvd0V4Y2VwdGlvbkZtdChlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIkludmFsaWQgaW5kZXg6ICVkIiwgaW5kZXgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIkFscGhhYmV0aWNJbmRleDo6bmV4dEJ1Y2tldCIsIHN0YXR1cykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybiAiIiBmb3IgdGhlIHVuZGVyZmxvdy9pbmZsb3cvb3ZlcmZsb3cgYnVja2V0cy4KKyAgaWYgKGFpLT5nZXRCdWNrZXRMYWJlbFR5cGUoKSAhPSBVX0FMUEhBSU5ERVhfTk9STUFMKSB7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKCIiKTsKKyAgfQorCisgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGxhYmVsKGFpLT5nZXRCdWNrZXRMYWJlbCgpKTsKKyAgcmV0dXJuIGVudi0+TmV3U3RyaW5nKGxhYmVsLmdldEJ1ZmZlcigpLCBsYWJlbC5sZW5ndGgoKSk7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgTkFUSVZFX01FVEhPRChBbHBoYWJldGljSW5kZXgsIGNyZWF0ZSwgIihMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICBOQVRJVkVfTUVUSE9EKEFscGhhYmV0aWNJbmRleCwgZGVzdHJveSwgIihKKVYiKSwKKyAgTkFUSVZFX01FVEhPRChBbHBoYWJldGljSW5kZXgsIGFkZExhYmVscywgIihKTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgTkFUSVZFX01FVEhPRChBbHBoYWJldGljSW5kZXgsIGFkZExhYmVsUmFuZ2UsICIoSklJKVYiKSwKKyAgTkFUSVZFX01FVEhPRChBbHBoYWJldGljSW5kZXgsIGdldEJ1Y2tldENvdW50LCAiKEopSSIpLAorICBOQVRJVkVfTUVUSE9EKEFscGhhYmV0aWNJbmRleCwgZ2V0QnVja2V0SW5kZXgsICIoSkxqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgIE5BVElWRV9NRVRIT0QoQWxwaGFiZXRpY0luZGV4LCBnZXRCdWNrZXRMYWJlbCwgIihKSSlMamF2YS9sYW5nL1N0cmluZzsiKSwKK307Cit2b2lkIHJlZ2lzdGVyX2xpYmNvcmVfaWN1X0FscGhhYmV0aWNJbmRleChKTklFbnYqIGVudikgeworICBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAibGliY29yZS9pY3UvQWxwaGFiZXRpY0luZGV4IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9JQ1UuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfSUNVLmNwcAppbmRleCA1MjI0NDIwLi41M2ExMjQxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9JQ1UuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X0lDVS5jcHAKQEAgLTE2LDEzICsxNiwxMyBAQAogCiAjZGVmaW5lIExPR19UQUcgIklDVSIKIAorI2luY2x1ZGUgIkljdVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKICNpbmNsdWRlICJKbmlFeGNlcHRpb24uaCIKICNpbmNsdWRlICJTY29wZWRGZC5oIgogI2luY2x1ZGUgIlNjb3BlZEphdmFVbmljb2RlU3RyaW5nLmgiCiAjaW5jbHVkZSAiU2NvcGVkTG9jYWxSZWYuaCIKLSNpbmNsdWRlICJTY29wZWRTdHJpbmdDaGFycy5oIgogI2luY2x1ZGUgIlNjb3BlZFV0ZkNoYXJzLmgiCiAjaW5jbHVkZSAiVW5pcXVlUHRyLmgiCiAjaW5jbHVkZSAiY3V0aWxzL2xvZy5oIgpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgInVuaWNvZGUvZGNmbXRzeW0uaCIKICNpbmNsdWRlICJ1bmljb2RlL2RlY2ltZm10LmgiCiAjaW5jbHVkZSAidW5pY29kZS9kdGZtdHN5bS5oIgorI2luY2x1ZGUgInVuaWNvZGUvZHRwdG5nZW4uaCIKICNpbmNsdWRlICJ1bmljb2RlL2dyZWdvY2FsLmgiCiAjaW5jbHVkZSAidW5pY29kZS9sb2NpZC5oIgogI2luY2x1ZGUgInVuaWNvZGUvbnVtZm10LmgiCkBAIC00Myw2ICs0NCw3IEBACiAjaW5jbHVkZSAidW5pY29kZS91Y3Vyci5oIgogI2luY2x1ZGUgInVuaWNvZGUvdWRhdC5oIgogI2luY2x1ZGUgInVuaWNvZGUvdWxvYy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWxvY2RhdGEuaCIKICNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKICNpbmNsdWRlICJ1cmVzbG9jcy5oIgogI2luY2x1ZGUgInZhbHVlT2YuaCIKQEAgLTkyLDEwICs5NCw2IEBACiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY29wZWRSZXNvdXJjZUJ1bmRsZSk7CiB9OwogCi1Mb2NhbGUgZ2V0TG9jYWxlKEpOSUVudiogZW52LCBqc3RyaW5nIGxvY2FsZU5hbWUpIHsKLSAgICByZXR1cm4gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZShTY29wZWRVdGZDaGFycyhlbnYsIGxvY2FsZU5hbWUpLmNfc3RyKCkpOwotfQotCiBzdGF0aWMganN0cmluZyBJQ1VfYWRkTGlrZWx5U3VidGFncyhKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGphdmFMb2NhbGUpIHsKICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICBTY29wZWRVdGZDaGFycyBsb2NhbGVJRChlbnYsIGphdmFMb2NhbGUpOwpAQCAtMTE5LDEyICsxMTcsMTYgQEAKIH0KIAogc3RhdGljIGppbnQgSUNVX2dldEN1cnJlbmN5RnJhY3Rpb25EaWdpdHMoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhQ3VycmVuY3lDb2RlKSB7Ci0gICAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgY3VycmVuY3lDb2RlKGVudiwgamF2YUN1cnJlbmN5Q29kZSk7Ci0gICAgVW5pY29kZVN0cmluZyBpY3VDdXJyZW5jeUNvZGUoY3VycmVuY3lDb2RlLnVuaWNvZGVTdHJpbmcoKSk7Ci0gICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0gICAgcmV0dXJuIHVjdXJyX2dldERlZmF1bHRGcmFjdGlvbkRpZ2l0cyhpY3VDdXJyZW5jeUNvZGUuZ2V0VGVybWluYXRlZEJ1ZmZlcigpLCAmc3RhdHVzKTsKKyAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgY3VycmVuY3lDb2RlKGVudiwgamF2YUN1cnJlbmN5Q29kZSk7CisgIGlmICghY3VycmVuY3lDb2RlLnZhbGlkKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBVbmljb2RlU3RyaW5nIGljdUN1cnJlbmN5Q29kZShjdXJyZW5jeUNvZGUudW5pY29kZVN0cmluZygpKTsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIHJldHVybiB1Y3Vycl9nZXREZWZhdWx0RnJhY3Rpb25EaWdpdHMoaWN1Q3VycmVuY3lDb2RlLmdldFRlcm1pbmF0ZWRCdWZmZXIoKSwgJnN0YXR1cyk7CiB9CiAKKy8vIFRPRE86IHJld3JpdGUgdGhpcyB3aXRoIGludDMyX3QgdWN1cnJfZm9yTG9jYWxlKGNvbnN0IGNoYXIqIGxvY2FsZSwgVUNoYXIqIGJ1ZmYsIGludDMyX3QgYnVmZkNhcGFjaXR5LCBVRXJyb3JDb2RlKiBlYykuLi4KIHN0YXRpYyBqc3RyaW5nIElDVV9nZXRDdXJyZW5jeUNvZGUoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhQ291bnRyeUNvZGUpIHsKICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICBTY29wZWRSZXNvdXJjZUJ1bmRsZSBzdXBwbERhdGEodXJlc19vcGVuRGlyZWN0KFVfSUNVREFUQV9DVVJSLCAic3VwcGxlbWVudGFsRGF0YSIsICZzdGF0dXMpKTsKQEAgLTE2Nyw1MCArMTY5LDQ0IEBACiAgICAgcmV0dXJuIChjaGFyQ291bnQgPT0gMCkgPyBlbnYtPk5ld1N0cmluZ1VURigiWFhYIikgOiBlbnYtPk5ld1N0cmluZyhjaGFycywgY2hhckNvdW50KTsKIH0KIAotc3RhdGljIGpzdHJpbmcgSUNVX2dldEN1cnJlbmN5RGlzcGxheU5hbWUoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhTG9jYWxlTmFtZSwganN0cmluZyBqYXZhQ3VycmVuY3lDb2RlKSB7Ci0gICAgU2NvcGVkVXRmQ2hhcnMgbG9jYWxlTmFtZShlbnYsIGphdmFMb2NhbGVOYW1lKTsKLSAgICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBjdXJyZW5jeUNvZGUoZW52LCBqYXZhQ3VycmVuY3lDb2RlKTsKLSAgICBVbmljb2RlU3RyaW5nIGljdUN1cnJlbmN5Q29kZShjdXJyZW5jeUNvZGUudW5pY29kZVN0cmluZygpKTsKLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBVQm9vbCBpc0Nob2ljZUZvcm1hdDsKLSAgICBpbnQzMl90IGNoYXJDb3VudDsKLSAgICBjb25zdCBVQ2hhciogY2hhcnMgPSB1Y3Vycl9nZXROYW1lKGljdUN1cnJlbmN5Q29kZS5nZXRUZXJtaW5hdGVkQnVmZmVyKCksIGxvY2FsZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIFVDVVJSX0xPTkdfTkFNRSwgJmlzQ2hvaWNlRm9ybWF0LCAmY2hhckNvdW50LCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzID09IFVfVVNJTkdfREVGQVVMVF9XQVJOSU5HKSB7Ci0gICAgICAgIC8vIElDVSdzIGRlZmF1bHQgaXMgRW5nbGlzaC4gV2Ugd2FudCB0aGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBpbnN0ZWFkLgotICAgICAgICBjaGFycyA9IGljdUN1cnJlbmN5Q29kZS5nZXRCdWZmZXIoKTsKLSAgICAgICAgY2hhckNvdW50ID0gaWN1Q3VycmVuY3lDb2RlLmxlbmd0aCgpOworc3RhdGljIGpzdHJpbmcgZ2V0Q3VycmVuY3lOYW1lKEpOSUVudiogZW52LCBqc3RyaW5nIGphdmFMb2NhbGVOYW1lLCBqc3RyaW5nIGphdmFDdXJyZW5jeUNvZGUsIFVDdXJyTmFtZVN0eWxlIG5hbWVTdHlsZSkgeworICBTY29wZWRVdGZDaGFycyBsb2NhbGVOYW1lKGVudiwgamF2YUxvY2FsZU5hbWUpOworICBpZiAobG9jYWxlTmFtZS5jX3N0cigpID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBjdXJyZW5jeUNvZGUoZW52LCBqYXZhQ3VycmVuY3lDb2RlKTsKKyAgaWYgKCFjdXJyZW5jeUNvZGUudmFsaWQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFVuaWNvZGVTdHJpbmcgaWN1Q3VycmVuY3lDb2RlKGN1cnJlbmN5Q29kZS51bmljb2RlU3RyaW5nKCkpOworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgVUJvb2wgaXNDaG9pY2VGb3JtYXQgPSBmYWxzZTsKKyAgaW50MzJfdCBjaGFyQ291bnQ7CisgIGNvbnN0IFVDaGFyKiBjaGFycyA9IHVjdXJyX2dldE5hbWUoaWN1Q3VycmVuY3lDb2RlLmdldFRlcm1pbmF0ZWRCdWZmZXIoKSwgbG9jYWxlTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTdHlsZSwgJmlzQ2hvaWNlRm9ybWF0LCAmY2hhckNvdW50LCAmc3RhdHVzKTsKKyAgaWYgKHN0YXR1cyA9PSBVX1VTSU5HX0RFRkFVTFRfV0FSTklORykgeworICAgIGlmIChuYW1lU3R5bGUgPT0gVUNVUlJfU1lNQk9MX05BTUUpIHsKKyAgICAgIC8vIElDVSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gZmFsbGluZyBiYWNrIHRvIHRoZSByb290IGxvY2FsZSBhbmQgbWVldGluZyBhIGdlbnVpbmVseQorICAgICAgLy8gdW5rbm93biBjdXJyZW5jeS4gVGhlIEN1cnJlbmN5IGNsYXNzIGRvZXMuCisgICAgICBpZiAoIXVjdXJyX2lzQXZhaWxhYmxlKGljdUN1cnJlbmN5Q29kZS5nZXRUZXJtaW5hdGVkQnVmZmVyKCksIFVfREFURV9NSU4sIFVfREFURV9NQVgsICZzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gKGNoYXJDb3VudCA9PSAwKSA/IE5VTEwgOiBlbnYtPk5ld1N0cmluZyhjaGFycywgY2hhckNvdW50KTsKKyAgICBpZiAobmFtZVN0eWxlID09IFVDVVJSX0xPTkdfTkFNRSkgeworICAgICAgLy8gSUNVJ3MgZGVmYXVsdCBpcyBFbmdsaXNoLiBXZSB3YW50IHRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIGluc3RlYWQuCisgICAgICBjaGFycyA9IGljdUN1cnJlbmN5Q29kZS5nZXRCdWZmZXIoKTsKKyAgICAgIGNoYXJDb3VudCA9IGljdUN1cnJlbmN5Q29kZS5sZW5ndGgoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjaGFyQ291bnQgPT0gMCkgPyBOVUxMIDogZW52LT5OZXdTdHJpbmcoY2hhcnMsIGNoYXJDb3VudCk7CiB9CiAKLXN0YXRpYyBqc3RyaW5nIElDVV9nZXRDdXJyZW5jeVN5bWJvbChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGxvY2FsZSwganN0cmluZyBjdXJyZW5jeUNvZGUpIHsKLSAgICAvLyBXZSBjYW4ndCB1c2UgdWN1cnJfZ2V0TmFtZSBiZWNhdXNlIGl0IGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB1c2luZyBkYXRhIHJvb3QgZnJvbQotICAgIC8vIHRoZSByb290IGxvY2FsZSBhbmQgcGFycm90aW5nIGJhY2sgdGhlIGlucHV0IGJlY2F1c2UgaXQncyBuZXZlciBoZWFyZCBvZiB0aGUgY3VycmVuY3kgY29kZS4KLSAgICBTY29wZWRVdGZDaGFycyBsb2NhbGVOYW1lKGVudiwgbG9jYWxlKTsKLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBTY29wZWRSZXNvdXJjZUJ1bmRsZSBjdXJyTG9jKHVyZXNfb3BlbihVX0lDVURBVEFfQ1VSUiwgbG9jYWxlTmFtZS5jX3N0cigpLCAmc3RhdHVzKSk7Ci0gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KK3N0YXRpYyBqc3RyaW5nIElDVV9nZXRDdXJyZW5jeURpc3BsYXlOYW1lKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YUxvY2FsZU5hbWUsIGpzdHJpbmcgamF2YUN1cnJlbmN5Q29kZSkgeworICByZXR1cm4gZ2V0Q3VycmVuY3lOYW1lKGVudiwgamF2YUxvY2FsZU5hbWUsIGphdmFDdXJyZW5jeUNvZGUsIFVDVVJSX0xPTkdfTkFNRSk7Cit9CiAKLSAgICBTY29wZWRSZXNvdXJjZUJ1bmRsZSBjdXJyZW5jaWVzKHVyZXNfZ2V0QnlLZXkoY3VyckxvYy5nZXQoKSwgIkN1cnJlbmNpZXMiLCBOVUxMLCAmc3RhdHVzKSk7Ci0gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFNjb3BlZFV0ZkNoYXJzIGN1cnJlbmN5KGVudiwgY3VycmVuY3lDb2RlKTsKLSAgICBTY29wZWRSZXNvdXJjZUJ1bmRsZSBjdXJyZW5jeUVsZW1zKHVyZXNfZ2V0QnlLZXkoY3VycmVuY2llcy5nZXQoKSwgY3VycmVuY3kuY19zdHIoKSwgTlVMTCwgJnN0YXR1cykpOwotICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGNoYXJDb3VudDsKLSAgICBjb25zdCBqY2hhciogY2hhcnMgPSB1cmVzX2dldFN0cmluZ0J5SW5kZXgoY3VycmVuY3lFbGVtcy5nZXQoKSwgMCwgJmNoYXJDb3VudCwgJnN0YXR1cyk7Ci0gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKGNoYXJDb3VudCA9PSAwKSA/IE5VTEwgOiBlbnYtPk5ld1N0cmluZyhjaGFycywgY2hhckNvdW50KTsKK3N0YXRpYyBqc3RyaW5nIElDVV9nZXRDdXJyZW5jeVN5bWJvbChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGphdmFMb2NhbGVOYW1lLCBqc3RyaW5nIGphdmFDdXJyZW5jeUNvZGUpIHsKKyAgcmV0dXJuIGdldEN1cnJlbmN5TmFtZShlbnYsIGphdmFMb2NhbGVOYW1lLCBqYXZhQ3VycmVuY3lDb2RlLCBVQ1VSUl9TWU1CT0xfTkFNRSk7CiB9CiAKIHN0YXRpYyBqc3RyaW5nIElDVV9nZXREaXNwbGF5Q291bnRyeU5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIHRhcmdldExvY2FsZSwganN0cmluZyBsb2NhbGUpIHsKQEAgLTM0NiwyOCArMzQyLDI2IEBACiAgICAgc2V0U3RyaW5nRmllbGQoZW52LCBvYmosIGZpZWxkTmFtZSwgZW52LT5OZXdTdHJpbmcoY2hhcnMsIHZhbHVlLmxlbmd0aCgpKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldE51bWJlclBhdHRlcm5zKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwganN0cmluZyBsb2NhbGUpIHsKK3N0YXRpYyB2b2lkIHNldE51bWJlclBhdHRlcm5zKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgTG9jYWxlJiBsb2NhbGUpIHsKICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBMb2NhbGUgbG9jYWxlT2JqID0gZ2V0TG9jYWxlKGVudiwgbG9jYWxlKTsKIAogICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKLSAgICBVbmlxdWVQdHI8RGVjaW1hbEZvcm1hdD4gZm10KHN0YXRpY19jYXN0PERlY2ltYWxGb3JtYXQqPihOdW1iZXJGb3JtYXQ6OmNyZWF0ZUluc3RhbmNlKGxvY2FsZU9iaiwgVU5VTV9DVVJSRU5DWSwgc3RhdHVzKSkpOworICAgIFVuaXF1ZVB0cjxEZWNpbWFsRm9ybWF0PiBmbXQoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlLCBVTlVNX0NVUlJFTkNZLCBzdGF0dXMpKSk7CiAgICAgcGF0dGVybiA9IGZtdC0+dG9QYXR0ZXJuKHBhdHRlcm4ucmVtb3ZlKCkpOwogICAgIHNldFN0cmluZ0ZpZWxkKGVudiwgb2JqLCAiY3VycmVuY3lQYXR0ZXJuIiwgcGF0dGVybik7CiAKLSAgICBmbXQucmVzZXQoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlT2JqLCBVTlVNX0RFQ0lNQUwsIHN0YXR1cykpKTsKKyAgICBmbXQucmVzZXQoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlLCBVTlVNX0RFQ0lNQUwsIHN0YXR1cykpKTsKICAgICBwYXR0ZXJuID0gZm10LT50b1BhdHRlcm4ocGF0dGVybi5yZW1vdmUoKSk7CiAgICAgc2V0U3RyaW5nRmllbGQoZW52LCBvYmosICJudW1iZXJQYXR0ZXJuIiwgcGF0dGVybik7CiAKLSAgICBmbXQucmVzZXQoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlT2JqLCBVTlVNX1BFUkNFTlQsIHN0YXR1cykpKTsKKyAgICBmbXQucmVzZXQoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlLCBVTlVNX1BFUkNFTlQsIHN0YXR1cykpKTsKICAgICBwYXR0ZXJuID0gZm10LT50b1BhdHRlcm4ocGF0dGVybi5yZW1vdmUoKSk7CiAgICAgc2V0U3RyaW5nRmllbGQoZW52LCBvYmosICJwZXJjZW50UGF0dGVybiIsIHBhdHRlcm4pOwogfQogCi1zdGF0aWMgdm9pZCBzZXREZWNpbWFsRm9ybWF0U3ltYm9sc0RhdGEoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBqc3RyaW5nIGxvY2FsZSkgeworc3RhdGljIHZvaWQgc2V0RGVjaW1hbEZvcm1hdFN5bWJvbHNEYXRhKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgTG9jYWxlJiBsb2NhbGUpIHsKICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBMb2NhbGUgbG9jYWxlT2JqID0gZ2V0TG9jYWxlKGVudiwgbG9jYWxlKTsKLSAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnMobG9jYWxlT2JqLCBzdGF0dXMpOworICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRmcyhsb2NhbGUsIHN0YXR1cyk7CiAKICAgICBzZXRDaGFyRmllbGQoZW52LCBvYmosICJkZWNpbWFsU2VwYXJhdG9yIiwgZGZzLmdldFN5bWJvbChEZWNpbWFsRm9ybWF0U3ltYm9sczo6a0RlY2ltYWxTZXBhcmF0b3JTeW1ib2wpKTsKICAgICBzZXRDaGFyRmllbGQoZW52LCBvYmosICJncm91cGluZ1NlcGFyYXRvciIsIGRmcy5nZXRTeW1ib2woRGVjaW1hbEZvcm1hdFN5bWJvbHM6OmtHcm91cGluZ1NlcGFyYXRvclN5bWJvbCkpOwpAQCAtNDQ0LDYgKzQzOCwyOCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgZ2V0VGltZUZvcm1hdHMxMkFuZDI0KEpOSUVudiogZW52LCBqb2JqZWN0IGxvY2FsZURhdGEsIExvY2FsZSYgbG9jYWxlKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBEYXRlVGltZVBhdHRlcm5HZW5lcmF0b3IqIGdlbmVyYXRvciA9IERhdGVUaW1lUGF0dGVybkdlbmVyYXRvcjo6Y3JlYXRlSW5zdGFuY2UobG9jYWxlLCBzdGF0dXMpOworICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBVbmljb2RlU3RyaW5nIHBhdHRlcm5fSG0oZ2VuZXJhdG9yLT5nZXRCZXN0UGF0dGVybihVbmljb2RlU3RyaW5nKCJIbSIsIDIsIFVTX0lOViksIHN0YXR1cykpOworICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBVbmljb2RlU3RyaW5nIHBhdHRlcm5faG0oZ2VuZXJhdG9yLT5nZXRCZXN0UGF0dGVybihVbmljb2RlU3RyaW5nKCJobSIsIDIsIFVTX0lOViksIHN0YXR1cykpOworICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzZXRTdHJpbmdGaWVsZChlbnYsIGxvY2FsZURhdGEsICJ0aW1lRm9ybWF0MTIiLCBwYXR0ZXJuX2htKTsKKyAgc2V0U3RyaW5nRmllbGQoZW52LCBsb2NhbGVEYXRhLCAidGltZUZvcm1hdDI0IiwgcGF0dGVybl9IbSk7CisgIHJldHVybiB0cnVlOworfQorCiBzdGF0aWMgYm9vbCBnZXRZZXN0ZXJkYXlUb2RheUFuZFRvbW9ycm93KEpOSUVudiogZW52LCBqb2JqZWN0IGxvY2FsZURhdGEsIGNvbnN0IGNoYXIqIGxvY2FsZV9uYW1lKSB7CiAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICBTY29wZWRSZXNvdXJjZUJ1bmRsZSByb290KHVyZXNfb3BlbihOVUxMLCBsb2NhbGVfbmFtZSwgJnN0YXR1cykpOwpAQCAtNDgwLDggKzQ5Niw4IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGpib29sZWFuIElDVV9pbml0TG9jYWxlRGF0YUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBsb2NhbGUsIGpvYmplY3QgbG9jYWxlRGF0YSkgewotICAgIFNjb3BlZFV0ZkNoYXJzIGxvY2FsZU5hbWUoZW52LCBsb2NhbGUpOworc3RhdGljIGpib29sZWFuIElDVV9pbml0TG9jYWxlRGF0YUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhTG9jYWxlTmFtZSwgam9iamVjdCBsb2NhbGVEYXRhKSB7CisgICAgU2NvcGVkVXRmQ2hhcnMgbG9jYWxlTmFtZShlbnYsIGphdmFMb2NhbGVOYW1lKTsKICAgICBpZiAobG9jYWxlTmFtZS5jX3N0cigpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKICAgICB9CkBAIC01MDMsNiArNTE5LDEzIEBACiAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CiAgICAgfQogCisgICAgLy8gR2V0IHRoZSAiaDptbSBhIiBhbmQgIkhIOm1tIiAxMi0gYW5kIDI0LWhvdXIgdGltZSBmb3JtYXQgc3RyaW5ncy4KKyAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKGVudiwgamF2YUxvY2FsZU5hbWUpOworICAgIGlmICghZ2V0VGltZUZvcm1hdHMxMkFuZDI0KGVudiwgbG9jYWxlRGF0YSwgbG9jYWxlKSkgeworICAgICAgICBBTE9HRSgiQ291bGRuJ3QgZmluZCBJQ1UgMTItIGFuZCAyNC1ob3VyIHRpbWUgZm9ybWF0cyBmb3IgJXMiLCBsb2NhbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIH0KKwogICAgIC8vIEdldCB0aGUgIlllc3RlcmRheSIsICJUb2RheSIsIGFuZCAiVG9tb3Jyb3ciIHN0cmluZ3MuCiAgICAgYm9vbCBmb3VuZFllc3RlcmRheVRvZGF5QW5kVG9tb3Jyb3cgPSBmYWxzZTsKICAgICBmb3IgKExvY2FsZU5hbWVJdGVyYXRvciBpdChsb2NhbGVOYW1lLmNfc3RyKCksIHN0YXR1cyk7IGl0Lkhhc05leHQoKTsgaXQuVXAoKSkgewpAQCAtNTE3LDggKzU0MCw3IEBACiAgICAgfQogCiAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotICAgIExvY2FsZSBsb2NhbGVPYmogPSBnZXRMb2NhbGUoZW52LCBsb2NhbGUpOwotICAgIFVuaXF1ZVB0cjxDYWxlbmRhcj4gY2FsKENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShsb2NhbGVPYmosIHN0YXR1cykpOworICAgIFVuaXF1ZVB0cjxDYWxlbmRhcj4gY2FsKENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShsb2NhbGUsIHN0YXR1cykpOwogICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewogICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgIH0KQEAgLTUyOCw3ICs1NTAsNyBAQAogCiAgICAgLy8gR2V0IERhdGVGb3JtYXRTeW1ib2xzLgogICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBEYXRlRm9ybWF0U3ltYm9scyBkYXRlRm9ybWF0U3ltKGxvY2FsZU9iaiwgc3RhdHVzKTsKKyAgICBEYXRlRm9ybWF0U3ltYm9scyBkYXRlRm9ybWF0U3ltKGxvY2FsZSwgc3RhdHVzKTsKICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKICAgICB9CkBAIC01OTEsNyArNjEzLDcgQEAKIAogICAgIGpzdHJpbmcgY3VycmVuY3lTeW1ib2wgPSBOVUxMOwogICAgIGlmIChpbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wgIT0gTlVMTCkgewotICAgICAgICBjdXJyZW5jeVN5bWJvbCA9IElDVV9nZXRDdXJyZW5jeVN5bWJvbChlbnYsIE5VTEwsIGxvY2FsZSwgaW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKTsKKyAgICAgICAgY3VycmVuY3lTeW1ib2wgPSBJQ1VfZ2V0Q3VycmVuY3lTeW1ib2woZW52LCBOVUxMLCBqYXZhTG9jYWxlTmFtZSwgaW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wgPSBlbnYtPk5ld1N0cmluZ1VURigiWFhYIik7CiAgICAgfQpAQCAtNjA2LDE5ICs2MjgsMjUgQEAKIH0KIAogc3RhdGljIGpzdHJpbmcgSUNVX3RvTG93ZXJDYXNlKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YVN0cmluZywganN0cmluZyBsb2NhbGVOYW1lKSB7Ci0gICAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgc2NvcGVkU3RyaW5nKGVudiwgamF2YVN0cmluZyk7Ci0gICAgVW5pY29kZVN0cmluZyYgcyhzY29wZWRTdHJpbmcudW5pY29kZVN0cmluZygpKTsKLSAgICBVbmljb2RlU3RyaW5nIG9yaWdpbmFsKHMpOwotICAgIHMudG9Mb3dlcihMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKFNjb3BlZFV0ZkNoYXJzKGVudiwgbG9jYWxlTmFtZSkuY19zdHIoKSkpOwotICAgIHJldHVybiBzID09IG9yaWdpbmFsID8gamF2YVN0cmluZyA6IGVudi0+TmV3U3RyaW5nKHMuZ2V0QnVmZmVyKCksIHMubGVuZ3RoKCkpOworICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBzY29wZWRTdHJpbmcoZW52LCBqYXZhU3RyaW5nKTsKKyAgaWYgKCFzY29wZWRTdHJpbmcudmFsaWQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFVuaWNvZGVTdHJpbmcmIHMoc2NvcGVkU3RyaW5nLnVuaWNvZGVTdHJpbmcoKSk7CisgIFVuaWNvZGVTdHJpbmcgb3JpZ2luYWwocyk7CisgIHMudG9Mb3dlcihMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKFNjb3BlZFV0ZkNoYXJzKGVudiwgbG9jYWxlTmFtZSkuY19zdHIoKSkpOworICByZXR1cm4gcyA9PSBvcmlnaW5hbCA/IGphdmFTdHJpbmcgOiBlbnYtPk5ld1N0cmluZyhzLmdldEJ1ZmZlcigpLCBzLmxlbmd0aCgpKTsKIH0KIAogc3RhdGljIGpzdHJpbmcgSUNVX3RvVXBwZXJDYXNlKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YVN0cmluZywganN0cmluZyBsb2NhbGVOYW1lKSB7Ci0gICAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgc2NvcGVkU3RyaW5nKGVudiwgamF2YVN0cmluZyk7Ci0gICAgVW5pY29kZVN0cmluZyYgcyhzY29wZWRTdHJpbmcudW5pY29kZVN0cmluZygpKTsKLSAgICBVbmljb2RlU3RyaW5nIG9yaWdpbmFsKHMpOwotICAgIHMudG9VcHBlcihMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKFNjb3BlZFV0ZkNoYXJzKGVudiwgbG9jYWxlTmFtZSkuY19zdHIoKSkpOwotICAgIHJldHVybiBzID09IG9yaWdpbmFsID8gamF2YVN0cmluZyA6IGVudi0+TmV3U3RyaW5nKHMuZ2V0QnVmZmVyKCksIHMubGVuZ3RoKCkpOworICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBzY29wZWRTdHJpbmcoZW52LCBqYXZhU3RyaW5nKTsKKyAgaWYgKCFzY29wZWRTdHJpbmcudmFsaWQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFVuaWNvZGVTdHJpbmcmIHMoc2NvcGVkU3RyaW5nLnVuaWNvZGVTdHJpbmcoKSk7CisgIFVuaWNvZGVTdHJpbmcgb3JpZ2luYWwocyk7CisgIHMudG9VcHBlcihMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKFNjb3BlZFV0ZkNoYXJzKGVudiwgbG9jYWxlTmFtZSkuY19zdHIoKSkpOworICByZXR1cm4gcyA9PSBvcmlnaW5hbCA/IGphdmFTdHJpbmcgOiBlbnYtPk5ld1N0cmluZyhzLmdldEJ1ZmZlcigpLCBzLmxlbmd0aCgpKTsKIH0KIAogc3RhdGljIGpzdHJpbmcgdmVyc2lvblN0cmluZyhKTklFbnYqIGVudiwgY29uc3QgVVZlcnNpb25JbmZvJiB2ZXJzaW9uKSB7CkBAIC02MjcsNiArNjU1LDEzIEBACiAgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKHZlcnNpb25TdHJpbmcpOwogfQogCitzdGF0aWMganN0cmluZyBJQ1VfZ2V0Q2xkclZlcnNpb24oSk5JRW52KiBlbnYsIGpjbGFzcykgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgVVZlcnNpb25JbmZvIGNsZHJWZXJzaW9uOworICB1bG9jZGF0YV9nZXRDTERSVmVyc2lvbihjbGRyVmVyc2lvbiwgJnN0YXR1cyk7CisgIHJldHVybiB2ZXJzaW9uU3RyaW5nKGVudiwgY2xkclZlcnNpb24pOworfQorCiBzdGF0aWMganN0cmluZyBJQ1VfZ2V0SWN1VmVyc2lvbihKTklFbnYqIGVudiwgamNsYXNzKSB7CiAgICAgVVZlcnNpb25JbmZvIGljdVZlcnNpb247CiAgICAgdV9nZXRWZXJzaW9uKGljdVZlcnNpb24pOwpAQCAtNjM5LDcgKzY3NCw2IEBACiAgICAgcmV0dXJuIHZlcnNpb25TdHJpbmcoZW52LCB1bmljb2RlVmVyc2lvbik7CiB9CiAKLQogc3RydWN0IEVudW1lcmF0aW9uQ291bnRlciB7CiAgICAgY29uc3Qgc2l6ZV90IGNvdW50OwogICAgIEVudW1lcmF0aW9uQ291bnRlcihzaXplX3QgY291bnQpIDogY291bnQoY291bnQpIHt9CkBAIC02NjUsNiArNjk5LDI2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGpzdHJpbmcgSUNVX2dldEJlc3REYXRlVGltZVBhdHRlcm4oSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhUGF0dGVybiwganN0cmluZyBqYXZhTG9jYWxlTmFtZSkgeworICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKGVudiwgamF2YUxvY2FsZU5hbWUpOworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBEYXRlVGltZVBhdHRlcm5HZW5lcmF0b3I6OmNyZWF0ZUluc3RhbmNlKGxvY2FsZSwgc3RhdHVzKTsKKyAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAiRGF0ZVRpbWVQYXR0ZXJuR2VuZXJhdG9yOjpjcmVhdGVJbnN0YW5jZSIsIHN0YXR1cykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHBhdHRlcm5Ib2xkZXIoZW52LCBqYXZhUGF0dGVybik7CisgIGlmICghcGF0dGVybkhvbGRlci52YWxpZCgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgVW5pY29kZVN0cmluZyByZXN1bHQoZ2VuZXJhdG9yLT5nZXRCZXN0UGF0dGVybihwYXR0ZXJuSG9sZGVyLnVuaWNvZGVTdHJpbmcoKSwgc3RhdHVzKSk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIkRhdGVUaW1lUGF0dGVybkdlbmVyYXRvcjo6Z2V0QmVzdFBhdHRlcm4iLCBzdGF0dXMpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gZW52LT5OZXdTdHJpbmcocmVzdWx0LmdldEJ1ZmZlcigpLCByZXN1bHQubGVuZ3RoKCkpOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CiAgICAgTkFUSVZFX01FVEhPRChJQ1UsIGFkZExpa2VseVN1YnRhZ3MsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpLAogICAgIE5BVElWRV9NRVRIT0QoSUNVLCBnZXRBdmFpbGFibGVCcmVha0l0ZXJhdG9yTG9jYWxlc05hdGl2ZSwgIigpW0xqYXZhL2xhbmcvU3RyaW5nOyIpLApAQCAtNjc0LDYgKzcyOCw4IEBACiAgICAgTkFUSVZFX01FVEhPRChJQ1UsIGdldEF2YWlsYWJsZURhdGVGb3JtYXRMb2NhbGVzTmF0aXZlLCAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiksCiAgICAgTkFUSVZFX01FVEhPRChJQ1UsIGdldEF2YWlsYWJsZUxvY2FsZXNOYXRpdmUsICIoKVtMamF2YS9sYW5nL1N0cmluZzsiKSwKICAgICBOQVRJVkVfTUVUSE9EKElDVSwgZ2V0QXZhaWxhYmxlTnVtYmVyRm9ybWF0TG9jYWxlc05hdGl2ZSwgIigpW0xqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoSUNVLCBnZXRCZXN0RGF0ZVRpbWVQYXR0ZXJuLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKElDVSwgZ2V0Q2xkclZlcnNpb24sICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAogICAgIE5BVElWRV9NRVRIT0QoSUNVLCBnZXRDdXJyZW5jeUNvZGUsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpLAogICAgIE5BVElWRV9NRVRIT0QoSUNVLCBnZXRDdXJyZW5jeURpc3BsYXlOYW1lLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKICAgICBOQVRJVkVfTUVUSE9EKElDVSwgZ2V0Q3VycmVuY3lGcmFjdGlvbkRpZ2l0cywgIihMamF2YS9sYW5nL1N0cmluZzspSSIpLApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfTmF0aXZlQnJlYWtJdGVyYXRvci5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVCcmVha0l0ZXJhdG9yLmNwcAppbmRleCA1ODY1MDgxLi5jMDI1YTYwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVCcmVha0l0ZXJhdG9yLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVCcmVha0l0ZXJhdG9yLmNwcApAQCAtMTYsMjEwICsxNiwyMDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJOYXRpdmVCcmVha0l0ZXJhdG9yIgogCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIlNjb3BlZFV0ZkNoYXJzLmgiCi0jaW5jbHVkZSAidW5pY29kZS91YnJrLmgiCisjaW5jbHVkZSAidW5pY29kZS9icmtpdGVyLmgiCiAjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCisvLyBJQ1UgZG9jdW1lbnRhdGlvbjogaHR0cDovL2ljdS1wcm9qZWN0Lm9yZy9hcGlyZWYvaWN1NGMvY2xhc3NCcmVha0l0ZXJhdG9yLmh0bWwKKworc3RhdGljIEJyZWFrSXRlcmF0b3IqIHRvQnJlYWtJdGVyYXRvcihqaW50IGFkZHJlc3MpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QnJlYWtJdGVyYXRvcio+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oYWRkcmVzcykpOworfQorCiAvKioKLSAqIElDVTRDIDQuNiBkb2Vzbid0IGxldCB1cyB1cGRhdGUgdGhlIHBvaW50ZXJzIGluc2lkZSBhIFVCcmVha0l0ZXJhdG9yIHRvIHRyYWNrIG91ciBjaGFyW10gYXMgaXQKLSAqIG1vdmVzIGFyb3VuZCB0aGUgaGVhcC4gVGhpcyBjbGFzcyBwaW5zIHRoZSBjaGFyW10gZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKLSAqIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yLiBJdCBhbHNvIGhvbGRzIGEgZ2xvYmFsIHJlZmVyZW5jZSB0byB0aGUgamF2YS5sYW5nLlN0cmluZyB0aGF0IG93bnMgdGhlCi0gKiBjaGFyW10gc28gdGhhdCB0aGUgY2hhcltdIGNhbid0IGJlIEdDZWQuCisgKiBXZSB1c2UgSUNVNEMncyBCcmVha0l0ZXJhdG9yIGNsYXNzLCBidXQgb3VyIGlucHV0IGlzIG9uIHRoZSBKYXZhIGhlYXAgYW5kIHBvdGVudGlhbGx5IG1vdmluZworICogYXJvdW5kIGJldHdlZW4gY2FsbHMuIFRoaXMgd3JhcHBlciBjbGFzcyBlbnN1cmVzIHRoYXQgb3VyIFJlZ2V4TWF0Y2hlciBpcyBhbHdheXMgcG9pbnRpbmcgYXQKKyAqIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBjaGFyW10uIEVhcmxpZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBzaW1wbHkgY29waWVkIHRoZSBkYXRhIHRvIHRoZQorICogbmF0aXZlIGhlYXAsIGJ1dCB0aGF0J3Mgd2FzdGVmdWwgYW5kIGhpZGVzIGFsbG9jYXRpb25zIGZyb20gdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgogICovCi1jbGFzcyBCcmVha0l0ZXJhdG9yUGVlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIEJyZWFrSXRlcmF0b3JQZWVyKiBmcm9tQWRkcmVzcyhqaW50IGFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QnJlYWtJdGVyYXRvclBlZXIqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGFkZHJlc3MpKTsKK2NsYXNzIEJyZWFrSXRlcmF0b3JBY2Nlc3NvciB7CisgcHVibGljOgorICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IoSk5JRW52KiBlbnYsIGppbnQgYWRkcmVzcywganN0cmluZyBqYXZhSW5wdXQsIGJvb2wgcmVzZXQpIHsKKyAgICBpbml0KGVudiwgYWRkcmVzcyk7CisgICAgbUphdmFJbnB1dCA9IGphdmFJbnB1dDsKKworICAgIGlmIChtSmF2YUlucHV0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB1aW50cHRyX3QgdG9BZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHRoaXMpOworICAgIG1DaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnMobUphdmFJbnB1dCwgTlVMTCk7CisgICAgaWYgKG1DaGFycyA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQnJlYWtJdGVyYXRvclBlZXIoVUJyZWFrSXRlcmF0b3IqIGl0KSA6IG1JdChpdCksIG1TdHJpbmcoTlVMTCksIG1DaGFycyhOVUxMKSB7CisgICAgbVVUZXh0ID0gdXRleHRfb3BlblVDaGFycyhOVUxMLCBtQ2hhcnMsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKG1KYXZhSW5wdXQpLCAmbVN0YXR1cyk7CisgICAgaWYgKG1VVGV4dCA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdm9pZCBzZXRUZXh0KEpOSUVudiogZW52LCBqc3RyaW5nIHMpIHsKLSAgICAgICAgcmVsZWFzZVN0cmluZyhlbnYpOwotCi0gICAgICAgIG1TdHJpbmcgPSByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+TmV3R2xvYmFsUmVmKHMpKTsKLSAgICAgICAgbUNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyhtU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgaWYgKG1DaGFycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY2hhckNvdW50ID0gZW52LT5HZXRTdHJpbmdMZW5ndGgobVN0cmluZyk7Ci0gICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotICAgICAgICB1YnJrX3NldFRleHQobUl0LCBtQ2hhcnMsIGNoYXJDb3VudCwgJnN0YXR1cyk7Ci0gICAgICAgIG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAidWJya19zZXRUZXh0Iiwgc3RhdHVzKTsKKyAgICBpZiAocmVzZXQpIHsKKyAgICAgIG1CcmVha0l0ZXJhdG9yLT5zZXRUZXh0KG1VVGV4dCwgbVN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1CcmVha0l0ZXJhdG9yLT5yZWZyZXNoSW5wdXRUZXh0KG1VVGV4dCwgbVN0YXR1cyk7CiAgICAgfQorICB9CiAKLSAgICBCcmVha0l0ZXJhdG9yUGVlciogY2xvbmUoSk5JRW52KiBlbnYpIHsKLSAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0gICAgICAgIGppbnQgYnVmZmVyU2l6ZSA9IFVfQlJLX1NBRkVDTE9ORV9CVUZGRVJTSVpFOwotICAgICAgICBVQnJlYWtJdGVyYXRvciogaXQgPSB1YnJrX3NhZmVDbG9uZShtSXQsIE5VTEwsICZidWZmZXJTaXplLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAidWJya19zYWZlQ2xvbmUiLCBzdGF0dXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBCcmVha0l0ZXJhdG9yUGVlciogcmVzdWx0ID0gbmV3IEJyZWFrSXRlcmF0b3JQZWVyKGl0KTsKLSAgICAgICAgaWYgKG1TdHJpbmcgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0LT5zZXRUZXh0KGVudiwgbVN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgQnJlYWtJdGVyYXRvckFjY2Vzc29yKEpOSUVudiogZW52LCBqaW50IGFkZHJlc3MpIHsKKyAgICBpbml0KGVudiwgYWRkcmVzcyk7CisgIH0KKworICB+QnJlYWtJdGVyYXRvckFjY2Vzc29yKCkgeworICAgIHV0ZXh0X2Nsb3NlKG1VVGV4dCk7CisgICAgaWYgKG1KYXZhSW5wdXQpIHsKKyAgICAgIG1FbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhtSmF2YUlucHV0LCBtQ2hhcnMpOwogICAgIH0KKyAgICBtYXliZVRocm93SWN1RXhjZXB0aW9uKG1FbnYsICJ1dGV4dF9jbG9zZSIsIG1TdGF0dXMpOworICB9CiAKLSAgICB2b2lkIGNsb3NlKEpOSUVudiogZW52KSB7Ci0gICAgICAgIGlmIChtSXQgIT0gTlVMTCkgewotICAgICAgICAgICAgdWJya19jbG9zZShtSXQpOwotICAgICAgICAgICAgbUl0ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZWxlYXNlU3RyaW5nKGVudik7Ci0gICAgfQorICBCcmVha0l0ZXJhdG9yKiBvcGVyYXRvci0+KCkgeworICAgIHJldHVybiBtQnJlYWtJdGVyYXRvcjsKKyAgfQogCi0gICAgfkJyZWFrSXRlcmF0b3JQZWVyKCkgewotICAgICAgICBpZiAobUl0ICE9IE5VTEwgfHwgbVN0cmluZyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJCcmVha0l0ZXJhdG9yUGVlciBkZWxldGVkIGJ1dCBub3QgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICB9CisgIFVFcnJvckNvZGUmIHN0YXR1cygpIHsKKyAgICByZXR1cm4gbVN0YXR1czsKKyAgfQogCi0gICAgVUJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtSXQ7Ci0gICAgfQorIHByaXZhdGU6CisgIHZvaWQgaW5pdChKTklFbnYqIGVudiwgamludCBhZGRyZXNzKSB7CisgICAgbUVudiA9IGVudjsKKyAgICBtSmF2YUlucHV0ID0gTlVMTDsKKyAgICBtQnJlYWtJdGVyYXRvciA9IHRvQnJlYWtJdGVyYXRvcihhZGRyZXNzKTsKKyAgICBtQ2hhcnMgPSBOVUxMOworICAgIG1TdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgbVVUZXh0ID0gTlVMTDsKKyAgfQogCi1wcml2YXRlOgotICAgIFVCcmVha0l0ZXJhdG9yKiBtSXQ7CisgIEpOSUVudiogbUVudjsKKyAganN0cmluZyBtSmF2YUlucHV0OworICBCcmVha0l0ZXJhdG9yKiBtQnJlYWtJdGVyYXRvcjsKKyAgY29uc3QgamNoYXIqIG1DaGFyczsKKyAgVUVycm9yQ29kZSBtU3RhdHVzOworICBVVGV4dCogbVVUZXh0OwogCi0gICAganN0cmluZyBtU3RyaW5nOwotICAgIGNvbnN0IGpjaGFyKiBtQ2hhcnM7Ci0KLSAgICB2b2lkIHJlbGVhc2VTdHJpbmcoSk5JRW52KiBlbnYpIHsKLSAgICAgICAgaWYgKG1TdHJpbmcgIT0gTlVMTCkgewotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMobVN0cmluZywgbUNoYXJzKTsKLSAgICAgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TdHJpbmcpOwotICAgICAgICAgICAgbVN0cmluZyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ25tZW50LgotICAgIEJyZWFrSXRlcmF0b3JQZWVyKGNvbnN0IEJyZWFrSXRlcmF0b3JQZWVyJik7Ci0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQnJlYWtJdGVyYXRvclBlZXImKTsKKyAgLy8gRGlzYWxsb3cgY29weSBhbmQgYXNzaWdubWVudC4KKyAgQnJlYWtJdGVyYXRvckFjY2Vzc29yKGNvbnN0IEJyZWFrSXRlcmF0b3JBY2Nlc3NvciYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBCcmVha0l0ZXJhdG9yQWNjZXNzb3ImKTsKIH07CiAKLXN0YXRpYyBVQnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvcihqaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gQnJlYWtJdGVyYXRvclBlZXI6OmZyb21BZGRyZXNzKGFkZHJlc3MpLT5icmVha0l0ZXJhdG9yKCk7Ci19Ci0KLXN0YXRpYyBqaW50IG1ha2VJdGVyYXRvcihKTklFbnYqIGVudiwganN0cmluZyBsb2NhbGUsIFVCcmVha0l0ZXJhdG9yVHlwZSB0eXBlKSB7Ci0gICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0gICAgY29uc3QgU2NvcGVkVXRmQ2hhcnMgbG9jYWxlQ2hhcnMoZW52LCBsb2NhbGUpOwotICAgIGlmIChsb2NhbGVDaGFycy5jX3N0cigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFVCcmVha0l0ZXJhdG9yKiBpdCA9IHVicmtfb3Blbih0eXBlLCBsb2NhbGVDaGFycy5jX3N0cigpLCBOVUxMLCAwLCAmc3RhdHVzKTsKLSAgICBpZiAobWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsICJ1YnJrX29wZW4iLCBzdGF0dXMpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKG5ldyBCcmVha0l0ZXJhdG9yUGVlcihpdCkpLT50b0FkZHJlc3MoKTsKLX0KLQotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9nZXRDaGFyYWN0ZXJJbnN0YW5jZUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBsb2NhbGUpIHsKLSAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKGVudiwgbG9jYWxlLCBVQlJLX0NIQVJBQ1RFUik7Ci19Ci0KLXN0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfZ2V0TGluZUluc3RhbmNlSW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGxvY2FsZSkgewotICAgIHJldHVybiBtYWtlSXRlcmF0b3IoZW52LCBsb2NhbGUsIFVCUktfTElORSk7Ci19Ci0KLXN0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfZ2V0U2VudGVuY2VJbnN0YW5jZUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBsb2NhbGUpIHsKLSAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKGVudiwgbG9jYWxlLCBVQlJLX1NFTlRFTkNFKTsKLX0KLQotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9nZXRXb3JkSW5zdGFuY2VJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgbG9jYWxlKSB7Ci0gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihlbnYsIGxvY2FsZSwgVUJSS19XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQgTmF0aXZlQnJlYWtJdGVyYXRvcl9jbG9zZUJyZWFrSXRlcmF0b3JJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkcmVzcykgewotICAgIEJyZWFrSXRlcmF0b3JQZWVyKiBwZWVyID0gQnJlYWtJdGVyYXRvclBlZXI6OmZyb21BZGRyZXNzKGFkZHJlc3MpOwotICAgIHBlZXItPmNsb3NlKGVudik7Ci0gICAgZGVsZXRlIHBlZXI7Ci19CisjZGVmaW5lIE1BS0VfQlJFQUtfSVRFUkFUT1JfSU5TVEFOQ0UoRikgXAorICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsgXAorICBjb25zdCBTY29wZWRVdGZDaGFycyBsb2NhbGVDaGFycyhlbnYsIGphdmFMb2NhbGUpOyBcCisgIGlmIChsb2NhbGVDaGFycy5jX3N0cigpID09IE5VTEwpIHsgXAorICAgIHJldHVybiAwOyBcCisgIH0gXAorICBMb2NhbGUgbG9jYWxlKExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUobG9jYWxlQ2hhcnMuY19zdHIoKSkpOyBcCisgIEJyZWFrSXRlcmF0b3IqIGl0ID0gRihsb2NhbGUsIHN0YXR1cyk7IFwKKyAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAidWJya19vcGVuIiwgc3RhdHVzKSkgeyBcCisgICAgcmV0dXJuIDA7IFwKKyAgfSBcCisgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oaXQpCiAKIHN0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfY2xvbmVJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkcmVzcykgewotICAgIHJldHVybiBCcmVha0l0ZXJhdG9yUGVlcjo6ZnJvbUFkZHJlc3MoYWRkcmVzcyktPmNsb25lKGVudiktPnRvQWRkcmVzcygpOworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpdC0+Y2xvbmUoKSk7CiB9CiAKLXN0YXRpYyB2b2lkIE5hdGl2ZUJyZWFrSXRlcmF0b3Jfc2V0VGV4dEltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFUZXh0KSB7Ci0gICAgQnJlYWtJdGVyYXRvclBlZXIqIHBlZXIgPSBCcmVha0l0ZXJhdG9yUGVlcjo6ZnJvbUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgcGVlci0+c2V0VGV4dChlbnYsIGphdmFUZXh0KTsKK3N0YXRpYyB2b2lkIE5hdGl2ZUJyZWFrSXRlcmF0b3JfY2xvc2VJbXBsKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyZXNzKSB7CisgIGRlbGV0ZSB0b0JyZWFrSXRlcmF0b3IoYWRkcmVzcyk7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBOYXRpdmVCcmVha0l0ZXJhdG9yX2lzQm91bmRhcnlJbXBsKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyZXNzLCBqaW50IG9mZnNldCkgewotICAgIHJldHVybiB1YnJrX2lzQm91bmRhcnkoYnJlYWtJdGVyYXRvcihhZGRyZXNzKSwgb2Zmc2V0KTsKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfY3VycmVudEltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCkgeworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzLCBqYXZhSW5wdXQsIGZhbHNlKTsKKyAgcmV0dXJuIGl0LT5jdXJyZW50KCk7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfbmV4dEltcGwoSk5JRW52KiwgamNsYXNzLCBqaW50IGFkZHJlc3MsIGppbnQgbikgewotICAgIFVCcmVha0l0ZXJhdG9yKiBiaSA9IGJyZWFrSXRlcmF0b3IoYWRkcmVzcyk7Ci0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIHdoaWxlIChuKysgPCAtMSkgewotICAgICAgICAgICAgdWJya19wcmV2aW91cyhiaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVicmtfcHJldmlvdXMoYmkpOwotICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB1YnJrX2N1cnJlbnQoYmkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChuLS0gPiAxKSB7Ci0gICAgICAgICAgICB1YnJrX25leHQoYmkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1YnJrX25leHQoYmkpOworc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9maXJzdEltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCkgeworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzLCBqYXZhSW5wdXQsIGZhbHNlKTsKKyAgcmV0dXJuIGl0LT5maXJzdCgpOworfQorCitzdGF0aWMgamludCBOYXRpdmVCcmVha0l0ZXJhdG9yX2ZvbGxvd2luZ0ltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCwgamludCBvZmZzZXQpIHsKKyAgQnJlYWtJdGVyYXRvckFjY2Vzc29yIGl0KGVudiwgYWRkcmVzcywgamF2YUlucHV0LCBmYWxzZSk7CisgIHJldHVybiBpdC0+Zm9sbG93aW5nKG9mZnNldCk7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfZ2V0Q2hhcmFjdGVySW5zdGFuY2VJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YUxvY2FsZSkgeworICBNQUtFX0JSRUFLX0lURVJBVE9SX0lOU1RBTkNFKEJyZWFrSXRlcmF0b3I6OmNyZWF0ZUNoYXJhY3Rlckluc3RhbmNlKTsKK30KKworc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9nZXRMaW5lSW5zdGFuY2VJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YUxvY2FsZSkgeworICBNQUtFX0JSRUFLX0lURVJBVE9SX0lOU1RBTkNFKEJyZWFrSXRlcmF0b3I6OmNyZWF0ZUxpbmVJbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfZ2V0U2VudGVuY2VJbnN0YW5jZUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBqYXZhTG9jYWxlKSB7CisgIE1BS0VfQlJFQUtfSVRFUkFUT1JfSU5TVEFOQ0UoQnJlYWtJdGVyYXRvcjo6Y3JlYXRlU2VudGVuY2VJbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfZ2V0V29yZEluc3RhbmNlSW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGphdmFMb2NhbGUpIHsKKyAgTUFLRV9CUkVBS19JVEVSQVRPUl9JTlNUQU5DRShCcmVha0l0ZXJhdG9yOjpjcmVhdGVXb3JkSW5zdGFuY2UpOworfQorCitzdGF0aWMgamJvb2xlYW4gTmF0aXZlQnJlYWtJdGVyYXRvcl9pc0JvdW5kYXJ5SW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGFkZHJlc3MsIGpzdHJpbmcgamF2YUlucHV0LCBqaW50IG9mZnNldCkgeworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzLCBqYXZhSW5wdXQsIGZhbHNlKTsKKyAgcmV0dXJuIGl0LT5pc0JvdW5kYXJ5KG9mZnNldCk7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfbGFzdEltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCkgeworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzLCBqYXZhSW5wdXQsIGZhbHNlKTsKKyAgcmV0dXJuIGl0LT5sYXN0KCk7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfbmV4dEltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyZXNzLCBqc3RyaW5nIGphdmFJbnB1dCwgamludCBuKSB7CisgIEJyZWFrSXRlcmF0b3JBY2Nlc3NvciBpdChlbnYsIGFkZHJlc3MsIGphdmFJbnB1dCwgZmFsc2UpOworICBpZiAobiA8IDApIHsKKyAgICB3aGlsZSAobisrIDwgLTEpIHsKKyAgICAgIGl0LT5wcmV2aW91cygpOwogICAgIH0KLSAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIGl0LT5wcmV2aW91cygpOworICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgIHJldHVybiBpdC0+Y3VycmVudCgpOworICB9IGVsc2UgeworICAgIHdoaWxlIChuLS0gPiAxKSB7CisgICAgICBpdC0+bmV4dCgpOworICAgIH0KKyAgICByZXR1cm4gaXQtPm5leHQoKTsKKyAgfQorICByZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfcHJlY2VkaW5nSW1wbChKTklFbnYqLCBqY2xhc3MsIGppbnQgYWRkcmVzcywgamludCBvZmZzZXQpIHsKLSAgICByZXR1cm4gdWJya19wcmVjZWRpbmcoYnJlYWtJdGVyYXRvcihhZGRyZXNzKSwgb2Zmc2V0KTsKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfcHJlY2VkaW5nSW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGFkZHJlc3MsIGpzdHJpbmcgamF2YUlucHV0LCBqaW50IG9mZnNldCkgeworICBCcmVha0l0ZXJhdG9yQWNjZXNzb3IgaXQoZW52LCBhZGRyZXNzLCBqYXZhSW5wdXQsIGZhbHNlKTsKKyAgcmV0dXJuIGl0LT5wcmVjZWRpbmcob2Zmc2V0KTsKIH0KIAotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9maXJzdEltcGwoSk5JRW52KiwgamNsYXNzLCBqaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gdWJya19maXJzdChicmVha0l0ZXJhdG9yKGFkZHJlc3MpKTsKK3N0YXRpYyBqaW50IE5hdGl2ZUJyZWFrSXRlcmF0b3JfcHJldmlvdXNJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkcmVzcywganN0cmluZyBqYXZhSW5wdXQpIHsKKyAgQnJlYWtJdGVyYXRvckFjY2Vzc29yIGl0KGVudiwgYWRkcmVzcywgamF2YUlucHV0LCBmYWxzZSk7CisgIHJldHVybiBpdC0+cHJldmlvdXMoKTsKIH0KIAotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9mb2xsb3dpbmdJbXBsKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyZXNzLCBqaW50IG9mZnNldCkgewotICAgIHJldHVybiB1YnJrX2ZvbGxvd2luZyhicmVha0l0ZXJhdG9yKGFkZHJlc3MpLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgamludCBOYXRpdmVCcmVha0l0ZXJhdG9yX2N1cnJlbnRJbXBsKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIHVicmtfY3VycmVudChicmVha0l0ZXJhdG9yKGFkZHJlc3MpKTsKLX0KLQotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9wcmV2aW91c0ltcGwoSk5JRW52KiwgamNsYXNzLCBqaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gdWJya19wcmV2aW91cyhicmVha0l0ZXJhdG9yKGFkZHJlc3MpKTsKLX0KLQotc3RhdGljIGppbnQgTmF0aXZlQnJlYWtJdGVyYXRvcl9sYXN0SW1wbChKTklFbnYqLCBqY2xhc3MsIGppbnQgYWRkcmVzcykgewotICAgIHJldHVybiB1YnJrX2xhc3QoYnJlYWtJdGVyYXRvcihhZGRyZXNzKSk7CitzdGF0aWMgdm9pZCBOYXRpdmVCcmVha0l0ZXJhdG9yX3NldFRleHRJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkcmVzcywganN0cmluZyBqYXZhSW5wdXQpIHsKKyAgQnJlYWtJdGVyYXRvckFjY2Vzc29yIGl0KGVudiwgYWRkcmVzcywgamF2YUlucHV0LCB0cnVlKTsKIH0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgY2xvbmVJbXBsLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgY2xvc2VCcmVha0l0ZXJhdG9ySW1wbCwgIihJKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGN1cnJlbnRJbXBsLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZmlyc3RJbXBsLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZm9sbG93aW5nSW1wbCwgIihJSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBnZXRDaGFyYWN0ZXJJbnN0YW5jZUltcGwsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGdldExpbmVJbnN0YW5jZUltcGwsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGdldFNlbnRlbmNlSW5zdGFuY2VJbXBsLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBnZXRXb3JkSW5zdGFuY2VJbXBsLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBpc0JvdW5kYXJ5SW1wbCwgIihJSSlaIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBsYXN0SW1wbCwgIihJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIG5leHRJbXBsLCAiKElJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIHByZWNlZGluZ0ltcGwsICIoSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgcHJldmlvdXNJbXBsLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgc2V0VGV4dEltcGwsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgY2xvbmVJbXBsLCAiKEkpSSIpLAorICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGNsb3NlSW1wbCwgIihJKVYiKSwKKyAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBjdXJyZW50SW1wbCwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKKyAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBmaXJzdEltcGwsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZm9sbG93aW5nSW1wbCwgIihJTGphdmEvbGFuZy9TdHJpbmc7SSlJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZ2V0Q2hhcmFjdGVySW5zdGFuY2VJbXBsLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZ2V0TGluZUluc3RhbmNlSW1wbCwgIihMamF2YS9sYW5nL1N0cmluZzspSSIpLAorICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGdldFNlbnRlbmNlSW5zdGFuY2VJbXBsLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgZ2V0V29yZEluc3RhbmNlSW1wbCwgIihMamF2YS9sYW5nL1N0cmluZzspSSIpLAorICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIGlzQm91bmRhcnlJbXBsLCAiKElMamF2YS9sYW5nL1N0cmluZztJKVoiKSwKKyAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBsYXN0SW1wbCwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKKyAgTkFUSVZFX01FVEhPRChOYXRpdmVCcmVha0l0ZXJhdG9yLCBuZXh0SW1wbCwgIihJTGphdmEvbGFuZy9TdHJpbmc7SSlJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgcHJlY2VkaW5nSW1wbCwgIihJTGphdmEvbGFuZy9TdHJpbmc7SSlJIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlQnJlYWtJdGVyYXRvciwgcHJldmlvdXNJbXBsLCAiKElMamF2YS9sYW5nL1N0cmluZzspSSIpLAorICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUJyZWFrSXRlcmF0b3IsIHNldFRleHRJbXBsLCAiKElMamF2YS9sYW5nL1N0cmluZzspViIpLAogfTsKIHZvaWQgcmVnaXN0ZXJfbGliY29yZV9pY3VfTmF0aXZlQnJlYWtJdGVyYXRvcihKTklFbnYqIGVudikgewotICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2ljdS9OYXRpdmVCcmVha0l0ZXJhdG9yIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CisgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2ljdS9OYXRpdmVCcmVha0l0ZXJhdG9yIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVDb2xsYXRpb24uY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfTmF0aXZlQ29sbGF0aW9uLmNwcAppbmRleCAzMmIxY2M0Li45OGE3OGVhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVDb2xsYXRpb24uY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZUNvbGxhdGlvbi5jcHAKQEAgLTksNiArOSw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlQ29sbGF0aW9uIgogCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfTmF0aXZlQ29udmVydGVyLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZUNvbnZlcnRlci5jcHAKaW5kZXggNmIwOGVlMC4uMjRkZmE2ZiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfTmF0aXZlQ29udmVydGVyLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVDb252ZXJ0ZXIuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlQ29udmVydGVyIgogCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgogI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgpAQCAtNTg4LDcgKzU4OSw3IEBACiAgICAgfQogICAgIC8vIEdldCBKYXZhJ3MgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgY2hhcnNldC4KICAgICBqc3RyaW5nIGphdmFDYW5vbmljYWxOYW1lID0gZ2V0SmF2YUNhbm9uaWNhbE5hbWUoZW52LCBpY3VDYW5vbmljYWxOYW1lKTsKLSAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTYwNCwxNCArNjA1LDE0IEBACiAKICAgICAvLyBHZXQgdGhlIGFsaWFzZXMgZm9yIHRoaXMgY2hhcnNldC4KICAgICBqb2JqZWN0QXJyYXkgYWxpYXNlcyA9IGdldEFsaWFzZXMoZW52LCBpY3VDYW5vbmljYWxOYW1lKTsKLSAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvLyBDb25zdHJ1Y3QgdGhlIENoYXJzZXRJQ1Ugb2JqZWN0LgotICAgIGptZXRob2RJRCBjaGFyc2V0Q29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKEpuaUNvbnN0YW50czo6Y2hhcnNldElDVUNsYXNzLCAiPGluaXQ+IiwKKyAgICBzdGF0aWMgam1ldGhvZElEIGNoYXJzZXRDb25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoSm5pQ29uc3RhbnRzOjpjaGFyc2V0SUNVQ2xhc3MsICI8aW5pdD4iLAogICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLSAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KEpuaUNvbnN0YW50czo6Y2hhcnNldElDVUNsYXNzLCBjaGFyc2V0Q29uc3RydWN0b3IsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVEZWNpbWFsRm9ybWF0LmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZURlY2ltYWxGb3JtYXQuY3BwCmluZGV4IDA0MDYwOTQuLmVmZWQ5NTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZURlY2ltYWxGb3JtYXQuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZURlY2ltYWxGb3JtYXQuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlRGVjaW1hbEZvcm1hdCIKIAorI2luY2x1ZGUgIkljdVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKICNpbmNsdWRlICJKbmlFeGNlcHRpb24uaCIKQEAgLTM1LDExICszNiwxMSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1zdGF0aWMgRGVjaW1hbEZvcm1hdCogdG9EZWNpbWFsRm9ybWF0KGppbnQgYWRkcikgeworc3RhdGljIERlY2ltYWxGb3JtYXQqIHRvRGVjaW1hbEZvcm1hdChqbG9uZyBhZGRyKSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RGVjaW1hbEZvcm1hdCo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oYWRkcikpOwogfQogCi1zdGF0aWMgVU51bWJlckZvcm1hdCogdG9VTnVtYmVyRm9ybWF0KGppbnQgYWRkcikgeworc3RhdGljIFVOdW1iZXJGb3JtYXQqIHRvVU51bWJlckZvcm1hdChqbG9uZyBhZGRyKSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VU51bWJlckZvcm1hdCo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oYWRkcikpOwogfQogCkBAIC04Niw3ICs4Nyw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgTmF0aXZlRGVjaW1hbEZvcm1hdF9zZXREZWNpbWFsRm9ybWF0U3ltYm9scyhKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGFkZHIsCitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X3NldERlY2ltYWxGb3JtYXRTeW1ib2xzKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGFkZHIsCiAgICAgICAgIGpzdHJpbmcgY3VycmVuY3lTeW1ib2wsIGpjaGFyIGRlY2ltYWxTZXBhcmF0b3IsIGpjaGFyIGRpZ2l0LCBqc3RyaW5nIGV4cG9uZW50U2VwYXJhdG9yLAogICAgICAgICBqY2hhciBncm91cGluZ1NlcGFyYXRvciwganN0cmluZyBpbmZpbml0eSwKICAgICAgICAganN0cmluZyBpbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wsIGpjaGFyIG1pbnVzU2lnbiwKQEAgLTEwMCwxOSArMTAxLDE4IEBACiAgICAgdG9EZWNpbWFsRm9ybWF0KGFkZHIpLT5hZG9wdERlY2ltYWxGb3JtYXRTeW1ib2xzKHN5bWJvbHMpOwogfQogCi1zdGF0aWMgamludCBOYXRpdmVEZWNpbWFsRm9ybWF0X29wZW4oSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBwYXR0ZXJuMCwKK3N0YXRpYyBqbG9uZyBOYXRpdmVEZWNpbWFsRm9ybWF0X29wZW4oSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBwYXR0ZXJuMCwKICAgICAgICAganN0cmluZyBjdXJyZW5jeVN5bWJvbCwgamNoYXIgZGVjaW1hbFNlcGFyYXRvciwgamNoYXIgZGlnaXQsIGpzdHJpbmcgZXhwb25lbnRTZXBhcmF0b3IsCiAgICAgICAgIGpjaGFyIGdyb3VwaW5nU2VwYXJhdG9yLCBqc3RyaW5nIGluZmluaXR5LAogICAgICAgICBqc3RyaW5nIGludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbCwgamNoYXIgbWludXNTaWduLAogICAgICAgICBqY2hhciBtb25ldGFyeURlY2ltYWxTZXBhcmF0b3IsIGpzdHJpbmcgbmFuLCBqY2hhciBwYXR0ZXJuU2VwYXJhdG9yLAogICAgICAgICBqY2hhciBwZXJjZW50LCBqY2hhciBwZXJNaWxsLCBqY2hhciB6ZXJvRGlnaXQpIHsKLSAgICBpZiAocGF0dGVybjAgPT0gTlVMTCkgewotICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICBVUGFyc2VFcnJvciBwYXJzZUVycm9yOwogICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHBhdHRlcm4oZW52LCBwYXR0ZXJuMCk7CisgICAgaWYgKCFwYXR0ZXJuLnZhbGlkKCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyogc3ltYm9scyA9IG1ha2VEZWNpbWFsRm9ybWF0U3ltYm9scyhlbnYsCiAgICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCwgZGVjaW1hbFNlcGFyYXRvciwgZGlnaXQsIGV4cG9uZW50U2VwYXJhdG9yLCBncm91cGluZ1NlcGFyYXRvciwKICAgICAgICAgICAgIGluZmluaXR5LCBpbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wsIG1pbnVzU2lnbiwKQEAgLTEyMywyMCArMTIzLDIwIEBACiAgICAgICAgIGRlbGV0ZSBzeW1ib2xzOwogICAgIH0KICAgICBtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIkRlY2ltYWxGb3JtYXQ6OkRlY2ltYWxGb3JtYXQiLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxqaW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZm10KSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihmbXQpOwogfQogCi1zdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X2Nsb3NlKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyKSB7CitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X2Nsb3NlKEpOSUVudiosIGpjbGFzcywgamxvbmcgYWRkcikgewogICAgIGRlbGV0ZSB0b0RlY2ltYWxGb3JtYXQoYWRkcik7CiB9CiAKLXN0YXRpYyB2b2lkIE5hdGl2ZURlY2ltYWxGb3JtYXRfc2V0Um91bmRpbmdNb2RlKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyLCBqaW50IG1vZGUsIGpkb3VibGUgaW5jcmVtZW50KSB7CitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X3NldFJvdW5kaW5nTW9kZShKTklFbnYqLCBqY2xhc3MsIGpsb25nIGFkZHIsIGppbnQgbW9kZSwgamRvdWJsZSBpbmNyZW1lbnQpIHsKICAgICBEZWNpbWFsRm9ybWF0KiBmbXQgPSB0b0RlY2ltYWxGb3JtYXQoYWRkcik7CiAgICAgZm10LT5zZXRSb3VuZGluZ01vZGUoc3RhdGljX2Nhc3Q8RGVjaW1hbEZvcm1hdDo6RVJvdW5kaW5nTW9kZT4obW9kZSkpOwogICAgIGZtdC0+c2V0Um91bmRpbmdJbmNyZW1lbnQoaW5jcmVtZW50KTsKIH0KIAotc3RhdGljIHZvaWQgTmF0aXZlRGVjaW1hbEZvcm1hdF9zZXRTeW1ib2woSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqaW50IGphdmFTeW1ib2wsIGpzdHJpbmcgamF2YVZhbHVlKSB7CitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X3NldFN5bWJvbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBhZGRyLCBqaW50IGphdmFTeW1ib2wsIGpzdHJpbmcgamF2YVZhbHVlKSB7CiAgICAgU2NvcGVkU3RyaW5nQ2hhcnMgdmFsdWUoZW52LCBqYXZhVmFsdWUpOwogICAgIGlmICh2YWx1ZS5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE0NywxNyArMTQ3LDE3IEBACiAgICAgbWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsICJ1bnVtX3NldFN5bWJvbCIsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIE5hdGl2ZURlY2ltYWxGb3JtYXRfc2V0QXR0cmlidXRlKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyLCBqaW50IGphdmFBdHRyLCBqaW50IHZhbHVlKSB7CitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X3NldEF0dHJpYnV0ZShKTklFbnYqLCBqY2xhc3MsIGpsb25nIGFkZHIsIGppbnQgamF2YUF0dHIsIGppbnQgdmFsdWUpIHsKICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlIGF0dHIgPSBzdGF0aWNfY2FzdDxVTnVtYmVyRm9ybWF0QXR0cmlidXRlPihqYXZhQXR0cik7CiAgICAgdW51bV9zZXRBdHRyaWJ1dGUodG9VTnVtYmVyRm9ybWF0KGFkZHIpLCBhdHRyLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZURlY2ltYWxGb3JtYXRfZ2V0QXR0cmlidXRlKEpOSUVudiosIGpjbGFzcywgamludCBhZGRyLCBqaW50IGphdmFBdHRyKSB7CitzdGF0aWMgamludCBOYXRpdmVEZWNpbWFsRm9ybWF0X2dldEF0dHJpYnV0ZShKTklFbnYqLCBqY2xhc3MsIGpsb25nIGFkZHIsIGppbnQgamF2YUF0dHIpIHsKICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlIGF0dHIgPSBzdGF0aWNfY2FzdDxVTnVtYmVyRm9ybWF0QXR0cmlidXRlPihqYXZhQXR0cik7CiAgICAgcmV0dXJuIHVudW1fZ2V0QXR0cmlidXRlKHRvVU51bWJlckZvcm1hdChhZGRyKSwgYXR0cik7CiB9CiAKLXN0YXRpYyB2b2lkIE5hdGl2ZURlY2ltYWxGb3JtYXRfc2V0VGV4dEF0dHJpYnV0ZShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGFkZHIsIGppbnQgamF2YUF0dHIsIGpzdHJpbmcgamF2YVZhbHVlKSB7CitzdGF0aWMgdm9pZCBOYXRpdmVEZWNpbWFsRm9ybWF0X3NldFRleHRBdHRyaWJ1dGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgYWRkciwgamludCBqYXZhQXR0ciwganN0cmluZyBqYXZhVmFsdWUpIHsKICAgICBTY29wZWRTdHJpbmdDaGFycyB2YWx1ZShlbnYsIGphdmFWYWx1ZSk7CiAgICAgaWYgKHZhbHVlLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgbWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsICJ1bnVtX3NldFRleHRBdHRyaWJ1dGUiLCBzdGF0dXMpOwogfQogCi1zdGF0aWMganN0cmluZyBOYXRpdmVEZWNpbWFsRm9ybWF0X2dldFRleHRBdHRyaWJ1dGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqaW50IGphdmFBdHRyKSB7CitzdGF0aWMganN0cmluZyBOYXRpdmVEZWNpbWFsRm9ybWF0X2dldFRleHRBdHRyaWJ1dGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgYWRkciwgamludCBqYXZhQXR0cikgewogICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgIFVOdW1iZXJGb3JtYXQqIGZtdCA9IHRvVU51bWJlckZvcm1hdChhZGRyKTsKICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSBhdHRyID0gc3RhdGljX2Nhc3Q8VU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGU+KGphdmFBdHRyKTsKQEAgLTE4NywxMiArMTg3LDExIEBACiAgICAgcmV0dXJuIG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAidW51bV9nZXRUZXh0QXR0cmlidXRlIiwgc3RhdHVzKSA/IE5VTEwgOiBlbnYtPk5ld1N0cmluZyhjaGFycy5nZXQoKSwgY2hhckNvdW50KTsKIH0KIAotc3RhdGljIHZvaWQgTmF0aXZlRGVjaW1hbEZvcm1hdF9hcHBseVBhdHRlcm5JbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkciwgamJvb2xlYW4gbG9jYWxpemVkLCBqc3RyaW5nIHBhdHRlcm4wKSB7Ci0gICAgaWYgKHBhdHRlcm4wID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsIE5VTEwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorc3RhdGljIHZvaWQgTmF0aXZlRGVjaW1hbEZvcm1hdF9hcHBseVBhdHRlcm5JbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGFkZHIsIGpib29sZWFuIGxvY2FsaXplZCwganN0cmluZyBwYXR0ZXJuMCkgewogICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHBhdHRlcm4oZW52LCBwYXR0ZXJuMCk7CisgICAgaWYgKCFwYXR0ZXJuLnZhbGlkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgRGVjaW1hbEZvcm1hdCogZm10ID0gdG9EZWNpbWFsRm9ybWF0KGFkZHIpOwogICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uOwpAQCAtMjA2LDcgKzIwNSw3IEBACiAgICAgbWF5YmVUaHJvd0ljdUV4Y2VwdGlvbihlbnYsIGZ1bmN0aW9uLCBzdGF0dXMpOwogfQogCi1zdGF0aWMganN0cmluZyBOYXRpdmVEZWNpbWFsRm9ybWF0X3RvUGF0dGVybkltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqYm9vbGVhbiBsb2NhbGl6ZWQpIHsKK3N0YXRpYyBqc3RyaW5nIE5hdGl2ZURlY2ltYWxGb3JtYXRfdG9QYXR0ZXJuSW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBhZGRyLCBqYm9vbGVhbiBsb2NhbGl6ZWQpIHsKICAgICBEZWNpbWFsRm9ybWF0KiBmbXQgPSB0b0RlY2ltYWxGb3JtYXQoYWRkcik7CiAgICAgVW5pY29kZVN0cmluZyBwYXR0ZXJuOwogICAgIGlmIChsb2NhbGl6ZWQpIHsKQEAgLTI0Miw3ICsyNDEsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBqY2hhckFycmF5IGZvcm1hdChKTklFbnYqIGVudiwgamludCBhZGRyLCBqb2JqZWN0IGZwSXRlciwgVCB2YWwpIHsKK3N0YXRpYyBqY2hhckFycmF5IGZvcm1hdChKTklFbnYqIGVudiwgamxvbmcgYWRkciwgam9iamVjdCBmcEl0ZXIsIFQgdmFsKSB7CiAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICAgVW5pY29kZVN0cmluZyBzdHI7CiAgICAgRGVjaW1hbEZvcm1hdCogZm10ID0gdG9EZWNpbWFsRm9ybWF0KGFkZHIpOwpAQCAtMjUyLDE1ICsyNTEsMTUgQEAKICAgICByZXR1cm4gZm9ybWF0UmVzdWx0KGVudiwgc3RyLCBwZnBpLCBmcEl0ZXIpOwogfQogCi1zdGF0aWMgamNoYXJBcnJheSBOYXRpdmVEZWNpbWFsRm9ybWF0X2Zvcm1hdExvbmcoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqbG9uZyB2YWx1ZSwgam9iamVjdCBmcEl0ZXIpIHsKK3N0YXRpYyBqY2hhckFycmF5IE5hdGl2ZURlY2ltYWxGb3JtYXRfZm9ybWF0TG9uZyhKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBhZGRyLCBqbG9uZyB2YWx1ZSwgam9iamVjdCBmcEl0ZXIpIHsKKyAgcmV0dXJuIGZvcm1hdChlbnYsIGFkZHIsIGZwSXRlciwgdmFsdWUpOworfQorCitzdGF0aWMgamNoYXJBcnJheSBOYXRpdmVEZWNpbWFsRm9ybWF0X2Zvcm1hdERvdWJsZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBhZGRyLCBqZG91YmxlIHZhbHVlLCBqb2JqZWN0IGZwSXRlcikgewogICAgIHJldHVybiBmb3JtYXQoZW52LCBhZGRyLCBmcEl0ZXIsIHZhbHVlKTsKIH0KIAotc3RhdGljIGpjaGFyQXJyYXkgTmF0aXZlRGVjaW1hbEZvcm1hdF9mb3JtYXREb3VibGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqZG91YmxlIHZhbHVlLCBqb2JqZWN0IGZwSXRlcikgewotICAgIHJldHVybiBmb3JtYXQoZW52LCBhZGRyLCBmcEl0ZXIsIHZhbHVlKTsKLX0KLQotc3RhdGljIGpjaGFyQXJyYXkgTmF0aXZlRGVjaW1hbEZvcm1hdF9mb3JtYXREaWdpdExpc3QoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBhZGRyLCBqc3RyaW5nIHZhbHVlLCBqb2JqZWN0IGZwSXRlcikgeworc3RhdGljIGpjaGFyQXJyYXkgTmF0aXZlRGVjaW1hbEZvcm1hdF9mb3JtYXREaWdpdExpc3QoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgYWRkciwganN0cmluZyB2YWx1ZSwgam9iamVjdCBmcEl0ZXIpIHsKICAgICBTY29wZWRVdGZDaGFycyBjaGFycyhlbnYsIHZhbHVlKTsKICAgICBpZiAoY2hhcnMuY19zdHIoKSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjgxLDcgKzI4MCw3IEBACiAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KEpuaUNvbnN0YW50czo6YmlnRGVjaW1hbENsYXNzLCBnQmlnRGVjaW1hbF9pbml0LCBzdHIpOwogfQogCi1zdGF0aWMgam9iamVjdCBOYXRpdmVEZWNpbWFsRm9ybWF0X3BhcnNlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgYWRkciwganN0cmluZyB0ZXh0LAorc3RhdGljIGpvYmplY3QgTmF0aXZlRGVjaW1hbEZvcm1hdF9wYXJzZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBhZGRyLCBqc3RyaW5nIHRleHQsCiAgICAgICAgIGpvYmplY3QgcG9zaXRpb24sIGpib29sZWFuIHBhcnNlQmlnRGVjaW1hbCkgewogCiAgICAgc3RhdGljIGptZXRob2RJRCBnUFBfZ2V0SW5kZXggPSBlbnYtPkdldE1ldGhvZElEKEpuaUNvbnN0YW50czo6cGFyc2VQb3NpdGlvbkNsYXNzLCAiZ2V0SW5kZXgiLCAiKClJIik7CkBAIC0yOTksNiArMjk4LDkgQEAKICAgICBGb3JtYXR0YWJsZSByZXM7CiAgICAgUGFyc2VQb3NpdGlvbiBwcChwYXJzZVBvcyk7CiAgICAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgc3JjKGVudiwgdGV4dCk7CisgICAgaWYgKCFzcmMudmFsaWQoKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIERlY2ltYWxGb3JtYXQqIGZtdCA9IHRvRGVjaW1hbEZvcm1hdChhZGRyKTsKICAgICBmbXQtPnBhcnNlKHNyYy51bmljb2RlU3RyaW5nKCksIHJlcywgcHApOwogCkBAIC0zMzQsMjggKzMzNiwyOCBAQAogICAgIH0KIH0KIAotc3RhdGljIGppbnQgTmF0aXZlRGVjaW1hbEZvcm1hdF9jbG9uZUltcGwoSk5JRW52KiwgamNsYXNzLCBqaW50IGFkZHIpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVEZWNpbWFsRm9ybWF0X2Nsb25lSW1wbChKTklFbnYqLCBqY2xhc3MsIGpsb25nIGFkZHIpIHsKICAgICBEZWNpbWFsRm9ybWF0KiBmbXQgPSB0b0RlY2ltYWxGb3JtYXQoYWRkcik7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihmbXQtPmNsb25lKCkpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGZtdC0+Y2xvbmUoKSk7CiB9CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIGFwcGx5UGF0dGVybkltcGwsICIoSVpMamF2YS9sYW5nL1N0cmluZzspViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgY2xvbmVJbXBsLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgY2xvc2UsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBmb3JtYXREb3VibGUsICIoSURMbGliY29yZS9pY3UvTmF0aXZlRGVjaW1hbEZvcm1hdCRGaWVsZFBvc2l0aW9uSXRlcmF0b3I7KVtDIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBmb3JtYXRMb25nLCAiKElKTGxpYmNvcmUvaWN1L05hdGl2ZURlY2ltYWxGb3JtYXQkRmllbGRQb3NpdGlvbkl0ZXJhdG9yOylbQyIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgZm9ybWF0RGlnaXRMaXN0LCAiKElMamF2YS9sYW5nL1N0cmluZztMbGliY29yZS9pY3UvTmF0aXZlRGVjaW1hbEZvcm1hdCRGaWVsZFBvc2l0aW9uSXRlcmF0b3I7KVtDIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBnZXRBdHRyaWJ1dGUsICIoSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgZ2V0VGV4dEF0dHJpYnV0ZSwgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIG9wZW4sICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7Q0NMamF2YS9sYW5nL1N0cmluZztDTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7Q0NMamF2YS9sYW5nL1N0cmluZztDQ0NDKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIHBhcnNlLCAiKElMamF2YS9sYW5nL1N0cmluZztMamF2YS90ZXh0L1BhcnNlUG9zaXRpb247WilMamF2YS9sYW5nL051bWJlcjsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIHNldEF0dHJpYnV0ZSwgIihJSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgc2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0NDTGphdmEvbGFuZy9TdHJpbmc7Q0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0NDTGphdmEvbGFuZy9TdHJpbmc7Q0NDQylWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBzZXRSb3VuZGluZ01vZGUsICIoSUlEKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIHNldFN5bWJvbCwgIihJSUxqYXZhL2xhbmcvU3RyaW5nOylWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBzZXRUZXh0QXR0cmlidXRlLCAiKElJTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIHRvUGF0dGVybkltcGwsICIoSVopTGphdmEvbGFuZy9TdHJpbmc7IiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBhcHBseVBhdHRlcm5JbXBsLCAiKEpaTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIGNsb25lSW1wbCwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIGNsb3NlLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgZm9ybWF0RG91YmxlLCAiKEpETGxpYmNvcmUvaWN1L05hdGl2ZURlY2ltYWxGb3JtYXQkRmllbGRQb3NpdGlvbkl0ZXJhdG9yOylbQyIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgZm9ybWF0TG9uZywgIihKSkxsaWJjb3JlL2ljdS9OYXRpdmVEZWNpbWFsRm9ybWF0JEZpZWxkUG9zaXRpb25JdGVyYXRvcjspW0MiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIGZvcm1hdERpZ2l0TGlzdCwgIihKTGphdmEvbGFuZy9TdHJpbmc7TGxpYmNvcmUvaWN1L05hdGl2ZURlY2ltYWxGb3JtYXQkRmllbGRQb3NpdGlvbkl0ZXJhdG9yOylbQyIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgZ2V0QXR0cmlidXRlLCAiKEpJKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIGdldFRleHRBdHRyaWJ1dGUsICIoSkkpTGphdmEvbGFuZy9TdHJpbmc7IiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBvcGVuLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0NDTGphdmEvbGFuZy9TdHJpbmc7Q0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0NDTGphdmEvbGFuZy9TdHJpbmc7Q0NDQylKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBwYXJzZSwgIihKTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdGV4dC9QYXJzZVBvc2l0aW9uO1opTGphdmEvbGFuZy9OdW1iZXI7IiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBzZXRBdHRyaWJ1dGUsICIoSklJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZURlY2ltYWxGb3JtYXQsIHNldERlY2ltYWxGb3JtYXRTeW1ib2xzLCAiKEpMamF2YS9sYW5nL1N0cmluZztDQ0xqYXZhL2xhbmcvU3RyaW5nO0NMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztDQ0xqYXZhL2xhbmcvU3RyaW5nO0NDQ0MpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgc2V0Um91bmRpbmdNb2RlLCAiKEpJRClWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCBzZXRTeW1ib2wsICIoSklMamF2YS9sYW5nL1N0cmluZzspViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlRGVjaW1hbEZvcm1hdCwgc2V0VGV4dEF0dHJpYnV0ZSwgIihKSUxqYXZhL2xhbmcvU3RyaW5nOylWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVEZWNpbWFsRm9ybWF0LCB0b1BhdHRlcm5JbXBsLCAiKEpaKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAogfTsKIHZvaWQgcmVnaXN0ZXJfbGliY29yZV9pY3VfTmF0aXZlRGVjaW1hbEZvcm1hdChKTklFbnYqIGVudikgewogICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2ljdS9OYXRpdmVEZWNpbWFsRm9ybWF0IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVOb3JtYWxpemVyLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZU5vcm1hbGl6ZXIuY3BwCmluZGV4IDY5M2U5NDQuLjhhZTQyZDkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZU5vcm1hbGl6ZXIuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZU5vcm1hbGl6ZXIuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlTm9ybWFsaXplciIKIAorI2luY2x1ZGUgIkljdVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKICNpbmNsdWRlICJKbmlFeGNlcHRpb24uaCIKQEAgLTIzLDI4ICsyNCwzNCBAQAogI2luY2x1ZGUgInVuaWNvZGUvbm9ybWx6ci5oIgogCiBzdGF0aWMganN0cmluZyBOYXRpdmVOb3JtYWxpemVyX25vcm1hbGl6ZUltcGwoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBzLCBqaW50IGludE1vZGUpIHsKLSAgICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBzcmMoZW52LCBzKTsKLSAgICBVTm9ybWFsaXphdGlvbk1vZGUgbW9kZSA9IHN0YXRpY19jYXN0PFVOb3JtYWxpemF0aW9uTW9kZT4oaW50TW9kZSk7Ci0gICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0gICAgVW5pY29kZVN0cmluZyBkc3Q7Ci0gICAgTm9ybWFsaXplcjo6bm9ybWFsaXplKHNyYy51bmljb2RlU3RyaW5nKCksIG1vZGUsIDAsIGRzdCwgc3RhdHVzKTsKLSAgICBtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIk5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSIsIHN0YXR1cyk7Ci0gICAgcmV0dXJuIGRzdC5pc0JvZ3VzKCkgPyBOVUxMIDogZW52LT5OZXdTdHJpbmcoZHN0LmdldEJ1ZmZlcigpLCBkc3QubGVuZ3RoKCkpOworICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBzcmMoZW52LCBzKTsKKyAgaWYgKCFzcmMudmFsaWQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFVOb3JtYWxpemF0aW9uTW9kZSBtb2RlID0gc3RhdGljX2Nhc3Q8VU5vcm1hbGl6YXRpb25Nb2RlPihpbnRNb2RlKTsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIFVuaWNvZGVTdHJpbmcgZHN0OworICBOb3JtYWxpemVyOjpub3JtYWxpemUoc3JjLnVuaWNvZGVTdHJpbmcoKSwgbW9kZSwgMCwgZHN0LCBzdGF0dXMpOworICBtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIk5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSIsIHN0YXR1cyk7CisgIHJldHVybiBkc3QuaXNCb2d1cygpID8gTlVMTCA6IGVudi0+TmV3U3RyaW5nKGRzdC5nZXRCdWZmZXIoKSwgZHN0Lmxlbmd0aCgpKTsKIH0KIAogc3RhdGljIGpib29sZWFuIE5hdGl2ZU5vcm1hbGl6ZXJfaXNOb3JtYWxpemVkSW1wbChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIHMsIGppbnQgaW50TW9kZSkgewotICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHNyYyhlbnYsIHMpOwotICAgIFVOb3JtYWxpemF0aW9uTW9kZSBtb2RlID0gc3RhdGljX2Nhc3Q8VU5vcm1hbGl6YXRpb25Nb2RlPihpbnRNb2RlKTsKLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBVQm9vbCByZXN1bHQgPSBOb3JtYWxpemVyOjppc05vcm1hbGl6ZWQoc3JjLnVuaWNvZGVTdHJpbmcoKSwgbW9kZSwgc3RhdHVzKTsKLSAgICBtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIk5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCIsIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcgc3JjKGVudiwgcyk7CisgIGlmICghc3JjLnZhbGlkKCkpIHsKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworICB9CisgIFVOb3JtYWxpemF0aW9uTW9kZSBtb2RlID0gc3RhdGljX2Nhc3Q8VU5vcm1hbGl6YXRpb25Nb2RlPihpbnRNb2RlKTsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIFVCb29sIHJlc3VsdCA9IE5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZChzcmMudW5pY29kZVN0cmluZygpLCBtb2RlLCBzdGF0dXMpOworICBtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIk5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCIsIHN0YXR1cyk7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZU5vcm1hbGl6ZXIsIG5vcm1hbGl6ZUltcGwsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZU5vcm1hbGl6ZXIsIGlzTm9ybWFsaXplZEltcGwsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiksCisgIE5BVElWRV9NRVRIT0QoTmF0aXZlTm9ybWFsaXplciwgbm9ybWFsaXplSW1wbCwgIihMamF2YS9sYW5nL1N0cmluZztJKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICBOQVRJVkVfTUVUSE9EKE5hdGl2ZU5vcm1hbGl6ZXIsIGlzTm9ybWFsaXplZEltcGwsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiksCiB9Owogdm9pZCByZWdpc3Rlcl9saWJjb3JlX2ljdV9OYXRpdmVOb3JtYWxpemVyKEpOSUVudiogZW52KSB7Ci0gICAgam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImxpYmNvcmUvaWN1L05hdGl2ZU5vcm1hbGl6ZXIiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKKyAgam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImxpYmNvcmUvaWN1L05hdGl2ZU5vcm1hbGl6ZXIiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZVBsdXJhbFJ1bGVzLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X05hdGl2ZVBsdXJhbFJ1bGVzLmNwcAppbmRleCBkZjIyOGZmLi4zMjUzZWI4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9OYXRpdmVQbHVyYWxSdWxlcy5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfTmF0aXZlUGx1cmFsUnVsZXMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlUGx1cmFsUnVsZXMiCiAKKyNpbmNsdWRlICJJY3VVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiSm5pQ29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiSm5pRXhjZXB0aW9uLmgiCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9UaW1lWm9uZU5hbWVzLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X1RpbWVab25lTmFtZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzc3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9UaW1lWm9uZU5hbWVzLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGltZVpvbmVOYW1lcyIKKworI2luY2x1ZGUgIkljdVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKKyNpbmNsdWRlICJKbmlFeGNlcHRpb24uaCIKKyNpbmNsdWRlICJTY29wZWRKYXZhVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgIlNjb3BlZExvY2FsUmVmLmgiCisjaW5jbHVkZSAiU2NvcGVkVXRmQ2hhcnMuaCIKKyNpbmNsdWRlICJVbmlxdWVQdHIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL2NhbGVuZGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS90aW1lem9uZS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdHpuYW1lcy5oIgorCitzdGF0aWMgam9iamVjdEFycmF5IFRpbWVab25lTmFtZXNfZm9yQ291bnRyeUNvZGUoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBjb3VudHJ5Q29kZSkgeworICBTY29wZWRVdGZDaGFycyBjb3VudHJ5Q2hhcnMoZW52LCBjb3VudHJ5Q29kZSk7CisgIGlmIChjb3VudHJ5Q2hhcnMuY19zdHIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGZyb21TdHJpbmdFbnVtZXJhdGlvbihlbnYsIFRpbWVab25lOjpjcmVhdGVFbnVtZXJhdGlvbihjb3VudHJ5Q2hhcnMuY19zdHIoKSkpOworfQorCitzdGF0aWMgYm9vbCBpc1V0Yyhjb25zdCBVbmljb2RlU3RyaW5nJiBpZCkgeworICBzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyBrRXRjVWN0KCJFdGMvVUNUIiwgNywgVVNfSU5WKTsKKyAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcga0V0Y1V0YygiRXRjL1VUQyIsIDcsIFVTX0lOVik7CisgIHN0YXRpYyBjb25zdCBVbmljb2RlU3RyaW5nIGtFdGNVbml2ZXJzYWwoIkV0Yy9Vbml2ZXJzYWwiLCAxMywgVVNfSU5WKTsKKyAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcga0V0Y1p1bHUoIkV0Yy9adWx1IiwgOCwgVVNfSU5WKTsKKworICBzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyBrVWN0KCJVQ1QiLCAzLCBVU19JTlYpOworICBzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyBrVXRjKCJVVEMiLCAzLCBVU19JTlYpOworICBzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyBrVW5pdmVyc2FsKCJVbml2ZXJzYWwiLCA5LCBVU19JTlYpOworICBzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyBrWnVsdSgiWnVsdSIsIDQsIFVTX0lOVik7CisKKyAgcmV0dXJuIGlkID09IGtFdGNVY3QgfHwgaWQgPT0ga0V0Y1V0YyB8fCBpZCA9PSBrRXRjVW5pdmVyc2FsIHx8IGlkID09IGtFdGNadWx1IHx8CisgICAgICBpZCA9PSBrVWN0IHx8IGlkID09IGtVdGMgfHwgaWQgPT0ga1VuaXZlcnNhbCB8fCBpZCA9PSBrWnVsdTsKK30KKworc3RhdGljIHZvaWQgc2V0U3RyaW5nQXJyYXlFbGVtZW50KEpOSUVudiogZW52LCBqb2JqZWN0QXJyYXkgYXJyYXksIGludCBpLCBjb25zdCBVbmljb2RlU3RyaW5nJiBzKSB7CisgIC8vIEZpbGwgaW4gd2hhdGV2ZXIgd2UgZ290LiBXZSBkb24ndCB1c2UgdGhlIGRpc3BsYXkgbmFtZXMgaWYgdGhleSdyZSAiR01UWystXXh4Onh4IgorICAvLyBiZWNhdXNlIGljdTRjIGRvZXNuJ3QgdXNlIHRoZSB1cC10by1kYXRlIHRpbWUgem9uZSB0cmFuc2l0aW9uIGRhdGEsIHNvIGl0IGdldHMgdGhlc2UKKyAgLy8gd3JvbmcuIFRpbWVab25lLmdldERpc3BsYXlOYW1lIGNyZWF0ZXMgYWNjdXJhdGUgbmFtZXMgb24gZGVtYW5kLgorICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIGl0J3Mgd29ydGggZG9pbmcgdGhhdCB3b3JrIG9uY2UgaW4gdGhlIEphdmEgd3JhcHBlciBpbnN0ZWFkIG9mIG9uLWRlbWFuZC4KKyAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcga0dtdCgiR01UIiwgMywgVVNfSU5WKTsKKyAgaWYgKCFzLmlzQm9ndXMoKSAmJiAhcy5zdGFydHNXaXRoKGtHbXQpKSB7CisgICAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gamF2YVN0cmluZyhlbnYsIGVudi0+TmV3U3RyaW5nKHMuZ2V0QnVmZmVyKCksIHMubGVuZ3RoKCkpKTsKKyAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnJheSwgaSwgamF2YVN0cmluZy5nZXQoKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVGltZVpvbmVOYW1lc19maWxsWm9uZVN0cmluZ3MoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBsb2NhbGVOYW1lLCBqb2JqZWN0QXJyYXkgcmVzdWx0KSB7CisgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUoZW52LCBsb2NhbGVOYW1lKTsKKworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgVW5pcXVlUHRyPFRpbWVab25lTmFtZXM+IG5hbWVzKFRpbWVab25lTmFtZXM6OmNyZWF0ZUluc3RhbmNlKGxvY2FsZSwgc3RhdHVzKSk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIlRpbWVab25lTmFtZXM6OmNyZWF0ZUluc3RhbmNlIiwgc3RhdHVzKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IFVEYXRlIG5vdyhDYWxlbmRhcjo6Z2V0Tm93KCkpOworCisgIHN0YXRpYyBjb25zdCBVbmljb2RlU3RyaW5nIGtVdGMoIlVUQyIsIDMsIFVTX0lOVik7CisgIHN0YXRpYyBjb25zdCBVbmljb2RlU3RyaW5nIHBhY2lmaWNfYXBpYSgiUGFjaWZpYy9BcGlhIiwgMTIsIFVTX0lOVik7CisKKyAgc2l6ZV90IGlkX2NvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChyZXN1bHQpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkX2NvdW50OyArK2kpIHsKKyAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0QXJyYXk+IGphdmFfcm93KGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdEFycmF5PihlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChyZXN1bHQsIGkpKSk7CisgICAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gamF2YV96b25lX2lkKGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxqc3RyaW5nPihlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChqYXZhX3Jvdy5nZXQoKSwgMCkpKTsKKyAgICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyB6b25lX2lkKGVudiwgamF2YV96b25lX2lkLmdldCgpKTsKKyAgICBpZiAoIXpvbmVfaWQudmFsaWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVuaWNvZGVTdHJpbmcgbG9uZ19zdGQ7CisgICAgbmFtZXMtPmdldERpc3BsYXlOYW1lKHpvbmVfaWQudW5pY29kZVN0cmluZygpLCBVVFpOTV9MT05HX1NUQU5EQVJELCBub3csIGxvbmdfc3RkKTsKKyAgICBVbmljb2RlU3RyaW5nIHNob3J0X3N0ZDsKKyAgICBuYW1lcy0+Z2V0RGlzcGxheU5hbWUoem9uZV9pZC51bmljb2RlU3RyaW5nKCksIFVUWk5NX1NIT1JUX1NUQU5EQVJELCBub3csIHNob3J0X3N0ZCk7CisgICAgVW5pY29kZVN0cmluZyBsb25nX2RzdDsKKyAgICBuYW1lcy0+Z2V0RGlzcGxheU5hbWUoem9uZV9pZC51bmljb2RlU3RyaW5nKCksIFVUWk5NX0xPTkdfREFZTElHSFQsIG5vdywgbG9uZ19kc3QpOworICAgIFVuaWNvZGVTdHJpbmcgc2hvcnRfZHN0OworICAgIG5hbWVzLT5nZXREaXNwbGF5TmFtZSh6b25lX2lkLnVuaWNvZGVTdHJpbmcoKSwgVVRaTk1fU0hPUlRfREFZTElHSFQsIG5vdywgc2hvcnRfZHN0KTsKKworICAgIGlmIChpc1V0Yyh6b25lX2lkLnVuaWNvZGVTdHJpbmcoKSkpIHsKKyAgICAgIC8vIElDVSBkb2Vzbid0IGhhdmUgbmFtZXMgZm9yIHRoZSBVVEMgem9uZXM7IGl0IGp1c3Qgc2F5cyAiR01UKzAwOjAwIiBmb3IgYm90aAorICAgICAgLy8gbG9uZyBhbmQgc2hvcnQgbmFtZXMuIFdlIGRvbid0IHdhbnQgdGhpcy4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzIHVzZSAiVVRDIgorICAgICAgLy8gZm9yIGV2ZXJ5dGhpbmcgKHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIHNheSAiVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUiIGluCisgICAgICAvLyBldmVyeSBsYW5ndWFnZSkuCisgICAgICAvLyBUT0RPOiBjaGVjayBDTERSIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZSB0aGlzIHNvbWV3aGVyZS4KKyAgICAgIGxvbmdfc3RkID0gc2hvcnRfc3RkID0gbG9uZ19kc3QgPSBzaG9ydF9kc3QgPSBrVXRjOworICAgIH0gZWxzZSBpZiAoem9uZV9pZC51bmljb2RlU3RyaW5nKCkgPT0gcGFjaWZpY19hcGlhKSB7CisgICAgICAvLyBpY3U0YyA1MCBkb2Vzbid0IGtub3cgU2Ftb2EgaGFzIERTVCB5ZXQuIGh0dHA6Ly9iLzc5NTU2MTQKKyAgICAgIGlmIChsb25nX2RzdC5pc0JvZ3VzKCkpIHsKKyAgICAgICAgbG9uZ19kc3QgPSAiU2Ftb2EgRGF5bGlnaHQgVGltZSI7CisgICAgICB9CisgICAgfQorCisgICAgc2V0U3RyaW5nQXJyYXlFbGVtZW50KGVudiwgamF2YV9yb3cuZ2V0KCksIDEsIGxvbmdfc3RkKTsKKyAgICBzZXRTdHJpbmdBcnJheUVsZW1lbnQoZW52LCBqYXZhX3Jvdy5nZXQoKSwgMiwgc2hvcnRfc3RkKTsKKyAgICBzZXRTdHJpbmdBcnJheUVsZW1lbnQoZW52LCBqYXZhX3Jvdy5nZXQoKSwgMywgbG9uZ19kc3QpOworICAgIHNldFN0cmluZ0FycmF5RWxlbWVudChlbnYsIGphdmFfcm93LmdldCgpLCA0LCBzaG9ydF9kc3QpOworICB9Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgTkFUSVZFX01FVEhPRChUaW1lWm9uZU5hbWVzLCBmb3JDb3VudHJ5Q29kZSwgIihMamF2YS9sYW5nL1N0cmluZzspW0xqYXZhL2xhbmcvU3RyaW5nOyIpLAorICBOQVRJVkVfTUVUSE9EKFRpbWVab25lTmFtZXMsIGZpbGxab25lU3RyaW5ncywgIihMamF2YS9sYW5nL1N0cmluZztbW0xqYXZhL2xhbmcvU3RyaW5nOylWIiksCit9Owordm9pZCByZWdpc3Rlcl9saWJjb3JlX2ljdV9UaW1lWm9uZU5hbWVzKEpOSUVudiogZW52KSB7CisgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2ljdS9UaW1lWm9uZU5hbWVzIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9UaW1lWm9uZXMuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfVGltZVpvbmVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMThjNS4uMDAwMDAwMAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2ljdV9UaW1lWm9uZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlRpbWVab25lcyIKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiSm5pQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiSm5pRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiU2NvcGVkSmF2YVVuaWNvZGVTdHJpbmcuaCIKLSNpbmNsdWRlICJTY29wZWRMb2NhbFJlZi5oIgotI2luY2x1ZGUgIlNjb3BlZFV0ZkNoYXJzLmgiCi0jaW5jbHVkZSAiVW5pcXVlUHRyLmgiCi0jaW5jbHVkZSAidW5pY29kZS9zbXBkdGZtdC5oIgotI2luY2x1ZGUgInVuaWNvZGUvdGltZXpvbmUuaCIKLQotZXh0ZXJuIExvY2FsZSBnZXRMb2NhbGUoSk5JRW52KiBlbnYsIGpzdHJpbmcgbG9jYWxlTmFtZSk7Ci0KLXN0YXRpYyBqb2JqZWN0QXJyYXkgVGltZVpvbmVzX2ZvckNvdW50cnlDb2RlKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgY291bnRyeUNvZGUpIHsKLSAgICBTY29wZWRVdGZDaGFycyBjb3VudHJ5Q2hhcnMoZW52LCBjb3VudHJ5Q29kZSk7Ci0gICAgaWYgKGNvdW50cnlDaGFycy5jX3N0cigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVW5pcXVlUHRyPFN0cmluZ0VudW1lcmF0aW9uPiBpZHMoVGltZVpvbmU6OmNyZWF0ZUVudW1lcmF0aW9uKGNvdW50cnlDaGFycy5jX3N0cigpKSk7Ci0gICAgaWYgKGlkcy5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBpbnQzMl90IGlkQ291bnQgPSBpZHMtPmNvdW50KHN0YXR1cyk7Ci0gICAgaWYgKG1heWJlVGhyb3dJY3VFeGNlcHRpb24oZW52LCAiU3RyaW5nRW51bWVyYXRpb246OmNvdW50Iiwgc3RhdHVzKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBqb2JqZWN0QXJyYXkgcmVzdWx0ID0gZW52LT5OZXdPYmplY3RBcnJheShpZENvdW50LCBKbmlDb25zdGFudHM6OnN0cmluZ0NsYXNzLCBOVUxMKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpZENvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyogaWQgPSBpZHMtPnNuZXh0KHN0YXR1cyk7Ci0gICAgICAgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIlN0cmluZ0VudW1lcmF0aW9uOjpzbmV4dCIsIHN0YXR1cykpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFNjb3BlZExvY2FsUmVmPGpzdHJpbmc+IGlkU3RyaW5nKGVudiwgZW52LT5OZXdTdHJpbmcoaWQtPmdldEJ1ZmZlcigpLCBpZC0+bGVuZ3RoKCkpKTsKLSAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmVzdWx0LCBpLCBpZFN0cmluZy5nZXQoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cnVjdCBUaW1lWm9uZU5hbWVzIHsKLSAgICBUaW1lWm9uZSogdHo7Ci0KLSAgICBVbmljb2RlU3RyaW5nIGxvbmdTdGQ7Ci0gICAgVW5pY29kZVN0cmluZyBzaG9ydFN0ZDsKLSAgICBVbmljb2RlU3RyaW5nIGxvbmdEc3Q7Ci0gICAgVW5pY29kZVN0cmluZyBzaG9ydERzdDsKLQotICAgIFVEYXRlIHN0YW5kYXJkRGF0ZTsKLSAgICBVRGF0ZSBkYXlsaWdodFNhdmluZ0RhdGU7Ci19OwotCi1zdGF0aWMgdm9pZCBzZXRTdHJpbmdBcnJheUVsZW1lbnQoSk5JRW52KiBlbnYsIGpvYmplY3RBcnJheSBhcnJheSwgaW50IGksIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHMpIHsKLSAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqYXZhU3RyaW5nKGVudiwgZW52LT5OZXdTdHJpbmcocy5nZXRCdWZmZXIoKSwgcy5sZW5ndGgoKSkpOwotICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFycmF5LCBpLCBqYXZhU3RyaW5nLmdldCgpKTsKLX0KLQotc3RhdGljIGJvb2wgaXNVdGMoY29uc3QgVW5pY29kZVN0cmluZyYgaWQpIHsKLSAgICBzdGF0aWMgVW5pY29kZVN0cmluZyBldGNVY3QoIkV0Yy9VQ1QiLCA3LCBVU19JTlYpOwotICAgIHN0YXRpYyBVbmljb2RlU3RyaW5nIGV0Y1V0YygiRXRjL1VUQyIsIDcsIFVTX0lOVik7Ci0gICAgc3RhdGljIFVuaWNvZGVTdHJpbmcgZXRjVW5pdmVyc2FsKCJFdGMvVW5pdmVyc2FsIiwgMTMsIFVTX0lOVik7Ci0gICAgc3RhdGljIFVuaWNvZGVTdHJpbmcgZXRjWnVsdSgiRXRjL1p1bHUiLCA4LCBVU19JTlYpOwotCi0gICAgc3RhdGljIFVuaWNvZGVTdHJpbmcgdWN0KCJVQ1QiLCAzLCBVU19JTlYpOwotICAgIHN0YXRpYyBVbmljb2RlU3RyaW5nIHV0YygiVVRDIiwgMywgVVNfSU5WKTsKLSAgICBzdGF0aWMgVW5pY29kZVN0cmluZyB1bml2ZXJzYWwoIlVuaXZlcnNhbCIsIDksIFVTX0lOVik7Ci0gICAgc3RhdGljIFVuaWNvZGVTdHJpbmcgenVsdSgiWnVsdSIsIDQsIFVTX0lOVik7Ci0KLSAgICByZXR1cm4gaWQgPT0gZXRjVWN0IHx8IGlkID09IGV0Y1V0YyB8fCBpZCA9PSBldGNVbml2ZXJzYWwgfHwgaWQgPT0gZXRjWnVsdSB8fAotICAgICAgICAgICAgaWQgPT0gdWN0IHx8IGlkID09IHV0YyB8fCBpZCA9PSB1bml2ZXJzYWwgfHwgaWQgPT0genVsdTsKLX0KLQotc3RhdGljIGpvYmplY3RBcnJheSBUaW1lWm9uZXNfZ2V0Wm9uZVN0cmluZ3NJbXBsKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgbG9jYWxlTmFtZSwgam9iamVjdEFycmF5IHRpbWVab25lSWRzKSB7Ci0gICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShlbnYsIGxvY2FsZU5hbWUpOwotCi0gICAgLy8gV2UgY291bGQgdXNlIFRpbWVab25lOjpnZXREaXNwbGF5TmFtZSwgYnV0IHRoYXQncyBldmVuIHNsb3dlcgotICAgIC8vIGJlY2F1c2UgaXQgY3JlYXRlcyBhIG5ldyBTaW1wbGVEYXRlRm9ybWF0IGVhY2ggdGltZS4KLSAgICAvLyBXZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIFNpbXBsZURhdGVGb3JtYXQgZGlyZWN0bHkuCi0KLSAgICAvLyBXZSBjYW4ndCB1c2UgRGF0ZUZvcm1hdFN5bWJvbHM6OmdldFpvbmVTdHJpbmdzIGJlY2F1c2UgdGhhdAotICAgIC8vIHVzZXMgaXRzIG93biBzZXQgb2YgdGltZSB6b25lIGlkcyBhbmQgY29udGFpbnMgZW1wdHkgc3RyaW5ncwotICAgIC8vIGluc3RlYWQgb2YgR01UIG9mZnNldHMgKGEgcGl0eSwgYmVjYXVzZSBpdCdzIGEgYml0IGZhc3RlciB0aGFuIHRoaXMgY29kZSkuCi0KLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLSAgICBVbmljb2RlU3RyaW5nIGxvbmdQYXR0ZXJuKCJ6enp6IiwgNCwgVVNfSU5WKTsKLSAgICBTaW1wbGVEYXRlRm9ybWF0IGxvbmdGb3JtYXQobG9uZ1BhdHRlcm4sIGxvY2FsZSwgc3RhdHVzKTsKLSAgICAvLyAneicgb25seSB1c2VzICJjb21tb24iIGFiYnJldmlhdGlvbnMuICdWJyBhbGxvd3MgYWxsIGtub3duIGFiYnJldmlhdGlvbnMuCi0gICAgLy8gRm9yIGV4YW1wbGUsICJQU1QiIGlzIGluIGNvbW1vbiB1c2UgaW4gZW5fVVMsIGJ1dCAiQ0VUIiBpc24ndC4KLSAgICBVbmljb2RlU3RyaW5nIGNvbW1vblNob3J0UGF0dGVybigieiIsIDEsIFVTX0lOVik7Ci0gICAgU2ltcGxlRGF0ZUZvcm1hdCBzaG9ydEZvcm1hdChjb21tb25TaG9ydFBhdHRlcm4sIGxvY2FsZSwgc3RhdHVzKTsKLSAgICBVbmljb2RlU3RyaW5nIGFsbFNob3J0UGF0dGVybigiViIsIDEsIFVTX0lOVik7Ci0gICAgU2ltcGxlRGF0ZUZvcm1hdCBhbGxTaG9ydEZvcm1hdChhbGxTaG9ydFBhdHRlcm4sIGxvY2FsZSwgc3RhdHVzKTsKLQotICAgIFVuaWNvZGVTdHJpbmcgdXRjKCJVVEMiLCAzLCBVU19JTlYpOwotCi0gICAgLy8gVE9ETzogdXNlIG9mIGZpeGVkIGRhdGVzIHByZXZlbnRzIHVzIGZyb20gdXNpbmcgdGhlIGNvcnJlY3QgaGlzdG9yaWNhbCBuYW1lIHdoZW4gZm9ybWF0dGluZyBkYXRlcy4KLSAgICAvLyBUT0RPOiB1c2Ugb2YgZGF0ZXMgbm90IGluIHRoZSBjdXJyZW50IHllYXIgY291bGQgY2F1c2UgdXMgdG8gb3V0cHV0IG9ic29sZXRlZCBuYW1lcy4KLSAgICAvLyAxNXRoIEphbnVhcnkgMjAwOAotICAgIFVEYXRlIGRhdGUxID0gMTIwMzEwNTYwMDAwMC4wOwotICAgIC8vIDE1dGggSnVseSAyMDA4Ci0gICAgVURhdGUgZGF0ZTIgPSAxMjE4ODI2ODAwMDAwLjA7Ci0KLSAgICAvLyBJbiB0aGUgZmlyc3QgcGFzcywgd2UgZ2V0IHRoZSBsb25nIG5hbWVzIGZvciB0aGUgdGltZSB6b25lLgotICAgIC8vIFdlIGFsc28gZ2V0IGFueSBjb21tb25seS11c2VkIGFiYnJldmlhdGlvbnMuCi0gICAgc3RkOjp2ZWN0b3I8VGltZVpvbmVOYW1lcz4gdGFibGU7Ci0gICAgdHlwZWRlZiBzdGQ6Om1hcDxVbmljb2RlU3RyaW5nLCBVbmljb2RlU3RyaW5nKj4gQWJicmV2aWF0aW9uTWFwOwotICAgIEFiYnJldmlhdGlvbk1hcCB1c2VkQWJicmV2aWF0aW9uczsKLSAgICBzaXplX3QgaWRDb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgodGltZVpvbmVJZHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaWRDb3VudDsgKytpKSB7Ci0gICAgICAgIFNjb3BlZExvY2FsUmVmPGpzdHJpbmc+IGphdmFab25lSWQoZW52LAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8anN0cmluZz4oZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQodGltZVpvbmVJZHMsIGkpKSk7Ci0gICAgICAgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIHpvbmVJZChlbnYsIGphdmFab25lSWQuZ2V0KCkpOwotICAgICAgICBVbmljb2RlU3RyaW5nIGlkKHpvbmVJZC51bmljb2RlU3RyaW5nKCkpOwotCi0gICAgICAgIFRpbWVab25lTmFtZXMgcm93OwotICAgICAgICBpZiAoaXNVdGMoaWQpKSB7Ci0gICAgICAgICAgICAvLyBJQ1UgZG9lc24ndCBoYXZlIG5hbWVzIGZvciB0aGUgVVRDIHpvbmVzOyBpdCBqdXN0IHNheXMgIkdNVCswMDowMCIgZm9yIGJvdGgKLSAgICAgICAgICAgIC8vIGxvbmcgYW5kIHNob3J0IG5hbWVzLiBXZSBkb24ndCB3YW50IHRoaXMuIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB1c2UgIlVUQyIKLSAgICAgICAgICAgIC8vIGZvciBldmVyeXRoaW5nIChzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBzYXkgIlVuaXZlcnNhbCBDb29yZGluYXRlZCBUaW1lIikuCi0gICAgICAgICAgICByb3cudHogPSBOVUxMOwotICAgICAgICAgICAgcm93LmxvbmdTdGQgPSByb3cuc2hvcnRTdGQgPSByb3cubG9uZ0RzdCA9IHJvdy5zaG9ydERzdCA9IHV0YzsKLSAgICAgICAgICAgIHRhYmxlLnB1c2hfYmFjayhyb3cpOwotICAgICAgICAgICAgdXNlZEFiYnJldmlhdGlvbnNbdXRjXSA9ICZ1dGM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJvdy50eiA9IFRpbWVab25lOjpjcmVhdGVUaW1lWm9uZShpZCk7Ci0gICAgICAgIGxvbmdGb3JtYXQuc2V0VGltZVpvbmUoKnJvdy50eik7Ci0gICAgICAgIHNob3J0Rm9ybWF0LnNldFRpbWVab25lKCpyb3cudHopOwotCi0gICAgICAgIGludDMyX3QgZGF5bGlnaHRPZmZzZXQ7Ci0gICAgICAgIGludDMyX3QgcmF3T2Zmc2V0OwotICAgICAgICByb3cudHotPmdldE9mZnNldChkYXRlMSwgZmFsc2UsIHJhd09mZnNldCwgZGF5bGlnaHRPZmZzZXQsIHN0YXR1cyk7Ci0gICAgICAgIGlmIChkYXlsaWdodE9mZnNldCAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBUaGUgVGltZVpvbmUgaXMgcmVwb3J0aW5nIHRoYXQgd2UgYXJlIGluIGRheWxpZ2h0IHRpbWUgZm9yIHRoZSB3aW50ZXIgZGF0ZS4KLSAgICAgICAgICAgIC8vIFRoZSBkYXRlcyBhcmUgZm9yIHRoZSB3cm9uZyBoZW1pc3BoZXJlLCBzbyBzd2FwIHRoZW0uCi0gICAgICAgICAgICByb3cuc3RhbmRhcmREYXRlID0gZGF0ZTI7Ci0gICAgICAgICAgICByb3cuZGF5bGlnaHRTYXZpbmdEYXRlID0gZGF0ZTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByb3cuc3RhbmRhcmREYXRlID0gZGF0ZTE7Ci0gICAgICAgICAgICByb3cuZGF5bGlnaHRTYXZpbmdEYXRlID0gZGF0ZTI7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nRm9ybWF0LmZvcm1hdChyb3cuc3RhbmRhcmREYXRlLCByb3cubG9uZ1N0ZCk7Ci0gICAgICAgIHNob3J0Rm9ybWF0LmZvcm1hdChyb3cuc3RhbmRhcmREYXRlLCByb3cuc2hvcnRTdGQpOwotICAgICAgICBpZiAocm93LnR6LT51c2VEYXlsaWdodFRpbWUoKSkgewotICAgICAgICAgICAgbG9uZ0Zvcm1hdC5mb3JtYXQocm93LmRheWxpZ2h0U2F2aW5nRGF0ZSwgcm93LmxvbmdEc3QpOwotICAgICAgICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KHJvdy5kYXlsaWdodFNhdmluZ0RhdGUsIHJvdy5zaG9ydERzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByb3cubG9uZ0RzdCA9IHJvdy5sb25nU3RkOwotICAgICAgICAgICAgcm93LnNob3J0RHN0ID0gcm93LnNob3J0U3RkOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFibGUucHVzaF9iYWNrKHJvdyk7Ci0gICAgICAgIHVzZWRBYmJyZXZpYXRpb25zW3Jvdy5zaG9ydFN0ZF0gPSAmcm93LmxvbmdTdGQ7Ci0gICAgICAgIHVzZWRBYmJyZXZpYXRpb25zW3Jvdy5zaG9ydERzdF0gPSAmcm93LmxvbmdEc3Q7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBjcmVhdGUgdGhlIEphdmEgU3RyaW5nW11bXS4KLSAgICAvLyBXZSBhbHNvIGxvb2sgZm9yIGFueSB1bmNvbW1vbiBhYmJyZXZpYXRpb25zIHRoYXQgZG9uJ3QgY29uZmxpY3Qgd2l0aCBvbmVzIHdlJ3ZlIGFscmVhZHkgc2Vlbi4KLSAgICBqb2JqZWN0QXJyYXkgcmVzdWx0ID0gZW52LT5OZXdPYmplY3RBcnJheShpZENvdW50LCBKbmlDb25zdGFudHM6OnN0cmluZ0FycmF5Q2xhc3MsIE5VTEwpOwotICAgIFVuaWNvZGVTdHJpbmcgZ210KCJHTVQiLCAzLCBVU19JTlYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFibGUuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVGltZVpvbmVOYW1lcyYgcm93KHRhYmxlW2ldKTsKLSAgICAgICAgLy8gRGlkIHdlIGdldCBhIEdNVCBvZmZzZXQgaW5zdGVhZCBvZiBhbiBhYmJyZXZpYXRpb24/Ci0gICAgICAgIGlmIChyb3cuc2hvcnRTdGQubGVuZ3RoKCkgPiAzICYmIHJvdy5zaG9ydFN0ZC5zdGFydHNXaXRoKGdtdCkpIHsKLSAgICAgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gZG8gYmV0dGVyLi4uCi0gICAgICAgICAgICBVbmljb2RlU3RyaW5nIHVuY29tbW9uU3RkLCB1bmNvbW1vbkRzdDsKLSAgICAgICAgICAgIGFsbFNob3J0Rm9ybWF0LnNldFRpbWVab25lKCpyb3cudHopOwotICAgICAgICAgICAgYWxsU2hvcnRGb3JtYXQuZm9ybWF0KHJvdy5zdGFuZGFyZERhdGUsIHVuY29tbW9uU3RkKTsKLSAgICAgICAgICAgIGlmIChyb3cudHotPnVzZURheWxpZ2h0VGltZSgpKSB7Ci0gICAgICAgICAgICAgICAgYWxsU2hvcnRGb3JtYXQuZm9ybWF0KHJvdy5kYXlsaWdodFNhdmluZ0RhdGUsIHVuY29tbW9uRHN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5jb21tb25Ec3QgPSB1bmNvbW1vblN0ZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhpcyBhYmJyZXZpYXRpb24gaXNuJ3QgYWxyZWFkeSBpbiB1c2UsIHdlIGNhbiB1c2UgaXQuCi0gICAgICAgICAgICBBYmJyZXZpYXRpb25NYXA6Oml0ZXJhdG9yIGl0ID0gdXNlZEFiYnJldmlhdGlvbnMuZmluZCh1bmNvbW1vblN0ZCk7Ci0gICAgICAgICAgICBpZiAoaXQgPT0gdXNlZEFiYnJldmlhdGlvbnMuZW5kKCkgfHwgKihpdC0+c2Vjb25kKSA9PSByb3cubG9uZ1N0ZCkgewotICAgICAgICAgICAgICAgIHJvdy5zaG9ydFN0ZCA9IHVuY29tbW9uU3RkOwotICAgICAgICAgICAgICAgIHVzZWRBYmJyZXZpYXRpb25zW3Jvdy5zaG9ydFN0ZF0gPSAmcm93LmxvbmdTdGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdCA9IHVzZWRBYmJyZXZpYXRpb25zLmZpbmQodW5jb21tb25Ec3QpOwotICAgICAgICAgICAgaWYgKGl0ID09IHVzZWRBYmJyZXZpYXRpb25zLmVuZCgpIHx8ICooaXQtPnNlY29uZCkgPT0gcm93LmxvbmdEc3QpIHsKLSAgICAgICAgICAgICAgICByb3cuc2hvcnREc3QgPSB1bmNvbW1vbkRzdDsKLSAgICAgICAgICAgICAgICB1c2VkQWJicmV2aWF0aW9uc1tyb3cuc2hvcnREc3RdID0gJnJvdy5sb25nRHN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEZpbGwgaW4gd2hhdGV2ZXIgd2UgZ290LgotICAgICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0QXJyYXk+IGphdmFSb3coZW52LCBlbnYtPk5ld09iamVjdEFycmF5KDUsIEpuaUNvbnN0YW50czo6c3RyaW5nQ2xhc3MsIE5VTEwpKTsKLSAgICAgICAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gaWQoZW52LCByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KHRpbWVab25lSWRzLCBpKSkpOwotICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXZhUm93LmdldCgpLCAwLCBpZC5nZXQoKSk7Ci0gICAgICAgIHNldFN0cmluZ0FycmF5RWxlbWVudChlbnYsIGphdmFSb3cuZ2V0KCksIDEsIHJvdy5sb25nU3RkKTsKLSAgICAgICAgc2V0U3RyaW5nQXJyYXlFbGVtZW50KGVudiwgamF2YVJvdy5nZXQoKSwgMiwgcm93LnNob3J0U3RkKTsKLSAgICAgICAgc2V0U3RyaW5nQXJyYXlFbGVtZW50KGVudiwgamF2YVJvdy5nZXQoKSwgMywgcm93LmxvbmdEc3QpOwotICAgICAgICBzZXRTdHJpbmdBcnJheUVsZW1lbnQoZW52LCBqYXZhUm93LmdldCgpLCA0LCByb3cuc2hvcnREc3QpOwotICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXN1bHQsIGksIGphdmFSb3cuZ2V0KCkpOwotICAgICAgICBkZWxldGUgcm93LnR6OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICBOQVRJVkVfTUVUSE9EKFRpbWVab25lcywgZm9yQ291bnRyeUNvZGUsICIoTGphdmEvbGFuZy9TdHJpbmc7KVtMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKFRpbWVab25lcywgZ2V0Wm9uZVN0cmluZ3NJbXBsLCAiKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspW1tMamF2YS9sYW5nL1N0cmluZzsiKSwKLX07Ci12b2lkIHJlZ2lzdGVyX2xpYmNvcmVfaWN1X1RpbWVab25lcyhKTklFbnYqIGVudikgewotICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2ljdS9UaW1lWm9uZXMiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKLX0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X1RyYW5zbGl0ZXJhdG9yLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaWN1X1RyYW5zbGl0ZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJlNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pY3VfVHJhbnNsaXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlRyYW5zbGl0ZXJhdG9yIgorCisjaW5jbHVkZSAiSWN1VXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkpuaUV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIlNjb3BlZEphdmFVbmljb2RlU3RyaW5nLmgiCisjaW5jbHVkZSAiU2NvcGVkU3RyaW5nQ2hhcnMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3RyYW5zbGl0LmgiCisKK3N0YXRpYyBUcmFuc2xpdGVyYXRvciogZnJvbVBlZXIoamxvbmcgcGVlcikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUcmFuc2xpdGVyYXRvcio+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4ocGVlcikpOworfQorCitzdGF0aWMgamxvbmcgVHJhbnNsaXRlcmF0b3JfY3JlYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgamF2YUlkKSB7CisgIFNjb3BlZEphdmFVbmljb2RlU3RyaW5nIGlkKGVudiwgamF2YUlkKTsKKyAgaWYgKCFpZC52YWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIFRyYW5zbGl0ZXJhdG9yKiB0ID0gVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZUluc3RhbmNlKGlkLnVuaWNvZGVTdHJpbmcoKSwgVVRSQU5TX0ZPUldBUkQsIHN0YXR1cyk7CisgIGlmIChtYXliZVRocm93SWN1RXhjZXB0aW9uKGVudiwgIlRyYW5zbGl0ZXJhdG9yOjpjcmVhdGVJbnN0YW5jZSIsIHN0YXR1cykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHQpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2xpdGVyYXRvcl9kZXN0cm95KEpOSUVudiosIGpjbGFzcywgamxvbmcgcGVlcikgeworICBkZWxldGUgZnJvbVBlZXIocGVlcik7Cit9CisKK3N0YXRpYyBqb2JqZWN0QXJyYXkgVHJhbnNsaXRlcmF0b3JfZ2V0QXZhaWxhYmxlSURzKEpOSUVudiogZW52LCBqY2xhc3MpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIHJldHVybiBmcm9tU3RyaW5nRW51bWVyYXRpb24oZW52LCBUcmFuc2xpdGVyYXRvcjo6Z2V0QXZhaWxhYmxlSURzKHN0YXR1cykpOworfQorCitzdGF0aWMganN0cmluZyBUcmFuc2xpdGVyYXRvcl90cmFuc2xpdGVyYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBlZXIsIGpzdHJpbmcgamF2YVN0cmluZykgeworICBUcmFuc2xpdGVyYXRvciogdCA9IGZyb21QZWVyKHBlZXIpOworICBTY29wZWRKYXZhVW5pY29kZVN0cmluZyBzdHJpbmcoZW52LCBqYXZhU3RyaW5nKTsKKyAgaWYgKCFzdHJpbmcudmFsaWQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgVW5pY29kZVN0cmluZyYgcyhzdHJpbmcudW5pY29kZVN0cmluZygpKTsKKyAgdC0+dHJhbnNsaXRlcmF0ZShzKTsKKyAgcmV0dXJuIGVudi0+TmV3U3RyaW5nKHMuZ2V0QnVmZmVyKCksIHMubGVuZ3RoKCkpOworfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgIE5BVElWRV9NRVRIT0QoVHJhbnNsaXRlcmF0b3IsIGNyZWF0ZSwgIihMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICBOQVRJVkVfTUVUSE9EKFRyYW5zbGl0ZXJhdG9yLCBkZXN0cm95LCAiKEopViIpLAorICBOQVRJVkVfTUVUSE9EKFRyYW5zbGl0ZXJhdG9yLCBnZXRBdmFpbGFibGVJRHMsICIoKVtMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgTkFUSVZFX01FVEhPRChUcmFuc2xpdGVyYXRvciwgdHJhbnNsaXRlcmF0ZSwgIihKTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorfTsKK3ZvaWQgcmVnaXN0ZXJfbGliY29yZV9pY3VfVHJhbnNsaXRlcmF0b3IoSk5JRW52KiBlbnYpIHsKKyAgam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImxpYmNvcmUvaWN1L1RyYW5zbGl0ZXJhdG9yIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX0FzeW5jaHJvbm91c0Nsb3NlTW9uaXRvci5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX0FzeW5jaHJvbm91c0Nsb3NlTW9uaXRvci5jcHAKaW5kZXggMWI4ODhiZS4uNGY1MGNlNSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19Bc3luY2hyb25vdXNDbG9zZU1vbml0b3IuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaW9fQXN5bmNocm9ub3VzQ2xvc2VNb25pdG9yLmNwcApAQCAtMjksNyArMjksNiBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewogICAgIE5BVElWRV9NRVRIT0QoQXN5bmNocm9ub3VzQ2xvc2VNb25pdG9yLCBzaWduYWxCbG9ja2VkVGhyZWFkcywgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIpLAogfTsKLQogdm9pZCByZWdpc3Rlcl9saWJjb3JlX2lvX0FzeW5jaHJvbm91c0Nsb3NlTW9uaXRvcihKTklFbnYqIGVudikgewogICAgIEFzeW5jaHJvbm91c1NvY2tldENsb3NlTW9uaXRvcjo6aW5pdCgpOwogICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJsaWJjb3JlL2lvL0FzeW5jaHJvbm91c0Nsb3NlTW9uaXRvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19NZW1vcnkuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19NZW1vcnkuY3BwCmluZGV4IGZlNWYxMmQuLmUxY2E1NzEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaW9fTWVtb3J5LmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX01lbW9yeS5jcHAKQEAgLTE4LDExICsxOCwxMSBAQAogCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgIkpuaUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIlBvcnRhYmlsaXR5LmgiCiAjaW5jbHVkZSAiU2NvcGVkQnl0ZXMuaCIKICNpbmNsdWRlICJTY29wZWRQcmltaXRpdmVBcnJheS5oIgogI2luY2x1ZGUgIlVuaXF1ZVB0ci5oIgogCi0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19Pc0NvbnN0YW50cy5jcHAgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX09zQ29uc3RhbnRzLmNwcAppbmRleCA0YTcxOWFmLi43MjQ3YTM4IDEwMDY0NAotLS0gYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX09zQ29uc3RhbnRzLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9saWJjb3JlX2lvX09zQ29uc3RhbnRzLmNwcApAQCAtMjEsNyArMjEsNiBAQAogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CkBAIC0zNSw2ICszNCw4IEBACiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPG5ldC9pZi5oPiAvLyBBZnRlciA8c3lzL3NvY2tldC5oPiB0byB3b3JrIGFyb3VuZCBhIE1hYyBoZWFkZXIgZmlsZSBidWcuCisKIHN0YXRpYyB2b2lkIGluaXRDb25zdGFudChKTklFbnYqIGVudiwgamNsYXNzIGMsIGNvbnN0IGNoYXIqIGZpZWxkTmFtZSwgaW50IHZhbHVlKSB7CiAgICAgamZpZWxkSUQgZmllbGQgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQoYywgZmllbGROYW1lLCAiSSIpOwogICAgIGVudi0+U2V0U3RhdGljSW50RmllbGQoYywgZmllbGQsIHZhbHVlKTsKQEAgLTQ5LDcgKzUwLDkgQEAKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiQUlfQUxMIiwgQUlfQUxMKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiQUlfQ0FOT05OQU1FIiwgQUlfQ0FOT05OQU1FKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiQUlfTlVNRVJJQ0hPU1QiLCBBSV9OVU1FUklDSE9TVCk7CisjaWYgZGVmaW5lZChBSV9OVU1FUklDU0VSVikKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiQUlfTlVNRVJJQ1NFUlYiLCBBSV9OVU1FUklDU0VSVik7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiQUlfUEFTU0lWRSIsIEFJX1BBU1NJVkUpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJBSV9WNE1BUFBFRCIsIEFJX1Y0TUFQUEVEKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRTJCSUciLCBFMkJJRyk7CkBAIC02NSw3ICs2OCw5IEBACiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkVBSV9NRU1PUlkiLCBFQUlfTUVNT1JZKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRUFJX05PREFUQSIsIEVBSV9OT0RBVEEpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJFQUlfTk9OQU1FIiwgRUFJX05PTkFNRSk7CisjaWYgZGVmaW5lZChFQUlfT1ZFUkZMT1cpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkVBSV9PVkVSRkxPVyIsIEVBSV9PVkVSRkxPVyk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRUFJX1NFUlZJQ0UiLCBFQUlfU0VSVklDRSk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkVBSV9TT0NLVFlQRSIsIEVBSV9TT0NLVFlQRSk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkVBSV9TWVNURU0iLCBFQUlfU1lTVEVNKTsKQEAgLTE1MCwzNCArMTU1LDUwIEBACiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfR0VURkQiLCBGX0dFVEZEKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRl9HRVRGTCIsIEZfR0VURkwpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJGX0dFVExLIiwgRl9HRVRMSyk7CisjaWYgZGVmaW5lZChGX0dFVExLNjQpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfR0VUTEs2NCIsIEZfR0VUTEs2NCk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRl9HRVRPV04iLCBGX0dFVE9XTik7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfT0siLCBGX09LKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRl9SRExDSyIsIEZfUkRMQ0spOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJGX1NFVEZEIiwgRl9TRVRGRCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfU0VURkwiLCBGX1NFVEZMKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRl9TRVRMSyIsIEZfU0VUTEspOworI2lmIGRlZmluZWQoRl9TRVRMSzY0KQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJGX1NFVExLNjQiLCBGX1NFVExLNjQpOworI2VuZGlmCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfU0VUTEtXIiwgRl9TRVRMS1cpOworI2lmIGRlZmluZWQoRl9TRVRMS1c2NCkKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiRl9TRVRMS1c2NCIsIEZfU0VUTEtXNjQpOworI2VuZGlmCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfU0VUT1dOIiwgRl9TRVRPV04pOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJGX1VOTENLIiwgRl9VTkxDSyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIkZfV1JMQ0siLCBGX1dSTENLKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSUZGX0FMTE1VTFRJIiwgSUZGX0FMTE1VTFRJKTsKKyNpZiBkZWZpbmVkKElGRl9BVVRPTUVESUEpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9BVVRPTUVESUEiLCBJRkZfQVVUT01FRElBKTsKKyNlbmRpZgogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJRkZfQlJPQURDQVNUIiwgSUZGX0JST0FEQ0FTVCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9ERUJVRyIsIElGRl9ERUJVRyk7CisjaWYgZGVmaW5lZChJRkZfRFlOQU1JQykKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSUZGX0RZTkFNSUMiLCBJRkZfRFlOQU1JQyk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSUZGX0xPT1BCQUNLIiwgSUZGX0xPT1BCQUNLKTsKKyNpZiBkZWZpbmVkKElGRl9NQVNURVIpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9NQVNURVIiLCBJRkZfTUFTVEVSKTsKKyNlbmRpZgogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJRkZfTVVMVElDQVNUIiwgSUZGX01VTFRJQ0FTVCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9OT0FSUCIsIElGRl9OT0FSUCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9OT1RSQUlMRVJTIiwgSUZGX05PVFJBSUxFUlMpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJRkZfUE9JTlRPUE9JTlQiLCBJRkZfUE9JTlRPUE9JTlQpOworI2lmIGRlZmluZWQoSUZGX1BPUlRTRUwpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9QT1JUU0VMIiwgSUZGX1BPUlRTRUwpOworI2VuZGlmCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklGRl9QUk9NSVNDIiwgSUZGX1BST01JU0MpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJRkZfUlVOTklORyIsIElGRl9SVU5OSU5HKTsKKyNpZiBkZWZpbmVkKElGRl9TTEFWRSkKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSUZGX1NMQVZFIiwgSUZGX1NMQVZFKTsKKyNlbmRpZgogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJRkZfVVAiLCBJRkZfVVApOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFBST1RPX0lDTVAiLCBJUFBST1RPX0lDTVApOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFBST1RPX0lQIiwgSVBQUk9UT19JUCk7CkBAIC0xODksMTMgKzIxMCwyNyBAQAogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X01VTFRJQ0FTVF9IT1BTIiwgSVBWNl9NVUxUSUNBU1RfSE9QUyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklQVjZfTVVMVElDQVNUX0lGIiwgSVBWNl9NVUxUSUNBU1RfSUYpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X01VTFRJQ0FTVF9MT09QIiwgSVBWNl9NVUxUSUNBU1RfTE9PUCk7CisjaWYgZGVmaW5lZChJUFY2X1JFQ1ZEU1RPUFRTKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X1JFQ1ZEU1RPUFRTIiwgSVBWNl9SRUNWRFNUT1BUUyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKElQVjZfUkVDVkhPUExJTUlUKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X1JFQ1ZIT1BMSU1JVCIsIElQVjZfUkVDVkhPUExJTUlUKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSVBWNl9SRUNWSE9QT1BUUykKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSVBWNl9SRUNWSE9QT1BUUyIsIElQVjZfUkVDVkhPUE9QVFMpOworI2VuZGlmCisjaWYgZGVmaW5lZChJUFY2X1JFQ1ZQS1RJTkZPKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X1JFQ1ZQS1RJTkZPIiwgSVBWNl9SRUNWUEtUSU5GTyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKElQVjZfUkVDVlJUSERSKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X1JFQ1ZSVEhEUiIsIElQVjZfUkVDVlJUSERSKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSVBWNl9SRUNWVENMQVNTKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUFY2X1JFQ1ZUQ0xBU1MiLCBJUFY2X1JFQ1ZUQ0xBU1MpOworI2VuZGlmCisjaWYgZGVmaW5lZChJUFY2X1RDTEFTUykKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSVBWNl9UQ0xBU1MiLCBJUFY2X1RDTEFTUyk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiSVBWNl9VTklDQVNUX0hPUFMiLCBJUFY2X1VOSUNBU1RfSE9QUyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIklQVjZfVjZPTkxZIiwgSVBWNl9WNk9OTFkpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJJUF9NVUxUSUNBU1RfSUYiLCBJUF9NVUxUSUNBU1RfSUYpOwpAQCAtMjA2LDggKzI0MSwxMiBAQAogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJNQVBfRklYRUQiLCBNQVBfRklYRUQpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJNQVBfUFJJVkFURSIsIE1BUF9QUklWQVRFKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiTUFQX1NIQVJFRCIsIE1BUF9TSEFSRUQpOworI2lmIGRlZmluZWQoTUNBU1RfSk9JTl9HUk9VUCkKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiTUNBU1RfSk9JTl9HUk9VUCIsIE1DQVNUX0pPSU5fR1JPVVApOworI2VuZGlmCisjaWYgZGVmaW5lZChNQ0FTVF9MRUFWRV9HUk9VUCkKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiTUNBU1RfTEVBVkVfR1JPVVAiLCBNQ0FTVF9MRUFWRV9HUk9VUCk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiTUNMX0NVUlJFTlQiLCBNQ0xfQ1VSUkVOVCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIk1DTF9GVVRVUkUiLCBNQ0xfRlVUVVJFKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiTVNHX0NUUlVOQyIsIE1TR19DVFJVTkMpOwpAQCAtMjcxLDEwICszMTAsMTYgQEAKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU0lHS0lMTCIsIFNJR0tJTEwpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJTSUdQSVBFIiwgU0lHUElQRSk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIlNJR1BST0YiLCBTSUdQUk9GKTsKKyNpZiBkZWZpbmVkKFNJR1BXUikKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU0lHUFdSIiwgU0lHUFdSKTsKKyNlbmRpZgogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJTSUdRVUlUIiwgU0lHUVVJVCk7CisjaWYgZGVmaW5lZChTSUdSVE1BWCkKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU0lHUlRNQVgiLCBTSUdSVE1BWCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR1JUTUlOKQogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJTSUdSVE1JTiIsIFNJR1JUTUlOKTsKKyNlbmRpZgogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJTSUdTRUdWIiwgU0lHU0VHVik7CiAjaWYgZGVmaW5lZChTSUdTVEtGTFQpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIlNJR1NUS0ZMVCIsIFNJR1NUS0ZMVCk7CkBAIC0zMDIsNyArMzQ3LDkgQEAKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU09DS19TRVFQQUNLRVQiLCBTT0NLX1NFUVBBQ0tFVCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIlNPQ0tfU1RSRUFNIiwgU09DS19TVFJFQU0pOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJTT0xfU09DS0VUIiwgU09MX1NPQ0tFVCk7CisjaWYgZGVmaW5lZChTT19CSU5EVE9ERVZJQ0UpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIlNPX0JJTkRUT0RFVklDRSIsIFNPX0JJTkRUT0RFVklDRSk7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU09fQlJPQURDQVNUIiwgU09fQlJPQURDQVNUKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiU09fREVCVUciLCBTT19ERUJVRyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIlNPX0RPTlRST1VURSIsIFNPX0RPTlRST1VURSk7CkBAIC0zNTYsNyArNDAzLDkgQEAKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDXzJfQ0hBUl9URVJNIiwgX1NDXzJfQ0hBUl9URVJNKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDXzJfQ19CSU5EIiwgX1NDXzJfQ19CSU5EKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDXzJfQ19ERVYiLCBfU0NfMl9DX0RFVik7CisjaWYgZGVmaW5lZChfU0NfMl9DX1ZFUlNJT04pCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ18yX0NfVkVSU0lPTiIsIF9TQ18yX0NfVkVSU0lPTik7CisjZW5kaWYKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDXzJfRk9SVF9ERVYiLCBfU0NfMl9GT1JUX0RFVik7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ18yX0ZPUlRfUlVOIiwgX1NDXzJfRk9SVF9SVU4pOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJfU0NfMl9MT0NBTEVERUYiLCBfU0NfMl9MT0NBTEVERUYpOwpAQCAtMzY5LDcgKzQxOCw5IEBACiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19BUkdfTUFYIiwgX1NDX0FSR19NQVgpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJfU0NfQVNZTkNIUk9OT1VTX0lPIiwgX1NDX0FTWU5DSFJPTk9VU19JTyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19BVEVYSVRfTUFYIiwgX1NDX0FURVhJVF9NQVgpOworI2lmIGRlZmluZWQoX1NDX0FWUEhZU19QQUdFUykKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDX0FWUEhZU19QQUdFUyIsIF9TQ19BVlBIWVNfUEFHRVMpOworI2VuZGlmCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19CQ19CQVNFX01BWCIsIF9TQ19CQ19CQVNFX01BWCk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19CQ19ESU1fTUFYIiwgX1NDX0JDX0RJTV9NQVgpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJfU0NfQkNfU0NBTEVfTUFYIiwgX1NDX0JDX1NDQUxFX01BWCk7CkBAIC00MDAsNyArNDUxLDkgQEAKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDX1BBR0VTSVpFIiwgX1NDX1BBR0VTSVpFKTsKICAgICBpbml0Q29uc3RhbnQoZW52LCBjLCAiX1NDX1BBR0VfU0laRSIsIF9TQ19QQUdFX1NJWkUpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJfU0NfUEFTU19NQVgiLCBfU0NfUEFTU19NQVgpOworI2lmIGRlZmluZWQoX1NDX1BIWVNfUEFHRVMpCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19QSFlTX1BBR0VTIiwgX1NDX1BIWVNfUEFHRVMpOworI2VuZGlmCiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19QUklPUklUSVpFRF9JTyIsIF9TQ19QUklPUklUSVpFRF9JTyk7CiAgICAgaW5pdENvbnN0YW50KGVudiwgYywgIl9TQ19QUklPUklUWV9TQ0hFRFVMSU5HIiwgX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcpOwogICAgIGluaXRDb25zdGFudChlbnYsIGMsICJfU0NfUkVBTFRJTUVfU0lHTkFMUyIsIF9TQ19SRUFMVElNRV9TSUdOQUxTKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL2xpYmNvcmVfaW9fUG9zaXguY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19Qb3NpeC5jcHAKaW5kZXggYWNiM2RjMi4uMzM2Yzk4MiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19Qb3NpeC5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvbGliY29yZV9pb19Qb3NpeC5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJKbmlDb25zdGFudHMuaCIKICNpbmNsdWRlICJKbmlFeGNlcHRpb24uaCIKICNpbmNsdWRlICJOZXR3b3JrVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiUG9ydGFiaWxpdHkuaCIKICNpbmNsdWRlICJTY29wZWRCeXRlcy5oIgogI2luY2x1ZGUgIlNjb3BlZExvY2FsUmVmLmgiCiAjaW5jbHVkZSAiU2NvcGVkUHJpbWl0aXZlQXJyYXkuaCIKQEAgLTQyLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlIDxzeXMvdmZzLmg+IC8vIEJpb25pYyBkb2Vzbid0IGhhdmUgPHN5cy9zdGF0dmZzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0xMjksNyArMTI4LDEyIEBACiB9CiAKIHN0YXRpYyB2b2lkIHRocm93R2FpRXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBmdW5jdGlvbk5hbWUsIGludCBlcnJvcikgewotICAgIGlmIChlcnJubyAhPSAwKSB7CisgIC8vIENhY2hlIHRoZSBtZXRob2RzIGlkcyBiZWZvcmUgd2UgdGhyb3csIHNvIHdlIGRvbid0IGNhbGwgR2V0TWV0aG9kSUQgd2l0aCBhIHBlbmRpbmcgZXhjZXB0aW9uLgorICBzdGF0aWMgam1ldGhvZElEIGN0b3IzID0gZW52LT5HZXRNZXRob2RJRChKbmlDb25zdGFudHM6OmdhaUV4Y2VwdGlvbkNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJTGphdmEvbGFuZy9UaHJvd2FibGU7KVYiKTsKKyAgc3RhdGljIGptZXRob2RJRCBjdG9yMiA9IGVudi0+R2V0TWV0aG9kSUQoSm5pQ29uc3RhbnRzOjpnYWlFeGNlcHRpb25DbGFzcywgIjxpbml0PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIik7CisgIGlmIChlcnJubyAhPSAwKSB7CiAgICAgICAgIC8vIEVBSV9TWVNURU0gc2hvdWxkIG1lYW4gImxvb2sgYXQgZXJybm8gaW5zdGVhZCIsIGJ1dCBib3RoIGdsaWJjIGFuZCBiaW9uaWMgc2VlbSB0bwogICAgICAgICAvLyBtZXNzIHRoaXMgdXAuIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBkb24ndCBoYXZlIElOVEVSTkVUIHBlcm1pc3Npb24sIGVycm5vIHdpbGwgYmUgRUFDQ0VTCiAgICAgICAgIC8vIGJ1dCB5b3UnbGwgZ2V0IEVBSV9OT05BTUUgb3IgRUFJX05PREFUQS4gU28gd2Ugd2FudCBvdXIgR2FpRXhjZXB0aW9uIHRvIGhhdmUgYQpAQCAtMTM4LDEwICsxNDIsNiBAQAogICAgICAgICB0aHJvd0Vycm5vRXhjZXB0aW9uKGVudiwgZnVuY3Rpb25OYW1lKTsKICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZhbGwgdGhyb3VnaCB0byB0aHJvdyBhbm90aGVyIGV4Y2VwdGlvbi4uLgogICAgIH0KLSAgICBzdGF0aWMgam1ldGhvZElEIGN0b3IzID0gZW52LT5HZXRNZXRob2RJRChKbmlDb25zdGFudHM6OmdhaUV4Y2VwdGlvbkNsYXNzLAotICAgICAgICAgICAgIjxpbml0PiIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvVGhyb3dhYmxlOylWIik7Ci0gICAgc3RhdGljIGptZXRob2RJRCBjdG9yMiA9IGVudi0+R2V0TWV0aG9kSUQoSm5pQ29uc3RhbnRzOjpnYWlFeGNlcHRpb25DbGFzcywKLSAgICAgICAgICAgICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIHRocm93RXhjZXB0aW9uKGVudiwgSm5pQ29uc3RhbnRzOjpnYWlFeGNlcHRpb25DbGFzcywgY3RvcjMsIGN0b3IyLCBmdW5jdGlvbk5hbWUsIGVycm9yKTsKIH0KIApAQCAtMjQ3LDE2ICsyNDcsMjQgQEAKIH0KIAogc3RhdGljIGpvYmplY3QgbWFrZVN0cnVjdFN0YXRGcyhKTklFbnYqIGVudiwgY29uc3Qgc3RydWN0IHN0YXRmcyYgc2IpIHsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAvLyBNYWMgT1MgaGFzIG5vIGZfbmFtZWxlbiBmaWVsZCBpbiBzdHJ1Y3Qgc3RhdGZzLgorICAgIGpsb25nIG1heF9uYW1lX2xlbmd0aCA9IDI1NTsgLy8gX19EQVJXSU5fTUFYTkFNTEVOCisjZWxzZQorICAgIC8vIFVudGlsIE1hYyBPUyAxMC43LCB0aGVzZSB3ZXJlIDMyLWJpdCBmaWVsZHMuCiAgICAgU1RBVElDX0FTU0VSVChzaXplb2Yoc2IuZl9iYXZhaWwpID09IHNpemVvZihqbG9uZyksIHN0YXRmc19ub3RfNjRfYml0KTsKICAgICBTVEFUSUNfQVNTRVJUKHNpemVvZihzYi5mX2JmcmVlKSA9PSBzaXplb2YoamxvbmcpLCBzdGF0ZnNfbm90XzY0X2JpdCk7CiAgICAgU1RBVElDX0FTU0VSVChzaXplb2Yoc2IuZl9ibG9ja3MpID09IHNpemVvZihqbG9uZyksIHN0YXRmc19ub3RfNjRfYml0KTsKIAorICAgIGpsb25nIG1heF9uYW1lX2xlbmd0aCA9IHN0YXRpY19jYXN0PGpsb25nPihzYi5mX25hbWVsZW4pOworI2VuZGlmCisKICAgICBzdGF0aWMgam1ldGhvZElEIGN0b3IgPSBlbnYtPkdldE1ldGhvZElEKEpuaUNvbnN0YW50czo6c3RydWN0U3RhdEZzQ2xhc3MsICI8aW5pdD4iLAogICAgICAgICAgICAgIihKSkpKSkpKSilWIik7CiAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KEpuaUNvbnN0YW50czo6c3RydWN0U3RhdEZzQ2xhc3MsIGN0b3IsIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2JzaXplKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2Jsb2NrcyksIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2JmcmVlKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2JhdmFpbCksIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2ZpbGVzKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2ZmcmVlKSwgc3RhdGljX2Nhc3Q8amxvbmc+KHNiLmZfbmFtZWxlbiksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxqbG9uZz4oc2IuZl9mZnJlZSksIG1heF9uYW1lX2xlbmd0aCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGpsb25nPihzYi5mX2Zyc2l6ZSkpOwogfQogCkBAIC00NTgsNiArNDY2LDM0IEBACiAgICAgcmV0dXJuIHRvU3RyaW5nQXJyYXkoZW52LCBlbnZpcm9uKTsKIH0KIAorc3RhdGljIHZvaWQgUG9zaXhfZXhlY3ZlKEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGphdmFGaWxlbmFtZSwgam9iamVjdEFycmF5IGphdmFBcmd2LCBqb2JqZWN0QXJyYXkgamF2YUVudnApIHsKKyAgICBTY29wZWRVdGZDaGFycyBwYXRoKGVudiwgamF2YUZpbGVuYW1lKTsKKyAgICBpZiAocGF0aC5jX3N0cigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYXIqKiBhcmd2ID0gY29udmVydFN0cmluZ3MoZW52LCBqYXZhQXJndik7CisgICAgY2hhcioqIGVudnAgPSBjb252ZXJ0U3RyaW5ncyhlbnYsIGphdmFFbnZwKTsKKyAgICBleGVjdmUocGF0aC5jX3N0cigpLCBhcmd2LCBlbnZwKTsKKworICAgIGZyZWVTdHJpbmdzKGVudiwgamF2YUFyZ3YsIGFyZ3YpOworICAgIGZyZWVTdHJpbmdzKGVudiwgamF2YUVudnAsIGVudnApOworICAgIHRocm93RXJybm9FeGNlcHRpb24oZW52LCAiZXhlY3ZlIik7Cit9CisKK3N0YXRpYyB2b2lkIFBvc2l4X2V4ZWN2KEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGphdmFGaWxlbmFtZSwgam9iamVjdEFycmF5IGphdmFBcmd2KSB7CisgICAgU2NvcGVkVXRmQ2hhcnMgcGF0aChlbnYsIGphdmFGaWxlbmFtZSk7CisgICAgaWYgKHBhdGguY19zdHIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGFyKiogYXJndiA9IGNvbnZlcnRTdHJpbmdzKGVudiwgamF2YUFyZ3YpOworICAgIGV4ZWN2KHBhdGguY19zdHIoKSwgYXJndik7CisKKyAgICBmcmVlU3RyaW5ncyhlbnYsIGphdmFBcmd2LCBhcmd2KTsKKyAgICB0aHJvd0Vycm5vRXhjZXB0aW9uKGVudiwgImV4ZWN2Iik7Cit9CisKIHN0YXRpYyB2b2lkIFBvc2l4X2ZjaG1vZChKTklFbnYqIGVudiwgam9iamVjdCwgam9iamVjdCBqYXZhRmQsIGppbnQgbW9kZSkgewogICAgIGludCBmZCA9IGpuaUdldEZERnJvbUZpbGVEZXNjcmlwdG9yKGVudiwgamF2YUZkKTsKICAgICB0aHJvd0lmTWludXNPbmUoZW52LCAiZmNobW9kIiwgVEVNUF9GQUlMVVJFX1JFVFJZKGZjaG1vZChmZCwgbW9kZSkpKTsKQEAgLTEwNjMsNiArMTA5OSwxOCBAQAogICAgIHRocm93SWZNaW51c09uZShlbnYsICJzZXRlZ2lkIiwgVEVNUF9GQUlMVVJFX1JFVFJZKHNldGVnaWQoZWdpZCkpKTsKIH0KIAorc3RhdGljIHZvaWQgUG9zaXhfc2V0ZW52KEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGphdmFOYW1lLCBqc3RyaW5nIGphdmFWYWx1ZSwgamJvb2xlYW4gb3ZlcndyaXRlKSB7CisgICAgU2NvcGVkVXRmQ2hhcnMgbmFtZShlbnYsIGphdmFOYW1lKTsKKyAgICBpZiAobmFtZS5jX3N0cigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTY29wZWRVdGZDaGFycyB2YWx1ZShlbnYsIGphdmFWYWx1ZSk7CisgICAgaWYgKHZhbHVlLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRocm93SWZNaW51c09uZShlbnYsICJzZXRlbnYiLCBzZXRlbnYobmFtZS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpLCBvdmVyd3JpdGUpKTsKK30KKwogc3RhdGljIHZvaWQgUG9zaXhfc2V0ZXVpZChKTklFbnYqIGVudiwgam9iamVjdCwgamludCBldWlkKSB7CiAgICAgdGhyb3dJZk1pbnVzT25lKGVudiwgInNldGV1aWQiLCBURU1QX0ZBSUxVUkVfUkVUUlkoc2V0ZXVpZChldWlkKSkpOwogfQpAQCAtMTA5NSw2ICsxMTQzLDExIEBACiAgICAgdGhyb3dJZk1pbnVzT25lKGVudiwgInNldHNvY2tvcHQiLCBURU1QX0ZBSUxVUkVfUkVUUlkoc2V0c29ja29wdChmZCwgbGV2ZWwsIG9wdGlvbiwgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkpOwogfQogCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDcwCisvLyBNYWMgT1MgZGlkbid0IHN1cHBvcnQgbW9kZXJuIG11bHRpY2FzdCBBUElzIHVudGlsIDEwLjcuCitzdGF0aWMgdm9pZCBQb3NpeF9zZXRzb2Nrb3B0SXBNcmVxbihKTklFbnYqLCBqb2JqZWN0LCBqb2JqZWN0LCBqaW50LCBqaW50LCBqaW50KSB7IGFib3J0KCk7IH0KK3N0YXRpYyB2b2lkIFBvc2l4X3NldHNvY2tvcHRHcm91cFJlcShKTklFbnYqLCBqb2JqZWN0LCBqb2JqZWN0LCBqaW50LCBqaW50LCBqb2JqZWN0KSB7IGFib3J0KCk7IH0KKyNlbHNlCiBzdGF0aWMgdm9pZCBQb3NpeF9zZXRzb2Nrb3B0SXBNcmVxbihKTklFbnYqIGVudiwgam9iamVjdCwgam9iamVjdCBqYXZhRmQsIGppbnQgbGV2ZWwsIGppbnQgb3B0aW9uLCBqaW50IHZhbHVlKSB7CiAgICAgaXBfbXJlcW4gcmVxOwogICAgIG1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CkBAIC0xMTMzLDYgKzExODYsNyBAQAogICAgIH0KICAgICB0aHJvd0lmTWludXNPbmUoZW52LCAic2V0c29ja29wdCIsIHJjKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBQb3NpeF9zZXRzb2Nrb3B0TGluZ2VyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqb2JqZWN0IGphdmFGZCwgamludCBsZXZlbCwgamludCBvcHRpb24sIGpvYmplY3QgamF2YUxpbmdlcikgewogICAgIHN0YXRpYyBqZmllbGRJRCBsT25vZmZGaWQgPSBlbnYtPkdldEZpZWxkSUQoSm5pQ29uc3RhbnRzOjpzdHJ1Y3RMaW5nZXJDbGFzcywgImxfb25vZmYiLCAiSSIpOwpAQCAtMTIyOCw3ICsxMjgyLDEyIEBACiAgICAgdGhyb3dJZk1pbnVzT25lKGVudiwgInRjZHJhaW4iLCBURU1QX0ZBSUxVUkVfUkVUUlkodGNkcmFpbihmZCkpKTsKIH0KIAotc3RhdGljIGppbnQgUG9zaXhfdW1hc2soSk5JRW52Kiwgam9iamVjdCwgamludCBtYXNrKSB7CitzdGF0aWMgdm9pZCBQb3NpeF90Y3NlbmRicmVhayhKTklFbnYqIGVudiwgam9iamVjdCwgam9iamVjdCBqYXZhRmQsIGppbnQgZHVyYXRpb24pIHsKKyAgaW50IGZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBqYXZhRmQpOworICB0aHJvd0lmTWludXNPbmUoZW52LCAidGNzZW5kYnJlYWsiLCBURU1QX0ZBSUxVUkVfUkVUUlkodGNzZW5kYnJlYWsoZmQsIGR1cmF0aW9uKSkpOworfQorCitzdGF0aWMgamludCBQb3NpeF91bWFza0ltcGwoSk5JRW52Kiwgam9iamVjdCwgamludCBtYXNrKSB7CiAgICAgcmV0dXJuIHVtYXNrKG1hc2spOwogfQogCkBAIC0xMjQwLDYgKzEyOTksMTQgQEAKICAgICByZXR1cm4gbWFrZVN0cnVjdFV0c25hbWUoZW52LCBidWYpOwogfQogCitzdGF0aWMgdm9pZCBQb3NpeF91bnNldGVudihKTklFbnYqIGVudiwgam9iamVjdCwganN0cmluZyBqYXZhTmFtZSkgeworICAgIFNjb3BlZFV0ZkNoYXJzIG5hbWUoZW52LCBqYXZhTmFtZSk7CisgICAgaWYgKG5hbWUuY19zdHIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhyb3dJZk1pbnVzT25lKGVudiwgInVuc2V0ZW52IiwgdW5zZXRlbnYobmFtZS5jX3N0cigpKSk7Cit9CisKIHN0YXRpYyBqaW50IFBvc2l4X3dhaXRwaWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgcGlkLCBqb2JqZWN0IGphdmFTdGF0dXMsIGppbnQgb3B0aW9ucykgewogICAgIGludCBzdGF0dXM7CiAgICAgaW50IHJjID0gdGhyb3dJZk1pbnVzT25lKGVudiwgIndhaXRwaWQiLCBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChwaWQsICZzdGF0dXMsIG9wdGlvbnMpKSk7CkBAIC0xMjc5LDYgKzEzNDYsOCBAQAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIGR1cCwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgZHVwMiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtJKUxqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOyIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIGVudmlyb24sICIoKVtMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBleGVjdiwgIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBleGVjdmUsICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspViIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIGZjaG1vZCwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtJKVYiKSwKICAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBmY2hvd24sICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7SUkpViIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIGZjbnRsVm9pZCwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtJKUkiKSwKQEAgLTEzMzcsNiArMTQwNiw3IEBACiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgc2VuZGZpbGUsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7TGphdmEvaW8vRmlsZURlc2NyaXB0b3I7TGxpYmNvcmUvdXRpbC9NdXRhYmxlTG9uZztKKUoiKSwKICAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBzZW5kdG9CeXRlcywgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtMamF2YS9sYW5nL09iamVjdDtJSUlMamF2YS9uZXQvSW5ldEFkZHJlc3M7SSlJIiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgc2V0ZWdpZCwgIihJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBzZXRlbnYsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7WilWIiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgc2V0ZXVpZCwgIihJKVYiKSwKICAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBzZXRnaWQsICIoSSlWIiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgc2V0c2lkLCAiKClJIiksCkBAIC0xMzU3LDggKzE0MjcsMTAgQEAKICAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCBzeW1saW5rLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWIiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgc3lzY29uZiwgIihJKUoiKSwKICAgICBOQVRJVkVfTUVUSE9EKFBvc2l4LCB0Y2RyYWluLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiksCi0gICAgTkFUSVZFX01FVEhPRChQb3NpeCwgdW1hc2ssICIoSSlJIiksCisgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgdGNzZW5kYnJlYWssICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7SSlWIiksCisgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgdW1hc2tJbXBsLCAiKEkpSSIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIHVuYW1lLCAiKClMbGliY29yZS9pby9TdHJ1Y3RVdHNuYW1lOyIpLAorICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIHVuc2V0ZW52LCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiksCiAgICAgTkFUSVZFX01FVEhPRChQb3NpeCwgd2FpdHBpZCwgIihJTGxpYmNvcmUvdXRpbC9NdXRhYmxlSW50O0kpSSIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIHdyaXRlQnl0ZXMsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7TGphdmEvbGFuZy9PYmplY3Q7SUkpSSIpLAogICAgIE5BVElWRV9NRVRIT0QoUG9zaXgsIHdyaXRldiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtbTGphdmEvbGFuZy9PYmplY3Q7W0lbSSlJIiksCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfeG1sX0V4cGF0UGFyc2VyLmNwcCBiL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bWxfRXhwYXRQYXJzZXIuY3BwCmluZGV4IGNlNDFhNTEuLjliNGJiNGQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bWxfRXhwYXRQYXJzZXIuY3BwCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bWxfRXhwYXRQYXJzZXIuY3BwCkBAIC03Nyw2ICs3Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1jcHkobmV3QXJyYXksIGFycmF5LCBjYXBhY2l0eSAqIHNpemVvZihqc3RyaW5nKSk7CiAKKyAgICAgICAgICAgIGRlbGV0ZVtdIGFycmF5OwogICAgICAgICAgICAgYXJyYXkgPSBuZXdBcnJheTsKICAgICAgICAgICAgIGNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7CiAgICAgICAgIH0KQEAgLTEzOSw3ICsxNDAsNyBAQAogICAgICAgICAgICAgaWYgKGphdmFCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAKICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGdsb2JhbCByZWZlcmVuY2UuCi0gICAgICAgICAgICBqYXZhQnVmZmVyID0gKGpjaGFyQXJyYXkpIGVudi0+TmV3R2xvYmFsUmVmKGphdmFCdWZmZXIpOworICAgICAgICAgICAgamF2YUJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8amNoYXJBcnJheT4oZW52LT5OZXdHbG9iYWxSZWYoamF2YUJ1ZmZlcikpOwogICAgICAgICAgICAgaWYgKGphdmFCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAKICAgICAgICAgICAgIGJ1ZmZlciA9IGphdmFCdWZmZXI7CkBAIC0xOTksNiArMjAwLDE0IEBACiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyc2luZ0NvbnRleHQqPihYTUxfR2V0VXNlckRhdGEocGFyc2VyKSk7CiB9CiAKK3N0YXRpYyBYTUxfUGFyc2VyIHRvWE1MUGFyc2VyKGpsb25nIGFkZHJlc3MpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8WE1MX1BhcnNlcj4oYWRkcmVzcyk7Cit9CisKK3N0YXRpYyBqbG9uZyBmcm9tWE1MUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocGFyc2VyKTsKK30KKwogc3RhdGljIGptZXRob2RJRCBjb21tZW50TWV0aG9kOwogc3RhdGljIGptZXRob2RJRCBlbmRDZGF0YU1ldGhvZDsKIHN0YXRpYyBqbWV0aG9kSUQgZW5kRHRkTWV0aG9kOwpAQCAtMjc4LDcgKzI4Nyw3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIGEgZ2xvYmFsIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuZWQgc3RyaW5nLgotICAgIHdyYXBwZXItPmludGVybmVkID0gKGpzdHJpbmcpIGVudi0+TmV3R2xvYmFsUmVmKGludGVybmVkLmdldCgpKTsKKyAgICB3cmFwcGVyLT5pbnRlcm5lZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8anN0cmluZz4oZW52LT5OZXdHbG9iYWxSZWYoaW50ZXJuZWQuZ2V0KCkpKTsKICAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQxNyw3ICs0MjYsOSBAQAogCiAgICAgLy8gR3JvdyBidWZmZXIgaWYgbmVjZXNzYXJ5ICh0aGUgbGVuZ3RoIGluIGJ5dGVzIGlzIGFsd2F5cyA+PSB0aGUgbGVuZ3RoIGluIGNoYXJzKS4KICAgICBqY2hhckFycmF5IGphdmFDaGFycyA9IHBhcnNpbmdDb250ZXh0LT5lbnN1cmVDYXBhY2l0eShieXRlQ291bnQpOwotICAgIGlmIChqYXZhQ2hhcnMgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGlmIChqYXZhQ2hhcnMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAgICAgLy8gRGVjb2RlIFVURi04IGNoYXJhY3RlcnMgaW50byBvdXIgY2hhcltdLgogICAgIFNjb3BlZENoYXJBcnJheVJXIGNoYXJzKGVudiwgamF2YUNoYXJzKTsKQEAgLTQ1NCw3ICs0NjUsNyBAQAogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoamF2YVBhcnNlciwgbWV0aG9kLCBidWZmZXIsIHV0ZjE2bGVuZ3RoKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIqKiB0b0F0dHJpYnV0ZXMoamludCBhdHRyaWJ1dGVQb2ludGVyKSB7CitzdGF0aWMgY29uc3QgY2hhcioqIHRvQXR0cmlidXRlcyhqbG9uZyBhdHRyaWJ1dGVQb2ludGVyKSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcioqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGF0dHJpYnV0ZVBvaW50ZXIpKTsKIH0KIApAQCAtNDYzLDcgKzQ3NCw3IEBACiAgKi8KIGNsYXNzIEV4cGF0RWxlbWVudE5hbWUgewogcHVibGljOgotICAgIEV4cGF0RWxlbWVudE5hbWUoSk5JRW52KiBlbnYsIFBhcnNpbmdDb250ZXh0KiBwYXJzaW5nQ29udGV4dCwgamludCBhdHRyaWJ1dGVQb2ludGVyLCBqaW50IGluZGV4KSB7CisgICAgRXhwYXRFbGVtZW50TmFtZShKTklFbnYqIGVudiwgUGFyc2luZ0NvbnRleHQqIHBhcnNpbmdDb250ZXh0LCBqbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBqaW50IGluZGV4KSB7CiAgICAgICAgIGNvbnN0IGNoYXIqKiBhdHRyaWJ1dGVzID0gdG9BdHRyaWJ1dGVzKGF0dHJpYnV0ZVBvaW50ZXIpOwogICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gYXR0cmlidXRlc1tpbmRleCAqIDJdOwogICAgICAgICBpbml0KGVudiwgcGFyc2luZ0NvbnRleHQsIG5hbWUpOwpAQCAtNTAzLDcgKzUxNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lCi0gICAgICAgIExvY2FsQXJyYXk8MTAyND4gcU5hbWUoc3RybGVuKG1QcmVmaXgpICsgMSArIHN0cmxlbihtTG9jYWxOYW1lKSArIDEpOworICAgICAgICA6OkxvY2FsQXJyYXk8MTAyND4gcU5hbWUoc3RybGVuKG1QcmVmaXgpICsgMSArIHN0cmxlbihtTG9jYWxOYW1lKSArIDEpOwogICAgICAgICBzbnByaW50ZigmcU5hbWVbMF0sIHFOYW1lLnNpemUoKSwgIiVzOiVzIiwgbVByZWZpeCwgbUxvY2FsTmFtZSk7CiAgICAgICAgIHJldHVybiBpbnRlcm5TdHJpbmcobUVudiwgbVBhcnNpbmdDb250ZXh0LCAmcU5hbWVbMF0pOwogICAgIH0KQEAgLTgzMSwxOSArODQyLDE5IEBACiAgKiBAcGFyYW0gamF2YUNvbnRleHQgdGhhdCB3YXMgcHJvdmlkZWQgdG8gaGFuZGxlRXh0ZXJuYWxFbnRpdHkKICAqIEByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBDIEV4cGF0IGVudGl0eSBwYXJzZXIKICAqLwotc3RhdGljIGppbnQgRXhwYXRQYXJzZXJfY3JlYXRlRW50aXR5UGFyc2VyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IHBhcmVudFBhcnNlciwganN0cmluZyBqYXZhQ29udGV4dCkgeworc3RhdGljIGpsb25nIEV4cGF0UGFyc2VyX2NyZWF0ZUVudGl0eVBhcnNlcihKTklFbnYqIGVudiwgam9iamVjdCwgamxvbmcgcGFyZW50UGFyc2VyLCBqc3RyaW5nIGphdmFDb250ZXh0KSB7CiAgICAgU2NvcGVkVXRmQ2hhcnMgY29udGV4dChlbnYsIGphdmFDb250ZXh0KTsKICAgICBpZiAoY29udGV4dC5jX3N0cigpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgWE1MX1BhcnNlciBwYXJlbnQgPSAoWE1MX1BhcnNlcikgcGFyZW50UGFyc2VyOworICAgIFhNTF9QYXJzZXIgcGFyZW50ID0gdG9YTUxQYXJzZXIocGFyZW50UGFyc2VyKTsKICAgICBYTUxfUGFyc2VyIGVudGl0eVBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJlbnQsIGNvbnRleHQuY19zdHIoKSwgTlVMTCk7CiAgICAgaWYgKGVudGl0eVBhcnNlciA9PSBOVUxMKSB7CiAgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsIE5VTEwpOwogICAgIH0KIAotICAgIHJldHVybiAoamludCkgZW50aXR5UGFyc2VyOworICAgIHJldHVybiBmcm9tWE1MUGFyc2VyKGVudGl0eVBhcnNlcik7CiB9CiAKIC8qKgpAQCAtOTQ0LDcgKzk1NSw3IEBACiAgKiBAcGFyYW0gcHJvY2Vzc05hbWVzcGFjZXMgdHJ1ZSBpZiB0aGUgcGFyc2VyIHNob3VsZCBoYW5kbGUgbmFtZXNwYWNlcwogICogQHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIEMgRXhwYXQgcGFyc2VyCiAgKi8KLXN0YXRpYyBqaW50IEV4cGF0UGFyc2VyX2luaXRpYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGphdmFFbmNvZGluZywKK3N0YXRpYyBqbG9uZyBFeHBhdFBhcnNlcl9pbml0aWFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBqYXZhRW5jb2RpbmcsCiAgICAgICAgIGpib29sZWFuIHByb2Nlc3NOYW1lc3BhY2VzKSB7CiAgICAgLy8gQWxsb2NhdGUgcGFyc2luZyBjb250ZXh0LgogICAgIFVuaXF1ZVB0cjxQYXJzaW5nQ29udGV4dD4gY29udGV4dChuZXcgUGFyc2luZ0NvbnRleHQob2JqZWN0KSk7CkBAIC05NTMsNyArOTY0LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgY29udGV4dC0+cHJvY2Vzc05hbWVzcGFjZXMgPSAoYm9vbCkgcHJvY2Vzc05hbWVzcGFjZXM7CisgICAgY29udGV4dC0+cHJvY2Vzc05hbWVzcGFjZXMgPSBwcm9jZXNzTmFtZXNwYWNlczsKIAogICAgIC8vIENyZWF0ZSBhIHBhcnNlci4KICAgICBYTUxfUGFyc2VyIHBhcnNlcjsKQEAgLTk4OSw3ICsxMDAwLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgcmV0dXJuIChqaW50KSBwYXJzZXI7CisgICAgcmV0dXJuIGZyb21YTUxQYXJzZXIocGFyc2VyKTsKIH0KIAogLyoqCkBAIC05OTksOSArMTAxMCw5IEBACiAgKiBjYW4gYmUgcmVpbnRlcnByZXRlZCBhcyBhIFVURi0xNiBlbmNvZGVkIGJ5dGVbXS4gYXBwZW5kQnl0ZXMsIGFwcGVuZENoYXJzCiAgKiBhbmQgYXBwZW5kU3RyaW5nIGFsbCBjYWxsIHRocm91Z2ggdGhpcyBtZXRob2QuCiAgKi8KLXN0YXRpYyB2b2lkIGFwcGVuZChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcG9pbnRlciwKK3N0YXRpYyB2b2lkIGFwcGVuZChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpsb25nIHBvaW50ZXIsCiAgICAgICAgIGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgYnl0ZU9mZnNldCwgc2l6ZV90IGJ5dGVDb3VudCwgamJvb2xlYW4gaXNGaW5hbCkgewotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHBvaW50ZXI7CisgICAgWE1MX1BhcnNlciBwYXJzZXIgPSB0b1hNTFBhcnNlcihwb2ludGVyKTsKICAgICBQYXJzaW5nQ29udGV4dCogY29udGV4dCA9IHRvUGFyc2luZ0NvbnRleHQocGFyc2VyKTsKICAgICBjb250ZXh0LT5lbnYgPSBlbnY7CiAgICAgY29udGV4dC0+b2JqZWN0ID0gb2JqZWN0OwpAQCAtMTAxMiw3ICsxMDIzLDcgQEAKICAgICBjb250ZXh0LT5lbnYgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBFeHBhdFBhcnNlcl9hcHBlbmRCeXRlcyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcG9pbnRlciwKK3N0YXRpYyB2b2lkIEV4cGF0UGFyc2VyX2FwcGVuZEJ5dGVzKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamxvbmcgcG9pbnRlciwKICAgICAgICAgamJ5dGVBcnJheSB4bWwsIGppbnQgYnl0ZU9mZnNldCwgamludCBieXRlQ291bnQpIHsKICAgICBTY29wZWRCeXRlQXJyYXlSTyBieXRlQXJyYXkoZW52LCB4bWwpOwogICAgIGlmIChieXRlQXJyYXkuZ2V0KCkgPT0gTlVMTCkgewpAQCAtMTAyMyw3ICsxMDM0LDcgQEAKICAgICBhcHBlbmQoZW52LCBvYmplY3QsIHBvaW50ZXIsIGJ5dGVzLCBieXRlT2Zmc2V0LCBieXRlQ291bnQsIFhNTF9GQUxTRSk7CiB9CiAKLXN0YXRpYyB2b2lkIEV4cGF0UGFyc2VyX2FwcGVuZENoYXJzKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBwb2ludGVyLAorc3RhdGljIHZvaWQgRXhwYXRQYXJzZXJfYXBwZW5kQ2hhcnMoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqbG9uZyBwb2ludGVyLAogICAgICAgICBqY2hhckFycmF5IHhtbCwgamludCBjaGFyT2Zmc2V0LCBqaW50IGNoYXJDb3VudCkgewogICAgIFNjb3BlZENoYXJBcnJheVJPIGNoYXJBcnJheShlbnYsIHhtbCk7CiAgICAgaWYgKGNoYXJBcnJheS5nZXQoKSA9PSBOVUxMKSB7CkBAIC0xMDM2LDcgKzEwNDcsNyBAQAogICAgIGFwcGVuZChlbnYsIG9iamVjdCwgcG9pbnRlciwgYnl0ZXMsIGJ5dGVPZmZzZXQsIGJ5dGVDb3VudCwgWE1MX0ZBTFNFKTsKIH0KIAotc3RhdGljIHZvaWQgRXhwYXRQYXJzZXJfYXBwZW5kU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBwb2ludGVyLCBqc3RyaW5nIGphdmFYbWwsIGpib29sZWFuIGlzRmluYWwpIHsKK3N0YXRpYyB2b2lkIEV4cGF0UGFyc2VyX2FwcGVuZFN0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpsb25nIHBvaW50ZXIsIGpzdHJpbmcgamF2YVhtbCwgamJvb2xlYW4gaXNGaW5hbCkgewogICAgIFNjb3BlZFN0cmluZ0NoYXJzIHhtbChlbnYsIGphdmFYbWwpOwogICAgIGlmICh4bWwuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMDQ4LDEwMSArMTA1OSw2OSBAQAogCiAvKioKICAqIFJlbGVhc2VzIHBhcnNlciBvbmx5LgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIEphdmEgRXhwYXRQYXJzZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSBpIHBvaW50ZXIgdG8gdGhlIEMgZXhwYXQgcGFyc2VyCiAgKi8KLXN0YXRpYyB2b2lkIEV4cGF0UGFyc2VyX3JlbGVhc2VQYXJzZXIoSk5JRW52Kiwgam9iamVjdCwgamludCBpKSB7Ci0gICAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgaTsKLSAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworc3RhdGljIHZvaWQgRXhwYXRQYXJzZXJfcmVsZWFzZVBhcnNlcihKTklFbnYqLCBqb2JqZWN0LCBqbG9uZyBhZGRyZXNzKSB7CisgIFhNTF9QYXJzZXJGcmVlKHRvWE1MUGFyc2VyKGFkZHJlc3MpKTsKIH0KIAogLyoqCiAgKiBDbGVhbnMgdXAgYWZ0ZXIgdGhlIHBhcnNlci4gQ2FsbGVkIGF0IGdhcmJhZ2UgY29sbGVjdGlvbiB0aW1lLgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIEphdmEgRXhwYXRQYXJzZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSBpIHBvaW50ZXIgdG8gdGhlIEMgZXhwYXQgcGFyc2VyCiAgKi8KLXN0YXRpYyB2b2lkIEV4cGF0UGFyc2VyX3JlbGVhc2UoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgaSkgewotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIGk7CitzdGF0aWMgdm9pZCBFeHBhdFBhcnNlcl9yZWxlYXNlKEpOSUVudiogZW52LCBqb2JqZWN0LCBqbG9uZyBhZGRyZXNzKSB7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gdG9YTUxQYXJzZXIoYWRkcmVzcyk7CiAKLSAgICBQYXJzaW5nQ29udGV4dCogY29udGV4dCA9IHRvUGFyc2luZ0NvbnRleHQocGFyc2VyKTsKLSAgICBjb250ZXh0LT5lbnYgPSBlbnY7Ci0gICAgZGVsZXRlIGNvbnRleHQ7CisgIFBhcnNpbmdDb250ZXh0KiBjb250ZXh0ID0gdG9QYXJzaW5nQ29udGV4dChwYXJzZXIpOworICBjb250ZXh0LT5lbnYgPSBlbnY7CisgIGRlbGV0ZSBjb250ZXh0OwogCi0gICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKIH0KIAotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IGxpbmUuCi0gKgotICogQHBhcmFtIG9iamVjdCB0aGUgSmF2YSBFeHBhdFBhcnNlciBpbnN0YW5jZQotICogQHBhcmFtIHBvaW50ZXIgdG8gdGhlIEMgZXhwYXQgcGFyc2VyCi0gKiBAcmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyCi0gKi8KLXN0YXRpYyBpbnQgRXhwYXRQYXJzZXJfbGluZShKTklFbnYqLCBqb2JqZWN0LCBqaW50IHBvaW50ZXIpIHsKLSAgICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSBwb2ludGVyOwotICAgIHJldHVybiBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKTsKK3N0YXRpYyBpbnQgRXhwYXRQYXJzZXJfbGluZShKTklFbnYqLCBqb2JqZWN0LCBqbG9uZyBhZGRyZXNzKSB7CisgIHJldHVybiBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIodG9YTUxQYXJzZXIoYWRkcmVzcykpOwogfQogCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgY29sdW1uLgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIEphdmEgRXhwYXRQYXJzZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSBwb2ludGVyIHRvIHRoZSBDIGV4cGF0IHBhcnNlcgotICogQHJldHVybnMgY3VycmVudCBjb2x1bW4gbnVtYmVyCi0gKi8KLXN0YXRpYyBpbnQgRXhwYXRQYXJzZXJfY29sdW1uKEpOSUVudiosIGpvYmplY3QsIGppbnQgcG9pbnRlcikgewotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHBvaW50ZXI7Ci0gICAgcmV0dXJuIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlcik7CitzdGF0aWMgaW50IEV4cGF0UGFyc2VyX2NvbHVtbihKTklFbnYqLCBqb2JqZWN0LCBqbG9uZyBhZGRyZXNzKSB7CisgIHJldHVybiBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcih0b1hNTFBhcnNlcihhZGRyZXNzKSk7CiB9CiAKIC8qKgogICogR2V0cyB0aGUgVVJJIG9mIHRoZSBhdHRyaWJ1dGUgYXQgdGhlIGdpdmVuIGluZGV4LgogICoKLSAqIEBwYXJhbSBvYmplY3QgSmF2YSBFeHBhdFBhcnNlciBpbnN0YW5jZQotICogQHBhcmFtIHBvaW50ZXIgdG8gdGhlIEMgZXhwYXQgcGFyc2VyCiAgKiBAcGFyYW0gYXR0cmlidXRlUG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFycmF5CiAgKiBAcGFyYW0gaW5kZXggb2YgdGhlIGF0dHJpYnV0ZQogICogQHJldHVybnMgaW50ZXJuZWQgSmF2YSBzdHJpbmcgY29udGFpbmluZyBhdHRyaWJ1dGUncyBVUkkKICAqLwotc3RhdGljIGpzdHJpbmcgRXhwYXRBdHRyaWJ1dGVzX2dldFVSSShKTklFbnYqIGVudiwgam9iamVjdCwgamludCBwb2ludGVyLAotICAgICAgICBqaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGppbnQgaW5kZXgpIHsKLSAgICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSBwb2ludGVyOwotICAgIFBhcnNpbmdDb250ZXh0KiBjb250ZXh0ID0gdG9QYXJzaW5nQ29udGV4dChwYXJzZXIpOwotICAgIHJldHVybiBFeHBhdEVsZW1lbnROYW1lKGVudiwgY29udGV4dCwgYXR0cmlidXRlUG9pbnRlciwgaW5kZXgpLnVyaSgpOworc3RhdGljIGpzdHJpbmcgRXhwYXRBdHRyaWJ1dGVzX2dldFVSSShKTklFbnYqIGVudiwgam9iamVjdCwgamxvbmcgYWRkcmVzcywKKyAgICAgICAgamxvbmcgYXR0cmlidXRlUG9pbnRlciwgamludCBpbmRleCkgeworICBQYXJzaW5nQ29udGV4dCogY29udGV4dCA9IHRvUGFyc2luZ0NvbnRleHQodG9YTUxQYXJzZXIoYWRkcmVzcykpOworICByZXR1cm4gRXhwYXRFbGVtZW50TmFtZShlbnYsIGNvbnRleHQsIGF0dHJpYnV0ZVBvaW50ZXIsIGluZGV4KS51cmkoKTsKIH0KIAogLyoqCiAgKiBHZXRzIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYXQgdGhlIGdpdmVuIGluZGV4LgogICoKLSAqIEBwYXJhbSBvYmplY3QgSmF2YSBFeHBhdFBhcnNlciBpbnN0YW5jZQotICogQHBhcmFtIHBvaW50ZXIgdG8gdGhlIEMgZXhwYXQgcGFyc2VyCiAgKiBAcGFyYW0gYXR0cmlidXRlUG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFycmF5CiAgKiBAcGFyYW0gaW5kZXggb2YgdGhlIGF0dHJpYnV0ZQogICogQHJldHVybnMgaW50ZXJuZWQgSmF2YSBzdHJpbmcgY29udGFpbmluZyBhdHRyaWJ1dGUncyBsb2NhbCBuYW1lCiAgKi8KLXN0YXRpYyBqc3RyaW5nIEV4cGF0QXR0cmlidXRlc19nZXRMb2NhbE5hbWUoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgcG9pbnRlciwKLSAgICAgICAgamludCBhdHRyaWJ1dGVQb2ludGVyLCBqaW50IGluZGV4KSB7Ci0gICAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgcG9pbnRlcjsKLSAgICBQYXJzaW5nQ29udGV4dCogY29udGV4dCA9IHRvUGFyc2luZ0NvbnRleHQocGFyc2VyKTsKLSAgICByZXR1cm4gRXhwYXRFbGVtZW50TmFtZShlbnYsIGNvbnRleHQsIGF0dHJpYnV0ZVBvaW50ZXIsIGluZGV4KS5sb2NhbE5hbWUoKTsKK3N0YXRpYyBqc3RyaW5nIEV4cGF0QXR0cmlidXRlc19nZXRMb2NhbE5hbWUoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpsb25nIGFkZHJlc3MsCisgICAgICAgIGpsb25nIGF0dHJpYnV0ZVBvaW50ZXIsIGppbnQgaW5kZXgpIHsKKyAgUGFyc2luZ0NvbnRleHQqIGNvbnRleHQgPSB0b1BhcnNpbmdDb250ZXh0KHRvWE1MUGFyc2VyKGFkZHJlc3MpKTsKKyAgcmV0dXJuIEV4cGF0RWxlbWVudE5hbWUoZW52LCBjb250ZXh0LCBhdHRyaWJ1dGVQb2ludGVyLCBpbmRleCkubG9jYWxOYW1lKCk7CiB9CiAKIC8qKgogICogR2V0cyB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgKgotICogQHBhcmFtIG9iamVjdCBKYXZhIEV4cGF0UGFyc2VyIGluc3RhbmNlCi0gKiBAcGFyYW0gcG9pbnRlciB0byB0aGUgQyBleHBhdCBwYXJzZXIKICAqIEBwYXJhbSBhdHRyaWJ1dGVQb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgYXJyYXkKICAqIEBwYXJhbSBpbmRleCBvZiB0aGUgYXR0cmlidXRlCiAgKiBAcmV0dXJucyBpbnRlcm5lZCBKYXZhIHN0cmluZyBjb250YWluaW5nIGF0dHJpYnV0ZSdzIGxvY2FsIG5hbWUKICAqLwotc3RhdGljIGpzdHJpbmcgRXhwYXRBdHRyaWJ1dGVzX2dldFFOYW1lKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IHBvaW50ZXIsCi0gICAgICAgIGppbnQgYXR0cmlidXRlUG9pbnRlciwgamludCBpbmRleCkgewotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHBvaW50ZXI7Ci0gICAgUGFyc2luZ0NvbnRleHQqIGNvbnRleHQgPSB0b1BhcnNpbmdDb250ZXh0KHBhcnNlcik7Ci0gICAgcmV0dXJuIEV4cGF0RWxlbWVudE5hbWUoZW52LCBjb250ZXh0LCBhdHRyaWJ1dGVQb2ludGVyLCBpbmRleCkucU5hbWUoKTsKK3N0YXRpYyBqc3RyaW5nIEV4cGF0QXR0cmlidXRlc19nZXRRTmFtZShKTklFbnYqIGVudiwgam9iamVjdCwgamxvbmcgYWRkcmVzcywKKyAgICAgICAgamxvbmcgYXR0cmlidXRlUG9pbnRlciwgamludCBpbmRleCkgeworICBQYXJzaW5nQ29udGV4dCogY29udGV4dCA9IHRvUGFyc2luZ0NvbnRleHQodG9YTUxQYXJzZXIoYWRkcmVzcykpOworICByZXR1cm4gRXhwYXRFbGVtZW50TmFtZShlbnYsIGNvbnRleHQsIGF0dHJpYnV0ZVBvaW50ZXIsIGluZGV4KS5xTmFtZSgpOwogfQogCiAvKioKQEAgLTExNTQsNyArMTEzMyw3IEBACiAgKiBAcmV0dXJucyBKYXZhIHN0cmluZyBjb250YWluaW5nIGF0dHJpYnV0ZSdzIHZhbHVlCiAgKi8KIHN0YXRpYyBqc3RyaW5nIEV4cGF0QXR0cmlidXRlc19nZXRWYWx1ZUJ5SW5kZXgoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgIGppbnQgYXR0cmlidXRlUG9pbnRlciwgamludCBpbmRleCkgeworICAgICAgICBqbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBqaW50IGluZGV4KSB7CiAgICAgY29uc3QgY2hhcioqIGF0dHJpYnV0ZXMgPSB0b0F0dHJpYnV0ZXMoYXR0cmlidXRlUG9pbnRlcik7CiAgICAgY29uc3QgY2hhciogdmFsdWUgPSBhdHRyaWJ1dGVzWyhpbmRleCAqIDIpICsgMV07CiAgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKHZhbHVlKTsKQEAgLTExNjksNyArMTE0OCw3IEBACiAgKiAgZm91bmQKICAqLwogc3RhdGljIGppbnQgRXhwYXRBdHRyaWJ1dGVzX2dldEluZGV4Rm9yUU5hbWUoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgIGppbnQgYXR0cmlidXRlUG9pbnRlciwganN0cmluZyBxTmFtZSkgeworICAgICAgICBqbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBqc3RyaW5nIHFOYW1lKSB7CiAgICAgU2NvcGVkVXRmQ2hhcnMgcU5hbWVCeXRlcyhlbnYsIHFOYW1lKTsKICAgICBpZiAocU5hbWVCeXRlcy5jX3N0cigpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTE5Niw3ICsxMTc1LDcgQEAKICAqIEByZXR1cm5zIGluZGV4IG9mIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiB1cmkgYW5kIGxvY2FsIG5hbWUgb3IgLTEgaWYgbm90CiAgKiAgZm91bmQKICAqLwotc3RhdGljIGppbnQgRXhwYXRBdHRyaWJ1dGVzX2dldEluZGV4KEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IGF0dHJpYnV0ZVBvaW50ZXIsCitzdGF0aWMgamludCBFeHBhdEF0dHJpYnV0ZXNfZ2V0SW5kZXgoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpsb25nIGF0dHJpYnV0ZVBvaW50ZXIsCiAgICAgICAgIGpzdHJpbmcgdXJpLCBqc3RyaW5nIGxvY2FsTmFtZSkgewogICAgIFNjb3BlZFV0ZkNoYXJzIHVyaUJ5dGVzKGVudiwgdXJpKTsKICAgICBpZiAodXJpQnl0ZXMuY19zdHIoKSA9PSBOVUxMKSB7CkBAIC0xMjI4LDcgKzEyMDcsNyBAQAogICogIGZvdW5kCiAgKi8KIHN0YXRpYyBqc3RyaW5nIEV4cGF0QXR0cmlidXRlc19nZXRWYWx1ZUZvclFOYW1lKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICBqaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGpzdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgamxvbmcgYXR0cmlidXRlUG9pbnRlciwganN0cmluZyBxTmFtZSkgewogICAgIGppbnQgaW5kZXggPSBFeHBhdEF0dHJpYnV0ZXNfZ2V0SW5kZXhGb3JRTmFtZShlbnYsIGNsYXp6LCBhdHRyaWJ1dGVQb2ludGVyLCBxTmFtZSk7CiAgICAgcmV0dXJuIGluZGV4ID09IC0xID8gTlVMTAogICAgICAgICAgICAgOiBFeHBhdEF0dHJpYnV0ZXNfZ2V0VmFsdWVCeUluZGV4KGVudiwgY2xhenosIGF0dHJpYnV0ZVBvaW50ZXIsIGluZGV4KTsKQEAgLTEyNDQsNyArMTIyMyw3IEBACiAgKiAgZm91bmQKICAqLwogc3RhdGljIGpzdHJpbmcgRXhwYXRBdHRyaWJ1dGVzX2dldFZhbHVlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICBqaW50IGF0dHJpYnV0ZVBvaW50ZXIsIGpzdHJpbmcgdXJpLCBqc3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBqbG9uZyBhdHRyaWJ1dGVQb2ludGVyLCBqc3RyaW5nIHVyaSwganN0cmluZyBsb2NhbE5hbWUpIHsKICAgICBqaW50IGluZGV4ID0gRXhwYXRBdHRyaWJ1dGVzX2dldEluZGV4KGVudiwgY2xhenosIGF0dHJpYnV0ZVBvaW50ZXIsIHVyaSwgbG9jYWxOYW1lKTsKICAgICByZXR1cm4gaW5kZXggPT0gLTEgPyBOVUxMCiAgICAgICAgICAgICA6IEV4cGF0QXR0cmlidXRlc19nZXRWYWx1ZUJ5SW5kZXgoZW52LCBjbGF6eiwgYXR0cmlidXRlUG9pbnRlciwgaW5kZXgpOwpAQCAtMTI1Nyw3ICsxMjM2LDcgQEAKICAqIEBwYXJhbSBhZGRyZXNzIGNoYXIqKiB0byBjbG9uZQogICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgKi8KLXN0YXRpYyBqaW50IEV4cGF0UGFyc2VyX2Nsb25lQXR0cmlidXRlcyhKTklFbnYqIGVudiwgam9iamVjdCwgamludCBhZGRyZXNzLCBqaW50IGNvdW50KSB7CitzdGF0aWMgamxvbmcgRXhwYXRQYXJzZXJfY2xvbmVBdHRyaWJ1dGVzKEpOSUVudiogZW52LCBqb2JqZWN0LCBqbG9uZyBhZGRyZXNzLCBqaW50IGNvdW50KSB7CiAgICAgY29uc3QgY2hhcioqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcioqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGFkZHJlc3MpKTsKICAgICBjb3VudCAqPSAyOwogCkBAIC0xMjkxLDEzICsxMjcwLDEzIEBACiAgICAgICAgIGRlc3RpbmF0aW9uU3RyaW5nICs9IHN0cmluZ0xlbmd0aCArIDE7CiAgICAgfQogCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihidWZmZXIpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJ1ZmZlcik7CiB9CiAKIC8qKgogICogRnJlZXMgY2xvbmVkIGF0dHJpYnV0ZXMuCiAgKi8KLXN0YXRpYyB2b2lkIEV4cGF0QXR0cmlidXRlc19mcmVlQXR0cmlidXRlcyhKTklFbnYqLCBqb2JqZWN0LCBqaW50IHBvaW50ZXIpIHsKK3N0YXRpYyB2b2lkIEV4cGF0QXR0cmlidXRlc19mcmVlQXR0cmlidXRlcyhKTklFbnYqLCBqb2JqZWN0LCBqbG9uZyBwb2ludGVyKSB7CiAgICAgZGVsZXRlW10gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90Pihwb2ludGVyKSk7CiB9CiAKQEAgLTEzNjQsMzMgKzEzNDMsMzMgQEAKICAgICBpZiAoaW50ZXJuTWV0aG9kID09IE5VTEwpIHJldHVybjsKIAogICAgIC8vIFJlZmVyZW5jZSB0byAiIi4KLSAgICBlbXB0eVN0cmluZyA9IChqc3RyaW5nKSBlbnYtPk5ld0dsb2JhbFJlZihlbXB0eSk7CisgICAgZW1wdHlTdHJpbmcgPSByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+TmV3R2xvYmFsUmVmKGVtcHR5KSk7CiB9CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgcGFyc2VyTWV0aG9kc1tdID0gewotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIGFwcGVuZFN0cmluZywgIihJTGphdmEvbGFuZy9TdHJpbmc7WilWIiksCi0gICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgYXBwZW5kQnl0ZXMsICIoSVtCSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIGFwcGVuZENoYXJzLCAiKElbQ0lJKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBjbG9uZUF0dHJpYnV0ZXMsICIoSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIGNvbHVtbiwgIihJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBjcmVhdGVFbnRpdHlQYXJzZXIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiksCi0gICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgaW5pdGlhbGl6ZSwgIihMamF2YS9sYW5nL1N0cmluZztaKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBsaW5lLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIHJlbGVhc2UsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgcmVsZWFzZVBhcnNlciwgIihJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBhcHBlbmRTdHJpbmcsICIoSkxqYXZhL2xhbmcvU3RyaW5nO1opViIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIGFwcGVuZEJ5dGVzLCAiKEpbQklJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBhcHBlbmRDaGFycywgIihKW0NJSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgY2xvbmVBdHRyaWJ1dGVzLCAiKEpJKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCBjb2x1bW4sICIoSilJIiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgY3JlYXRlRW50aXR5UGFyc2VyLCAiKEpMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIGluaXRpYWxpemUsICIoTGphdmEvbGFuZy9TdHJpbmc7WilKIiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgbGluZSwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0UGFyc2VyLCByZWxlYXNlLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRQYXJzZXIsIHJlbGVhc2VQYXJzZXIsICIoSilWIiksCiAgICAgTkFUSVZFX01FVEhPRChFeHBhdFBhcnNlciwgc3RhdGljSW5pdGlhbGl6ZSwgIihMamF2YS9sYW5nL1N0cmluZzspViIpLAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBhdHRyaWJ1dGVNZXRob2RzW10gPSB7Ci0gICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGZyZWVBdHRyaWJ1dGVzLCAiKEkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRJbmRleEZvclFOYW1lLCAiKElMamF2YS9sYW5nL1N0cmluZzspSSIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRJbmRleCwgIihJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0QXR0cmlidXRlcywgZ2V0TG9jYWxOYW1lLCAiKElJSSlMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0QXR0cmlidXRlcywgZ2V0UU5hbWUsICIoSUlJKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRVUkksICIoSUlJKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAotICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRWYWx1ZUJ5SW5kZXgsICIoSUkpTGphdmEvbGFuZy9TdHJpbmc7IiksCi0gICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGdldFZhbHVlRm9yUU5hbWUsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKEV4cGF0QXR0cmlidXRlcywgZ2V0VmFsdWUsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0QXR0cmlidXRlcywgZnJlZUF0dHJpYnV0ZXMsICIoSilWIiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGdldEluZGV4Rm9yUU5hbWUsICIoSkxqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGdldEluZGV4LCAiKEpMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSSIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRMb2NhbE5hbWUsICIoSkpJKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRRTmFtZSwgIihKSkkpTGphdmEvbGFuZy9TdHJpbmc7IiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGdldFVSSSwgIihKSkkpTGphdmEvbGFuZy9TdHJpbmc7IiksCisgICAgTkFUSVZFX01FVEhPRChFeHBhdEF0dHJpYnV0ZXMsIGdldFZhbHVlQnlJbmRleCwgIihKSSlMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKEV4cGF0QXR0cmlidXRlcywgZ2V0VmFsdWVGb3JRTmFtZSwgIihKTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoRXhwYXRBdHRyaWJ1dGVzLCBnZXRWYWx1ZSwgIihKTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpLAogfTsKIHZvaWQgcmVnaXN0ZXJfb3JnX2FwYWNoZV9oYXJtb255X3htbF9FeHBhdFBhcnNlcihKTklFbnYqIGVudikgewogICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UGFyc2VyIiwgcGFyc2VyTWV0aG9kcywgTkVMRU0ocGFyc2VyTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X3huZXRfcHJvdmlkZXJfanNzZV9OYXRpdmVDcnlwdG8uY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvb3JnX2FwYWNoZV9oYXJtb255X3huZXRfcHJvdmlkZXJfanNzZV9OYXRpdmVDcnlwdG8uY3BwCmluZGV4IDMyMmY0MTYuLjFiNjgwNzcgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL29yZ19hcGFjaGVfaGFybW9ueV94bmV0X3Byb3ZpZGVyX2pzc2VfTmF0aXZlQ3J5cHRvLmNwcAorKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfeG5ldF9wcm92aWRlcl9qc3NlX05hdGl2ZUNyeXB0by5jcHAKQEAgLTY1LDYgKzY1LDE0IEBACiAvLyBkb24ndCBvdmVyd2hlbG0gbG9nY2F0CiAjZGVmaW5lIFdJVEhfSk5JX1RSQUNFX0RBVEFfQ0hVTktfU0laRSA1MTIKIAorc3RhdGljIEphdmFWTSogZ0phdmFWTTsKK3N0YXRpYyBqY2xhc3Mgb3BlblNzbE91dHB1dFN0cmVhbUNsYXNzOworCitzdGF0aWMgam1ldGhvZElEIGlucHV0U3RyZWFtX3JlYWRNZXRob2Q7CitzdGF0aWMgam1ldGhvZElEIG9wZW5Tc2xJbnB1dFN0cmVhbV9yZWFkTGluZU1ldGhvZDsKK3N0YXRpYyBqbWV0aG9kSUQgb3V0cHV0U3RyZWFtX3dyaXRlTWV0aG9kOworc3RhdGljIGptZXRob2RJRCBvdXRwdXRTdHJlYW1fZmx1c2hNZXRob2Q7CisKIHN0cnVjdCBCSU9fRGVsZXRlIHsKICAgICB2b2lkIG9wZXJhdG9yKCkoQklPKiBwKSBjb25zdCB7CiAgICAgICAgIEJJT19mcmVlKHApOwpAQCAtOTMsNiArMTAxLDIwIEBACiB9OwogdHlwZWRlZiBVbmlxdWVQdHI8RFNBLCBEU0FfRGVsZXRlPiBVbmlxdWVfRFNBOwogCitzdHJ1Y3QgRUNfR1JPVVBfRGVsZXRlIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoRUNfR1JPVVAqIHApIGNvbnN0IHsKKyAgICAgICAgRUNfR1JPVVBfY2xlYXJfZnJlZShwKTsKKyAgICB9Cit9OwordHlwZWRlZiBVbmlxdWVQdHI8RUNfR1JPVVAsIEVDX0dST1VQX0RlbGV0ZT4gVW5pcXVlX0VDX0dST1VQOworCitzdHJ1Y3QgRUNfUE9JTlRfRGVsZXRlIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoRUNfUE9JTlQqIHApIGNvbnN0IHsKKyAgICAgICAgRUNfUE9JTlRfY2xlYXJfZnJlZShwKTsKKyAgICB9Cit9OwordHlwZWRlZiBVbmlxdWVQdHI8RUNfUE9JTlQsIEVDX1BPSU5UX0RlbGV0ZT4gVW5pcXVlX0VDX1BPSU5UOworCiBzdHJ1Y3QgRUNfS0VZX0RlbGV0ZSB7CiAgICAgdm9pZCBvcGVyYXRvcigpKEVDX0tFWSogcCkgY29uc3QgewogICAgICAgICBFQ19LRVlfZnJlZShwKTsKQEAgLTEzNSw2ICsxNTcsMTMgQEAKIH07CiB0eXBlZGVmIFVuaXF1ZVB0cjxSU0EsIFJTQV9EZWxldGU+IFVuaXF1ZV9SU0E7CiAKK3N0cnVjdCBBU04xX09CSkVDVF9EZWxldGUgeworICAgIHZvaWQgb3BlcmF0b3IoKShBU04xX09CSkVDVCogcCkgY29uc3QgeworICAgICAgICBBU04xX09CSkVDVF9mcmVlKHApOworICAgIH0KK307Cit0eXBlZGVmIFVuaXF1ZVB0cjxBU04xX09CSkVDVCwgQVNOMV9PQkpFQ1RfRGVsZXRlPiBVbmlxdWVfQVNOMV9PQkpFQ1Q7CisKIHN0cnVjdCBTU0xfRGVsZXRlIHsKICAgICB2b2lkIG9wZXJhdG9yKCkoU1NMKiBwKSBjb25zdCB7CiAgICAgICAgIFNTTF9mcmVlKHApOwpAQCAtMjUwLDYgKzI3OSwxNCBAQAogICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uIiwgbWVzc2FnZSk7CiB9CiAKKy8qKgorICogVGhyb3dzIGEgU2lnbmF0dXJlRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZyBhcyBhIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIHRocm93SWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbihKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIEpOSV9UUkFDRSgidGhyb3dJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uICVzIiwgbWVzc2FnZSk7CisgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24iLCBtZXNzYWdlKTsKK30KKwogLyoKICAqIENoZWNrcyB0aGlzIHRocmVhZCdzIE9wZW5TU0wgZXJyb3IgcXVldWUgYW5kIHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24gaWYKICAqIG5lY2Vzc2FyeS4KQEAgLTI3OCw2ICszMTUsMTAgQEAKICAgICAgICAgICAgIHRocm93QmFkUGFkZGluZ0V4Y2VwdGlvbihlbnYsIG1lc3NhZ2UpOwogICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnkgPT0gRVJSX0xJQl9SU0EgJiYgcmVhc29uID09IFJTQV9SX0RBVEFfR1JFQVRFUl9USEFOX01PRF9MRU4pIHsKICAgICAgICAgICAgIHRocm93U2lnbmF0dXJlRXhjZXB0aW9uKGVudiwgbWVzc2FnZSk7CisgICAgICAgIH0gZWxzZSBpZiAobGlicmFyeSA9PSBFUlJfTElCX0VWUCAmJiByZWFzb24gPT0gRVZQX1JfQkFEX0RFQ1JZUFQpIHsKKyAgICAgICAgICAgIHRocm93QmFkUGFkZGluZ0V4Y2VwdGlvbihlbnYsIG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnkgPT0gRVJSX0xJQl9FVlAgJiYgcmVhc29uID09IEVWUF9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCkgeworICAgICAgICAgICAgdGhyb3dJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uKGVudiwgbWVzc2FnZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCBtZXNzYWdlKTsKICAgICAgICAgfQpAQCAtNDQ4LDcgKzQ4OSw3IEBACiAgKiBAcGFyYW0gdGhyb3dJZk51bGwgd2hldGhlciB0byB0aHJvdyBpZiB0aGUgU1NMIHBvaW50ZXIgaXMgTlVMTAogICogQHJldHVybnMgdGhlIHBvaW50ZXIsIHdoaWNoIG1heSBiZSBOVUxMCiAgKi8KLXN0YXRpYyBTU0xfQ1RYKiB0b19TU0xfQ1RYKEpOSUVudiogZW52LCBpbnQgc3NsX2N0eF9hZGRyZXNzLCBib29sIHRocm93SWZOdWxsKSB7CitzdGF0aWMgU1NMX0NUWCogdG9fU1NMX0NUWChKTklFbnYqIGVudiwgamxvbmcgc3NsX2N0eF9hZGRyZXNzLCBib29sIHRocm93SWZOdWxsKSB7CiAgICAgU1NMX0NUWCogc3NsX2N0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U1NMX0NUWCo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oc3NsX2N0eF9hZGRyZXNzKSk7CiAgICAgaWYgKChzc2xfY3R4ID09IE5VTEwpICYmIHRocm93SWZOdWxsKSB7CiAgICAgICAgIEpOSV9UUkFDRSgic3NsX2N0eCA9PSBudWxsIik7CkBAIC00NTcsNyArNDk4LDcgQEAKICAgICByZXR1cm4gc3NsX2N0eDsKIH0KIAotc3RhdGljIFNTTCogdG9fU1NMKEpOSUVudiogZW52LCBpbnQgc3NsX2FkZHJlc3MsIGJvb2wgdGhyb3dJZk51bGwpIHsKK3N0YXRpYyBTU0wqIHRvX1NTTChKTklFbnYqIGVudiwgamxvbmcgc3NsX2FkZHJlc3MsIGJvb2wgdGhyb3dJZk51bGwpIHsKICAgICBTU0wqIHNzbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U1NMKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90Pihzc2xfYWRkcmVzcykpOwogICAgIGlmICgoc3NsID09IE5VTEwpICYmIHRocm93SWZOdWxsKSB7CiAgICAgICAgIEpOSV9UUkFDRSgic3NsID09IG51bGwiKTsKQEAgLTQ2Niw3ICs1MDcsNyBAQAogICAgIHJldHVybiBzc2w7CiB9CiAKLXN0YXRpYyBTU0xfU0VTU0lPTiogdG9fU1NMX1NFU1NJT04oSk5JRW52KiBlbnYsIGludCBzc2xfc2Vzc2lvbl9hZGRyZXNzLCBib29sIHRocm93SWZOdWxsKSB7CitzdGF0aWMgU1NMX1NFU1NJT04qIHRvX1NTTF9TRVNTSU9OKEpOSUVudiogZW52LCBqbG9uZyBzc2xfc2Vzc2lvbl9hZGRyZXNzLCBib29sIHRocm93SWZOdWxsKSB7CiAgICAgU1NMX1NFU1NJT04qIHNzbF9zZXNzaW9uCiAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxTU0xfU0VTU0lPTio+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oc3NsX3Nlc3Npb25fYWRkcmVzcykpOwogICAgIGlmICgoc3NsX3Nlc3Npb24gPT0gTlVMTCkgJiYgdGhyb3dJZk51bGwpIHsKQEAgLTUwNSw3ICs1NDYsNyBAQAogLyoqCiAgKiBDb252ZXJ0cyBhbiBPcGVuU1NMIEJJR05VTSB0byBhIEphdmEgYnl0ZVtdIGFycmF5LgogICovCi1zdGF0aWMgamJ5dGVBcnJheSBiaWdudW1Ub0FycmF5KEpOSUVudiogZW52LCBCSUdOVU0qIHNvdXJjZSwgY29uc3QgY2hhciogc291cmNlTmFtZSkgeworc3RhdGljIGpieXRlQXJyYXkgYmlnbnVtVG9BcnJheShKTklFbnYqIGVudiwgY29uc3QgQklHTlVNKiBzb3VyY2UsIGNvbnN0IGNoYXIqIHNvdXJjZU5hbWUpIHsKICAgICBKTklfVFJBQ0UoImJpZ251bVRvQXJyYXkoJXAsICVzKSIsIHNvdXJjZSwgc291cmNlTmFtZSk7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKQEAgLTU0MCw2ICs1ODEsMjU3IEBACiB9CiAKIC8qKgorICogQ29udmVydHMgdmFyaW91cyBPcGVuU1NMIEFTTi4xIHR5cGVzIHRvIGEgamJ5dGVBcnJheSB3aXRoIERFUi1lbmNvZGVkIGRhdGEKKyAqIGluc2lkZS4gVGhlICJpMmRfZnVuYyIgZnVuY3Rpb24gcG9pbnRlciBpcyBhIGZ1bmN0aW9uIG9mIHRoZSAiaTJkXzxUWVBFPiIKKyAqIGZyb20gdGhlIE9wZW5TU0wgQVNOLjEgQVBJLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoramJ5dGVBcnJheSBBU04xVG9CeXRlQXJyYXkoSk5JRW52KiBlbnYsIFQqIG9iaiwgaW50ICgqaTJkX2Z1bmMpKFQqLCB1bnNpZ25lZCBjaGFyKiopKSB7CisgICAgaW50IGRlckxlbiA9IGkyZF9mdW5jKG9iaiwgTlVMTCk7CisgICAgaWYgKGRlckxlbiA8IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJBU04xVG9CeXRlQXJyYXkiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJBU04xVG9CeXRlQXJyYXkoJXApID0+IG1lYXN1cmVtZW50IGZhaWxlZCIsIG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGJ5dGVBcnJheShlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGRlckxlbikpOworICAgIGlmIChieXRlQXJyYXkuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkFTTjFUb0J5dGVBcnJheSglcCkgPT4gY3JlYXRpbmcgYnl0ZSBhcnJheSBmYWlsZWQiLCBvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTY29wZWRCeXRlQXJyYXlSVyBieXRlcyhlbnYsIGJ5dGVBcnJheS5nZXQoKSk7CisgICAgaWYgKGJ5dGVzLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJBU04xVG9CeXRlQXJyYXkoJXApID0+IHVzaW5nIGJ5dGUgYXJyYXkgZmFpbGVkIiwgb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGJ5dGVzLmdldCgpKTsKKyAgICBpbnQgcmV0ID0gaTJkX2Z1bmMob2JqLCAmcCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJBU04xVG9CeXRlQXJyYXkiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJBU04xVG9CeXRlQXJyYXkoJXApID0+IGZpbmFsIGNvbnZlcnNpb24gZmFpbGVkIiwgb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgSk5JX1RSQUNFKCJBU04xVG9CeXRlQXJyYXkoJXApID0+IHN1Y2Nlc3MgKCVkIGJ5dGVzIHdyaXR0ZW4pIiwgb2JqLCByZXQpOworICAgIHJldHVybiBieXRlQXJyYXkucmVsZWFzZSgpOworfQorCisvKioKKyAqIEJJTyBmb3IgSW5wdXRTdHJlYW0KKyAqLworY2xhc3MgQklPX1N0cmVhbSB7CitwdWJsaWM6CisgICAgQklPX1N0cmVhbShqb2JqZWN0IHN0cmVhbSkgOgorICAgICAgICAgICAgbUVvZihmYWxzZSkgeworICAgICAgICBKTklFbnYqIGVudiA9IGdldEVudigpOworICAgICAgICBtU3RyZWFtID0gZW52LT5OZXdHbG9iYWxSZWYoc3RyZWFtKTsKKyAgICB9CisKKyAgICB+QklPX1N0cmVhbSgpIHsKKyAgICAgICAgSk5JRW52KiBlbnYgPSBnZXRFbnYoKTsKKworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtU3RyZWFtKTsKKyAgICB9CisKKyAgICBib29sIGlzRW9mKCkgY29uc3QgeworICAgICAgICBKTklfVFJBQ0UoImlzRW9mPyAlcyIsIG1Fb2YgPyAieWVzIiA6ICJubyIpOworICAgICAgICByZXR1cm4gbUVvZjsKKyAgICB9CisKKyAgICBpbnQgZmx1c2goKSB7CisgICAgICAgIEpOSUVudiogZW52ID0gZ2V0RW52KCk7CisgICAgICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtU3RyZWFtLCBvdXRwdXRTdHJlYW1fZmx1c2hNZXRob2QpOworICAgICAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBqb2JqZWN0IGdldFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW07CisgICAgfQorCisgICAgdm9pZCBzZXRFb2YoYm9vbCBlb2YpIHsKKyAgICAgICAgbUVvZiA9IGVvZjsKKyAgICB9CisKKyAgICBKTklFbnYqIGdldEVudigpIHsKKyAgICAgICAgSk5JRW52KiBlbnY7CisKKyAgICAgICAgaWYgKGdKYXZhVk0tPkF0dGFjaEN1cnJlbnRUaHJlYWQoJmVudiwgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbnY7CisgICAgfQorCitwcml2YXRlOgorICAgIGpvYmplY3QgbVN0cmVhbTsKKyAgICBib29sIG1Fb2Y7Cit9OworCitjbGFzcyBCSU9fSW5wdXRTdHJlYW0gOiBwdWJsaWMgQklPX1N0cmVhbSB7CitwdWJsaWM6CisgICAgQklPX0lucHV0U3RyZWFtKGpvYmplY3Qgc3RyZWFtKSA6CisgICAgICAgICAgICBCSU9fU3RyZWFtKHN0cmVhbSkgeworICAgIH0KKworICAgIGludCByZWFkKGNoYXIgKmJ1ZiwgaW50IGxlbikgeworICAgICAgICByZXR1cm4gcmVhZF9pbnRlcm5hbChidWYsIGxlbiwgaW5wdXRTdHJlYW1fcmVhZE1ldGhvZCk7CisgICAgfQorCisgICAgaW50IGdldHMoY2hhciAqYnVmLCBpbnQgbGVuKSB7CisgICAgICAgIGludCByZWFkID0gcmVhZF9pbnRlcm5hbChidWYsIGxlbiAtIDEsIG9wZW5Tc2xJbnB1dFN0cmVhbV9yZWFkTGluZU1ldGhvZCk7CisgICAgICAgIGJ1ZltyZWFkXSA9ICdcMCc7CisgICAgICAgIEpOSV9UUkFDRSgiQklPOjpnZXRzIFwiJXNcIiIsIGJ1Zik7CisgICAgICAgIHJldHVybiByZWFkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQgcmVhZF9pbnRlcm5hbChjaGFyICpidWYsIGludCBsZW4sIGptZXRob2RJRCBtZXRob2QpIHsKKyAgICAgICAgSk5JRW52KiBlbnYgPSBnZXRFbnYoKTsKKyAgICAgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTklfVFJBQ0UoIkJJT19JbnB1dFN0cmVhbTo6cmVhZCBjb3VsZCBub3QgZ2V0IEpOSUVudiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gamF2YUJ5dGVzKGVudiwgZW52LT5OZXdCeXRlQXJyYXkobGVuKSk7CisgICAgICAgIGlmIChqYXZhQnl0ZXMuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgSk5JX1RSQUNFKCJCSU9fSW5wdXRTdHJlYW06OnJlYWQgZmFpbGVkIGNhbGwgdG8gTmV3Qnl0ZUFycmF5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBqaW50IHJlYWQgPSBlbnYtPkNhbGxJbnRNZXRob2QoZ2V0U3RyZWFtKCksIG1ldGhvZCwgamF2YUJ5dGVzLmdldCgpKTsKKyAgICAgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICAgICAgSk5JX1RSQUNFKCJCSU9fSW5wdXRTdHJlYW06OnJlYWQgZmFpbGVkIGNhbGwgdG8gSW5wdXRTdHJlYW0jcmVhZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogSmF2YSB1c2VzIC0xIHRvIGluZGljYXRlIEVPRiBjb25kaXRpb24uICovCisgICAgICAgIGlmIChyZWFkID09IC0xKSB7CisgICAgICAgICAgICBzZXRFb2YodHJ1ZSk7CisgICAgICAgICAgICByZWFkID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkID4gMCkgeworICAgICAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oamF2YUJ5dGVzLmdldCgpLCAwLCByZWFkLCByZWludGVycHJldF9jYXN0PGpieXRlKj4oYnVmKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZDsKKyAgICB9Cit9OworCitjbGFzcyBCSU9fT3V0cHV0U3RyZWFtIDogcHVibGljIEJJT19TdHJlYW0geworcHVibGljOgorICAgIEJJT19PdXRwdXRTdHJlYW0oam9iamVjdCBzdHJlYW0pIDoKKyAgICAgICAgICAgIEJJT19TdHJlYW0oc3RyZWFtKSB7CisgICAgfQorCisgICAgaW50IHdyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikgeworICAgICAgICBKTklFbnYqIGVudiA9IGdldEVudigpOworICAgICAgICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSV9UUkFDRSgiQklPX091dHB1dFN0cmVhbTo6d3JpdGUgPT4gY291bGQgbm90IGdldCBKTklFbnYiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGphdmFCeXRlcyhlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGxlbikpOworICAgICAgICBpZiAoamF2YUJ5dGVzLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSV9UUkFDRSgiQklPX091dHB1dFN0cmVhbTo6d3JpdGUgPT4gZmFpbGVkIGNhbGwgdG8gTmV3Qnl0ZUFycmF5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihqYXZhQnl0ZXMuZ2V0KCksIDAsIGxlbiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSo+KGJ1ZikpOworCisgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZ2V0U3RyZWFtKCksIG91dHB1dFN0cmVhbV93cml0ZU1ldGhvZCwgamF2YUJ5dGVzLmdldCgpKTsKKyAgICAgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICAgICAgSk5JX1RSQUNFKCJCSU9fT3V0cHV0U3RyZWFtOjp3cml0ZSA9PiBmYWlsZWQgY2FsbCB0byBPdXRwdXRTdHJlYW0jd3JpdGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0KK307CisKK3N0YXRpYyBpbnQgYmlvX3N0cmVhbV9jcmVhdGUoQklPICpiKSB7CisgICAgYi0+aW5pdCA9IDE7CisgICAgYi0+bnVtID0gMDsKKyAgICBiLT5wdHIgPSBOVUxMOworICAgIGItPmZsYWdzID0gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBiaW9fc3RyZWFtX2Rlc3Ryb3koQklPICpiKSB7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYi0+cHRyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PEJJT19TdHJlYW0qPihiLT5wdHIpOworICAgICAgICBiLT5wdHIgPSBOVUxMOworICAgIH0KKworICAgIGItPmluaXQgPSAwOworICAgIGItPmZsYWdzID0gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBiaW9fc3RyZWFtX3JlYWQoQklPICpiLCBjaGFyICpidWYsIGludCBsZW4pIHsKKyAgICBCSU9fSW5wdXRTdHJlYW0qIHN0cmVhbSA9IHN0YXRpY19jYXN0PEJJT19JbnB1dFN0cmVhbSo+KGItPnB0cik7CisgICAgcmV0dXJuIHN0cmVhbS0+cmVhZChidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgYmlvX3N0cmVhbV93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikgeworICAgIEJJT19PdXRwdXRTdHJlYW0qIHN0cmVhbSA9IHN0YXRpY19jYXN0PEJJT19PdXRwdXRTdHJlYW0qPihiLT5wdHIpOworICAgIHJldHVybiBzdHJlYW0tPndyaXRlKGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCBiaW9fc3RyZWFtX3B1dHMoQklPICpiLCBjb25zdCBjaGFyICpidWYpIHsKKyAgICBCSU9fT3V0cHV0U3RyZWFtKiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxCSU9fT3V0cHV0U3RyZWFtKj4oYi0+cHRyKTsKKyAgICByZXR1cm4gc3RyZWFtLT53cml0ZShidWYsIHN0cmxlbihidWYpKTsKK30KKworc3RhdGljIGludCBiaW9fc3RyZWFtX2dldHMoQklPICpiLCBjaGFyICpidWYsIGludCBsZW4pIHsKKyAgICBCSU9fSW5wdXRTdHJlYW0qIHN0cmVhbSA9IHN0YXRpY19jYXN0PEJJT19JbnB1dFN0cmVhbSo+KGItPnB0cik7CisgICAgcmV0dXJuIHN0cmVhbS0+Z2V0cyhidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGJpb19zdHJlYW1fYXNzaWduKEJJTyAqYiwgQklPX1N0cmVhbSogc3RyZWFtKSB7CisgICAgYi0+cHRyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHN0cmVhbSk7Cit9CisKK3N0YXRpYyBsb25nIGJpb19zdHJlYW1fY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcsIHZvaWQgKikgeworICAgIEJJT19TdHJlYW0qIHN0cmVhbSA9IHN0YXRpY19jYXN0PEJJT19TdHJlYW0qPihiLT5wdHIpOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEJJT19DVFJMX0VPRjoKKyAgICAgICAgcmV0dXJuIHN0cmVhbS0+aXNFb2YoKSA/IDEgOiAwOworICAgIGNhc2UgQklPX0NUUkxfRkxVU0g6CisgICAgICAgIHJldHVybiBzdHJlYW0tPmZsdXNoKCk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgQklPX01FVEhPRCBzdHJlYW1fYmlvX21ldGhvZCA9IHsKKyAgICAgICAgKCAxMDAgfCAweDA0MDAgKSwgLyogc291cmNlL3NpbmsgQklPICovCisgICAgICAgICJJbnB1dFN0cmVhbS9PdXRwdXRTdHJlYW0gQklPIiwKKyAgICAgICAgYmlvX3N0cmVhbV93cml0ZSwgLyogYmlvX3dyaXRlICovCisgICAgICAgIGJpb19zdHJlYW1fcmVhZCwgLyogYmlvX3JlYWQgKi8KKyAgICAgICAgYmlvX3N0cmVhbV9wdXRzLCAvKiBiaW9fcHV0cyAqLworICAgICAgICBiaW9fc3RyZWFtX2dldHMsIC8qIGJpb19nZXRzICovCisgICAgICAgIGJpb19zdHJlYW1fY3RybCwgLyogYmlvX2N0cmwgKi8KKyAgICAgICAgYmlvX3N0cmVhbV9jcmVhdGUsIC8qIGJpb19jcmVhdGUgKi8KKyAgICAgICAgYmlvX3N0cmVhbV9kZXN0cm95LCAvKiBiaW9fZnJlZSAqLworICAgICAgICBOVUxMLCAvKiBubyBiaW9fY2FsbGJhY2tfY3RybCAqLworfTsKKworLyoqCiAgKiBPcGVuU1NMIGxvY2tpbmcgc3VwcG9ydC4gVGFrZW4gZnJvbSB0aGUgTydSZWlsbHkgYm9vayBieSBWaWVnYSBldCBhbC4sIGJ1dCBJCiAgKiBzdXBwb3NlIHRoZXJlIGFyZSBub3QgbWFueSBvdGhlciB3YXlzIHRvIGRvIHRoaXMgb24gYSBMaW51eCBzeXN0ZW0gKG1vZHVsbwogICogaXNvbW9ycGhpc20pLgpAQCAtNjIxLDI2ICs5MTMsMjYgQEAKICAgICBFTkdJTkVfbG9hZF9keW5hbWljKCk7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FTkdJTkVfYnlfaWQoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBpZEphdmEpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRU5HSU5FX2J5X2lkKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgaWRKYXZhKSB7CiAgICAgSk5JX1RSQUNFKCJFTkdJTkVfYnlfaWQoJXApIiwgaWRKYXZhKTsKIAogICAgIFNjb3BlZFV0ZkNoYXJzIGlkKGVudiwgaWRKYXZhKTsKICAgICBpZiAoaWQuY19zdHIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCAiaWQgPT0gTlVMTCIpOworICAgICAgICBKTklfVFJBQ0UoIkVOR0lORV9ieV9pZCglcCkgPT4gaWQgPT0gbnVsbCIsIGlkSmF2YSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBKTklfVFJBQ0UoIkVOR0lORV9ieV9pZChcIiVzXCIpIiwgaWQuY19zdHIoKSk7CiAKICAgICBFTkdJTkUqIGUgPSBFTkdJTkVfYnlfaWQoaWQuY19zdHIoKSk7CiAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVOR0lORV9ieV9pZCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZnJlZU9wZW5Tc2xFcnJvclN0YXRlKCk7CiAgICAgfQogCi0gICAgSk5JX1RSQUNFKCJFTkdJTkVfYnlfaWQoJXApID0+ICVwIiwgaWRKYXZhLCBlKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGUpKTsKKyAgICBKTklfVFJBQ0UoIkVOR0lORV9ieV9pZChcIiVzXCIpID0+ICVwIiwgaWQuY19zdHIoKSwgZSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihlKTsKIH0KIAotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VOR0lORV9hZGQoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBlbmdpbmVSZWYpIHsKK3N0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FTkdJTkVfYWRkKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGVuZ2luZVJlZikgewogICAgIEVOR0lORSogZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RU5HSU5FKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihlbmdpbmVSZWYpKTsKICAgICBKTklfVFJBQ0UoIkVOR0lORV9hZGQoJXApIiwgZSk7CiAKQEAgLTY2MSw3ICs5NTMsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FTkdJTkVfaW5pdChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGVuZ2luZVJlZikgeworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VOR0lORV9pbml0KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGVuZ2luZVJlZikgewogICAgIEVOR0lORSogZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RU5HSU5FKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihlbmdpbmVSZWYpKTsKICAgICBKTklfVFJBQ0UoIkVOR0lORV9pbml0KCVwKSIsIGUpOwogCkBAIC02NzUsNyArOTY3LDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRU5HSU5FX2ZpbmlzaChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGVuZ2luZVJlZikgeworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VOR0lORV9maW5pc2goSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZW5naW5lUmVmKSB7CiAgICAgRU5HSU5FKiBlID0gcmVpbnRlcnByZXRfY2FzdDxFTkdJTkUqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGVuZ2luZVJlZikpOwogICAgIEpOSV9UUkFDRSgiRU5HSU5FX2ZpbmlzaCglcCkiLCBlKTsKIApAQCAtNjg5LDcgKzk4MSw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VOR0lORV9mcmVlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgZW5naW5lUmVmKSB7CitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRU5HSU5FX2ZyZWUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZW5naW5lUmVmKSB7CiAgICAgRU5HSU5FKiBlID0gcmVpbnRlcnByZXRfY2FzdDxFTkdJTkUqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGVuZ2luZVJlZikpOwogICAgIEpOSV9UUkFDRSgiRU5HSU5FX2ZyZWUoJXApIiwgZSk7CiAKQEAgLTcwMyw3ICs5OTUsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FTkdJTkVfbG9hZF9wcml2YXRlX2tleShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGVuZ2luZVJlZiwKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZW5naW5lUmVmLAogICAgICAgICBqc3RyaW5nIGlkSmF2YSkgewogICAgIEVOR0lORSogZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RU5HSU5FKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihlbmdpbmVSZWYpKTsKICAgICBKTklfVFJBQ0UoIkVOR0lORV9sb2FkX3ByaXZhdGVfa2V5KCVwLCAlcCkiLCBlLCBpZEphdmEpOwpAQCAtNzIxLDE0ICsxMDEzLDc1IEBACiAgICAgfQogCiAgICAgSk5JX1RSQUNFKCJFTkdJTkVfbG9hZF9wcml2YXRlX2tleSglcCwgJXApID0+ICVwIiwgZSwgaWRKYXZhLCBwa2V5LmdldCgpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSk7Cit9CisKK3N0YXRpYyBqc3RyaW5nIE5hdGl2ZUNyeXB0b19FTkdJTkVfZ2V0X2lkKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGVuZ2luZVJlZikKK3sKKyAgICBFTkdJTkUqIGUgPSByZWludGVycHJldF9jYXN0PEVOR0lORSo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oZW5naW5lUmVmKSk7CisgICAgSk5JX1RSQUNFKCJFTkdJTkVfZ2V0X2lkKCVwKSIsIGUpOworCisgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImVuZ2luZSA9PSBudWxsIik7CisgICAgICAgIEpOSV9UUkFDRSgiRU5HSU5FX2dldF9pZCglcCkgPT4gZW5naW5lID09IG51bGwiLCBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqaWQgPSBFTkdJTkVfZ2V0X2lkKGUpOworICAgIFNjb3BlZExvY2FsUmVmPGpzdHJpbmc+IGlkSmF2YShlbnYsIGVudi0+TmV3U3RyaW5nVVRGKGlkKSk7CisKKyAgICBKTklfVFJBQ0UoIkVOR0lORV9nZXRfaWQoJXApID0+IFwiJXNcIiIsIGUsIGlkKTsKKyAgICByZXR1cm4gaWRKYXZhLnJlbGVhc2UoKTsKK30KKworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VOR0lORV9jdHJsX2NtZF9zdHJpbmcoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZW5naW5lUmVmLAorICAgICAgICBqc3RyaW5nIGNtZEphdmEsIGpzdHJpbmcgYXJnSmF2YSwgamludCBjbWRfb3B0aW9uYWwpCit7CisgICAgRU5HSU5FKiBlID0gcmVpbnRlcnByZXRfY2FzdDxFTkdJTkUqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGVuZ2luZVJlZikpOworICAgIEpOSV9UUkFDRSgiRU5HSU5FX2N0cmxfY21kX3N0cmluZyglcCwgJXAsICVwLCAlZCkiLCBlLCBjbWRKYXZhLCBhcmdKYXZhLCBjbWRfb3B0aW9uYWwpOworCisgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImVuZ2luZSA9PSBudWxsIik7CisgICAgICAgIEpOSV9UUkFDRSgiRU5HSU5FX2N0cmxfY21kX3N0cmluZyglcCwgJXAsICVwLCAlZCkgPT4gZW5naW5lID09IG51bGwiLCBlLCBjbWRKYXZhLCBhcmdKYXZhLAorICAgICAgICAgICAgICAgIGNtZF9vcHRpb25hbCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFNjb3BlZFV0ZkNoYXJzIGNtZENoYXJzKGVudiwgY21kSmF2YSk7CisgICAgaWYgKGNtZENoYXJzLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBVbmlxdWVQdHI8U2NvcGVkVXRmQ2hhcnM+IGFyZzsKKyAgICBjb25zdCBjaGFyKiBhcmdfY19zdHIgPSBOVUxMOworICAgIGlmIChhcmdKYXZhICE9IE5VTEwpIHsKKyAgICAgICAgYXJnLnJlc2V0KG5ldyBTY29wZWRVdGZDaGFycyhlbnYsIGFyZ0phdmEpKTsKKyAgICAgICAgYXJnX2Nfc3RyID0gYXJnLT5jX3N0cigpOworICAgICAgICBpZiAoYXJnX2Nfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIEpOSV9UUkFDRSgiRU5HSU5FX2N0cmxfY21kX3N0cmluZyglcCwgXCIlc1wiLCBcIiVzXCIsICVkKSIsIGUsIGNtZENoYXJzLmNfc3RyKCksIGFyZ19jX3N0ciwKKyAgICAgICAgICAgIGNtZF9vcHRpb25hbCk7CisKKyAgICBpbnQgcmV0ID0gRU5HSU5FX2N0cmxfY21kX3N0cmluZyhlLCBjbWRDaGFycy5jX3N0cigpLCBhcmdfY19zdHIsIGNtZF9vcHRpb25hbCk7CisgICAgaWYgKHJldCAhPSAxKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRU5HSU5FX2N0cmxfY21kX3N0cmluZyIpOworICAgICAgICBKTklfVFJBQ0UoIkVOR0lORV9jdHJsX2NtZF9zdHJpbmcoJXAsIFwiJXNcIiwgXCIlc1wiLCAlZCkgPT4gdGhyZXcgZXJyb3IiLCBlLAorICAgICAgICAgICAgICAgIGNtZENoYXJzLmNfc3RyKCksIGFyZ19jX3N0ciwgY21kX29wdGlvbmFsKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgSk5JX1RSQUNFKCJFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCVwLCBcIiVzXCIsIFwiJXNcIiwgJWQpID0+ICVkIiwgZSwgY21kQ2hhcnMuY19zdHIoKSwKKyAgICAgICAgICAgIGFyZ19jX3N0ciwgY21kX29wdGlvbmFsLCByZXQpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX25ld19EU0EoYnl0ZVtdIHAsIGJ5dGVbXSBxLCBieXRlW10gZywKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwdWJfa2V5LCBieXRlW10gcHJpdl9rZXkpOwogICovCi1zdGF0aWMgRVZQX1BLRVkqIE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9uZXdfRFNBKEpOSUVudiogZW52LCBqY2xhc3MsCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX25ld19EU0EoSk5JRW52KiBlbnYsIGpjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBwLCBqYnl0ZUFycmF5IHEsIGpieXRlQXJyYXkgZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBwdWJfa2V5LCBqYnl0ZUFycmF5IHByaXZfa2V5KSB7CiAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRFNBKHA9JXAsIHE9JXAsIGc9JXAsIHB1Yl9rZXk9JXAsIHByaXZfa2V5PSVwKSIsCkBAIC03MzcsNTQgKzEwOTAsNTQgQEAKICAgICBVbmlxdWVfRFNBIGRzYShEU0FfbmV3KCkpOwogICAgIGlmIChkc2EuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiRFNBX25ldyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmICghYXJyYXlUb0JpZ251bShlbnYsIHAsICZkc2EtPnApKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAoIWFycmF5VG9CaWdudW0oZW52LCBxLCAmZHNhLT5xKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKCFhcnJheVRvQmlnbnVtKGVudiwgZywgJmRzYS0+ZykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmIChwdWJfa2V5ICE9IE5VTEwgJiYgIWFycmF5VG9CaWdudW0oZW52LCBwdWJfa2V5LCAmZHNhLT5wdWJfa2V5KSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKHByaXZfa2V5ICE9IE5VTEwgJiYgIWFycmF5VG9CaWdudW0oZW52LCBwcml2X2tleSwgJmRzYS0+cHJpdl9rZXkpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAoZHNhLT5wID09IE5VTEwgfHwgZHNhLT5xID09IE5VTEwgfHwgZHNhLT5nID09IE5VTEwKICAgICAgICAgICAgIHx8IChkc2EtPnB1Yl9rZXkgPT0gTlVMTCAmJiBkc2EtPnByaXZfa2V5ID09IE5VTEwpKSB7CiAgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJVbmFibGUgdG8gY29udmVydCBCaWdJbnRlZ2VyIHRvIEJJR05VTSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgVW5pcXVlX0VWUF9QS0VZIHBrZXkoRVZQX1BLRVlfbmV3KCkpOwogICAgIGlmIChwa2V5LmdldCgpID09IE5VTEwpIHsKICAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkVWUF9QS0VZX25ldyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoRVZQX1BLRVlfYXNzaWduX0RTQShwa2V5LmdldCgpLCBkc2EuZ2V0KCkpICE9IDEpIHsKICAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkVWUF9QS0VZX2Fzc2lnbl9EU0EgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKGRzYSk7CiAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRFNBKHA9JXAsIHE9JXAsIGc9JXAsIHB1Yl9rZXk9JXAsIHByaXZfa2V5PSVwKSA9PiAlcCIsCiAgICAgICAgICAgICAgIHAsIHEsIGcsIHB1Yl9rZXksIHByaXZfa2V5LCBwa2V5LmdldCgpKTsKLSAgICByZXR1cm4gcGtleS5yZWxlYXNlKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8amxvbmc+KHBrZXkucmVsZWFzZSgpKTsKIH0KIAogLyoqCiAgKiBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX25ld19SU0EoYnl0ZVtdIG4sIGJ5dGVbXSBlLCBieXRlW10gZCwgYnl0ZVtdIHAsIGJ5dGVbXSBxKTsKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX25ld19SU0EoSk5JRW52KiBlbnYsIGpjbGFzcywKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRVZQX1BLRVlfbmV3X1JTQShKTklFbnYqIGVudiwgamNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IG4sIGpieXRlQXJyYXkgZSwgamJ5dGVBcnJheSBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IHAsIGpieXRlQXJyYXkgcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBkbXAxLCBqYnl0ZUFycmF5IGRtcTEsCkBAIC04NzUsMTMgKzEyMjgsMTExIEBACiAgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKHJzYSk7CiAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfUlNBKG49JXAsIGU9JXAsIGQ9JXAsIHA9JXAsIHE9JXAgZG1wMT0lcCwgZG1xMT0lcCwgaXFtcD0lcCkgPT4gJXAiLAogICAgICAgICAgICAgbiwgZSwgZCwgcCwgcSwgZG1wMSwgZG1xMSwgaXFtcCwgcGtleS5nZXQoKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocGtleS5yZWxlYXNlKCkpOwogfQogCi0vKioKLSAqIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1BLRVlfc2l6ZShpbnQgcGtleSk7Ci0gKi8KLXN0YXRpYyBpbnQgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX3R5cGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwa2V5UmVmKSB7CitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX25ld19FQ19LRVkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYsCisgICAgICAgIGpsb25nIHB1YmtleVJlZiwgamJ5dGVBcnJheSBrZXlKYXZhQnl0ZXMpIHsKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIGNvbnN0IEVDX1BPSU5UKiBwdWJrZXkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVDX1BPSU5UKj4ocHVia2V5UmVmKTsKKyAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX25ld19FQ19LRVkoJXAsICVwLCAlcCkiLCBncm91cCwgcHVia2V5LCBrZXlKYXZhQnl0ZXMpOworCisgICAgVW5pcXVlX0JJR05VTSBrZXkoTlVMTCk7CisgICAgaWYgKGtleUphdmFCeXRlcyAhPSBOVUxMKSB7CisgICAgICAgIEJJR05VTSoga2V5UmVmOworICAgICAgICBpZiAoIWFycmF5VG9CaWdudW0oZW52LCBrZXlKYXZhQnl0ZXMsICZrZXlSZWYpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBrZXkucmVzZXQoa2V5UmVmKTsKKyAgICB9CisKKyAgICBVbmlxdWVfRUNfS0VZIGVja2V5KEVDX0tFWV9uZXcoKSk7CisgICAgaWYgKGVja2V5LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkVDX0tFWV9uZXcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChFQ19LRVlfc2V0X2dyb3VwKGVja2V5LmdldCgpLCBncm91cCkgIT0gMSkgeworICAgICAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX25ld19FQ19LRVkoJXAsICVwLCAlcCkgPiBFQ19LRVlfc2V0X2dyb3VwIGZhaWxlZCIsIGdyb3VwLCBwdWJrZXksCisgICAgICAgICAgICAgICAga2V5SmF2YUJ5dGVzKTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFQ19LRVlfc2V0X2dyb3VwIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChwdWJrZXkgIT0gTlVMTCkgeworICAgICAgICBpZiAoRUNfS0VZX3NldF9wdWJsaWNfa2V5KGVja2V5LmdldCgpLCBwdWJrZXkpICE9IDEpIHsKKyAgICAgICAgICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfbmV3X0VDX0tFWSglcCwgJXAsICVwKSA9PiBFQ19LRVlfc2V0X3ByaXZhdGVfa2V5IGZhaWxlZCIsIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICBwdWJrZXksIGtleUphdmFCeXRlcyk7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0tFWV9zZXRfcHVibGljX2tleSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoa2V5LmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoZWNrZXkuZ2V0KCksIGtleS5nZXQoKSkgIT0gMSkgeworICAgICAgICAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRUNfS0VZKCVwLCAlcCwgJXApID0+IEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkgZmFpbGVkIiwgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgIHB1YmtleSwga2V5SmF2YUJ5dGVzKTsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfS0VZX3NldF9wcml2YXRlX2tleSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB1YmtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICBVbmlxdWVfRUNfUE9JTlQgY2FsY1B1YmtleShFQ19QT0lOVF9uZXcoZ3JvdXApKTsKKyAgICAgICAgICAgIGlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBjYWxjUHVia2V5LmdldCgpLCBrZXkuZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRUNfS0VZKCVwLCAlcCwgJXApID0+IGNhbid0IGNhbHVsYXRlIHB1YmxpYyBrZXkiLCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmtleSwga2V5SmF2YUJ5dGVzKTsKKyAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVDX0tFWV9zZXRfcHVibGljX2tleShlY2tleS5nZXQoKSwgY2FsY1B1YmtleS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUVDX0tFWV9jaGVja19rZXkoZWNrZXkuZ2V0KCkpKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRVZQX0tFWV9uZXdfRUNfS0VZKCVwLCAlcCwgJXApID0+IGludmFsaWQga2V5IGNyZWF0ZWQiLCBncm91cCwgcHVia2V5LCBrZXlKYXZhQnl0ZXMpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0tFWV9jaGVja19rZXkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVW5pcXVlX0VWUF9QS0VZIHBrZXkoRVZQX1BLRVlfbmV3KCkpOworICAgIGlmIChwa2V5LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRUMoJXAsICVwLCAlcCkgPT4gdGhyZXcgZXJyb3IiLCBncm91cCwgcHVia2V5LCBrZXlKYXZhQnl0ZXMpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9QS0VZX25ldyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXkuZ2V0KCksIGVja2V5LmdldCgpKSAhPSAxKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfbmV3X0VDKCVwLCAlcCwgJXApID0+IHRocmV3IGVycm9yIiwgZ3JvdXAsIHB1YmtleSwga2V5SmF2YUJ5dGVzKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBPV05FUlNISVBfVFJBTlNGRVJSRUQoZWNrZXkpOworCisgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9uZXdfRUNfS0VZKCVwLCAlcCwgJXApID0+ICVwIiwgZ3JvdXAsIHB1YmtleSwga2V5SmF2YUJ5dGVzLCBwa2V5LmdldCgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKTsKK30KKworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9uZXdfbWFjX2tleShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBrZXlUeXBlLAorICAgICAgICBqYnl0ZUFycmF5IGtleUphdmFCeXRlcykKK3sKKyAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX25ld19tYWNfa2V5KCVkLCAlcCkiLCBwa2V5VHlwZSwga2V5SmF2YUJ5dGVzKTsKKworICAgIFNjb3BlZEJ5dGVBcnJheVJPIGtleShlbnYsIGtleUphdmFCeXRlcyk7CisgICAgaWYgKGtleS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGtleS5nZXQoKSk7CisgICAgVW5pcXVlX0VWUF9QS0VZIHBrZXkoRVZQX1BLRVlfbmV3X21hY19rZXkocGtleVR5cGUsIChFTkdJTkUgKikgTlVMTCwgdG1wLCBrZXkuc2l6ZSgpKSk7CisgICAgaWYgKHBrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX25ld19tYWNfa2V5KCVkLCAlcCkgPT4gdGhyZXcgZXJyb3IiLCBwa2V5VHlwZSwga2V5SmF2YUJ5dGVzKTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFTkdJTkVfbG9hZF9wcml2YXRlX2tleSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX25ld19tYWNfa2V5KCVkLCAlcCkgPT4gJXAiLCBwa2V5VHlwZSwga2V5SmF2YUJ5dGVzLCBwa2V5LmdldCgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKTsKK30KKworc3RhdGljIGludCBOYXRpdmVDcnlwdG9fRVZQX1BLRVlfdHlwZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwa2V5UmVmKSB7CiAgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CiAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV90eXBlKCVwKSIsIHBrZXkpOwogCkBAIC04OTgsNyArMTM0OSw3IEBACiAvKioKICAqIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1BLRVlfc2l6ZShpbnQgcGtleSk7CiAgKi8KLXN0YXRpYyBpbnQgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX3NpemUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwa2V5UmVmKSB7CitzdGF0aWMgaW50IE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9zaXplKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBrZXlSZWYpIHsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoIkVWUF9QS0VZX3NpemUoJXApIiwgcGtleSk7CiAKQEAgLTkxMiwxMCArMTM2Myw2OCBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qKgotICogcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1BLRVlfZnJlZShpbnQgcGtleSk7Ci0gKi8KLXN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9mcmVlKEpOSUVudiosIGpjbGFzcywgRVZQX1BLRVkqIHBrZXkpIHsKK3N0YXRpYyBqc3RyaW5nIE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9wcmludF9wdWJsaWMoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikgeworICAgIEVWUF9QS0VZKiBwa2V5ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfUEtFWSo+KHBrZXlSZWYpOworICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfcHJpbnRfcHVibGljKCVwKSIsIHBrZXkpOworCisgICAgaWYgKHBrZXkgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgInBrZXkgPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBVbmlxdWVfQklPIGJ1ZmZlcihCSU9fbmV3KEJJT19zX21lbSgpKSk7CisgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgdG8gYWxsb2NhdGUgQklPIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChFVlBfUEtFWV9wcmludF9wdWJsaWMoYnVmZmVyLmdldCgpLCBwa2V5LCAwLCAoQVNOMV9QQ1RYKikgTlVMTCkgIT0gMSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9QS0VZX3ByaW50X3B1YmxpYyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gTnVsbCB0ZXJtaW5hdGUgdGhpcworICAgIEJJT193cml0ZShidWZmZXIuZ2V0KCksICJcMCIsIDEpOworCisgICAgY2hhciAqdG1wOworICAgIEJJT19nZXRfbWVtX2RhdGEoYnVmZmVyLmdldCgpLCAmdG1wKTsKKyAgICBqc3RyaW5nIGRlc2NyaXB0aW9uID0gZW52LT5OZXdTdHJpbmdVVEYodG1wKTsKKworICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfcHJpbnRfcHVibGljKCVwKSA9PiBcIiVzXCIiLCBwa2V5LCB0bXApOworICAgIHJldHVybiBkZXNjcmlwdGlvbjsKK30KKworc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX3ByaW50X3ByaXZhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikgeworICAgIEVWUF9QS0VZKiBwa2V5ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfUEtFWSo+KHBrZXlSZWYpOworICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSglcCkiLCBwa2V5KTsKKworICAgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJwa2V5ID09IG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVW5pcXVlX0JJTyBidWZmZXIoQklPX25ldyhCSU9fc19tZW0oKSkpOworICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCAiVW5hYmxlIHRvIGFsbG9jYXRlIEJJTyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShidWZmZXIuZ2V0KCksIHBrZXksIDAsIChBU04xX1BDVFgqKSBOVUxMKSAhPSAxKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gTnVsbCB0ZXJtaW5hdGUgdGhpcworICAgIEJJT193cml0ZShidWZmZXIuZ2V0KCksICJcMCIsIDEpOworCisgICAgY2hhciAqdG1wOworICAgIEJJT19nZXRfbWVtX2RhdGEoYnVmZmVyLmdldCgpLCAmdG1wKTsKKyAgICBqc3RyaW5nIGRlc2NyaXB0aW9uID0gZW52LT5OZXdTdHJpbmdVVEYodG1wKTsKKworICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSglcCkgPT4gXCIlc1wiIiwgcGtleSwgdG1wKTsKKyAgICByZXR1cm4gZGVzY3JpcHRpb247Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9mcmVlKEpOSUVudiosIGpjbGFzcywgamxvbmcgcGtleVJlZikgeworICAgIEVWUF9QS0VZKiBwa2V5ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfUEtFWSo+KHBrZXlSZWYpOwogICAgIEpOSV9UUkFDRSgiRVZQX1BLRVlfZnJlZSglcCkiLCBwa2V5KTsKIAogICAgIGlmIChwa2V5ICE9IE5VTEwpIHsKQEAgLTkyMyw3ICsxNDMyLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfUEtFWV9jbXAoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwa2V5MVJlZiwgamludCBwa2V5MlJlZikgeworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9QS0VZX2NtcChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwa2V5MVJlZiwgamxvbmcgcGtleTJSZWYpIHsKICAgICBFVlBfUEtFWSogcGtleTEgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleTFSZWYpOwogICAgIEVWUF9QS0VZKiBwa2V5MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5MlJlZik7CiAgICAgSk5JX1RSQUNFKCJFVlBfUEtFWV9jbXAoJXAsICVwKSIsIHBrZXkxLCBwa2V5Mik7CkBAIC05NDYsNyArMTQ1NSw3IEBACiAvKgogICogc3RhdGljIG5hdGl2ZSBieXRlW10gaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8oaW50LCBieXRlW10pCiAgKi8KLXN0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19pMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBrZXlSZWYpIHsKK3N0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19pMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwa2V5UmVmKSB7CiAgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CiAgICAgSk5JX1RSQUNFKCJpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyglcCkiLCBwa2V5KTsKIApAQCAtOTYyLDMyICsxNDcxLDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGludCBsZW4gPSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhwa2NzOC5nZXQoKSwgTlVMTCk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBqYnl0ZUFycmF5IGphdmFCeXRlcyA9IGVudi0+TmV3Qnl0ZUFycmF5KGxlbik7Ci0gICAgU2NvcGVkQnl0ZUFycmF5UlcgYnl0ZXMoZW52LCBqYXZhQnl0ZXMpOwotICAgIGlmIChieXRlcy5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGNoYXIqIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGJ5dGVzLmdldCgpKTsKLSAgICBpZiAoaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8ocGtjczguZ2V0KCksICZ0bXApIDwgMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgImkyZF9QS0NTOF9QUklWX0tFWV9JTkZPIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEpOSV9UUkFDRSgicGtleT0lcCBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyA9PiBzaXplPSVkIiwgcGtleSwgbGVuKTsKLSAgICByZXR1cm4gamF2YUJ5dGVzOworICAgIHJldHVybiBBU04xVG9CeXRlQXJyYXk8UEtDUzhfUFJJVl9LRVlfSU5GTz4oZW52LCBwa2NzOC5nZXQoKSwgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8pOwogfQogCiAvKgogICogc3RhdGljIG5hdGl2ZSBpbnQgZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8oYnl0ZVtdKQogICovCi1zdGF0aWMgamludCBOYXRpdmVDcnlwdG9fZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8oSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGVBcnJheSBrZXlKYXZhQnl0ZXMpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8oSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGVBcnJheSBrZXlKYXZhQnl0ZXMpIHsKICAgICBKTklfVFJBQ0UoImQyaV9QS0NTOF9QUklWX0tFWV9JTkZPKCVwKSIsIGtleUphdmFCeXRlcyk7CiAKICAgICBTY29wZWRCeXRlQXJyYXlSTyBieXRlcyhlbnYsIGtleUphdmFCeXRlcyk7CkBAIC0xMDEyLDEzICsxNTAyLDEzIEBACiAgICAgfQogCiAgICAgSk5JX1RSQUNFKCJieXRlcz0lcCBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyA9PiAlcCIsIGtleUphdmFCeXRlcywgcGtleS5nZXQoKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocGtleS5yZWxlYXNlKCkpOwogfQogCiAvKgogICogc3RhdGljIG5hdGl2ZSBieXRlW10gaTJkX1BVQktFWShpbnQpCiAgKi8KLXN0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19pMmRfUFVCS0VZKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgcGtleVJlZikgeworc3RhdGljIGpieXRlQXJyYXkgTmF0aXZlQ3J5cHRvX2kyZF9QVUJLRVkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikgewogICAgIEVWUF9QS0VZKiBwa2V5ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfUEtFWSo+KHBrZXlSZWYpOwogICAgIEpOSV9UUkFDRSgiaTJkX1BVQktFWSglcCkiLCBwa2V5KTsKIApAQCAtMTAyNywzNCArMTUxNywxMyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpbnQgbGVuID0gaTJkX1BVQktFWShwa2V5LCBOVUxMKTsKLSAgICBpZiAobGVuIDwgMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgImkyZF9QVUJLRVkiKTsKLSAgICAgICAgSk5JX1RSQUNFKCJpMmRfUFVCS0VZKCVwKSA9PiB0aHJldyBlcnJvciBtZWFzdXJpbmcga2V5IiwgcGtleSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGpieXRlQXJyYXkgamF2YUJ5dGVzID0gZW52LT5OZXdCeXRlQXJyYXkobGVuKTsKLSAgICBTY29wZWRCeXRlQXJyYXlSVyBieXRlcyhlbnYsIGphdmFCeXRlcyk7Ci0gICAgaWYgKGJ5dGVzLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgY2hhciogdG1wID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYnl0ZXMuZ2V0KCkpOwotICAgIGlmIChpMmRfUFVCS0VZKHBrZXksICZ0bXApIDwgMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgImkyZF9QVUJLRVkiKTsKLSAgICAgICAgSk5JX1RSQUNFKCJpMmRfUFVCS0VZKCVwKSA9PiB0aHJldyBlcnJvciBjb252ZXJ0aW5nIGtleSIsIHBrZXkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBKTklfVFJBQ0UoInBrZXk9JXAgaTJkX1BVQktFWSA9PiBzaXplPSVkIiwgcGtleSwgbGVuKTsKLSAgICByZXR1cm4gamF2YUJ5dGVzOworICAgIHJldHVybiBBU04xVG9CeXRlQXJyYXk8RVZQX1BLRVk+KGVudiwgcGtleSwgaTJkX1BVQktFWSk7CiB9CiAKIC8qCiAgKiBzdGF0aWMgbmF0aXZlIGludCBkMmlfUFVCS0VZKGJ5dGVbXSkKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX2QyaV9QVUJLRVkoSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGVBcnJheSBqYXZhQnl0ZXMpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fZDJpX1BVQktFWShKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZUFycmF5IGphdmFCeXRlcykgewogICAgIEpOSV9UUkFDRSgiZDJpX1BVQktFWSglcCkiLCBqYXZhQnl0ZXMpOwogCiAgICAgU2NvcGVkQnl0ZUFycmF5Uk8gYnl0ZXMoZW52LCBqYXZhQnl0ZXMpOwpAQCAtMTA3MSwxMyArMTU0MCwxMyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSk7CiB9CiAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgUlNBX2dlbmVyYXRlX2tleShpbnQgbW9kdWx1c0JpdHMsIGJ5dGVbXSBwdWJsaWNFeHBvbmVudCk7CiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19SU0FfZ2VuZXJhdGVfa2V5X2V4KEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgbW9kdWx1c0JpdHMsCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX1JTQV9nZW5lcmF0ZV9rZXlfZXgoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBtb2R1bHVzQml0cywKICAgICAgICAgamJ5dGVBcnJheSBwdWJsaWNFeHBvbmVudCkgewogICAgIEpOSV9UUkFDRSgiUlNBX2dlbmVyYXRlX2tleV9leCglZCwgJXApIiwgbW9kdWx1c0JpdHMsIHB1YmxpY0V4cG9uZW50KTsKIApAQCAtMTExMSwxMCArMTU4MCwxMCBAQAogCiAgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKHJzYSk7CiAgICAgSk5JX1RSQUNFKCJSU0FfZ2VuZXJhdGVfa2V5X2V4KG49JWQsIGU9JXApID0+ICVwIiwgbW9kdWx1c0JpdHMsIHB1YmxpY0V4cG9uZW50LCBwa2V5LmdldCgpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSk7CiB9CiAKLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19SU0Ffc2l6ZShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBrZXlSZWYpIHsKK3N0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19SU0Ffc2l6ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBwa2V5UmVmKSB7CiAgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CiAgICAgSk5JX1RSQUNFKCJSU0Ffc2l6ZSglcCkiLCBwa2V5KTsKIApAQCAtMTEzMiw3ICsxNjAxLDcgQEAKIAogc3RhdGljIGppbnQgUlNBX2NyeXB0X29wZXJhdGlvbihSU0FDcnlwdE9wZXJhdGlvbiBvcGVyYXRpb24sCiAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIEpOSUVudiogZW52LCBqaW50IGZsZW4sCi0gICAgICAgIGpieXRlQXJyYXkgZnJvbUphdmFCeXRlcywgamJ5dGVBcnJheSB0b0phdmFCeXRlcywgamludCBwa2V5UmVmLCBqaW50IHBhZGRpbmcpIHsKKyAgICAgICAgamJ5dGVBcnJheSBmcm9tSmF2YUJ5dGVzLCBqYnl0ZUFycmF5IHRvSmF2YUJ5dGVzLCBqbG9uZyBwa2V5UmVmLCBqaW50IHBhZGRpbmcpIHsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoIiVzKCVkLCAlcCwgJXAsICVwKSIsIGNhbGxlciwgZmxlbiwgZnJvbUphdmFCeXRlcywgdG9KYXZhQnl0ZXMsIHBrZXkpOwogCkBAIC0xMTY2LDIyICsxNjM1LDIyIEBACiB9CiAKIHN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19SU0FfcHJpdmF0ZV9lbmNyeXB0KEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgZmxlbiwKLSAgICAgICAgamJ5dGVBcnJheSBmcm9tSmF2YUJ5dGVzLCBqYnl0ZUFycmF5IHRvSmF2YUJ5dGVzLCBqaW50IHBrZXlSZWYsIGppbnQgcGFkZGluZykgeworICAgICAgICBqYnl0ZUFycmF5IGZyb21KYXZhQnl0ZXMsIGpieXRlQXJyYXkgdG9KYXZhQnl0ZXMsIGpsb25nIHBrZXlSZWYsIGppbnQgcGFkZGluZykgewogICAgIHJldHVybiBSU0FfY3J5cHRfb3BlcmF0aW9uKFJTQV9wcml2YXRlX2VuY3J5cHQsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGZsZW4sIGZyb21KYXZhQnl0ZXMsIHRvSmF2YUJ5dGVzLCBwa2V5UmVmLCBwYWRkaW5nKTsKIH0KIHN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19SU0FfcHVibGljX2RlY3J5cHQoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBmbGVuLAotICAgICAgICBqYnl0ZUFycmF5IGZyb21KYXZhQnl0ZXMsIGpieXRlQXJyYXkgdG9KYXZhQnl0ZXMsIGppbnQgcGtleVJlZiwgamludCBwYWRkaW5nKSB7CisgICAgICAgIGpieXRlQXJyYXkgZnJvbUphdmFCeXRlcywgamJ5dGVBcnJheSB0b0phdmFCeXRlcywgamxvbmcgcGtleVJlZiwgamludCBwYWRkaW5nKSB7CiAgICAgcmV0dXJuIFJTQV9jcnlwdF9vcGVyYXRpb24oUlNBX3B1YmxpY19kZWNyeXB0LCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBmbGVuLCBmcm9tSmF2YUJ5dGVzLCB0b0phdmFCeXRlcywgcGtleVJlZiwgcGFkZGluZyk7CiB9CiBzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fUlNBX3B1YmxpY19lbmNyeXB0KEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgZmxlbiwKLSAgICAgICAgamJ5dGVBcnJheSBmcm9tSmF2YUJ5dGVzLCBqYnl0ZUFycmF5IHRvSmF2YUJ5dGVzLCBqaW50IHBrZXlSZWYsIGppbnQgcGFkZGluZykgeworICAgICAgICBqYnl0ZUFycmF5IGZyb21KYXZhQnl0ZXMsIGpieXRlQXJyYXkgdG9KYXZhQnl0ZXMsIGpsb25nIHBrZXlSZWYsIGppbnQgcGFkZGluZykgewogICAgIHJldHVybiBSU0FfY3J5cHRfb3BlcmF0aW9uKFJTQV9wdWJsaWNfZW5jcnlwdCwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgZmxlbiwgZnJvbUphdmFCeXRlcywgdG9KYXZhQnl0ZXMsIHBrZXlSZWYsIHBhZGRpbmcpOwogfQogc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX1JTQV9wcml2YXRlX2RlY3J5cHQoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBmbGVuLAotICAgICAgICBqYnl0ZUFycmF5IGZyb21KYXZhQnl0ZXMsIGpieXRlQXJyYXkgdG9KYXZhQnl0ZXMsIGppbnQgcGtleVJlZiwgamludCBwYWRkaW5nKSB7CisgICAgICAgIGpieXRlQXJyYXkgZnJvbUphdmFCeXRlcywgamJ5dGVBcnJheSB0b0phdmFCeXRlcywgamxvbmcgcGtleVJlZiwgamludCBwYWRkaW5nKSB7CiAgICAgcmV0dXJuIFJTQV9jcnlwdF9vcGVyYXRpb24oUlNBX3ByaXZhdGVfZGVjcnlwdCwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgZmxlbiwgZnJvbUphdmFCeXRlcywgdG9KYXZhQnl0ZXMsIHBrZXlSZWYsIHBhZGRpbmcpOwogfQpAQCAtMTE4OSwxMyArMTY1OCwxOCBAQAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXVtdIGdldF9SU0FfcHVibGljX3BhcmFtcyhpbnQpOwogICovCi1zdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19nZXRfUlNBX3B1YmxpY19wYXJhbXMoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwa2V5UmVmKSB7CitzdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19nZXRfUlNBX3B1YmxpY19wYXJhbXMoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikgewogICAgIEVWUF9QS0VZKiBwa2V5ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfUEtFWSo+KHBrZXlSZWYpOwogICAgIEpOSV9UUkFDRSgiZ2V0X1JTQV9wdWJsaWNfcGFyYW1zKCVwKSIsIHBrZXkpOwogCisgICAgaWYgKHBrZXkgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgInBrZXkgPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBVbmlxdWVfUlNBIHJzYShFVlBfUEtFWV9nZXQxX1JTQShwa2V5KSk7CiAgICAgaWYgKHJzYS5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJnZXRfUlNBX3B1YmxpY19wYXJhbXMgZmFpbGVkIik7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiZ2V0X1JTQV9wdWJsaWNfcGFyYW1zIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTEyMjIsMTMgKzE2OTYsMTggQEAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW11bXSBnZXRfUlNBX3ByaXZhdGVfcGFyYW1zKGludCk7CiAgKi8KLXN0YXRpYyBqb2JqZWN0QXJyYXkgTmF0aXZlQ3J5cHRvX2dldF9SU0FfcHJpdmF0ZV9wYXJhbXMoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwa2V5UmVmKSB7CitzdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19nZXRfUlNBX3ByaXZhdGVfcGFyYW1zKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBrZXlSZWYpIHsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoImdldF9SU0FfcHVibGljX3BhcmFtcyglcCkiLCBwa2V5KTsKIAorICAgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJwa2V5ID09IG51bGwiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgVW5pcXVlX1JTQSByc2EoRVZQX1BLRVlfZ2V0MV9SU0EocGtleSkpOwogICAgIGlmIChyc2EuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiZ2V0X1JTQV9wdWJsaWNfcGFyYW1zIGZhaWxlZCIpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgImdldF9SU0FfcHVibGljX3BhcmFtcyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xMzA1LDcgKzE3ODQsNyBAQAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBEU0FfZ2VuZXJhdGVfa2V5KGludCwgYnl0ZVtdKTsKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0RTQV9nZW5lcmF0ZV9rZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwcmltZUJpdHMsCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0RTQV9nZW5lcmF0ZV9rZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwcmltZUJpdHMsCiAgICAgICAgIGpieXRlQXJyYXkgc2VlZEphdmFCeXRlcywgamJ5dGVBcnJheSBnQnl0ZXMsIGpieXRlQXJyYXkgcEJ5dGVzLCBqYnl0ZUFycmF5IHFCeXRlcykgewogICAgIEpOSV9UUkFDRSgiRFNBX2dlbmVyYXRlX2tleSglZCwgJXAsICVwLCAlcCwgJXApIiwgcHJpbWVCaXRzLCBzZWVkSmF2YUJ5dGVzLAogICAgICAgICAgICAgZ0J5dGVzLCBwQnl0ZXMsIHFCeXRlcyk7CkBAIC0xMzI4LDYgKzE4MDcsNyBAQAogICAgIGlmIChkc2EuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBKTklfVFJBQ0UoIkRTQV9nZW5lcmF0ZV9rZXkgZmFpbGVkIik7CiAgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgdG8gYWxsb2NhdGUgRFNBIGtleSIpOworICAgICAgICBmcmVlT3BlblNzbEVycm9yU3RhdGUoKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xMzY1LDMwICsxODQ1LDMxIEBACiAgICAgaWYgKHBrZXkuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBKTklfVFJBQ0UoIkRTQV9nZW5lcmF0ZV9rZXkgZmFpbGVkIik7CiAgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJOYXRpdmVDcnlwdG9fRFNBX2dlbmVyYXRlX2tleSBmYWlsZWQiKTsKKyAgICAgICAgZnJlZU9wZW5Tc2xFcnJvclN0YXRlKCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmIChFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXkuZ2V0KCksIGRzYS5nZXQoKSkgIT0gMSkgewogICAgICAgICBKTklfVFJBQ0UoIkRTQV9nZW5lcmF0ZV9rZXkgZmFpbGVkIik7Ci0gICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJOYXRpdmVDcnlwdG9fRFNBX2dlbmVyYXRlX2tleSBmYWlsZWQiKTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJOYXRpdmVDcnlwdG9fRFNBX2dlbmVyYXRlX2tleSBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKGRzYSk7CiAgICAgSk5JX1RSQUNFKCJEU0FfZ2VuZXJhdGVfa2V5KG49JWQsIGU9JXApID0+ICVwIiwgcHJpbWVCaXRzLCBzZWVkUHRyLmdldCgpLCBwa2V5LmdldCgpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBrZXkucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSk7CiB9CiAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW11bXSBnZXRfRFNBX3BhcmFtcyhpbnQpOwogICovCi1zdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19nZXRfRFNBX3BhcmFtcyhKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBrZXlSZWYpIHsKK3N0YXRpYyBqb2JqZWN0QXJyYXkgTmF0aXZlQ3J5cHRvX2dldF9EU0FfcGFyYW1zKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBrZXlSZWYpIHsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoImdldF9EU0FfcGFyYW1zKCVwKSIsIHBrZXkpOwogCiAgICAgVW5pcXVlX0RTQSBkc2EoRVZQX1BLRVlfZ2V0MV9EU0EocGtleSkpOwogICAgIGlmIChkc2EuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiZ2V0X0RTQV9wYXJhbXMgZmFpbGVkIik7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiZ2V0X0RTQV9wYXJhbXMgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMTM5NywyMyArMTg3OCwyOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBqYnl0ZUFycmF5IGcgPSBiaWdudW1Ub0FycmF5KGVudiwgZHNhLT5nLCAiZyIpOwotICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGRzYS0+ZyAhPSBOVUxMKSB7CisgICAgICAgIGpieXRlQXJyYXkgZyA9IGJpZ251bVRvQXJyYXkoZW52LCBkc2EtPmcsICJnIik7CisgICAgICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMCwgZyk7CiAgICAgfQotICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMCwgZyk7CiAKLSAgICBqYnl0ZUFycmF5IHAgPSBiaWdudW1Ub0FycmF5KGVudiwgZHNhLT5wLCAicCIpOwotICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGRzYS0+cCAhPSBOVUxMKSB7CisgICAgICAgIGpieXRlQXJyYXkgcCA9IGJpZ251bVRvQXJyYXkoZW52LCBkc2EtPnAsICJwIik7CisgICAgICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMSwgcCk7CiAgICAgfQotICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMSwgcCk7CiAKLSAgICBqYnl0ZUFycmF5IHEgPSBiaWdudW1Ub0FycmF5KGVudiwgZHNhLT5xLCAicSIpOwotICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGRzYS0+cSAhPSBOVUxMKSB7CisgICAgICAgIGpieXRlQXJyYXkgcSA9IGJpZ251bVRvQXJyYXkoZW52LCBkc2EtPnEsICJxIik7CisgICAgICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMiwgcSk7CiAgICAgfQotICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMiwgcSk7CiAKICAgICBpZiAoZHNhLT5wdWJfa2V5ICE9IE5VTEwpIHsKICAgICAgICAgamJ5dGVBcnJheSBwdWJfa2V5ID0gYmlnbnVtVG9BcnJheShlbnYsIGRzYS0+cHViX2tleSwgInB1Yl9rZXkiKTsKQEAgLTE0MzQsMTAgKzE5MjEsNjYyIEBACiAgICAgcmV0dXJuIGpvYTsKIH0KIAotLyoKLSAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX01EX0NUWF9kZXN0cm95KGludCkKKyNkZWZpbmUgRUNfQ1VSVkVfR0ZQIDEKKyNkZWZpbmUgRUNfQ1VSVkVfR0YyTSAyCisKKy8qKgorICogUmV0dXJuIGdyb3VwIHR5cGUgb3IgMCBpZiB1bmtub3duIGdyb3VwLgorICogRUNfR1JPVVBfR0ZQIG9yIEVDX0dST1VQX0dGMk0KICAqLwotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9NRF9DVFhfZGVzdHJveShKTklFbnYqLCBqY2xhc3MsIEVWUF9NRF9DVFgqIGN0eCkgeworc3RhdGljIGludCBnZXRfRUNfR1JPVVBfdHlwZShjb25zdCBFQ19HUk9VUCogZ3JvdXApCit7CisgICAgY29uc3QgRUNfTUVUSE9EKiBtZXRob2QgPSBFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApOworICAgIGlmIChtZXRob2QgPT0gRUNfR0ZwX25pc3RfbWV0aG9kKCkKKyAgICAgICAgICAgICAgICB8fCBtZXRob2QgPT0gRUNfR0ZwX21vbnRfbWV0aG9kKCkKKyAgICAgICAgICAgICAgICB8fCBtZXRob2QgPT0gRUNfR0ZwX3NpbXBsZV9tZXRob2QoKSkgeworICAgICAgICByZXR1cm4gRUNfQ1VSVkVfR0ZQOworICAgIH0gZWxzZSBpZiAobWV0aG9kID09IEVDX0dGMm1fc2ltcGxlX21ldGhvZCgpKSB7CisgICAgICAgIHJldHVybiBFQ19DVVJWRV9HRjJNOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgY3VydmVOYW1lSmF2YSkKK3sKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKCVwKSIsIGN1cnZlTmFtZUphdmEpOworCisgICAgU2NvcGVkVXRmQ2hhcnMgY3VydmVOYW1lKGVudiwgY3VydmVOYW1lSmF2YSk7CisgICAgaWYgKGN1cnZlTmFtZS5jX3N0cigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoJXMpIiwgY3VydmVOYW1lLmNfc3RyKCkpOworCisgICAgaW50IG5pZCA9IE9CSl9zbjJuaWQoY3VydmVOYW1lLmNfc3RyKCkpOworICAgIGlmIChuaWQgPT0gTklEX3VuZGVmKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoJXMpID0+IHVua25vd24gTklEIG5hbWUiLCBjdXJ2ZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEVDX0dST1VQKiBncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CisgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSglcykgPT4gdW5rbm93biBOSUQgJWQiLCBjdXJ2ZU5hbWUuY19zdHIoKSwgbmlkKTsKKyAgICAgICAgZnJlZU9wZW5Tc2xFcnJvclN0YXRlKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoJXMpID0+ICVwIiwgY3VydmVOYW1lLmNfc3RyKCksIGdyb3VwKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGdyb3VwKTsKK30KKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VDX0dST1VQX3NldF9hc24xX2ZsYWcoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYsCisgICAgICAgIGppbnQgZmxhZykKK3sKKyAgICBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyglcCwgJWQpIiwgZ3JvdXAsIGZsYWcpOworCisgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9zZXRfYXNuMV9mbGFnID0+IGdyb3VwID09IE5VTEwiKTsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJncm91cCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKGdyb3VwLCBmbGFnKTsKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX3NldF9hc24xX2ZsYWcoJXAsICVkKSA9PiBzdWNjZXNzIiwgZ3JvdXAsIGZsYWcpOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShKTklFbnYqIGVudiwgamNsYXNzLAorICAgICAgICBqbG9uZyBncm91cFJlZiwgamludCBmb3JtKQoreworICAgIEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCVwLCAlZCkiLCBncm91cCwgZm9ybSk7CisKKyAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0gPT4gZ3JvdXAgPT0gTlVMTCIpOworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImdyb3VwID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oZ3JvdXAsIHN0YXRpY19jYXN0PHBvaW50X2NvbnZlcnNpb25fZm9ybV90Pihmb3JtKSk7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCVwLCAlZCkgPT4gc3VjY2VzcyIsIGdyb3VwLCBmb3JtKTsKK30KKworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FQ19HUk9VUF9uZXdfY3VydmUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCB0eXBlLCBqYnl0ZUFycmF5IHBKYXZhLAorICAgICAgICBqYnl0ZUFycmF5IGFKYXZhLCBqYnl0ZUFycmF5IGJKYXZhKQoreworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfbmV3X2N1cnZlKCVkLCAlcCwgJXAsICVwKSIsIHR5cGUsIHBKYXZhLCBhSmF2YSwgYkphdmEpOworCisgICAgQklHTlVNKiBwUmVmOworICAgIGlmICghYXJyYXlUb0JpZ251bShlbnYsIHBKYXZhLCAmcFJlZikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFVuaXF1ZV9CSUdOVU0gcChwUmVmKTsKKworICAgIEJJR05VTSogYVJlZjsKKyAgICBpZiAoIWFycmF5VG9CaWdudW0oZW52LCBhSmF2YSwgJmFSZWYpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBVbmlxdWVfQklHTlVNIGEoYVJlZik7CisKKyAgICBCSUdOVU0qIGJSZWY7CisgICAgaWYgKCFhcnJheVRvQmlnbnVtKGVudiwgYkphdmEsICZiUmVmKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVW5pcXVlX0JJR05VTSBiKGJSZWYpOworCisgICAgRUNfR1JPVVAqIGdyb3VwOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRUNfQ1VSVkVfR0ZQOgorICAgICAgICBncm91cCA9IEVDX0dST1VQX25ld19jdXJ2ZV9HRnAocC5nZXQoKSwgYS5nZXQoKSwgYi5nZXQoKSwgKEJOX0NUWCopIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVDX0NVUlZFX0dGMk06CisgICAgICAgIGdyb3VwID0gRUNfR1JPVVBfbmV3X2N1cnZlX0dGMm0ocC5nZXQoKSwgYS5nZXQoKSwgYi5nZXQoKSwgKEJOX0NUWCopIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiaW52YWxpZCBncm91cCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0dST1VQX25ld19jdXJ2ZSIpOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfbmV3X2N1cnZlKCVkLCAlcCwgJXAsICVwKSA9PiAlcCIsIHR5cGUsIHBKYXZhLCBhSmF2YSwgYkphdmEsIGdyb3VwKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGdyb3VwKTsKK30KKworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FQ19HUk9VUF9kdXAoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYpIHsKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfZHVwKCVwKSIsIGdyb3VwKTsKKworICAgIGlmIChncm91cCA9PSBOVUxMKSB7CisgICAgICAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2R1cCA9PiBncm91cCA9PSBOVUxMIik7CisgICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImdyb3VwID09IE5VTEwiKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICB9CisKKyAgICAgRUNfR1JPVVAqIGdyb3VwRHVwID0gRUNfR1JPVVBfZHVwKGdyb3VwKTsKKyAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9kdXAoJXApID0+ICVwIiwgZ3JvdXAsIGdyb3VwRHVwKTsKKyAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihncm91cER1cCk7Cit9CisKK3N0YXRpYyBqc3RyaW5nIE5hdGl2ZUNyeXB0b19FQ19HUk9VUF9nZXRfY3VydmVfbmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBncm91cFJlZikgeworICAgIGNvbnN0IEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSglcCkiLCBncm91cCk7CisKKyAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lID0+IGdyb3VwID09IE5VTEwiKTsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJncm91cCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBuaWQgPSBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShncm91cCk7CisgICAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSglcCkgPT4gdW5uYW1lZCBjdXJ2ZSIsIGdyb3VwLCBuaWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBzaG9ydE5hbWUgPSBPQkpfbmlkMnNuKG5pZCk7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSglcCkgPT4gXCIlc1wiIiwgZ3JvdXAsIHNob3J0TmFtZSk7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKHNob3J0TmFtZSk7Cit9CisKK3N0YXRpYyBqb2JqZWN0QXJyYXkgTmF0aXZlQ3J5cHRvX0VDX0dST1VQX2dldF9jdXJ2ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBncm91cFJlZikKK3sKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfZ2V0X2N1cnZlKCVwKSIsIGdyb3VwKTsKKworICAgIFVuaXF1ZV9CSUdOVU0gcChCTl9uZXcoKSk7CisgICAgVW5pcXVlX0JJR05VTSBhKEJOX25ldygpKTsKKyAgICBVbmlxdWVfQklHTlVNIGIoQk5fbmV3KCkpOworCisgICAgaW50IHJldDsKKyAgICBzd2l0Y2ggKGdldF9FQ19HUk9VUF90eXBlKGdyb3VwKSkgeworICAgIGNhc2UgRUNfQ1VSVkVfR0ZQOgorICAgICAgICByZXQgPSBFQ19HUk9VUF9nZXRfY3VydmVfR0ZwKGdyb3VwLCBwLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCAoQk5fQ1RYKikgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUNfQ1VSVkVfR0YyTToKKyAgICAgICAgcmV0ID0gRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0oZ3JvdXAsIHAuZ2V0KCksIGEuZ2V0KCksIGIuZ2V0KCksIChCTl9DVFgqKU5VTEwpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiaW52YWxpZCBncm91cCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHJldCAhPSAxKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfR1JPVVBfZ2V0X2N1cnZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpvYmplY3RBcnJheSBqb2EgPSBlbnYtPk5ld09iamVjdEFycmF5KDMsIEpuaUNvbnN0YW50czo6Ynl0ZUFycmF5Q2xhc3MsIE5VTEwpOworICAgIGlmIChqb2EgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqYnl0ZUFycmF5IHBBcnJheSA9IGJpZ251bVRvQXJyYXkoZW52LCBwLmdldCgpLCAicCIpOworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgMCwgcEFycmF5KTsKKworICAgIGpieXRlQXJyYXkgYUFycmF5ID0gYmlnbnVtVG9BcnJheShlbnYsIGEuZ2V0KCksICJhIik7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoam9hLCAxLCBhQXJyYXkpOworCisgICAgamJ5dGVBcnJheSBiQXJyYXkgPSBiaWdudW1Ub0FycmF5KGVudiwgYi5nZXQoKSwgImIiKTsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqb2EsIDIsIGJBcnJheSk7CisKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9jdXJ2ZSglcCkgPT4gJXAiLCBncm91cCwgam9hKTsKKyAgICByZXR1cm4gam9hOworfQorCitzdGF0aWMgamJ5dGVBcnJheSBOYXRpdmVDcnlwdG9fRUNfR1JPVVBfZ2V0X29yZGVyKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGdyb3VwUmVmKQoreworICAgIGNvbnN0IEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfb3JkZXIoJXApIiwgZ3JvdXApOworCisgICAgVW5pcXVlX0JJR05VTSBvcmRlcihCTl9uZXcoKSk7CisgICAgaWYgKG9yZGVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfb3JkZXIoJXApID0+IGNhbid0IGNyZWF0ZSBCTiIsIGdyb3VwKTsKKyAgICAgICAgam5pVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIkJOX25ldyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlci5nZXQoKSwgTlVMTCkgIT0gMSkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9vcmRlciglcCkgPT4gdGhyZXcgZXJyb3IiLCBncm91cCk7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfR1JPVVBfZ2V0X29yZGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpieXRlQXJyYXkgb3JkZXJBcnJheSA9IGJpZ251bVRvQXJyYXkoZW52LCBvcmRlci5nZXQoKSwgIm9yZGVyIik7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9vcmRlciglcCkgPT4gJXAiLCBncm91cCwgb3JkZXJBcnJheSk7CisgICAgcmV0dXJuIG9yZGVyQXJyYXk7Cit9CisKK3N0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19FQ19HUk9VUF9nZXRfY29mYWN0b3IoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYpCit7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwUmVmKTsKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9jb2ZhY3RvciglcCkiLCBncm91cCk7CisKKyAgICBVbmlxdWVfQklHTlVNIGNvZmFjdG9yKEJOX25ldygpKTsKKyAgICBpZiAoY29mYWN0b3IuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9jb2ZhY3RvciglcCkgPT4gY2FuJ3QgY3JlYXRlIEJOIiwgZ3JvdXApOworICAgICAgICBqbmlUaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCAiQk5fbmV3Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChFQ19HUk9VUF9nZXRfY29mYWN0b3IoZ3JvdXAsIGNvZmFjdG9yLmdldCgpLCBOVUxMKSAhPSAxKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKCVwKSA9PiB0aHJldyBlcnJvciIsIGdyb3VwKTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFQ19HUk9VUF9nZXRfY29mYWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgamJ5dGVBcnJheSBjb2ZhY3RvckFycmF5ID0gYmlnbnVtVG9BcnJheShlbnYsIGNvZmFjdG9yLmdldCgpLCAiY29mYWN0b3IiKTsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKCVwKSA9PiAlcCIsIGdyb3VwLCBjb2ZhY3RvckFycmF5KTsKKyAgICByZXR1cm4gY29mYWN0b3JBcnJheTsKK30KKworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX2dldF9FQ19HUk9VUF90eXBlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGdyb3VwUmVmKQoreworICAgIGNvbnN0IEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJnZXRfRUNfR1JPVVBfdHlwZSglcCkiLCBncm91cCk7CisKKyAgICBpbnQgdHlwZSA9IGdldF9FQ19HUk9VUF90eXBlKGdyb3VwKTsKKyAgICBpZiAodHlwZSA9PSAwKSB7CisgICAgICAgIEpOSV9UUkFDRSgiZ2V0X0VDX0dST1VQX3R5cGUoJXApID0+IGN1cnZlIHR5cGUiLCBncm91cCk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJ1bmtub3duIGN1cnZlIHR5cGUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBKTklfVFJBQ0UoImdldF9FQ19HUk9VUF90eXBlKCVwKSA9PiAlZCIsIGdyb3VwLCB0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FQ19HUk9VUF9jbGVhcl9mcmVlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGdyb3VwUmVmKQoreworICAgIEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9jbGVhcl9mcmVlKCVwKSIsIGdyb3VwKTsKKworICAgIGlmIChncm91cCA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfY2xlYXJfZnJlZSA9PiBncm91cCA9PSBOVUxMIik7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiZ3JvdXAgPT0gTlVMTCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRUNfR1JPVVBfY2xlYXJfZnJlZShncm91cCk7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9jbGVhcl9mcmVlKCVwKSA9PiBzdWNjZXNzIiwgZ3JvdXApOworfQorCitzdGF0aWMgamJvb2xlYW4gTmF0aXZlQ3J5cHRvX0VDX0dST1VQX2NtcChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBncm91cDFSZWYsIGpsb25nIGdyb3VwMlJlZikKK3sKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAxID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwMVJlZik7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfR1JPVVAqPihncm91cDJSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfY21wKCVwLCAlcCkiLCBncm91cDEsIGdyb3VwMik7CisKKyAgICBpZiAoZ3JvdXAxID09IE5VTEwgfHwgZ3JvdXAyID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9jbXAoJXAsICVwKSA9PiBncm91cDEgPT0gbnVsbCB8fCBncm91cDIgPT0gbnVsbCIsIGdyb3VwMSwgZ3JvdXAyKTsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJncm91cDEgPT0gbnVsbCB8fCBncm91cDIgPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJldCA9IEVDX0dST1VQX2NtcChncm91cDEsIGdyb3VwMiwgKEJOX0NUWCopTlVMTCk7CisKKyAgICBKTklfVFJBQ0UoIkVDUF9HUk9VUF9jbXAoJXAsICVwKSA9PiAlZCIsIGdyb3VwMSwgZ3JvdXAyLCByZXQpOworICAgIHJldHVybiByZXQgPT0gMDsKK30KKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VDX0dST1VQX3NldF9nZW5lcmF0b3IoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYsIGpsb25nIHBvaW50UmVmLCBqYnl0ZUFycmF5IG5qYXZhQnl0ZXMsIGpieXRlQXJyYXkgaGphdmFCeXRlcykKK3sKKyAgICBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIGNvbnN0IEVDX1BPSU5UKiBwb2ludCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfUE9JTlQqPihwb2ludFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKCVwLCAlcCwgJXAsICVwKSIsIGdyb3VwLCBwb2ludCwgbmphdmFCeXRlcywgaGphdmFCeXRlcyk7CisKKyAgICBpZiAoZ3JvdXAgPT0gTlVMTCB8fCBwb2ludCA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfR1JPVVBfc2V0X2dlbmVyYXRvciglcCwgJXAsICVwLCAlcCkgPT4gZ3JvdXAgPT0gbnVsbCB8fCBwb2ludCA9PSBudWxsIiwKKyAgICAgICAgICAgICAgICBncm91cCwgcG9pbnQsIG5qYXZhQnl0ZXMsIGhqYXZhQnl0ZXMpOworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImdyb3VwID09IG51bGwgfHwgcG9pbnQgPT0gbnVsbCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQklHTlVNKiBuUmVmOworICAgIGlmICghYXJyYXlUb0JpZ251bShlbnYsIG5qYXZhQnl0ZXMsICZuUmVmKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFVuaXF1ZV9CSUdOVU0gbihuUmVmKTsKKworICAgIEJJR05VTSogaFJlZjsKKyAgICBpZiAoIWFycmF5VG9CaWdudW0oZW52LCBoamF2YUJ5dGVzLCAmaFJlZikpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBVbmlxdWVfQklHTlVNIGgoaFJlZik7CisKKyAgICBpbnQgcmV0ID0gRUNfR1JPVVBfc2V0X2dlbmVyYXRvcihncm91cCwgcG9pbnQsIG4uZ2V0KCksIGguZ2V0KCkpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0dST1VQX3NldF9nZW5lcmF0b3IiKTsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX3NldF9nZW5lcmF0b3IoJXAsICVwLCAlcCwgJXApID0+ICVkIiwgZ3JvdXAsIHBvaW50LCBuamF2YUJ5dGVzLCBoamF2YUJ5dGVzLCByZXQpOworfQorCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VDX0dST1VQX2dldF9nZW5lcmF0b3IoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYpCit7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwUmVmKTsKKyAgICBKTklfVFJBQ0UoIkVDX0dST1VQX2dldF9nZW5lcmF0b3IoJXApIiwgZ3JvdXApOworCisgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9nZXRfZ2VuZXJhdG9yKCVwKSA9PiBncm91cCA9PSBudWxsIiwgZ3JvdXApOworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImdyb3VwID09IG51bGwiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3QgRUNfUE9JTlQqIGdlbmVyYXRvciA9IEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKTsKKworICAgIFVuaXF1ZV9FQ19QT0lOVCBkdXAoRUNfUE9JTlRfZHVwKGdlbmVyYXRvciwgZ3JvdXApKTsKKyAgICBpZiAoZHVwLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKCVwKSA9PiBvb20gZXJyb3IiLCBncm91cCk7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJ1bmFibGUgdG8gZHVwZSBnZW5lcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgSk5JX1RSQUNFKCJFQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKCVwKSA9PiAlcCIsIGdyb3VwLCBkdXAuZ2V0KCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVwLnJlbGVhc2UoKSk7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRUNfUE9JTlRfbmV3KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGdyb3VwUmVmKQoreworICAgIGNvbnN0IEVDX0dST1VQKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfR1JPVVAqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9uZXcoJXApIiwgZ3JvdXApOworCisgICAgaWYgKGdyb3VwID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9uZXcoJXApID0+IGdyb3VwID09IG51bGwiLCBncm91cCk7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiZ3JvdXAgPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFQ19QT0lOVCogcG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOworICAgIGlmIChwb2ludCA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgY3JlYXRlIGFuIEVDX1BPSU5UIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocG9pbnQpOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRUNfUE9JTlRfY2xlYXJfZnJlZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBncm91cFJlZikgeworICAgIEVDX1BPSU5UKiBncm91cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RUNfUE9JTlQqPihncm91cFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9jbGVhcl9mcmVlKCVwKSIsIGdyb3VwKTsKKworICAgIGlmIChncm91cCA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfUE9JTlRfY2xlYXJfZnJlZSA9PiBncm91cCA9PSBOVUxMIik7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiZ3JvdXAgPT0gTlVMTCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRUNfUE9JTlRfY2xlYXJfZnJlZShncm91cCk7CisgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9jbGVhcl9mcmVlKCVwKSA9PiBzdWNjZXNzIiwgZ3JvdXApOworfQorCitzdGF0aWMgamJvb2xlYW4gTmF0aXZlQ3J5cHRvX0VDX1BPSU5UX2NtcChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBncm91cFJlZiwgamxvbmcgcG9pbnQxUmVmLCBqbG9uZyBwb2ludDJSZWYpCit7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwUmVmKTsKKyAgICBjb25zdCBFQ19QT0lOVCogcG9pbnQxID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19QT0lOVCo+KHBvaW50MVJlZik7CisgICAgY29uc3QgRUNfUE9JTlQqIHBvaW50MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfUE9JTlQqPihwb2ludDJSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfUE9JTlRfY21wKCVwLCAlcCwgJXApIiwgZ3JvdXAsIHBvaW50MSwgcG9pbnQyKTsKKworICAgIGlmIChncm91cCA9PSBOVUxMIHx8IHBvaW50MSA9PSBOVUxMIHx8IHBvaW50MiA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfUE9JTlRfY21wKCVwLCAlcCwgJXApID0+IGdyb3VwID09IG51bGwgfHwgcG9pbnQxID09IG51bGwgfHwgcG9pbnQyID09IG51bGwiLAorICAgICAgICAgICAgICAgIGdyb3VwLCBwb2ludDEsIHBvaW50Mik7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiZ3JvdXAgPT0gbnVsbCB8fCBwb2ludDEgPT0gbnVsbCB8fCBwb2ludDIgPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJldCA9IEVDX1BPSU5UX2NtcChncm91cCwgcG9pbnQxLCBwb2ludDIsIChCTl9DVFgqKU5VTEwpOworCisgICAgSk5JX1RSQUNFKCJFQ1BfR1JPVVBfY21wKCVwLCAlcCkgPT4gJWQiLCBwb2ludDEsIHBvaW50MiwgcmV0KTsKKyAgICByZXR1cm4gcmV0ID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKEpOSUVudiogZW52LCBqY2xhc3MsCisgICAgICAgIGpsb25nIGdyb3VwUmVmLCBqbG9uZyBwb2ludFJlZiwgamJ5dGVBcnJheSB4amF2YUJ5dGVzLCBqYnl0ZUFycmF5IHlqYXZhQnl0ZXMpCit7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwUmVmKTsKKyAgICBFQ19QT0lOVCogcG9pbnQgPSByZWludGVycHJldF9jYXN0PEVDX1BPSU5UKj4ocG9pbnRSZWYpOworICAgIEpOSV9UUkFDRSgiRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlcyglcCwgJXAsICVwLCAlcCkiLCBncm91cCwgcG9pbnQsIHhqYXZhQnl0ZXMsCisgICAgICAgICAgICB5amF2YUJ5dGVzKTsKKworICAgIGlmIChncm91cCA9PSBOVUxMIHx8IHBvaW50ID09IE5VTEwpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKCVwLCAlcCwgJXAsICVwKSA9PiBncm91cCA9PSBudWxsIHx8IHBvaW50ID09IG51bGwiLAorICAgICAgICAgICAgICAgIGdyb3VwLCBwb2ludCwgeGphdmFCeXRlcywgeWphdmFCeXRlcyk7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiZ3JvdXAgPT0gbnVsbCB8fCBwb2ludCA9PSBudWxsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCSUdOVU0qIHhSZWY7CisgICAgaWYgKCFhcnJheVRvQmlnbnVtKGVudiwgeGphdmFCeXRlcywgJnhSZWYpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVW5pcXVlX0JJR05VTSB4KHhSZWYpOworCisgICAgQklHTlVNKiB5UmVmOworICAgIGlmICghYXJyYXlUb0JpZ251bShlbnYsIHlqYXZhQnl0ZXMsICZ5UmVmKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFVuaXF1ZV9CSUdOVU0geSh5UmVmKTsKKworICAgIGludCByZXQ7CisgICAgc3dpdGNoIChnZXRfRUNfR1JPVVBfdHlwZShncm91cCkpIHsKKyAgICBjYXNlIEVDX0NVUlZFX0dGUDoKKyAgICAgICAgcmV0ID0gRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LmdldCgpLCB5LmdldCgpLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFQ19DVVJWRV9HRjJNOgorICAgICAgICByZXQgPSBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oZ3JvdXAsIHBvaW50LCB4LmdldCgpLCB5LmdldCgpLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImludmFsaWQgY3VydmUgdHlwZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJldCAhPSAxKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlcyIpOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlcyglcCwgJXAsICVwLCAlcCkgPT4gJWQiLCBncm91cCwgcG9pbnQsCisgICAgICAgICAgICB4amF2YUJ5dGVzLCB5amF2YUJ5dGVzLCByZXQpOworfQorCitzdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19FQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGdyb3VwUmVmLAorICAgICAgICBqbG9uZyBwb2ludFJlZikKK3sKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVDX0dST1VQKj4oZ3JvdXBSZWYpOworICAgIGNvbnN0IEVDX1BPSU5UKiBwb2ludCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRUNfUE9JTlQqPihwb2ludFJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKCVwLCAlcCkiLCBncm91cCwgcG9pbnQpOworCisgICAgVW5pcXVlX0JJR05VTSB4KEJOX25ldygpKTsKKyAgICBVbmlxdWVfQklHTlVNIHkoQk5fbmV3KCkpOworCisgICAgaW50IHJldDsKKyAgICBzd2l0Y2ggKGdldF9FQ19HUk9VUF90eXBlKGdyb3VwKSkgeworICAgIGNhc2UgRUNfQ1VSVkVfR0ZQOgorICAgICAgICByZXQgPSBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHguZ2V0KCksIHkuZ2V0KCksIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVDX0NVUlZFX0dGMk06CisgICAgICAgIHJldCA9IEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybShncm91cCwgcG9pbnQsIHguZ2V0KCksIHkuZ2V0KCksIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiaW52YWxpZCBjdXJ2ZSB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmV0ICE9IDEpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKCVwLCAlcCkiLCBncm91cCwgcG9pbnQpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam9iamVjdEFycmF5IGpvYSA9IGVudi0+TmV3T2JqZWN0QXJyYXkoMiwgSm5pQ29uc3RhbnRzOjpieXRlQXJyYXlDbGFzcywgTlVMTCk7CisgICAgaWYgKGpvYSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpieXRlQXJyYXkgeEJ5dGVzID0gYmlnbnVtVG9BcnJheShlbnYsIHguZ2V0KCksICJ4Iik7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoam9hLCAwLCB4Qnl0ZXMpOworCisgICAgamJ5dGVBcnJheSB5Qnl0ZXMgPSBiaWdudW1Ub0FycmF5KGVudiwgeS5nZXQoKSwgInkiKTsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqb2EsIDEsIHlCeXRlcyk7CisKKyAgICBKTklfVFJBQ0UoIkVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoJXAsICVwKSA9PiAlcCIsIGdyb3VwLCBwb2ludCwgam9hKTsKKyAgICByZXR1cm4gam9hOworfQorCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VDX0tFWV9nZW5lcmF0ZV9rZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZ3JvdXBSZWYpCit7CisgICAgY29uc3QgRUNfR1JPVVAqIGdyb3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFQ19HUk9VUCo+KGdyb3VwUmVmKTsKKyAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZW5lcmF0ZV9rZXkoJXApIiwgZ3JvdXApOworCisgICAgVW5pcXVlX0VDX0tFWSBlY2tleShFQ19LRVlfbmV3KCkpOworICAgIGlmIChlY2tleS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfS0VZX2dlbmVyYXRlX2tleSglcCkgPT4gRUNfS0VZX25ldygpIG9vbSIsIGdyb3VwKTsKKyAgICAgICAgam5pVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIlVuYWJsZSB0byBjcmVhdGUgYW4gRUNfS0VZIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChFQ19LRVlfc2V0X2dyb3VwKGVja2V5LmdldCgpLCBncm91cCkgIT0gMSkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZW5lcmF0ZV9rZXkoJXApID0+IEVDX0tFWV9zZXRfZ3JvdXAgZXJyb3IiLCBncm91cCk7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfS0VZX3NldF9ncm91cCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoRUNfS0VZX2dlbmVyYXRlX2tleShlY2tleS5nZXQoKSkgIT0gMSkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZW5lcmF0ZV9rZXkoJXApID0+IEVDX0tFWV9nZW5lcmF0ZV9rZXkgZXJyb3IiLCBncm91cCk7CisgICAgICAgIHRocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkoZW52LCAiRUNfS0VZX3NldF9ncm91cCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBVbmlxdWVfRVZQX1BLRVkgcGtleShFVlBfUEtFWV9uZXcoKSk7CisgICAgaWYgKHBrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZW5lcmF0ZV9rZXkoJXApID0+IHRocmV3IGVycm9yIiwgZ3JvdXApOworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVDX0tFWV9nZW5lcmF0ZV9rZXkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXkuZ2V0KCksIGVja2V5LmdldCgpKSAhPSAxKSB7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJFVlBfUEtFWV9hc3NpZ25fRUNfS0VZIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKGVja2V5KTsKKworICAgIEpOSV9UUkFDRSgiRUNfS0VZX2dlbmVyYXRlX2tleSglcCkgPT4gJXAiLCBncm91cCwgcGtleS5nZXQoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihwa2V5LnJlbGVhc2UoKSk7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRUNfS0VZX2dldDBfZ3JvdXAoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikKK3sKKyAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKKyAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZXQwX2dyb3VwKCVwKSIsIHBrZXkpOworCisgICAgaWYgKHBrZXkgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgInBrZXkgPT0gbnVsbCIpOworICAgICAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZXQwX2dyb3VwKCVwKSA9PiBwa2V5ID09IG51bGwiLCBwa2V5KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKEVWUF9QS0VZX3R5cGUocGtleS0+dHlwZSkgIT0gRVZQX1BLRVlfRUMpIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIm5vdCBFQyBrZXkiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJFQ19LRVlfZ2V0MF9ncm91cCglcCkgPT4gbm90IEVDIGtleSAodHlwZSA9PSAlZCkiLCBwa2V5LAorICAgICAgICAgICAgICAgIEVWUF9QS0VZX3R5cGUocGtleS0+dHlwZSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBFQ19HUk9VUCogZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChwa2V5LT5wa2V5LmVjKTsKKyAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZXQwX2dyb3VwKCVwKSA9PiAlcCIsIHBrZXksIGdyb3VwKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGdyb3VwKTsKK30KKworc3RhdGljIGpieXRlQXJyYXkgTmF0aXZlQ3J5cHRvX0VDX0tFWV9nZXRfcHJpdmF0ZV9rZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgcGtleVJlZikKK3sKKyAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKKyAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZXRfcHJpdmF0ZV9rZXkoJXApIiwgcGtleSk7CisKKyAgICBVbmlxdWVfRUNfS0VZIGVja2V5KEVWUF9QS0VZX2dldDFfRUNfS0VZKHBrZXkpKTsKKyAgICBpZiAoZWNrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9QS0VZX2dldDFfRUNfS0VZIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IEJJR05VTSAqcHJpdmtleSA9IEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGVja2V5LmdldCgpKTsKKworICAgIGpieXRlQXJyYXkgcHJpdkJ5dGVzID0gYmlnbnVtVG9BcnJheShlbnYsIHByaXZrZXksICJwcml2a2V5Iik7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBKTklfVFJBQ0UoIkVDX0tFWV9nZXRfcHJpdmF0ZV9rZXkoJXApID0+IHRocmV3IGVycm9yIiwgcGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfS0VZX2dldF9wcml2YXRlX2tleSglcCkgPT4gJXAiLCBwa2V5LCBwcml2Qnl0ZXMpOworICAgIHJldHVybiBwcml2Qnl0ZXM7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRUNfS0VZX2dldF9wdWJsaWNfa2V5KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHBrZXlSZWYpCit7CisgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CisgICAgSk5JX1RSQUNFKCJFQ19LRVlfZ2V0X3B1YmxpY19rZXkoJXApIiwgcGtleSk7CisKKyAgICBVbmlxdWVfRUNfS0VZIGVja2V5KEVWUF9QS0VZX2dldDFfRUNfS0VZKHBrZXkpKTsKKyAgICBpZiAoZWNrZXkuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9QS0VZX2dldDFfRUNfS0VZIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFVuaXF1ZV9FQ19QT0lOVCBkdXAoRUNfUE9JTlRfZHVwKEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoZWNrZXkuZ2V0KCkpLAorICAgICAgICAgICAgRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkuZ2V0KCkpKSk7CisgICAgaWYgKGR1cC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEpOSV9UUkFDRSgiRUNfS0VZX2dldF9wdWJsaWNfa2V5KCVwKSA9PiBjYW4ndCBkdXAgcHVibGljIGtleSIsIHBrZXkpOworICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiRUNfUE9JTlRfZHVwIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRUNfS0VZX2dldF9wdWJsaWNfa2V5KCVwKSA9PiAlcCIsIHBrZXksIGR1cC5nZXQoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdXAucmVsZWFzZSgpKTsKK30KKworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FVlBfTURfQ1RYX2NyZWF0ZShKTklFbnYqIGVudiwgamNsYXNzKSB7CisgICAgSk5JX1RSQUNFKCJFVlBfTURfQ1RYX2NyZWF0ZSgpIik7CisKKyAgICBVbmlxdWVfRVZQX01EX0NUWCBjdHgoRVZQX01EX0NUWF9jcmVhdGUoKSk7CisgICAgaWYgKGN0eC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgY3JlYXRlIGEgRVZQX01EX0NUWCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVWUF9NRF9DVFhfY3JlYXRlKCkgPT4gJXAiLCBjdHguZ2V0KCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY3R4LnJlbGVhc2UoKSk7Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfTURfQ1RYX2luaXQoSk5JRW52KiwgamNsYXNzLCBqbG9uZyBjdHhSZWYpIHsKKyAgICBFVlBfTURfQ1RYKiBjdHggPSByZWludGVycHJldF9jYXN0PEVWUF9NRF9DVFgqPihjdHhSZWYpOworICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX0VWUF9NRF9DVFhfaW5pdCglcCkiLCBjdHgpOworCisgICAgaWYgKGN0eCAhPSBOVUxMKSB7CisgICAgICAgIEVWUF9NRF9DVFhfaW5pdChjdHgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9NRF9DVFhfZGVzdHJveShKTklFbnYqLCBqY2xhc3MsIGpsb25nIGN0eFJlZikgeworICAgIEVWUF9NRF9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX01EX0NUWF9kZXN0cm95KCVwKSIsIGN0eCk7CiAKICAgICBpZiAoY3R4ICE9IE5VTEwpIHsKQEAgLTE0NDUsMTQgKzI1ODQsMTIgQEAKICAgICB9CiB9CiAKLS8qCi0gKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX01EX0NUWF9jb3B5KGludCkKLSAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9NRF9DVFhfY29weShKTklFbnYqIGVudiwgamNsYXNzLCBFVlBfTURfQ1RYKiBjdHgpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRVZQX01EX0NUWF9jb3B5KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGN0eFJlZikgeworICAgIEVWUF9NRF9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX01EX0NUWF9jb3B5KCVwKSIsIGN0eCk7CiAKICAgICBpZiAoY3R4ID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsIE5VTEwpOworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImN0eCA9PSBudWxsIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMTQ2NywyMyArMjYwNCwyNCBAQAogICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICBFVlBfTURfQ1RYX2Rlc3Ryb3koY29weSk7CiAgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJVbmFibGUgdG8gY29weSBFVlBfTURfQ1RYIik7CisgICAgICAgIGZyZWVPcGVuU3NsRXJyb3JTdGF0ZSgpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19FVlBfTURfQ1RYX2NvcHkoJXApID0+ICVwIiwgY3R4LCBjb3B5KTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNvcHkpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNvcHkpOwogfQogCiAvKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9EaWdlc3RGaW5hbChpbnQsIGJ5dGVbXSwgaW50KQogICovCi1zdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX0RpZ2VzdEZpbmFsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgY3R4UmVmLAorc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9EaWdlc3RGaW5hbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlQXJyYXkgaGFzaCwgamludCBvZmZzZXQpIHsKICAgICBFVlBfTURfQ1RYKiBjdHggPSByZWludGVycHJldF9jYXN0PEVWUF9NRF9DVFgqPihjdHhSZWYpOwogICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX0VWUF9EaWdlc3RGaW5hbCglcCwgJXAsICVkKSIsIGN0eCwgaGFzaCwgb2Zmc2V0KTsKIAogICAgIGlmIChjdHggPT0gTlVMTCB8fCBoYXNoID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsIE5VTEwpOworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImN0eCA9PSBudWxsIHx8IGhhc2ggPT0gbnVsbCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xNTA3LDcgKzI2NDUsNyBAQAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfRGlnZXN0SW5pdChpbnQpCiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfRGlnZXN0SW5pdChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGV2cE1kUmVmKSB7CitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VWUF9EaWdlc3RJbml0KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGV2cE1kUmVmKSB7CiAgICAgRVZQX01EKiBldnBfbWQgPSByZWludGVycHJldF9jYXN0PEVWUF9NRCo+KGV2cE1kUmVmKTsKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19FVlBfRGlnZXN0SW5pdCglcCkiLCBldnBfbWQpOwogCkBAIC0xNTMwLDEzICsyNjY4LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGN0eC5yZWxlYXNlKCkpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGN0eC5yZWxlYXNlKCkpOwogfQogCiAvKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9nZXRfZGlnZXN0YnluYW1lKGphdmEubGFuZy5TdHJpbmcpCiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfZ2V0X2RpZ2VzdGJ5bmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGFsZ29yaXRobSkgeworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FVlBfZ2V0X2RpZ2VzdGJ5bmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGFsZ29yaXRobSkgewogICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX0VWUF9nZXRfZGlnZXN0YnluYW1lKCVwKSIsIGFsZ29yaXRobSk7CiAKICAgICBpZiAoYWxnb3JpdGhtID09IE5VTEwpIHsKQEAgLTE1NTcsMTMgKzI2OTUsMTQgQEAKICAgICB9CiAKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSglcykgPT4gJXAiLCBhbGdvcml0aG1DaGFycy5jX3N0cigpLCBldnBfbWQpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxqaW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZXZwX21kKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihldnBfbWQpOwogfQogCiAvKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9NRF9zaXplKGludCkKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9NRF9zaXplKEpOSUVudiogZW52LCBqY2xhc3MsIEVWUF9NRCogZXZwX21kKSB7CitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX01EX3NpemUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBldnBNZFJlZikgeworICAgIEVWUF9NRCogZXZwX21kID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfTUQqPihldnBNZFJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX01EX3NpemUoJXApIiwgZXZwX21kKTsKIAogICAgIGlmIChldnBfbWQgPT0gTlVMTCkgewpAQCAtMTU3OSw3ICsyNzE4LDggQEAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIGludCB2b2lkIEVWUF9NRF9ibG9ja19zaXplKGludCkKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9NRF9ibG9ja19zaXplKEpOSUVudiogZW52LCBqY2xhc3MsIEVWUF9NRCogZXZwX21kKSB7CitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX01EX2Jsb2NrX3NpemUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZXZwTWRSZWYpIHsKKyAgICBFVlBfTUQqIGV2cF9tZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EKj4oZXZwTWRSZWYpOwogICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX0VWUF9NRF9ibG9ja19zaXplKCVwKSIsIGV2cF9tZCk7CiAKICAgICBpZiAoZXZwX21kID09IE5VTEwpIHsKQEAgLTE1OTUsNyArMjczNSw3IEBACiAvKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfRGlnZXN0VXBkYXRlKGludCwgYnl0ZVtdLCBpbnQsIGludCkKICAqLwotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9EaWdlc3RVcGRhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBjdHhSZWYsCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX0RpZ2VzdFVwZGF0ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGJ1ZmZlciwgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKSB7CiAgICAgRVZQX01EX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfTURfQ1RYKj4oY3R4UmVmKTsKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19FVlBfRGlnZXN0VXBkYXRlKCVwLCAlcCwgJWQsICVkKSIsIGN0eCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CkBAIC0xNjIyLDEwICsyNzYyLDExMiBAQAogICAgIH0KIH0KIAotLyoKLSAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfU2lnbkluaXQoamF2YS5sYW5nLlN0cmluZykKLSAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9TaWduSW5pdChKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGFsZ29yaXRobSkgeworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9EaWdlc3RTaWduSW5pdChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGV2cE1kQ3R4UmVmLAorICAgICAgICBjb25zdCBqbG9uZyBldnBNZFJlZiwgamxvbmcgcGtleVJlZikKK3sKKyAgICBFVlBfTURfQ1RYKiBtZEN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGV2cE1kQ3R4UmVmKTsKKyAgICBjb25zdCBFVlBfTUQqIG1kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFVlBfTUQqPihldnBNZFJlZik7CisgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CisgICAgSk5JX1RSQUNFKCJFVlBfRGlnZXN0U2lnbkluaXQoJXAsICVwLCAlcCkiLCBtZEN0eCwgbWQsIHBrZXkpOworCisgICAgaWYgKG1kQ3R4ID09IE5VTEwpIHsKKyAgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAibWRDdHggPT0gbnVsbCIpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtZCA9PSBOVUxMKSB7CisgICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm1kID09IG51bGwiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocGtleSA9PSBOVUxMKSB7CisgICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgInBrZXkgPT0gbnVsbCIpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChFVlBfRGlnZXN0U2lnbkluaXQobWRDdHgsIChFVlBfUEtFWV9DVFggKiopIE5VTEwsIG1kLCAoRU5HSU5FICopIE5VTEwsIHBrZXkpIDw9IDApIHsKKyAgICAgICAgSk5JX1RSQUNFKCJjdHg9JXAgRVZQX0RpZ2VzdFNpZ25Jbml0ID0+IHRocmV3IGV4Y2VwdGlvbiIsIG1kQ3R4KTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfRGlnZXN0U2lnbkluaXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRVZQX0RpZ2VzdFNpZ25Jbml0KCVwLCAlcCwgJXApID0+IHN1Y2Nlc3MiLCBtZEN0eCwgbWQsIHBrZXkpOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX0RpZ2VzdFNpZ25VcGRhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBldnBNZEN0eFJlZiwKKyAgICAgICAgamJ5dGVBcnJheSBpbkphdmFCeXRlcywgamludCBpbk9mZnNldCwgamludCBpbkxlbmd0aCkKK3sKKyAgICBFVlBfTURfQ1RYKiBtZEN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGV2cE1kQ3R4UmVmKTsKKyAgICBKTklfVFJBQ0UoIkVWUF9EaWdlc3RTaWduVXBkYXRlKCVwLCAlcCwgJWQsICVkKSIsIG1kQ3R4LCBpbkphdmFCeXRlcywgaW5PZmZzZXQsIGluTGVuZ3RoKTsKKworICAgIGlmIChtZEN0eCA9PSBOVUxMKSB7CisgICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm1kQ3R4ID09IG51bGwiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTY29wZWRCeXRlQXJyYXlSTyBpbkJ5dGVzKGVudiwgaW5KYXZhQnl0ZXMpOworICAgIGlmIChpbkJ5dGVzLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbk9mZnNldCA8IDAgfHwgc2l6ZV90KGluT2Zmc2V0KSA+IGluQnl0ZXMuc2l6ZSgpKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwgImluT2Zmc2V0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzc2l6ZV90IGluRW5kID0gaW5PZmZzZXQgKyBpbkxlbmd0aDsKKyAgICBpZiAoaW5FbmQgPCAwIHx8IHNpemVfdChpbkVuZCkgPj0gaW5CeXRlcy5zaXplKCkpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLCAiaW5MZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihpbkJ5dGVzLmdldCgpKTsKKyAgICBpZiAoIUVWUF9EaWdlc3RTaWduVXBkYXRlKG1kQ3R4LCB0bXAgKyBpbk9mZnNldCwgaW5MZW5ndGgpKSB7CisgICAgICAgIEpOSV9UUkFDRSgiY3R4PSVwIEVWUF9EaWdlc3RTaWduVXBkYXRlID0+IHRocmV3IGV4Y2VwdGlvbiIsIG1kQ3R4KTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfRGlnZXN0U2lnblVwZGF0ZSIpOworICAgIH0KKworICAgIEpOSV9UUkFDRSgiRVZQX0RpZ2VzdFNpZ25VcGRhdGUoJXAsICVwLCAlZCwgJWQpID0+IHN1Y2Nlc3MiLCBtZEN0eCwgaW5KYXZhQnl0ZXMsIGluT2Zmc2V0LAorICAgICAgICAgICAgaW5MZW5ndGgpOworfQorCitzdGF0aWMgamJ5dGVBcnJheSBOYXRpdmVDcnlwdG9fRVZQX0RpZ2VzdFNpZ25GaW5hbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBldnBNZEN0eFJlZikKK3sKKyAgICBFVlBfTURfQ1RYKiBtZEN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGV2cE1kQ3R4UmVmKTsKKyAgICBKTklfVFJBQ0UoIkVWUF9EaWdlc3RTaWduRmluYWwoJXApIiwgbWRDdHgpOworCisgICAgaWYgKG1kQ3R4ID09IE5VTEwpIHsKKyAgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAibWRDdHggPT0gbnVsbCIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IEVWUF9NRF9DVFhfc2l6ZShtZEN0eCk7CisgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gb3V0SmF2YUJ5dGVzKGVudiwgZW52LT5OZXdCeXRlQXJyYXkoZXhwZWN0ZWRTaXplKSk7CisgICAgaWYgKG91dEphdmFCeXRlcy5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBTY29wZWRCeXRlQXJyYXlSVyBvdXRCeXRlcyhlbnYsIG91dEphdmFCeXRlcy5nZXQoKSk7CisgICAgaWYgKG91dEJ5dGVzLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVuc2lnbmVkIGNoYXIgKnRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG91dEJ5dGVzLmdldCgpKTsKKyAgICBzaXplX3QgbGVuOworICAgIGlmICghRVZQX0RpZ2VzdFNpZ25GaW5hbChtZEN0eCwgdG1wLCAmbGVuKSkgeworICAgICAgICBKTklfVFJBQ0UoImN0eD0lcCBFVlBfRGlnZXN0U2lnbkZpbmFsID0+IHRocmV3IGV4Y2VwdGlvbiIsIG1kQ3R4KTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfRGlnZXN0U2lnbkZpbmFsIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChsZW4gIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJoYXNoIHNpemUgdW5leHBlY3RlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVWUF9EaWdlc3RTaWduRmluYWwoJXApID0+ICVwIiwgbWRDdHgsIG91dEphdmFCeXRlcy5nZXQoKSk7CisgICAgcmV0dXJuIG91dEphdmFCeXRlcy5yZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRVZQX1NpZ25Jbml0KEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgYWxnb3JpdGhtKSB7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1NpZ25Jbml0KCVwKSIsIGFsZ29yaXRobSk7CiAKICAgICBpZiAoYWxnb3JpdGhtID09IE5VTEwpIHsKQEAgLTE2NDgsNyArMjg5MCw4IEBACiAKICAgICBjb25zdCBFVlBfTUQqIGRpZ2VzdCA9IEVWUF9nZXRfZGlnZXN0YnluaWQoT0JKX3R4dDJuaWQoYWxnb3JpdGhtQ2hhcnMuY19zdHIoKSkpOwogICAgIGlmIChkaWdlc3QgPT0gTlVMTCkgewotICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiSGFzaCBhbGdvcml0aG0gbm90IGZvdW5kIik7CisgICAgICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX0VWUF9TaWduSW5pdCglcykgPT4gaGFzaCBub3QgZm91bmQiLCBhbGdvcml0aG1DaGFycy5jX3N0cigpKTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJIYXNoIGFsZ29yaXRobSBub3QgZm91bmQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xNjU2LDE2ICsyODk5LDE5IEBACiAgICAgaWYgKG9rID09IDApIHsKICAgICAgICAgYm9vbCBleGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIk5hdGl2ZUNyeXB0b19FVlBfU2lnbkluaXQiKTsKICAgICAgICAgaWYgKGV4Y2VwdGlvbikgeworICAgICAgICAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1NpZ25Jbml0KCVzKSA9PiB0aHJldyBleGNlcHRpb24iLCBhbGdvcml0aG1DaGFycy5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxqaW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY3R4LnJlbGVhc2UoKSkpOworCisgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1NpZ25Jbml0KCVzKSA9PiAlcCIsIGFsZ29yaXRobUNoYXJzLmNfc3RyKCksIGN0eC5nZXQoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjdHgucmVsZWFzZSgpKTsKIH0KIAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1NpZ25VcGRhdGUoaW50LCBieXRlW10sIGludCwgaW50KQogICovCi1zdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX1NpZ25VcGRhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBjdHhSZWYsCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX1NpZ25VcGRhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgY3R4UmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBidWZmZXIsIGppbnQgb2Zmc2V0LCBqaW50IGxlbmd0aCkgewogICAgIEVWUF9NRF9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1NpZ25VcGRhdGUoJXAsICVwLCAlZCwgJWQpIiwgY3R4LCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKQEAgLTE2OTAsOCArMjkzNiw4IEBACiAvKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9TaWduRmluYWwoaW50LCBieXRlW10sIGludCwgaW50KQogICovCi1zdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX1NpZ25GaW5hbChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGN0eFJlZiwgamJ5dGVBcnJheSBzaWduYXR1cmUsCi0gICAgICAgIGppbnQgb2Zmc2V0LCBqaW50IHBrZXlSZWYpIHsKK3N0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfU2lnbkZpbmFsKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGN0eFJlZiwgamJ5dGVBcnJheSBzaWduYXR1cmUsCisgICAgICAgIGppbnQgb2Zmc2V0LCBqbG9uZyBwa2V5UmVmKSB7CiAgICAgRVZQX01EX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfTURfQ1RYKj4oY3R4UmVmKTsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19FVlBfU2lnbkZpbmFsKCVwLCAlcCwgJWQsICVwKSIsIGN0eCwgc2lnbmF0dXJlLCBvZmZzZXQsIHBrZXkpOwpAQCAtMTcyMiw3ICsyOTY4LDcgQEAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1ZlcmlmeUluaXQoamF2YS5sYW5nLlN0cmluZykKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9WZXJpZnlJbml0KEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgYWxnb3JpdGhtKSB7CitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX0VWUF9WZXJpZnlJbml0KEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgYWxnb3JpdGhtKSB7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1ZlcmlmeUluaXQoJXApIiwgYWxnb3JpdGhtKTsKIAogICAgIGlmIChhbGdvcml0aG0gPT0gTlVMTCkgewpAQCAtMTc1NiwxMyArMzAwMiwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjdHgucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjdHgucmVsZWFzZSgpKTsKIH0KIAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1ZlcmlmeVVwZGF0ZShpbnQsIGJ5dGVbXSwgaW50LCBpbnQpCiAgKi8KLXN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfVmVyaWZ5VXBkYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgY3R4UmVmLAorc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9WZXJpZnlVcGRhdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgY3R4UmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBidWZmZXIsIGppbnQgb2Zmc2V0LCBqaW50IGxlbmd0aCkgewogICAgIEVWUF9NRF9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1ZlcmlmeVVwZGF0ZSglcCwgJXAsICVkLCAlZCkiLCBjdHgsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtMTc4Nyw4ICszMDMzLDggQEAKIC8qCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX1ZlcmlmeUZpbmFsKGludCwgYnl0ZVtdLCBpbnQsIGludCwgaW50KQogICovCi1zdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX1ZlcmlmeUZpbmFsKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgY3R4UmVmLCBqYnl0ZUFycmF5IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG9mZnNldCwgamludCBsZW5ndGgsIGppbnQgcGtleVJlZikgeworc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX0VWUF9WZXJpZnlGaW5hbChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsIGpieXRlQXJyYXkgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgb2Zmc2V0LCBqaW50IGxlbmd0aCwgamxvbmcgcGtleVJlZikgewogICAgIEVWUF9NRF9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX01EX0NUWCo+KGN0eFJlZik7CiAgICAgRVZQX1BLRVkqIHBrZXkgPSByZWludGVycHJldF9jYXN0PEVWUF9QS0VZKj4ocGtleVJlZik7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fRVZQX1ZlcmlmeUZpbmFsKCVwLCAlcCwgJWQsICVkLCAlcCkiLApAQCAtMTgyMywxMCArMzA2OSw3IEBACiAgICAgcmV0dXJuIG9rOwogfQogCi0vKgotICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9nZXRfY2lwaGVyYnluYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfZ2V0X2NpcGhlcmJ5bmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGFsZ29yaXRobSkgeworc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19FVlBfZ2V0X2NpcGhlcmJ5bmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqc3RyaW5nIGFsZ29yaXRobSkgewogICAgIEpOSV9UUkFDRSgiRVZQX2dldF9jaXBoZXJieW5hbWUoJXApIiwgYWxnb3JpdGhtKTsKICAgICBpZiAoYWxnb3JpdGhtID09IE5VTEwpIHsKICAgICAgICAgSk5JX1RSQUNFKCJFVlBfZ2V0X2NpcGhlcmJ5bmFtZSglcCkgPT4gdGhyZXcgZXhjZXB0aW9uIGFsZ29yaXRobSA9PSBudWxsIiwgYWxnb3JpdGhtKTsKQEAgLTE4NDIsMjYgKzMwODUsMzYgQEAKIAogICAgIGNvbnN0IEVWUF9DSVBIRVIqIGV2cF9jaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShhbGdvcml0aG1DaGFycy5jX3N0cigpKTsKICAgICBpZiAoZXZwX2NpcGhlciA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJDaXBoZXIgYWxnb3JpdGhtIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZnJlZU9wZW5Tc2xFcnJvclN0YXRlKCk7CiAgICAgfQogCiAgICAgSk5JX1RSQUNFKCJFVlBfZ2V0X2NpcGhlcmJ5bmFtZSglcykgPT4gJXAiLCBhbGdvcml0aG1DaGFycy5jX3N0cigpLCBldnBfY2lwaGVyKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGV2cF9jaXBoZXIpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGV2cF9jaXBoZXIpOwogfQogCi0vKgotICogcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9DaXBoZXJJbml0X2V4KGludCBjaXBoZXJOaWQsIGJ5dGVbXSBrZXksIGJ5dGVbXSBpdiwKLSAqICAgICAgICAgIGJvb2xlYW4gZW5jcnlwdGluZyk7Ci0gKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfQ2lwaGVySW5pdF9leChKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGNpcGhlclJlZiwgamJ5dGVBcnJheSBrZXlBcnJheSwKLSAgICAgICAgamJ5dGVBcnJheSBpdkFycmF5LCBqYm9vbGVhbiBlbmNyeXB0aW5nKSB7Ci0gICAgY29uc3QgRVZQX0NJUEhFUiogZXZwX2NpcGhlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRVZQX0NJUEhFUio+KGNpcGhlclJlZik7Ci0gICAgSk5JX1RSQUNFKCJFVlBfQ2lwaGVySW5pdF9leCglcCwgJXAsICVwLCAlZCkiLCBldnBfY2lwaGVyLCBrZXlBcnJheSwgaXZBcnJheSwgZW5jcnlwdGluZyA/IDEgOiAwKTsKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfQ2lwaGVySW5pdF9leChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsIGpsb25nIGV2cENpcGhlclJlZiwKKyAgICAgICAgamJ5dGVBcnJheSBrZXlBcnJheSwgamJ5dGVBcnJheSBpdkFycmF5LCBqYm9vbGVhbiBlbmNyeXB0aW5nKSB7CisgICAgRVZQX0NJUEhFUl9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX0NJUEhFUl9DVFgqPihjdHhSZWYpOworICAgIGNvbnN0IEVWUF9DSVBIRVIqIGV2cENpcGhlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRVZQX0NJUEhFUio+KGV2cENpcGhlclJlZik7CisgICAgSk5JX1RSQUNFKCJFVlBfQ2lwaGVySW5pdF9leCglcCwgJXAsICVwLCAlcCwgJWQpIiwgY3R4LCBldnBDaXBoZXIsIGtleUFycmF5LCBpdkFycmF5LAorICAgICAgICAgICAgZW5jcnlwdGluZyA/IDEgOiAwKTsKIAotICAgIFNjb3BlZEJ5dGVBcnJheVJPIGtleUJ5dGVzKGVudiwga2V5QXJyYXkpOwotICAgIGlmIChrZXlCeXRlcy5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImN0eCA9PSBudWxsIik7CisgICAgICAgIEpOSV9UUkFDRSgiRVZQX0NpcGhlclVwZGF0ZSA9PiBjdHggPT0gbnVsbCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGtleSBjYW4gYmUgbnVsbCBpZiB3ZSBuZWVkIHRvIHNldCBleHRyYSBwYXJhbWV0ZXJzLgorICAgIFVuaXF1ZVB0cjx1bnNpZ25lZCBjaGFyW10+IGtleVB0cjsKKyAgICBpZiAoa2V5QXJyYXkgIT0gTlVMTCkgeworICAgICAgICBTY29wZWRCeXRlQXJyYXlSTyBrZXlCeXRlcyhlbnYsIGtleUFycmF5KTsKKyAgICAgICAgaWYgKGtleUJ5dGVzLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGtleVB0ci5yZXNldChuZXcgdW5zaWduZWQgY2hhcltrZXlCeXRlcy5zaXplKCldKTsKKyAgICAgICAgbWVtY3B5KGtleVB0ci5nZXQoKSwga2V5Qnl0ZXMuZ2V0KCksIGtleUJ5dGVzLnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gVGhlIElWIGNhbiBiZSBudWxsIGlmIHdlJ3JlIHVzaW5nIEVDQi4KQEAgLTE4NjksMzggKzMxMjIsMjkgQEAKICAgICBpZiAoaXZBcnJheSAhPSBOVUxMKSB7CiAgICAgICAgIFNjb3BlZEJ5dGVBcnJheVJPIGl2Qnl0ZXMoZW52LCBpdkFycmF5KTsKICAgICAgICAgaWYgKGl2Qnl0ZXMuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBpdlB0ci5yZXNldChuZXcgdW5zaWduZWQgY2hhcltpdkJ5dGVzLnNpemUoKV0pOwogICAgICAgICBtZW1jcHkoaXZQdHIuZ2V0KCksIGl2Qnl0ZXMuZ2V0KCksIGl2Qnl0ZXMuc2l6ZSgpKTsKICAgICB9CiAKLSAgICBVbmlxdWVfRVZQX0NJUEhFUl9DVFggY3R4KEVWUF9DSVBIRVJfQ1RYX25ldygpKTsKLSAgICBpZiAoY3R4LmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBjaXBoZXIgY29udGV4dCIpOwotICAgICAgICBKTklfVFJBQ0UoImN0eD0lcCBFVlBfQ2lwaGVySW5pdF9leCA9PiBjb250ZXh0IGFsbG9jYXRpb24gZXJyb3IiLCBldnBfY2lwaGVyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhcioga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oa2V5Qnl0ZXMuZ2V0KCkpOwotICAgIGlmICghRVZQX0NpcGhlckluaXRfZXgoY3R4LmdldCgpLCBldnBfY2lwaGVyLCBOVUxMLCBrZXksIGl2UHRyLmdldCgpLCBlbmNyeXB0aW5nID8gMSA6IDApKSB7CisgICAgaWYgKCFFVlBfQ2lwaGVySW5pdF9leChjdHgsIGV2cENpcGhlciwgTlVMTCwga2V5UHRyLmdldCgpLCBpdlB0ci5nZXQoKSwgZW5jcnlwdGluZyA/IDEgOiAwKSkgewogICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9DaXBoZXJJbml0X2V4Iik7CiAgICAgICAgIEpOSV9UUkFDRSgiRVZQX0NpcGhlckluaXRfZXggPT4gZXJyb3IgaW5pdGlhbGl6aW5nIGNpcGhlciIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEpOSV9UUkFDRSgiRVZQX0NpcGhlckluaXRfZXgoJXAsICVwLCAlcCwgJWQpID0+ICVwIiwgZXZwX2NpcGhlciwga2V5QXJyYXksIGl2QXJyYXksCi0gICAgICAgICAgICBlbmNyeXB0aW5nID8gMSA6IDAsIGN0eC5nZXQoKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGppbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjdHgucmVsZWFzZSgpKSk7CisgICAgSk5JX1RSQUNFKCJFVlBfQ2lwaGVySW5pdF9leCglcCwgJXAsICVwLCAlcCwgJWQpID0+IHN1Y2Nlc3MiLCBjdHgsIGV2cENpcGhlciwga2V5QXJyYXksIGl2QXJyYXksCisgICAgICAgICAgICBlbmNyeXB0aW5nID8gMSA6IDApOwogfQogCiAvKgogICogIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ2lwaGVyVXBkYXRlKGludCBjdHgsIGJ5dGVbXSBvdXQsIGludCBvdXRPZmZzZXQsIGJ5dGVbXSBpbiwKICAqICAgICAgICAgIGludCBpbk9mZnNldCk7CiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfQ2lwaGVyVXBkYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgY3R4UmVmLCBqYnl0ZUFycmF5IG91dEFycmF5LAotICAgICAgICBqaW50IG91dE9mZnNldCwgamJ5dGVBcnJheSBpbkFycmF5LCBqaW50IGluT2Zmc2V0KSB7CitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX0NpcGhlclVwZGF0ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsIGpieXRlQXJyYXkgb3V0QXJyYXksCisgICAgICAgIGppbnQgb3V0T2Zmc2V0LCBqYnl0ZUFycmF5IGluQXJyYXksIGppbnQgaW5PZmZzZXQsIGppbnQgaW5MZW5ndGgpIHsKICAgICBFVlBfQ0lQSEVSX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfQ0lQSEVSX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJFVlBfQ2lwaGVyVXBkYXRlKCVwLCAlcCwgJWQsICVwLCAlZCkiLCBjdHgsIG91dEFycmF5LCBvdXRPZmZzZXQsIGluQXJyYXksIGluT2Zmc2V0KTsKIApAQCAtMTkxNSw4ICszMTU5LDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGNvbnN0IHNpemVfdCBpblNpemUgPSBpbkJ5dGVzLnNpemUoKTsKLSAgICBpZiAoc2l6ZV90KGluT2Zmc2V0ICsgRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZShjdHgpKSA+IGluU2l6ZSkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsIE5VTEwpOworICAgIGlmIChzaXplX3QoaW5PZmZzZXQgKyBpbkxlbmd0aCkgPiBpblNpemUpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJpbi5sZW5ndGggPCAoaW5TaXplICsgaW5PZmZzZXQpIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMTkyNSwxNyArMzE3MCwyMSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgY29uc3Qgc2l6ZV90IG91dFNpemUgPSBvdXRCeXRlcy5zaXplKCk7Ci0gICAgaWYgKHNpemVfdChvdXRPZmZzZXQgKyBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKGN0eCkpID4gb3V0U2l6ZSkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsIE5VTEwpOworICAgIGlmIChzaXplX3Qob3V0T2Zmc2V0ICsgaW5MZW5ndGgpID4gb3V0U2l6ZSkgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgIm91dC5sZW5ndGggPCBpblNpemUgKyBvdXRPZmZzZXQgKyBibG9ja1NpemUgLSAxIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIEpOSV9UUkFDRSgiY3R4PSVwIEVWUF9DaXBoZXJVcGRhdGUgaW49JXAgaW4ubGVuZ3RoPSVkIGluT2Zmc2V0PSVkIGluTGVuZ3RoPSVkIG91dD0lcCBvdXQubGVuZ3RoPSVkIG91dE9mZnNldD0lZCIsCisgICAgICAgICAgICBjdHgsIGluQnl0ZXMuZ2V0KCksIGluQnl0ZXMuc2l6ZSgpLCBpbk9mZnNldCwgaW5MZW5ndGgsIG91dEJ5dGVzLmdldCgpLCBvdXRCeXRlcy5zaXplKCksIG91dE9mZnNldCk7CisKICAgICB1bnNpZ25lZCBjaGFyKiBvdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihvdXRCeXRlcy5nZXQoKSk7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihpbkJ5dGVzLmdldCgpKTsKIAogICAgIGludCBvdXRsOwotICAgIGlmICghRVZQX0NpcGhlclVwZGF0ZShjdHgsIG91dCArIG91dE9mZnNldCwgJm91dGwsIGluK2luT2Zmc2V0LCBpblNpemUgLSBpbk9mZnNldCkpIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfQ2lwaGVySW5pdF9leCIpOworICAgIGlmICghRVZQX0NpcGhlclVwZGF0ZShjdHgsIG91dCArIG91dE9mZnNldCwgJm91dGwsIGluICsgaW5PZmZzZXQsIGluTGVuZ3RoKSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIkVWUF9DaXBoZXJVcGRhdGUiKTsKICAgICAgICAgSk5JX1RSQUNFKCJjdHg9JXAgRVZQX0NpcGhlclVwZGF0ZSA9PiB0aHJldyBlcnJvciIsIGN0eCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE5NDUsMTAgKzMxOTQsNyBAQAogICAgIHJldHVybiBvdXRsOwogfQogCi0vKgotICogIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfQ2lwaGVyRmluYWwoaW50IGN0eCwgYnl0ZVtdIG91dCwgaW50IG91dE9mZnNldCk7Ci0gKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19FVlBfQ2lwaGVyRmluYWxfZXgoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBjdHhSZWYsIGpieXRlQXJyYXkgb3V0QXJyYXksCitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX0NpcGhlckZpbmFsX2V4KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGN0eFJlZiwgamJ5dGVBcnJheSBvdXRBcnJheSwKICAgICAgICAgamludCBvdXRPZmZzZXQpIHsKICAgICBFVlBfQ0lQSEVSX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfQ0lQSEVSX0NUWCo+KGN0eFJlZik7CiAgICAgSk5JX1RSQUNFKCJFVlBfQ2lwaGVyRmluYWxfZXgoJXAsICVwLCAlZCkiLCBjdHgsIG91dEFycmF5LCBvdXRPZmZzZXQpOwpAQCAtMTk2OCw4ICszMjE0LDggQEAKIAogICAgIGludCBvdXRsOwogICAgIGlmICghRVZQX0NpcGhlckZpbmFsX2V4KGN0eCwgb3V0ICsgb3V0T2Zmc2V0LCAmb3V0bCkpIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfQ2lwaGVySW5pdF9leCIpOwotICAgICAgICBKTklfVFJBQ0UoImN0eD0lcCBFVlBfQ2lwaGVyVXBkYXRlID0+IHRocmV3IGVycm9yIiwgY3R4KTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeShlbnYsICJFVlBfQ2lwaGVyRmluYWxfZXgiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJjdHg9JXAgRVZQX0NpcGhlckZpbmFsX2V4ID0+IHRocmV3IGVycm9yIiwgY3R4KTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xOTc3LDE1ICszMjIzLDEwMyBAQAogICAgIHJldHVybiBvdXRsOwogfQogCi0vKgotICogcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKGludCBjdHgpOwotICovCi1zdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX0NJUEhFUl9DVFhfY2xlYW51cChKTklFbnYqLCBqY2xhc3MsIGppbnQgY3R4UmVmKSB7CitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX0NJUEhFUl9pdl9sZW5ndGgoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgZXZwQ2lwaGVyUmVmKSB7CisgICAgY29uc3QgRVZQX0NJUEhFUiogZXZwQ2lwaGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFVlBfQ0lQSEVSKj4oZXZwQ2lwaGVyUmVmKTsKKyAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfaXZfbGVuZ3RoKCVwKSIsIGV2cENpcGhlcik7CisKKyAgICBpZiAoZXZwQ2lwaGVyID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJldnBDaXBoZXIgPT0gbnVsbCIpOworICAgICAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfaXZfbGVuZ3RoID0+IGV2cENpcGhlciA9PSBudWxsIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnN0IGludCBpdkxlbmd0aCA9IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGV2cENpcGhlcik7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX2l2X2xlbmd0aCglcCkgPT4gJWQiLCBldnBDaXBoZXIsIGl2TGVuZ3RoKTsKKyAgICByZXR1cm4gaXZMZW5ndGg7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRVZQX0NJUEhFUl9DVFhfbmV3KEpOSUVudiogZW52LCBqY2xhc3MpIHsKKyAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfQ1RYX25ldygpIik7CisKKyAgICBVbmlxdWVfRVZQX0NJUEhFUl9DVFggY3R4KEVWUF9DSVBIRVJfQ1RYX25ldygpKTsKKyAgICBpZiAoY3R4LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBjaXBoZXIgY29udGV4dCIpOworICAgICAgICBKTklfVFJBQ0UoIkVWUF9DaXBoZXJJbml0X2V4ID0+IGNvbnRleHQgYWxsb2NhdGlvbiBlcnJvciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfQ1RYX25ldygpID0+ICVwIiwgY3R4LmdldCgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGN0eC5yZWxlYXNlKCkpOworfQorCitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYpIHsKICAgICBFVlBfQ0lQSEVSX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfQ0lQSEVSX0NUWCo+KGN0eFJlZik7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKCVwKSIsIGN0eCk7CisKKyAgICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJjdHggPT0gbnVsbCIpOworICAgICAgICBKTklfVFJBQ0UoImN0eD0lcCBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplID0+IGN0eCA9PSBudWxsIiwgY3R4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGJsb2NrU2l6ZSA9IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoY3R4KTsKKyAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoJXApID0+ICVkIiwgY3R4LCBibG9ja1NpemUpOworICAgIHJldHVybiBibG9ja1NpemU7Cit9CisKK3N0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19nZXRfRVZQX0NJUEhFUl9DVFhfYnVmX2xlbihKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfQ0lQSEVSX0NUWCo+KGN0eFJlZik7CisgICAgSk5JX1RSQUNFKCJnZXRfRVZQX0NJUEhFUl9DVFhfYnVmX2xlbiglcCkiLCBjdHgpOworCisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiY3R4ID09IG51bGwiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJjdHg9JXAgZ2V0X0VWUF9DSVBIRVJfQ1RYX2J1Zl9sZW4gPT4gY3R4ID09IG51bGwiLCBjdHgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgYnVmX2xlbiA9IGN0eC0+YnVmX2xlbjsKKyAgICBKTklfVFJBQ0UoImdldF9FVlBfQ0lQSEVSX0NUWF9idWZfbGVuKCVwKSA9PiAlZCIsIGN0eCwgYnVmX2xlbik7CisgICAgcmV0dXJuIGJ1Zl9sZW47Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19FVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyhKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBjdHhSZWYsIGpib29sZWFuIGVuYWJsZVBhZGRpbmdCb29sKSB7CisgICAgRVZQX0NJUEhFUl9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX0NJUEhFUl9DVFgqPihjdHhSZWYpOworICAgIGppbnQgZW5hYmxlUGFkZGluZyA9IGVuYWJsZVBhZGRpbmdCb29sID8gMSA6IDA7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyglcCwgJWQpIiwgY3R4LCBlbmFibGVQYWRkaW5nKTsKKworICAgIGlmIChjdHggPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImN0eCA9PSBudWxsIik7CisgICAgICAgIEpOSV9UUkFDRSgiY3R4PSVwIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nID0+IGN0eCA9PSBudWxsIiwgY3R4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKGN0eCwgZW5hYmxlUGFkZGluZyk7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyglcCwgJWQpID0+IHN1Y2Nlc3MiLCBjdHgsIGVuYWJsZVBhZGRpbmcpOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgY3R4UmVmLAorICAgICAgICBqaW50IGtleVNpemVCaXRzKSB7CisgICAgRVZQX0NJUEhFUl9DVFgqIGN0eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX0NJUEhFUl9DVFgqPihjdHhSZWYpOworICAgIEpOSV9UUkFDRSgiRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoJXAsICVkKSIsIGN0eCwga2V5U2l6ZUJpdHMpOworCisgICAgaWYgKGN0eCA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiY3R4ID09IG51bGwiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJjdHg9JXAgRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGggPT4gY3R4ID09IG51bGwiLCBjdHgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoY3R4LCBrZXlTaXplQml0cyk7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCglcCwgJWQpID0+IHN1Y2Nlc3MiLCBjdHgsIGtleVNpemVCaXRzKTsKK30KKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0VWUF9DSVBIRVJfQ1RYX2NsZWFudXAoSk5JRW52KiwgamNsYXNzLCBqbG9uZyBjdHhSZWYpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWCogY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxFVlBfQ0lQSEVSX0NUWCo+KGN0eFJlZik7CisgICAgSk5JX1RSQUNFKCJFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCVwKSIsIGN0eCk7CiAKICAgICBpZiAoY3R4ICE9IE5VTEwpIHsKICAgICAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjdHgpOwogICAgIH0KKyAgICBKTklfVFJBQ0UoIkVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJXApID0+IHN1Y2Nlc3MiLCBjdHgpOwogfQogCiAvKioKQEAgLTIwMjksNiArMzM2MywyMDQgQEAKICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19SQU5EX2J5dGVzKCVwKSA9PiBzdWNjZXNzIiwgb3V0cHV0KTsKIH0KIAorc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX09CSl90eHQybmlkKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgb2lkU3RyKSB7CisgICAgSk5JX1RSQUNFKCJPQkpfdHh0Mm5pZCglcCkiLCBvaWRTdHIpOworCisgICAgU2NvcGVkVXRmQ2hhcnMgb2lkKGVudiwgb2lkU3RyKTsKKyAgICBpZiAob2lkLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgbmlkID0gT0JKX3R4dDJuaWQob2lkLmNfc3RyKCkpOworICAgIEpOSV9UUkFDRSgiT0JKX3R4dDJuaWQoJXMpID0+ICVkIiwgb2lkLmNfc3RyKCksIG5pZCk7CisgICAgcmV0dXJuIG5pZDsKK30KKworc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX09CSl90eHQybmlkX2xvbmdOYW1lKEpOSUVudiogZW52LCBqY2xhc3MsIGpzdHJpbmcgb2lkU3RyKSB7CisgICAgSk5JX1RSQUNFKCJPQkpfdHh0Mm5pZF9sb25nTmFtZSglcCkiLCBvaWRTdHIpOworCisgICAgU2NvcGVkVXRmQ2hhcnMgb2lkKGVudiwgb2lkU3RyKTsKKyAgICBpZiAob2lkLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIk9CSl90eHQybmlkX2xvbmdOYW1lKCVzKSIsIG9pZC5jX3N0cigpKTsKKworICAgIGludCBuaWQgPSBPQkpfdHh0Mm5pZChvaWQuY19zdHIoKSk7CisgICAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKKyAgICAgICAgSk5JX1RSQUNFKCJPQkpfdHh0Mm5pZF9sb25nTmFtZSglcykgPT4gTklEX3VuZGVmIiwgb2lkLmNfc3RyKCkpOworICAgICAgICBmcmVlT3BlblNzbEVycm9yU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgY2hhciogbG9uZ05hbWUgPSBPQkpfbmlkMmxuKG5pZCk7CisgICAgSk5JX1RSQUNFKCJPQkpfdHh0Mm5pZF9sb25nTmFtZSglcykgPT4gJXMiLCBvaWQuY19zdHIoKSwgbG9uZ05hbWUpOworICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihsb25nTmFtZSk7Cit9CisKK3N0YXRpYyBqc3RyaW5nIE5hdGl2ZUNyeXB0b19PQkpfdHh0Mm5pZF9vaWQoSk5JRW52KiBlbnYsIGpjbGFzcywganN0cmluZyBvaWRTdHIpIHsKKyAgICBKTklfVFJBQ0UoIk9CSl90eHQybmlkX29pZCglcCkiLCBvaWRTdHIpOworCisgICAgU2NvcGVkVXRmQ2hhcnMgb2lkKGVudiwgb2lkU3RyKTsKKyAgICBpZiAob2lkLmNfc3RyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIk9CSl90eHQybmlkX29pZCglcykiLCBvaWQuY19zdHIoKSk7CisKKyAgICBpbnQgbmlkID0gT0JKX3R4dDJuaWQob2lkLmNfc3RyKCkpOworICAgIGlmIChuaWQgPT0gTklEX3VuZGVmKSB7CisgICAgICAgIEpOSV9UUkFDRSgiT0JKX3R4dDJuaWRfb2lkKCVzKSA9PiBOSURfdW5kZWYiLCBvaWQuY19zdHIoKSk7CisgICAgICAgIGZyZWVPcGVuU3NsRXJyb3JTdGF0ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBVbmlxdWVfQVNOMV9PQkpFQ1Qgb2JqKE9CSl9uaWQyb2JqKG5pZCkpOworICAgIGlmIChvYmouZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIk9CSl9uaWQyb2JqIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIE9CSl9vYmoydHh0IEFQSSBkb2Vzbid0ICJtZWFzdXJlIiBpZiB5b3UgcGFzcyBpbiBOVUxMIGFzIHRoZSBidWZmZXIuCisgICAgICogSnVzdCBtYWtlIGEgYnVmZmVyIHRoYXQncyBsYXJnZSBlbm91Z2ggaGVyZS4gVGhlIGRvY3VtZW50YXRpb24gcmVjb21tZW5kcworICAgICAqIDgwIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgY2hhciBvdXRwdXRbMTI4XTsKKyAgICBpbnQgcmV0ID0gT0JKX29iajJ0eHQob3V0cHV0LCBzaXplb2Yob3V0cHV0KSwgb2JqLmdldCgpLCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KGVudiwgIk9CSl9vYmoydHh0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoc2l6ZV90KHJldCkgPj0gc2l6ZW9mKG91dHB1dCkpIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIk9CSl9vYmoydHh0IGJ1ZmZlciB0b28gc21hbGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgSk5JX1RSQUNFKCJPQkpfdHh0Mm5pZF9vaWQoJXMpID0+ICVzIiwgb2lkLmNfc3RyKCksIG91dHB1dCk7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKG91dHB1dCk7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fY3JlYXRlX0JJT19JbnB1dFN0cmVhbShKTklFbnYqIGVudiwgamNsYXNzLCBqb2JqZWN0IHN0cmVhbU9iaikgeworICAgIEpOSV9UUkFDRSgiY3JlYXRlX0JJT19JbnB1dFN0cmVhbSglcCkiLCBzdHJlYW1PYmopOworCisgICAgaWYgKHN0cmVhbU9iaiA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAic3RyZWFtID09IG51bGwiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVW5pcXVlX0JJTyBiaW8oQklPX25ldygmc3RyZWFtX2Jpb19tZXRob2QpKTsKKyAgICBpZiAoYmlvLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYmlvX3N0cmVhbV9hc3NpZ24oYmlvLmdldCgpLCBuZXcgQklPX0lucHV0U3RyZWFtKHN0cmVhbU9iaikpOworCisgICAgSk5JX1RSQUNFKCJjcmVhdGVfQklPX0lucHV0U3RyZWFtKCVwKSA9PiAlcCIsIHN0cmVhbU9iaiwgYmlvLmdldCgpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amxvbmc+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihiaW8ucmVsZWFzZSgpKSk7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fY3JlYXRlX0JJT19PdXRwdXRTdHJlYW0oSk5JRW52KiBlbnYsIGpjbGFzcywgam9iamVjdCBzdHJlYW1PYmopIHsKKyAgICBKTklfVFJBQ0UoImNyZWF0ZV9CSU9fT3V0cHV0U3RyZWFtKCVwKSIsIHN0cmVhbU9iaik7CisKKyAgICBpZiAoc3RyZWFtT2JqID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJzdHJlYW0gPT0gbnVsbCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBVbmlxdWVfQklPIGJpbyhCSU9fbmV3KCZzdHJlYW1fYmlvX21ldGhvZCkpOworICAgIGlmIChiaW8uZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBiaW9fc3RyZWFtX2Fzc2lnbihiaW8uZ2V0KCksIG5ldyBCSU9fT3V0cHV0U3RyZWFtKHN0cmVhbU9iaikpOworCisgICAgSk5JX1RSQUNFKCJjcmVhdGVfQklPX091dHB1dFN0cmVhbSglcCkgPT4gJXAiLCBzdHJlYW1PYmosIGJpby5nZXQoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGpsb25nPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYmlvLnJlbGVhc2UoKSkpOworfQorCitzdGF0aWMgaW50IE5hdGl2ZUNyeXB0b19CSU9fcmVhZChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBiaW9SZWYsIGpieXRlQXJyYXkgb3V0cHV0SmF2YUJ5dGVzKSB7CisgICAgQklPKiBiaW8gPSByZWludGVycHJldF9jYXN0PEJJTyo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oYmlvUmVmKSk7CisgICAgSk5JX1RSQUNFKCJCSU9fcmVhZCglcCwgJXApIiwgYmlvLCBvdXRwdXRKYXZhQnl0ZXMpOworCisgICAgaWYgKG91dHB1dEphdmFCeXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAib3V0cHV0ID09IG51bGwiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJCSU9fcmVhZCglcCwgJXApID0+IG91dHB1dCA9PSBudWxsIiwgYmlvLCBvdXRwdXRKYXZhQnl0ZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgb3V0cHV0U2l6ZSA9IGVudi0+R2V0QXJyYXlMZW5ndGgob3V0cHV0SmF2YUJ5dGVzKTsKKworICAgIFVuaXF1ZVB0cjx1bnNpZ25lZCBjaGFyW10+IGJ1ZmZlcihuZXcgdW5zaWduZWQgY2hhcltvdXRwdXRTaXplXSk7CisgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciByZWFkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCByZWFkID0gQklPX3JlYWQoYmlvLCBidWZmZXIuZ2V0KCksIG91dHB1dFNpemUpOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJCSU9fcmVhZCIpOworICAgICAgICBKTklfVFJBQ0UoIkJJT19yZWFkKCVwLCAlcCkgPT4gdGhyZXcgSU8gZXhjZXB0aW9uIiwgYmlvLCBvdXRwdXRKYXZhQnl0ZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihvdXRwdXRKYXZhQnl0ZXMsIDAsIHJlYWQsIHJlaW50ZXJwcmV0X2Nhc3Q8amJ5dGUqPihidWZmZXIuZ2V0KCkpKTsKKyAgICBKTklfVFJBQ0UoIkJJT19yZWFkKCVwLCAlcCkgPT4gJWQiLCBiaW8sIG91dHB1dEphdmFCeXRlcywgcmVhZCk7CisgICAgcmV0dXJuIHJlYWQ7Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19CSU9fd3JpdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgYmlvUmVmLCBqYnl0ZUFycmF5IGlucHV0SmF2YUJ5dGVzLAorICAgICAgICBqaW50IG9mZnNldCwgamludCBsZW5ndGgpIHsKKyAgICBCSU8qIGJpbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8QklPKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihiaW9SZWYpKTsKKyAgICBKTklfVFJBQ0UoIkJJT193cml0ZSglcCwgJXAsICVkLCAlZCkiLCBiaW8sIGlucHV0SmF2YUJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICBpZiAoaW5wdXRKYXZhQnl0ZXMgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImlucHV0ID09IG51bGwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPCAwIHx8IGxlbmd0aCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLCAib2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwIik7CisgICAgICAgIEpOSV9UUkFDRSgiQklPX3dyaXRlKCVwLCAlcCwgJWQsICVkKSA9PiBJT09CIiwgYmlvLCBpbnB1dEphdmFCeXRlcywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGlucHV0U2l6ZSA9IGVudi0+R2V0QXJyYXlMZW5ndGgoaW5wdXRKYXZhQnl0ZXMpOworICAgIGlmIChpbnB1dFNpemUgPCBvZmZzZXQgKyBsZW5ndGgpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJpbnB1dC5sZW5ndGggPCBvZmZzZXQgKyBsZW5ndGgiKTsKKyAgICAgICAgSk5JX1RSQUNFKCJCSU9fd3JpdGUoJXAsICVwLCAlZCwgJWQpID0+IElPT0IiLCBiaW8sIGlucHV0SmF2YUJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBVbmlxdWVQdHI8dW5zaWduZWQgY2hhcltdPiBidWZmZXIobmV3IHVuc2lnbmVkIGNoYXJbbGVuZ3RoXSk7CisgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciB3cml0ZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oaW5wdXRKYXZhQnl0ZXMsIG9mZnNldCwgbGVuZ3RoLCByZWludGVycHJldF9jYXN0PGpieXRlKj4oYnVmZmVyLmdldCgpKSk7CisgICAgaWYgKEJJT193cml0ZShiaW8sIGJ1ZmZlci5nZXQoKSwgbGVuZ3RoKSAhPSAxKSB7CisgICAgICAgIGZyZWVPcGVuU3NsRXJyb3JTdGF0ZSgpOworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgIkJJT193cml0ZSIpOworICAgICAgICBKTklfVFJBQ0UoIkJJT193cml0ZSglcCwgJXAsICVkLCAlZCkgPT4gSU8gZXJyb3IiLCBiaW8sIGlucHV0SmF2YUJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoIkJJT193cml0ZSglcCwgJXAsICVkLCAlZCkgPT4gc3VjY2VzcyIsIGJpbywgaW5wdXRKYXZhQnl0ZXMsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX0JJT19mcmVlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIGJpb1JlZikgeworICAgIEJJTyogYmlvID0gcmVpbnRlcnByZXRfY2FzdDxCSU8qPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGJpb1JlZikpOworICAgIEpOSV9UUkFDRSgiQklPX2ZyZWUoJXApIiwgYmlvKTsKKworICAgIGlmIChiaW8gPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImJpbyA9PSBudWxsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCSU9fZnJlZShiaW8pOworfQorCiAjaWZkZWYgV0lUSF9KTklfVFJBQ0UKIC8qKgogICogQmFzZWQgb24gZXhhbXBsZSBsb2dnaW5nIGNhbGwgYmFjayBmcm9tIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2sgbWFuIHBhZ2UKQEAgLTIxMDYsMjMgKzM2MzgsMTAgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgWDUwOSogY2VydCA9IHNrX1g1MDlfdmFsdWUoY2hhaW4sIGkpOwogCi0gICAgICAgIGludCBsZW4gPSBpMmRfWDUwOShjZXJ0LCBOVUxMKTsKLSAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGJ5dGVBcnJheShlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGxlbikpOworICAgICAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBieXRlQXJyYXkoZW52LCBBU04xVG9CeXRlQXJyYXk8WDUwOT4oZW52LCBjZXJ0LCBpMmRfWDUwOSkpOwogICAgICAgICBpZiAoYnl0ZUFycmF5LmdldCgpID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFNjb3BlZEJ5dGVBcnJheVJXIGJ5dGVzKGVudiwgYnl0ZUFycmF5LmdldCgpKTsKLSAgICAgICAgaWYgKGJ5dGVzLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihieXRlcy5nZXQoKSk7Ci0gICAgICAgIGludCBuID0gaTJkX1g1MDkoY2VydCwgJnApOwotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYSwgaSwgYnl0ZUFycmF5LmdldCgpKTsKICAgICB9CiAKQEAgLTIxNDMsMzUgKzM2NjIsMjQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgam9iamVjdEFycmF5IGpvYSA9IGVudi0+TmV3T2JqZWN0QXJyYXkoY291bnQsIEpuaUNvbnN0YW50czo6Ynl0ZUFycmF5Q2xhc3MsIE5VTEwpOwotICAgIGlmIChqb2EgPT0gTlVMTCkgeworICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3RBcnJheT4gam9hKGVudiwgZW52LT5OZXdPYmplY3RBcnJheShjb3VudCwgSm5pQ29uc3RhbnRzOjpieXRlQXJyYXlDbGFzcywKKyAgICAgICAgICAgIE5VTEwpKTsKKyAgICBpZiAoam9hLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIFg1MDlfTkFNRSogcHJpbmNpcGFsID0gc2tfWDUwOV9OQU1FX3ZhbHVlKG5hbWVzLCBpKTsKIAotICAgICAgICBpbnQgbGVuID0gaTJkX1g1MDlfTkFNRShwcmluY2lwYWwsIE5VTEwpOwotICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYnl0ZUFycmF5KGVudiwgZW52LT5OZXdCeXRlQXJyYXkobGVuKSk7CisgICAgICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGJ5dGVBcnJheShlbnYsIEFTTjFUb0J5dGVBcnJheTxYNTA5X05BTUU+KGVudiwgcHJpbmNpcGFsLAorICAgICAgICAgICAgICAgIGkyZF9YNTA5X05BTUUpKTsKICAgICAgICAgaWYgKGJ5dGVBcnJheS5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBTY29wZWRCeXRlQXJyYXlSVyBieXRlcyhlbnYsIGJ5dGVBcnJheS5nZXQoKSk7Ci0gICAgICAgIGlmIChieXRlcy5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB1bnNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYnl0ZXMuZ2V0KCkpOwotICAgICAgICBpbnQgbiA9IGkyZF9YNTA5X05BTUUocHJpbmNpcGFsLCAmcCk7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoam9hLCBpLCBieXRlQXJyYXkuZ2V0KCkpOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqb2EuZ2V0KCksIGksIGJ5dGVBcnJheS5nZXQoKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIGpvYTsKKyAgICByZXR1cm4gam9hLnJlbGVhc2UoKTsKIH0KIAogLyoqCkBAIC0yNzYyLDcgKzQyNzAsNyBAQAogLyoKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTU0xfQ1RYX25ldygpOwogICovCi1zdGF0aWMgaW50IE5hdGl2ZUNyeXB0b19TU0xfQ1RYX25ldyhKTklFbnYqIGVudiwgamNsYXNzKSB7CitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX1NTTF9DVFhfbmV3KEpOSUVudiogZW52LCBqY2xhc3MpIHsKICAgICBVbmlxdWVfU1NMX0NUWCBzc2xDdHgoU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSk7CiAgICAgaWYgKHNzbEN0eC5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJTU0xfQ1RYX25ldyIpOwpAQCAtMjc5MiwxMCArNDMwMCwxMCBAQAogICAgICAqIGFuZCB1bmRlc2lyYWJsZS4pCiAgICAgICovCiAgICAgbW9kZSB8PSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURTsKLSNpZiBkZWZpbmVkKFNTTF9NT0RFX1NNQUxMX0JVRkZFUlMpIC8qIG5vdCBhbGwgU1NMIHZlcnNpb25zIGhhdmUgdGhpcyAqLwotICAgIG1vZGUgfD0gU1NMX01PREVfU01BTExfQlVGRkVSUzsgIC8qIGxhemlseSBhbGxvY2F0ZSByZWNvcmQgYnVmZmVyczsgdXN1YWxseSBzYXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDQ0ayBvdmVyIHRoZSBkZWZhdWx0ICovCi0jZW5kaWYKKworICAgIC8vIFJldXNlIGVtcHR5IGJ1ZmZlcnMgd2l0aGluIHRoZSBTU0xfQ1RYIHRvIHNhdmUgbWVtb3J5CisgICAgbW9kZSB8PSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlM7CisKICAgICBTU0xfQ1RYX3NldF9tb2RlKHNzbEN0eC5nZXQoKSwgbW9kZSk7CiAKICAgICBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjayhzc2xDdHguZ2V0KCksIGNlcnRfdmVyaWZ5X2NhbGxiYWNrLCBOVUxMKTsKQEAgLTI4MDYsMTQgKzQzMTQsMTQgQEAKICAgICBTU0xfQ1RYX3NldF90bXBfZWNkaF9jYWxsYmFjayhzc2xDdHguZ2V0KCksIHRtcF9lY2RoX2NhbGxiYWNrKTsKIAogICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX1NTTF9DVFhfbmV3ID0+ICVwIiwgc3NsQ3R4LmdldCgpKTsKLSAgICByZXR1cm4gKGppbnQpIHNzbEN0eC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIChqbG9uZykgc3NsQ3R4LnJlbGVhc2UoKTsKIH0KIAogLyoqCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNTTF9DVFhfZnJlZShpbnQgc3NsX2N0eCkKICAqLwogc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9DVFhfZnJlZShKTklFbnYqIGVudiwKLSAgICAgICAgamNsYXNzLCBqaW50IHNzbF9jdHhfYWRkcmVzcykKKyAgICAgICAgamNsYXNzLCBqbG9uZyBzc2xfY3R4X2FkZHJlc3MpCiB7CiAgICAgU1NMX0NUWCogc3NsX2N0eCA9IHRvX1NTTF9DVFgoZW52LCBzc2xfY3R4X2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsX2N0eD0lcCBOYXRpdmVDcnlwdG9fU1NMX0NUWF9mcmVlIiwgc3NsX2N0eCk7CkBAIC0yODI0LDcgKzQzMzIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3NsX2N0eF9hZGRyZXNzLCBqYnl0ZUFycmF5IHNpZF9jdHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsb25nIHNzbF9jdHhfYWRkcmVzcywgamJ5dGVBcnJheSBzaWRfY3R4KQogewogICAgIFNTTF9DVFgqIHNzbF9jdHggPSB0b19TU0xfQ1RYKGVudiwgc3NsX2N0eF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbF9jdHg9JXAgTmF0aXZlQ3J5cHRvX1NTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCBzaWRfY3R4PSVwIiwgc3NsX2N0eCwgc2lkX2N0eCk7CkBAIC0yODU3LDcgKzQzNjUsNyBAQAogLyoqCiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU1NMX25ldyhpbnQgc3NsX2N0eCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX1NTTF9uZXcoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBzc2xfY3R4X2FkZHJlc3MpCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX1NTTF9uZXcoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2N0eF9hZGRyZXNzKQogewogICAgIFNTTF9DVFgqIHNzbF9jdHggPSB0b19TU0xfQ1RYKGVudiwgc3NsX2N0eF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbF9jdHg9JXAgTmF0aXZlQ3J5cHRvX1NTTF9uZXciLCBzc2xfY3R4KTsKQEAgLTI4ODMsMTAgKzQzOTEsMTY0IEBACiAgICAgU1NMX3NldF92ZXJpZnkoc3NsLmdldCgpLCBTU0xfVkVSSUZZX05PTkUsIE5VTEwpOwogCiAgICAgSk5JX1RSQUNFKCJzc2xfY3R4PSVwIE5hdGl2ZUNyeXB0b19TU0xfbmV3ID0+IHNzbD0lcCIsIHNzbF9jdHgsIHNzbC5nZXQoKSk7Ci0gICAgcmV0dXJuIChqaW50KSBzc2wucmVsZWFzZSgpOworICAgIHJldHVybiAoamxvbmcpIHNzbC5yZWxlYXNlKCk7CiB9CiAKLXN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9hZGRyZXNzLCBqaW50IHBrZXlSZWYpIHsKKworc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9lbmFibGVfdGxzX2NoYW5uZWxfaWQoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MpCit7CisgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CisgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX05hdGl2ZUNyeXB0b19TU0xfZW5hYmxlX3Rsc19jaGFubmVsX2lkIiwgc3NsKTsKKyAgICBpZiAoc3NsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvbmcgcmV0ID0gU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZChzc2wpOworICAgIGlmIChyZXQgIT0gMUwpIHsKKyAgICAgICAgQUxPR0UoIiVzIiwgRVJSX2Vycm9yX3N0cmluZyhFUlJfcGVla19lcnJvcigpLCBOVUxMKSk7CisgICAgICAgIHRocm93U1NMRXhjZXB0aW9uV2l0aFNzbEVycm9ycyhlbnYsIHNzbCwgU1NMX0VSUk9SX05PTkUsICJFcnJvciBlbmFibGluZyBDaGFubmVsIElEIik7CisgICAgICAgIFNTTF9jbGVhcihzc2wpOworICAgICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZCA9PiBlcnJvciIsIHNzbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19TU0xfZ2V0X3Rsc19jaGFubmVsX2lkKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKQoreworICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOworICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19OYXRpdmVDcnlwdG9fU1NMX2dldF90bHNfY2hhbm5lbF9pZCIsIHNzbCk7CisgICAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIENoYW5uZWwgSUQgaXMgNjQgYnl0ZXMgbG9uZy4gVW5mb3J0dW5hdGVseSwgT3BlblNTTCBkb2Vzbid0IGRlY2xhcmUgdGhpcyBsZW5ndGgKKyAgICAvLyBhcyBhIGNvbnN0YW50IGFueXdoZXJlLgorICAgIGpieXRlQXJyYXkgamF2YUJ5dGVzID0gZW52LT5OZXdCeXRlQXJyYXkoNjQpOworICAgIFNjb3BlZEJ5dGVBcnJheVJXIGJ5dGVzKGVudiwgamF2YUJ5dGVzKTsKKyAgICBpZiAoYnl0ZXMuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoIk5hdGl2ZUNyeXB0b19TU0xfZ2V0X3Rsc19jaGFubmVsX2lkKCVwKSA9PiBOVUxMIiwgc3NsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhciogdG1wID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYnl0ZXMuZ2V0KCkpOworICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkIG1ldGhvZCBiZWxvdyBhbHdheXMgcmV0dXJucyA2NCAodXBvbiBzdWNjZXNzKQorICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciAidG1wIi4gVGh1cywgdGhlIGNvcnJlY3RuZXNzCisgICAgLy8gb2YgdGhpcyBjb2RlIGN1cnJlbnRseSByZWxpZXMgb24gdGhlICJ0bXAiIGJ1ZmZlciBiZWluZyBleGFjdGx5IDY0IGJ5dGVzIGxvbmcuCisgICAgbG9uZyByZXQgPSBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkKHNzbCwgdG1wLCA2NCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIC8vIENoYW5uZWwgSUQgZWl0aGVyIG5vdCBzZXQgb3IgZGlkIG5vdCB2ZXJpZnkKKyAgICAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fU1NMX2dldF90bHNfY2hhbm5lbF9pZCglcCkgPT4gbm90IGF2YWlsYWJsZSIsIHNzbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAocmV0ICE9IDY0KSB7CisgICAgICAgIEFMT0dFKCIlcyIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX3BlZWtfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICB0aHJvd1NTTEV4Y2VwdGlvbldpdGhTc2xFcnJvcnMoZW52LCBzc2wsIFNTTF9FUlJPUl9OT05FLCAiRXJyb3IgZ2V0dGluZyBDaGFubmVsIElEIik7CisgICAgICAgIFNTTF9jbGVhcihzc2wpOworICAgICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX2dldF90bHNfY2hhbm5lbF9pZCA9PiBlcnJvciwgcmV0dXJuZWQgJWxkIiwgc3NsLCByZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fTmF0aXZlQ3J5cHRvX1NTTF9nZXRfdGxzX2NoYW5uZWxfaWQoKSA9PiAlcCIsIHNzbCwgamF2YUJ5dGVzKTsKKyAgICByZXR1cm4gamF2YUJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9PcGVuU1NMX1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkKAorICAgICAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfYWRkcmVzcywgamxvbmcgcGtleVJlZikKK3sKKyAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKKyAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKKyAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9PcGVuU1NMX1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkIHByaXZhdGVrZXk9JXAiLAorICAgICAgICAgICAgc3NsLCBwa2V5KTsKKyAgICBpZiAoc3NsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwa2V5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkIHJlcXVpcmVzIHNzbC0+c2VydmVyIHRvIGJlIHNldCB0byAwLgorICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDEgYW5kIGl0J3Mgb25seSBjaGFuZ2VkIHRvIDAganVzdAorICAgIC8vIGJlZm9yZSB0aGUgaGFuZHNoYWtlIHN0YXJ0cyAoc2VlIE5hdGl2ZUNyeXB0b19TU0xfZG9faGFuZHNoYWtlKS4KKyAgICBzc2wtPnNlcnZlciA9IDA7CisgICAgbG9uZyByZXQgPSBTU0xfc2V0MV90bHNfY2hhbm5lbF9pZChzc2wsIHBrZXkpOworCisgICAgaWYgKHJldCAhPSAxTCkgeworICAgICAgICBBTE9HRSgiJXMiLCBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9wZWVrX2Vycm9yKCksIE5VTEwpKTsKKyAgICAgICAgdGhyb3dTU0xFeGNlcHRpb25XaXRoU3NsRXJyb3JzKAorICAgICAgICAgICAgICAgIGVudiwgc3NsLCBTU0xfRVJST1JfTk9ORSwgIkVycm9yIHNldHRpbmcgcHJpdmF0ZSBrZXkgZm9yIENoYW5uZWwgSUQiKTsKKyAgICAgICAgU1NMX2NsZWFyKHNzbCk7CisgICAgICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQgPT4gZXJyb3IiLCBzc2wpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFNTTF91c2VfUHJpdmF0ZUtleSBleHBlY3RzIHRvIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBFVlBfUEtFWSwKKyAgICAvLyBidXQgd2UgaGF2ZSBhbiBleHRlcm5hbCByZWZlcmVuY2UgZnJvbSB0aGUgY2FsbGVyIHN1Y2ggYXMgYW4KKyAgICAvLyBPcGVuU1NMS2V5LCBzbyB3ZSBtYW51YWxseSBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBoZXJlLgorICAgIENSWVBUT19hZGQoJnBrZXktPnJlZmVyZW5jZXMsKzEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCisgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfT3BlblNTTF9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCA9PiBvayIsIHNzbCk7Cit9CisKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfdXNlX1BLQ1M4X1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkKAorICAgICAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfYWRkcmVzcywgamJ5dGVBcnJheSBwcml2YXRla2V5KQoreworICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOworICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfdXNlX1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkIHByaXZhdGVrZXk9JXAiLCBzc2wsCisgICAgICAgICAgICBwcml2YXRla2V5KTsKKyAgICBpZiAoc3NsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNjb3BlZEJ5dGVBcnJheVJPIGJ1ZihlbnYsIHByaXZhdGVrZXkpOworICAgIGlmIChidWYuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCA9PiB0aHJldyBleGNlcHRpb24iLAorICAgICAgICAgICAgICAgIHNzbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmLmdldCgpKTsKKyAgICBVbmlxdWVfUEtDUzhfUFJJVl9LRVlfSU5GTyBwa2NzOChkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhOVUxMLCAmdG1wLCBidWYuc2l6ZSgpKSk7CisgICAgaWYgKHBrY3M4LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIiwgRVJSX2Vycm9yX3N0cmluZyhFUlJfcGVla19lcnJvcigpLCBOVUxMKSk7CisgICAgICAgIHRocm93U1NMRXhjZXB0aW9uV2l0aFNzbEVycm9ycyhlbnYsIHNzbCwgU1NMX0VSUk9SX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBwcml2YXRlIGtleSBmcm9tIERFUiB0byBQS0NTOCIpOworICAgICAgICBTU0xfY2xlYXIoc3NsKTsKKyAgICAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfUHJpdmF0ZUtleSA9PiBlcnJvciBmcm9tIERFUiB0byBQS0NTOCIsIHNzbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBVbmlxdWVfRVZQX1BLRVkgcHJpdmF0ZWtleWV2cChFVlBfUEtDUzgyUEtFWShwa2NzOC5nZXQoKSkpOworICAgIGlmIChwcml2YXRla2V5ZXZwLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIiwgRVJSX2Vycm9yX3N0cmluZyhFUlJfcGVla19lcnJvcigpLCBOVUxMKSk7CisgICAgICAgIHRocm93U1NMRXhjZXB0aW9uV2l0aFNzbEVycm9ycyhlbnYsIHNzbCwgU1NMX0VSUk9SX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY3JlYXRpbmcgcHJpdmF0ZSBrZXkgZnJvbSBQS0NTOCIpOworICAgICAgICBTU0xfY2xlYXIoc3NsKTsKKyAgICAgICAgSk5JX1RSQUNFKAorICAgICAgICAgICAgICAgICJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQgPT4gZXJyb3IgZnJvbSBQS0NTOCB0byBrZXkiLAorICAgICAgICAgICAgICAgIHNzbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCBFVlBfUEtFWV90eXBlPSVkIiwKKyAgICAgICAgICAgICAgc3NsLCBFVlBfUEtFWV90eXBlKHByaXZhdGVrZXlldnAuZ2V0KCktPnR5cGUpKTsKKworICAgIC8vIFNTTF9zZXQxX3Rsc19jaGFubmVsX2lkIHJlcXVpcmVzIHNzbC0+c2VydmVyIHRvIGJlIHNldCB0byAwLgorICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDEgYW5kIGl0J3Mgb25seSBjaGFuZ2VkIHRvIDAganVzdAorICAgIC8vIGJlZm9yZSB0aGUgaGFuZHNoYWtlIHN0YXJ0cyAoc2VlIE5hdGl2ZUNyeXB0b19TU0xfZG9faGFuZHNoYWtlKS4KKyAgICBzc2wtPnNlcnZlciA9IDA7CisgICAgbG9uZyByZXQgPSBTU0xfc2V0MV90bHNfY2hhbm5lbF9pZChzc2wsIHByaXZhdGVrZXlldnAuZ2V0KCkpOworICAgIGlmIChyZXQgPT0gMUwpIHsKKyAgICAgICAgT1dORVJTSElQX1RSQU5TRkVSUkVEKHByaXZhdGVrZXlldnApOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX3BlZWtfZXJyb3IoKSwgTlVMTCkpOworICAgICAgICB0aHJvd1NTTEV4Y2VwdGlvbldpdGhTc2xFcnJvcnMoZW52LCBzc2wsIFNTTF9FUlJPUl9OT05FLCAiRXJyb3Igc2V0dGluZyBwcml2YXRlIGtleSIpOworICAgICAgICBTU0xfY2xlYXIoc3NsKTsKKyAgICAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQgPT4gZXJyb3IiLCBzc2wpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfUHJpdmF0ZUtleV9mb3JfdGxzX2NoYW5uZWxfaWQgPT4gb2siLCBzc2wpOworfQorCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9PcGVuU1NMX1ByaXZhdGVLZXkoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MsIGpsb25nIHBrZXlSZWYpIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBFVlBfUEtFWSogcGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RVZQX1BLRVkqPihwa2V5UmVmKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBTU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleSBwcml2YXRla2V5PSVwIiwgc3NsLCBwa2V5KTsKQEAgLTI5MTUsNyArNDU3Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfdXNlX1ByaXZhdGVLZXkoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzc2xfYWRkcmVzcywgamJ5dGVBcnJheSBwcml2YXRla2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcywgamJ5dGVBcnJheSBwcml2YXRla2V5KQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfdXNlX1ByaXZhdGVLZXkgcHJpdmF0ZWtleT0lcCIsIHNzbCwgcHJpdmF0ZWtleSk7CkBAIC0yOTY2LDcgKzQ2MjgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3VzZV9jZXJ0aWZpY2F0ZShKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzc2xfYWRkcmVzcywgam9iamVjdEFycmF5IGNlcnRpZmljYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsb25nIHNzbF9hZGRyZXNzLCBqb2JqZWN0QXJyYXkgY2VydGlmaWNhdGVzKQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfdXNlX2NlcnRpZmljYXRlIGNlcnRpZmljYXRlcz0lcCIsIHNzbCwgY2VydGlmaWNhdGVzKTsKQEAgLTMwNTEsNyArNDcxMyw3IEBACiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF91c2VfY2VydGlmaWNhdGUgPT4gb2siLCBzc2wpOwogfQogCi1zdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX2NoZWNrX3ByaXZhdGVfa2V5KEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MpCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX2NoZWNrX3ByaXZhdGVfa2V5KEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfY2hlY2tfcHJpdmF0ZV9rZXkiLCBzc2wpOwpAQCAtMzA2OSw3ICs0NzMxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9zZXRfY2xpZW50X0NBX2xpc3QoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3NsX2FkZHJlc3MsIGpvYmplY3RBcnJheSBwcmluY2lwYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgc3NsX2FkZHJlc3MsIGpvYmplY3RBcnJheSBwcmluY2lwYWxzKQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfc2V0X2NsaWVudF9DQV9saXN0IHByaW5jaXBhbHM9JXAiLCBzc2wsIHByaW5jaXBhbHMpOwpAQCAtMzEzNiw3ICs0Nzk4LDcgQEAKIC8qKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfZ2V0X21vZGUoaW50IHNzbCk7CiAgKi8KLXN0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fU1NMX2dldF9tb2RlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fU1NMX2dldF9tb2RlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKSB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfbW9kZSIsIHNzbCk7CiAgICAgaWYgKHNzbCA9PSBOVUxMKSB7CkBAIC0zMTUxLDcgKzQ4MTMsNyBAQAogICogcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBTU0xfc2V0X21vZGUoaW50IHNzbCwgbG9uZyBtb2RlKTsKICAqLwogc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19TU0xfc2V0X21vZGUoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgamludCBzc2xfYWRkcmVzcywgamxvbmcgbW9kZSkgeworICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcywgamxvbmcgbW9kZSkgewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfc2V0X21vZGUgbW9kZT0weCVsbHgiLCBzc2wsIG1vZGUpOwogICAgIGlmIChzc2wgPT0gTlVMTCkgewpAQCAtMzE2Niw3ICs0ODI4LDcgQEAKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgU1NMX2NsZWFyX21vZGUoaW50IHNzbCwgbG9uZyBtb2RlKTsKICAqLwogc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19TU0xfY2xlYXJfbW9kZShKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICBqaW50IHNzbF9hZGRyZXNzLCBqbG9uZyBtb2RlKSB7CisgICAgICAgIGpsb25nIHNzbF9hZGRyZXNzLCBqbG9uZyBtb2RlKSB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9jbGVhcl9tb2RlIG1vZGU9MHglbGx4Iiwgc3NsLCBtb2RlKTsKICAgICBpZiAoc3NsID09IE5VTEwpIHsKQEAgLTMxODEsNyArNDg0Myw3IEBACiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9nZXRfb3B0aW9ucyhpbnQgc3NsKTsKICAqLwogc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19TU0xfZ2V0X29wdGlvbnMoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgamludCBzc2xfYWRkcmVzcykgeworICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcykgewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfZ2V0X29wdGlvbnMiLCBzc2wpOwogICAgIGlmIChzc2wgPT0gTlVMTCkgewpAQCAtMzE5Niw3ICs0ODU4LDcgQEAKICAqIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgU1NMX3NldF9vcHRpb25zKGludCBzc2wsIGxvbmcgb3B0aW9ucyk7CiAgKi8KIHN0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fU1NMX3NldF9vcHRpb25zKEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgIGppbnQgc3NsX2FkZHJlc3MsIGpsb25nIG9wdGlvbnMpIHsKKyAgICAgICAgamxvbmcgc3NsX2FkZHJlc3MsIGpsb25nIG9wdGlvbnMpIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3NldF9vcHRpb25zIG9wdGlvbnM9MHglbGx4Iiwgc3NsLCBvcHRpb25zKTsKICAgICBpZiAoc3NsID09IE5VTEwpIHsKQEAgLTMyMTEsNyArNDg3Myw3IEBACiAgKiBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIFNTTF9jbGVhcl9vcHRpb25zKGludCBzc2wsIGxvbmcgb3B0aW9ucyk7CiAgKi8KIHN0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fU1NMX2NsZWFyX29wdGlvbnMoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgamludCBzc2xfYWRkcmVzcywgamxvbmcgb3B0aW9ucykgeworICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcywgamxvbmcgb3B0aW9ucykgewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfY2xlYXJfb3B0aW9ucyBvcHRpb25zPTB4JWxseCIsIHNzbCwgb3B0aW9ucyk7CiAgICAgaWYgKHNzbCA9PSBOVUxMKSB7CkBAIC0zMjI2LDcgKzQ4ODgsNyBAQAogICogU2V0cyB0aGUgY2lwaGVycyBzdWl0ZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGUgU1NMCiAgKi8KIHN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfc2V0X2NpcGhlcl9saXN0cyhKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICBqaW50IHNzbF9hZGRyZXNzLCBqb2JqZWN0QXJyYXkgY2lwaGVyU3VpdGVzKQorICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcywgam9iamVjdEFycmF5IGNpcGhlclN1aXRlcykKIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3NldF9jaXBoZXJfbGlzdHMgY2lwaGVyU3VpdGVzPSVwIiwgc3NsLCBjaXBoZXJTdWl0ZXMpOwpAQCAtMzI5MSw3ICs0OTUzLDcgQEAKICAqIFNldHMgY2VydGlmaWNhdGUgZXhwZWN0YXRpb25zLCBlc3BlY2lhbGx5IGZvciBzZXJ2ZXIgdG8gcmVxdWVzdCBjbGllbnQgYXV0aAogICovCiBzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3NldF92ZXJpZnkoSk5JRW52KiBlbnYsCi0gICAgICAgIGpjbGFzcywgamludCBzc2xfYWRkcmVzcywgamludCBtb2RlKQorICAgICAgICBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzLCBqaW50IG1vZGUpCiB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9zZXRfdmVyaWZ5IG1vZGU9JXgiLCBzc2wsIG1vZGUpOwpAQCAtMzMwNSw3ICs0OTY3LDcgQEAKICAqIFNldHMgdGhlIGNpcGhlcnMgc3VpdGVzIHRoYXQgYXJlIGVuYWJsZWQgaW4gdGhlIFNTTAogICovCiBzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3NldF9zZXNzaW9uKEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgIGppbnQgc3NsX2FkZHJlc3MsIGppbnQgc3NsX3Nlc3Npb25fYWRkcmVzcykKKyAgICAgICAgamxvbmcgc3NsX2FkZHJlc3MsIGpsb25nIHNzbF9zZXNzaW9uX2FkZHJlc3MpCiB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgU1NMX1NFU1NJT04qIHNzbF9zZXNzaW9uID0gdG9fU1NMX1NFU1NJT04oZW52LCBzc2xfc2Vzc2lvbl9hZGRyZXNzLCBmYWxzZSk7CkBAIC0zMzMyLDcgKzQ5OTQsNyBAQAogICogU2V0cyB0aGUgY2lwaGVycyBzdWl0ZXMgdGhhdCBhcmUgZW5hYmxlZCBpbiB0aGUgU1NMCiAgKi8KIHN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfc2V0X3Nlc3Npb25fY3JlYXRpb25fZW5hYmxlZChKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICBqaW50IHNzbF9hZGRyZXNzLCBqYm9vbGVhbiBjcmVhdGlvbl9lbmFibGVkKQorICAgICAgICBqbG9uZyBzc2xfYWRkcmVzcywgamJvb2xlYW4gY3JlYXRpb25fZW5hYmxlZCkKIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3NldF9zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQgY3JlYXRpb25fZW5hYmxlZD0lZCIsCkBAIC0zMzQ0LDcgKzUwMDYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgIGppbnQgc3NsX2FkZHJlc3MsIGpzdHJpbmcgaG9zdG5hbWUpCisgICAgICAgIGpsb25nIHNzbF9hZGRyZXNzLCBqc3RyaW5nIGhvc3RuYW1lKQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUgaG9zdG5hbWU9JXAiLApAQCAtMzM3MCw3ICs1MDMyLDcgQEAKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX3NldF90bHNleHRfaG9zdF9uYW1lID0+IG9rIiwgc3NsKTsKIH0KIAotc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfc2VydmVybmFtZShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9hZGRyZXNzKSB7CitzdGF0aWMganN0cmluZyBOYXRpdmVDcnlwdG9fU1NMX2dldF9zZXJ2ZXJuYW1lKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKSB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfc2VydmVybmFtZSIsIHNzbCk7CiAgICAgaWYgKHNzbCA9PSBOVUxMKSB7CkBAIC0zNDMwLDcgKzUwOTIsNyBAQAogICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKIH0KIAotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9DVFhfZW5hYmxlX25wbihKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9jdHhfYWRkcmVzcykKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfQ1RYX2VuYWJsZV9ucG4oSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2N0eF9hZGRyZXNzKQogewogICAgIFNTTF9DVFgqIHNzbF9jdHggPSB0b19TU0xfQ1RYKGVudiwgc3NsX2N0eF9hZGRyZXNzLCB0cnVlKTsKICAgICBpZiAoc3NsX2N0eCA9PSBOVUxMKSB7CkBAIC0zNDQwLDcgKzUxMDIsNyBAQAogICAgIFNTTF9DVFhfc2V0X25leHRfcHJvdG9zX2FkdmVydGlzZWRfY2Ioc3NsX2N0eCwgbmV4dF9wcm90b3NfYWR2ZXJ0aXNlZF9jYWxsYmFjaywgTlVMTCk7IC8vIHNlcnZlcgogfQogCi1zdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX0NUWF9kaXNhYmxlX25wbihKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9jdHhfYWRkcmVzcykKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfQ1RYX2Rpc2FibGVfbnBuKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9jdHhfYWRkcmVzcykKIHsKICAgICBTU0xfQ1RYKiBzc2xfY3R4ID0gdG9fU1NMX0NUWChlbnYsIHNzbF9jdHhfYWRkcmVzcywgdHJ1ZSk7CiAgICAgaWYgKHNzbF9jdHggPT0gTlVMTCkgewpAQCAtMzQ1MSw3ICs1MTEzLDcgQEAKIH0KIAogc3RhdGljIGpieXRlQXJyYXkgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfbnBuX25lZ290aWF0ZWRfcHJvdG9jb2woSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgamludCBzc2xfYWRkcmVzcykKKyAgICAgICAgamxvbmcgc3NsX2FkZHJlc3MpCiB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfbnBuX25lZ290aWF0ZWRfcHJvdG9jb2wiLCBzc2wpOwpAQCAtMzQ3NCw3ICs1MTM2LDcgQEAKIC8qKgogICogUGVyZm9ybSBTU0wgaGFuZHNoYWtlCiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19TU0xfZG9faGFuZHNoYWtlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MsCitzdGF0aWMgamxvbmcgTmF0aXZlQ3J5cHRvX1NTTF9kb19oYW5kc2hha2UoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MsCiAgICAgICAgIGpvYmplY3QgZmRPYmplY3QsIGpvYmplY3Qgc2hjLCBqaW50IHRpbWVvdXRfbWlsbGlzLCBqYm9vbGVhbiBjbGllbnRfbW9kZSwKICAgICAgICAgamJ5dGVBcnJheSBucG5Qcm90b2NvbHMpCiB7CkBAIC0zNjQ1LDEzICs1MzA3LDEzIEBACiAgICAgfQogICAgIFNTTF9TRVNTSU9OKiBzc2xfc2Vzc2lvbiA9IFNTTF9nZXQxX3Nlc3Npb24oc3NsKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX2RvX2hhbmRzaGFrZSA9PiBzc2xfc2Vzc2lvbj0lcCIsIHNzbCwgc3NsX3Nlc3Npb24pOwotICAgIHJldHVybiAoamludCkgc3NsX3Nlc3Npb247CisgICAgcmV0dXJuIChqbG9uZykgc3NsX3Nlc3Npb247CiB9CiAKIC8qKgogICogUGVyZm9ybSBTU0wgcmVuZWdvdGlhdGlvbgogICovCi1zdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3JlbmVnb3RpYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MpCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX3JlbmVnb3RpYXRlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKQogewogICAgIFNTTCogc3NsID0gdG9fU1NMKGVudiwgc3NsX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfcmVuZWdvdGlhdGUiLCBzc2wpOwpAQCAtMzY4MCw3ICs1MzQyLDcgQEAKIC8qKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdW10gU1NMX2dldF9jZXJ0aWZpY2F0ZShpbnQgc3NsKTsKICAqLwotc3RhdGljIGpvYmplY3RBcnJheSBOYXRpdmVDcnlwdG9fU1NMX2dldF9jZXJ0aWZpY2F0ZShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9hZGRyZXNzKQorc3RhdGljIGpvYmplY3RBcnJheSBOYXRpdmVDcnlwdG9fU1NMX2dldF9jZXJ0aWZpY2F0ZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfYWRkcmVzcykKIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX2dldF9jZXJ0aWZpY2F0ZSIsIHNzbCk7CkBAIC0zNzE5LDcgKzUzODEsNyBAQAogfQogCiAvLyBGaWxscyBhIGJ5dGVbXVtdIHdpdGggdGhlIHBlZXIgY2VydGlmaWNhdGVzIGluIHRoZSBjaGFpbi4KLXN0YXRpYyBqb2JqZWN0QXJyYXkgTmF0aXZlQ3J5cHRvX1NTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MpCitzdGF0aWMgam9iamVjdEFycmF5IE5hdGl2ZUNyeXB0b19TU0xfZ2V0X3BlZXJfY2VydF9jaGFpbihKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfYWRkcmVzcykKIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbD0lcCBOYXRpdmVDcnlwdG9fU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4iLCBzc2wpOwpAQCAtMzg5NCw3ICs1NTU2LDcgQEAKICAqIE9wZW5TU0wgcmVhZCBmdW5jdGlvbiAoMik6IHJlYWQgaW50byBidWZmZXIgYXQgb2Zmc2V0IG4gY2h1bmtzLgogICogUmV0dXJucyAxIChzdWNjZXNzKSBvciB2YWx1ZSA8PSAwIChmYWlsdXJlKS4KICAqLwotc3RhdGljIGppbnQgTmF0aXZlQ3J5cHRvX1NTTF9yZWFkKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MsIGpvYmplY3QgZmRPYmplY3QsCitzdGF0aWMgamludCBOYXRpdmVDcnlwdG9fU1NMX3JlYWQoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MsIGpvYmplY3QgZmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBzaGMsIGpieXRlQXJyYXkgYiwgamludCBvZmZzZXQsIGppbnQgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgcmVhZF90aW1lb3V0X21pbGxpcykKIHsKQEAgLTQxMDEsNyArNTc2Myw3IEBACiAvKioKICAqIE9wZW5TU0wgd3JpdGUgZnVuY3Rpb24gKDIpOiB3cml0ZSBpbnRvIGJ1ZmZlciBhdCBvZmZzZXQgbiBjaHVua3MuCiAgKi8KLXN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfd3JpdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBzc2xfYWRkcmVzcywgam9iamVjdCBmZE9iamVjdCwKK3N0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfd3JpdGUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MsIGpvYmplY3QgZmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3Qgc2hjLCBqYnl0ZUFycmF5IGIsIGppbnQgb2Zmc2V0LCBqaW50IGxlbiwgamludCB3cml0ZV90aW1lb3V0X21pbGxpcykKIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCB0cnVlKTsKQEAgLTQxNTEsNyArNTgxMyw3IEBACiAgKiBJbnRlcnJ1cHQgYW55IHBlbmRpbmcgSS9PIGJlZm9yZSBjbG9zaW5nIHRoZSBzb2NrZXQuCiAgKi8KIHN0YXRpYyB2b2lkIE5hdGl2ZUNyeXB0b19TU0xfaW50ZXJydXB0KAotICAgICAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9hZGRyZXNzKSB7CisgICAgICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9hZGRyZXNzKSB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgZmFsc2UpOwogICAgIEpOSV9UUkFDRSgic3NsPSVwIE5hdGl2ZUNyeXB0b19TU0xfaW50ZXJydXB0Iiwgc3NsKTsKICAgICBpZiAoc3NsID09IE5VTEwpIHsKQEAgLTQxNzUsNyArNTgzNyw3IEBACiAvKioKICAqIE9wZW5TU0wgY2xvc2UgU1NMIHNvY2tldCBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9zaHV0ZG93bihKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9hZGRyZXNzLAorc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9zaHV0ZG93bihKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBmZE9iamVjdCwgam9iamVjdCBzaGMpIHsKICAgICBTU0wqIHNzbCA9IHRvX1NTTChlbnYsIHNzbF9hZGRyZXNzLCBmYWxzZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9zaHV0ZG93biBmZD0lcCBzaGM9JXAiLCBzc2wsIGZkT2JqZWN0LCBzaGMpOwpAQCAtNDI1NSw3ICs1OTE3LDcgQEAKIC8qKgogICogcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTU0xfZnJlZShpbnQgc3NsKTsKICAqLwotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9mcmVlKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX2FkZHJlc3MpCitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX2ZyZWUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX2FkZHJlc3MpCiB7CiAgICAgU1NMKiBzc2wgPSB0b19TU0woZW52LCBzc2xfYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2w9JXAgTmF0aXZlQ3J5cHRvX1NTTF9mcmVlIiwgc3NsKTsKQEAgLTQyNzMsNyArNTkzNSw3IEBACiAgKiBHZXRzIGFuZCByZXR1cm5zIGluIGEgYnl0ZSBhcnJheSB0aGUgSUQgb2YgdGhlIGFjdHVhbCBTU0wgc2Vzc2lvbi4KICAqLwogc3RhdGljIGpieXRlQXJyYXkgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX3Nlc3Npb25faWQoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3NsX3Nlc3Npb25fYWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgc3NsX3Nlc3Npb25fYWRkcmVzcykgewogICAgIFNTTF9TRVNTSU9OKiBzc2xfc2Vzc2lvbiA9IHRvX1NTTF9TRVNTSU9OKGVudiwgc3NsX3Nlc3Npb25fYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2xfc2Vzc2lvbj0lcCBOYXRpdmVDcnlwdG9fU1NMX1NFU1NJT05fc2Vzc2lvbl9pZCIsIHNzbF9zZXNzaW9uKTsKICAgICBpZiAoc3NsX3Nlc3Npb24gPT0gTlVMTCkgewpAQCAtNDI5Myw3ICs1OTU1LDcgQEAKICAqIEdldHMgYW5kIHJldHVybnMgaW4gYSBsb25nIGludGVnZXIgdGhlIGNyZWF0aW9uJ3MgdGltZSBvZiB0aGUKICAqIGFjdHVhbCBTU0wgc2Vzc2lvbi4KICAqLwotc3RhdGljIGpsb25nIE5hdGl2ZUNyeXB0b19TU0xfU0VTU0lPTl9nZXRfdGltZShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9zZXNzaW9uX2FkZHJlc3MpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fU1NMX1NFU1NJT05fZ2V0X3RpbWUoSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX3Nlc3Npb25fYWRkcmVzcykgewogICAgIFNTTF9TRVNTSU9OKiBzc2xfc2Vzc2lvbiA9IHRvX1NTTF9TRVNTSU9OKGVudiwgc3NsX3Nlc3Npb25fYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2xfc2Vzc2lvbj0lcCBOYXRpdmVDcnlwdG9fU1NMX1NFU1NJT05fZ2V0X3RpbWUiLCBzc2xfc2Vzc2lvbik7CiAgICAgaWYgKHNzbF9zZXNzaW9uID09IE5VTEwpIHsKQEAgLTQzMTAsNyArNTk3Miw3IEBACiAgKiBHZXRzIGFuZCByZXR1cm5zIGluIGEgc3RyaW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBTU0wgcHJvdG9jb2wuIElmIGl0CiAgKiByZXR1cm5zIHRoZSBzdHJpbmcgInVua25vd24iIGl0IG1lYW5zIHRoYXQgbm8gY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KICAqLwotc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX2dldF92ZXJzaW9uKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX3Nlc3Npb25fYWRkcmVzcykgeworc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX2dldF92ZXJzaW9uKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIHNzbF9zZXNzaW9uX2FkZHJlc3MpIHsKICAgICBTU0xfU0VTU0lPTiogc3NsX3Nlc3Npb24gPSB0b19TU0xfU0VTU0lPTihlbnYsIHNzbF9zZXNzaW9uX2FkZHJlc3MsIHRydWUpOwogICAgIEpOSV9UUkFDRSgic3NsX3Nlc3Npb249JXAgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX2dldF92ZXJzaW9uIiwgc3NsX3Nlc3Npb24pOwogICAgIGlmIChzc2xfc2Vzc2lvbiA9PSBOVUxMKSB7CkBAIC00MzI0LDcgKzU5ODYsNyBAQAogLyoqCiAgKiBHZXRzIGFuZCByZXR1cm5zIGluIGEgc3RyaW5nIHRoZSBjaXBoZXIgbmVnb3RpYXRlZCBmb3IgdGhlIFNTTCBzZXNzaW9uLgogICovCi1zdGF0aWMganN0cmluZyBOYXRpdmVDcnlwdG9fU1NMX1NFU1NJT05fY2lwaGVyKEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgc3NsX3Nlc3Npb25fYWRkcmVzcykgeworc3RhdGljIGpzdHJpbmcgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX2NpcGhlcihKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfc2Vzc2lvbl9hZGRyZXNzKSB7CiAgICAgU1NMX1NFU1NJT04qIHNzbF9zZXNzaW9uID0gdG9fU1NMX1NFU1NJT04oZW52LCBzc2xfc2Vzc2lvbl9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbF9zZXNzaW9uPSVwIE5hdGl2ZUNyeXB0b19TU0xfU0VTU0lPTl9jaXBoZXIiLCBzc2xfc2Vzc2lvbik7CiAgICAgaWYgKHNzbF9zZXNzaW9uID09IE5VTEwpIHsKQEAgLTQzMzksNyArNjAwMSw3IEBACiAvKioKICAqIEZyZWVzIHRoZSBTU0wgc2Vzc2lvbi4KICAqLwotc3RhdGljIHZvaWQgTmF0aXZlQ3J5cHRvX1NTTF9TRVNTSU9OX2ZyZWUoSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBzc2xfc2Vzc2lvbl9hZGRyZXNzKSB7CitzdGF0aWMgdm9pZCBOYXRpdmVDcnlwdG9fU1NMX1NFU1NJT05fZnJlZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBzc2xfc2Vzc2lvbl9hZGRyZXNzKSB7CiAgICAgU1NMX1NFU1NJT04qIHNzbF9zZXNzaW9uID0gdG9fU1NMX1NFU1NJT04oZW52LCBzc2xfc2Vzc2lvbl9hZGRyZXNzLCB0cnVlKTsKICAgICBKTklfVFJBQ0UoInNzbF9zZXNzaW9uPSVwIE5hdGl2ZUNyeXB0b19TU0xfU0VTU0lPTl9mcmVlIiwgc3NsX3Nlc3Npb24pOwogICAgIGlmIChzc2xfc2Vzc2lvbiA9PSBOVUxMKSB7CkBAIC00MzU0LDQwICs2MDE2LDIwIEBACiAgKiBub3QgY2VydGlmaWNhdGVzKS4gUmV0dXJucyBhIGJ5dGVbXSBjb250YWluaW5nIHRoZSBERVItZW5jb2RlZCBzdGF0ZS4KICAqIFNlZSBhcGFjaGUgbW9kX3NzbC4KICAqLwotc3RhdGljIGpieXRlQXJyYXkgTmF0aXZlQ3J5cHRvX2kyZF9TU0xfU0VTU0lPTihKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHNzbF9zZXNzaW9uX2FkZHJlc3MpIHsKK3N0YXRpYyBqYnl0ZUFycmF5IE5hdGl2ZUNyeXB0b19pMmRfU1NMX1NFU1NJT04oSk5JRW52KiBlbnYsIGpjbGFzcywgamxvbmcgc3NsX3Nlc3Npb25fYWRkcmVzcykgewogICAgIFNTTF9TRVNTSU9OKiBzc2xfc2Vzc2lvbiA9IHRvX1NTTF9TRVNTSU9OKGVudiwgc3NsX3Nlc3Npb25fYWRkcmVzcywgdHJ1ZSk7CiAgICAgSk5JX1RSQUNFKCJzc2xfc2Vzc2lvbj0lcCBOYXRpdmVDcnlwdG9faTJkX1NTTF9TRVNTSU9OIiwgc3NsX3Nlc3Npb24pOwogICAgIGlmIChzc2xfc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIERFUiBkYXRhCi0gICAgaW50IHNpemUgPSBpMmRfU1NMX1NFU1NJT04oc3NsX3Nlc3Npb24sIE5VTEwpOwotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgSk5JX1RSQUNFKCJzc2xfc2Vzc2lvbj0lcCBOYXRpdmVDcnlwdG9faTJkX1NTTF9TRVNTSU9OID0+IE5VTEwiLCBzc2xfc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGpieXRlQXJyYXkgamF2YUJ5dGVzID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZSk7Ci0gICAgaWYgKGphdmFCeXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIFNjb3BlZEJ5dGVBcnJheVJXIGJ5dGVzKGVudiwgamF2YUJ5dGVzKTsKLSAgICAgICAgaWYgKGJ5dGVzLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIEpOSV9UUkFDRSgic3NsX3Nlc3Npb249JXAgTmF0aXZlQ3J5cHRvX2kyZF9TU0xfU0VTU0lPTiA9PiB0aHJldyBleGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIHNzbF9zZXNzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIHVjcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGJ5dGVzLmdldCgpKTsKLSAgICAgICAgaTJkX1NTTF9TRVNTSU9OKHNzbF9zZXNzaW9uLCAmdWNwKTsKLSAgICB9Ci0KLSAgICBKTklfVFJBQ0UoInNzbF9zZXNzaW9uPSVwIE5hdGl2ZUNyeXB0b19pMmRfU1NMX1NFU1NJT04gPT4gc2l6ZT0lZCIsIHNzbF9zZXNzaW9uLCBzaXplKTsKLSAgICByZXR1cm4gamF2YUJ5dGVzOworICAgIHJldHVybiBBU04xVG9CeXRlQXJyYXk8U1NMX1NFU1NJT04+KGVudiwgc3NsX3Nlc3Npb24sIGkyZF9TU0xfU0VTU0lPTik7CiB9CiAKIC8qKgogICogRGVzZXJpYWxpemUgdGhlIHNlc3Npb24uCiAgKi8KLXN0YXRpYyBqaW50IE5hdGl2ZUNyeXB0b19kMmlfU1NMX1NFU1NJT04oSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGVBcnJheSBqYXZhQnl0ZXMpIHsKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fZDJpX1NTTF9TRVNTSU9OKEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlQXJyYXkgamF2YUJ5dGVzKSB7CiAgICAgSk5JX1RSQUNFKCJOYXRpdmVDcnlwdG9fZDJpX1NTTF9TRVNTSU9OIGJ5dGVzPSVwIiwgamF2YUJ5dGVzKTsKIAogICAgIFNjb3BlZEJ5dGVBcnJheVJPIGJ5dGVzKGVudiwgamF2YUJ5dGVzKTsKQEAgLTQ0MTMsMTAgKzYwNTUsMTYgQEAKICAgICAgICAgICAgICAgICAgIHNzbF9zZXNzaW9uLT5jaXBoZXJfaWQsIGNpcGhlcl9pZF9uZXR3b3JrX29yZGVyLAogICAgICAgICAgICAgICAgICAgY2lwaGVyX2lkX2J5dGVfcG9pbnRlclswXSwgY2lwaGVyX2lkX2J5dGVfcG9pbnRlclsxXSwKICAgICAgICAgICAgICAgICAgIFNTTF9DSVBIRVJfZ2V0X25hbWUoc3NsX3Nlc3Npb24tPmNpcGhlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyZWVPcGVuU3NsRXJyb3JTdGF0ZSgpOwogICAgIH0KIAogICAgIEpOSV9UUkFDRSgiTmF0aXZlQ3J5cHRvX2QyaV9TU0xfU0VTU0lPTiA9PiAlcCIsIHNzbF9zZXNzaW9uKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHNzbF9zZXNzaW9uKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihzc2xfc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBqbG9uZyBOYXRpdmVDcnlwdG9fRVJSX3BlZWtfbGFzdF9lcnJvcihKTklFbnYqLCBqY2xhc3MpIHsKKyAgICByZXR1cm4gRVJSX3BlZWtfbGFzdF9lcnJvcigpOwogfQogCiAjZGVmaW5lIEZJTEVfREVTQ1JJUFRPUiAiTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IgpAQCAtNDQyNCw5OCArNjA3MiwxNjYgQEAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc05hdGl2ZUNyeXB0b01ldGhvZHNbXSA9IHsKICAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgY2xpbml0LCAiKClWIiksCiAgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9sb2FkX2R5bmFtaWMsICIoKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRU5HSU5FX2J5X2lkLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9hZGQsICIoSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9pbml0LCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFTkdJTkVfZmluaXNoLCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFTkdJTkVfZnJlZSwgIihJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXksICIoSUxqYXZhL2xhbmcvU3RyaW5nOylJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX25ld19EU0EsICIoW0JbQltCW0JbQilJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX25ld19SU0EsICIoW0JbQltCW0JbQltCW0JbQilJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX3R5cGUsICIoSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX3NpemUsICIoSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX2ZyZWUsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9QS0VZX2NtcCwgIihJSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPLCAiKEkpW0IiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8sICIoW0IpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBpMmRfUFVCS0VZLCAiKEkpW0IiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgZDJpX1BVQktFWSwgIihbQilJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJTQV9nZW5lcmF0ZV9rZXlfZXgsICIoSVtCKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgUlNBX3NpemUsICIoSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJTQV9wcml2YXRlX2VuY3J5cHQsICIoSVtCW0JJSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJTQV9wdWJsaWNfZGVjcnlwdCwgIihJW0JbQklJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgUlNBX3B1YmxpY19lbmNyeXB0LCAiKElbQltCSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBSU0FfcHJpdmF0ZV9kZWNyeXB0LCAiKElbQltCSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBnZXRfUlNBX3ByaXZhdGVfcGFyYW1zLCAiKEkpW1tCIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGdldF9SU0FfcHVibGljX3BhcmFtcywgIihJKVtbQiIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBEU0FfZ2VuZXJhdGVfa2V5LCAiKElbQltCW0JbQilJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGdldF9EU0FfcGFyYW1zLCAiKEkpW1tCIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9NRF9DVFhfZGVzdHJveSwgIihJKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX01EX0NUWF9jb3B5LCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfRGlnZXN0RmluYWwsICIoSVtCSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9EaWdlc3RJbml0LCAiKEkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSwgIihMamF2YS9sYW5nL1N0cmluZzspSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfTURfYmxvY2tfc2l6ZSwgIihJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX01EX3NpemUsICIoSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9EaWdlc3RVcGRhdGUsICIoSVtCSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfU2lnbkluaXQsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1NpZ25VcGRhdGUsICIoSVtCSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfU2lnbkZpbmFsLCAiKElbQklJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1ZlcmlmeUluaXQsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1ZlcmlmeVVwZGF0ZSwgIihJW0JJSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9WZXJpZnlGaW5hbCwgIihJW0JJSUkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfZ2V0X2NpcGhlcmJ5bmFtZSwgIihMamF2YS9sYW5nL1N0cmluZzspSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ2lwaGVySW5pdF9leCwgIihJW0JbQlopSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ2lwaGVyVXBkYXRlLCAiKElbQklbQkkpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ2lwaGVyRmluYWxfZXgsICIoSVtCSSlJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAsICIoSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9ieV9pZCwgIihMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFTkdJTkVfYWRkLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFTkdJTkVfaW5pdCwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRU5HSU5FX2ZpbmlzaCwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRU5HSU5FX2ZyZWUsICIoSilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9sb2FkX3ByaXZhdGVfa2V5LCAiKEpMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFTkdJTkVfZ2V0X2lkLCAiKEopTGphdmEvbGFuZy9TdHJpbmc7IiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcsICIoSkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0kpSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9uZXdfRFNBLCAiKFtCW0JbQltCW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9uZXdfUlNBLCAiKFtCW0JbQltCW0JbQltCW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9uZXdfRUNfS0VZLCAiKEpKW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9uZXdfbWFjX2tleSwgIihJW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV90eXBlLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9zaXplLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9wcmludF9wdWJsaWMsICIoSilMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSwgIihKKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9mcmVlLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfUEtFWV9jbXAsICIoSkopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTywgIihKKVtCIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGQyaV9QS0NTOF9QUklWX0tFWV9JTkZPLCAiKFtCKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgaTJkX1BVQktFWSwgIihKKVtCIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGQyaV9QVUJLRVksICIoW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBSU0FfZ2VuZXJhdGVfa2V5X2V4LCAiKElbQilKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJTQV9zaXplLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBSU0FfcHJpdmF0ZV9lbmNyeXB0LCAiKElbQltCSkkpSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBSU0FfcHVibGljX2RlY3J5cHQsICIoSVtCW0JKSSlJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJTQV9wdWJsaWNfZW5jcnlwdCwgIihJW0JbQkpJKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgUlNBX3ByaXZhdGVfZGVjcnlwdCwgIihJW0JbQkpJKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgZ2V0X1JTQV9wcml2YXRlX3BhcmFtcywgIihKKVtbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBnZXRfUlNBX3B1YmxpY19wYXJhbXMsICIoSilbW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRFNBX2dlbmVyYXRlX2tleSwgIihJW0JbQltCW0IpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBnZXRfRFNBX3BhcmFtcywgIihKKVtbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSwgIihMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19HUk9VUF9uZXdfY3VydmUsICIoSVtCW0JbQilKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVDX0dST1VQX2R1cCwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfc2V0X2FzbjFfZmxhZywgIihKSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0sICIoSkkpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZSwgIihKKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19HUk9VUF9nZXRfY3VydmUsICIoSilbW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfZ2V0X29yZGVyLCAiKEopW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfZ2V0X2NvZmFjdG9yLCAiKEopW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfY2xlYXJfZnJlZSwgIihKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfY21wLCAiKEpKKVoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfZ2V0X2dlbmVyYXRvciwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfR1JPVVBfc2V0X2dlbmVyYXRvciwgIihKSltCW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBnZXRfRUNfR1JPVVBfdHlwZSwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfUE9JTlRfbmV3LCAiKEopSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19QT0lOVF9jbGVhcl9mcmVlLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19QT0lOVF9jbXAsICIoSkpKKVoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlcywgIihKSltCW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLCAiKEpKKVtbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19LRVlfZ2VuZXJhdGVfa2V5LCAiKEopSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFQ19LRVlfZ2V0MF9ncm91cCwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRUNfS0VZX2dldF9wcml2YXRlX2tleSwgIihKKVtCIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVDX0tFWV9nZXRfcHVibGljX2tleSwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX01EX0NUWF9jcmVhdGUsICIoKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX01EX0NUWF9pbml0LCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfTURfQ1RYX2Rlc3Ryb3ksICIoSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9NRF9DVFhfY29weSwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX0RpZ2VzdEZpbmFsLCAiKEpbQkkpSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfRGlnZXN0SW5pdCwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX2dldF9kaWdlc3RieW5hbWUsICIoTGphdmEvbGFuZy9TdHJpbmc7KUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX01EX2Jsb2NrX3NpemUsICIoSilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9NRF9zaXplLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfRGlnZXN0VXBkYXRlLCAiKEpbQklJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1NpZ25Jbml0LCAiKExqYXZhL2xhbmcvU3RyaW5nOylKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9TaWduVXBkYXRlLCAiKEpbQklJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX1NpZ25GaW5hbCwgIihKW0JJSilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9WZXJpZnlJbml0LCAiKExqYXZhL2xhbmcvU3RyaW5nOylKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9WZXJpZnlVcGRhdGUsICIoSltCSUkpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfVmVyaWZ5RmluYWwsICIoSltCSUlKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX0RpZ2VzdFNpZ25Jbml0LCAiKEpKSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9EaWdlc3RTaWduVXBkYXRlLCAiKEpbQilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9EaWdlc3RTaWduRmluYWwsICIoSilbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfZ2V0X2NpcGhlcmJ5bmFtZSwgIihMamF2YS9sYW5nL1N0cmluZzspSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ2lwaGVySW5pdF9leCwgIihKSltCW0JaKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX0NpcGhlclVwZGF0ZSwgIihKW0JJW0JJSSlJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9DaXBoZXJGaW5hbF9leCwgIihKW0JJKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX0NJUEhFUl9pdl9sZW5ndGgsICIoSilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9DSVBIRVJfQ1RYX25ldywgIigpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplLCAiKEopSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBnZXRfRVZQX0NJUEhFUl9DVFhfYnVmX2xlbiwgIihKKUkiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcsICIoSlopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCwgIihKSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAsICIoSilWIiksCiAgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJBTkRfc2VlZCwgIihbQilWIiksCiAgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFJBTkRfbG9hZF9maWxlLCAiKExqYXZhL2xhbmcvU3RyaW5nO0opSSIpLAogICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBSQU5EX2J5dGVzLCAiKFtCKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX0NUWF9uZXcsICIoKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX0NUWF9mcmVlLCAiKEkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQsICIoSVtCKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX25ldywgIihJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3VzZV9PcGVuU1NMX1ByaXZhdGVLZXksICIoSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfdXNlX1ByaXZhdGVLZXksICIoSVtCKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3VzZV9jZXJ0aWZpY2F0ZSwgIihJW1tCKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2NoZWNrX3ByaXZhdGVfa2V5LCAiKEkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfc2V0X2NsaWVudF9DQV9saXN0LCAiKElbW0IpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X21vZGUsICIoSSlKIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfbW9kZSwgIihJSilKIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9jbGVhcl9tb2RlLCAiKElKKUoiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2dldF9vcHRpb25zLCAiKEkpSiIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfc2V0X29wdGlvbnMsICIoSUopSiIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfY2xlYXJfb3B0aW9ucywgIihJSilKIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfY2lwaGVyX2xpc3RzLCAiKElbTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3NldF92ZXJpZnksICIoSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfc2V0X3Nlc3Npb24sICIoSUkpViIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfc2V0X3Nlc3Npb25fY3JlYXRpb25fZW5hYmxlZCwgIihJWilWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSwgIihJTGphdmEvbGFuZy9TdHJpbmc7KVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2dldF9zZXJ2ZXJuYW1lLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9kb19oYW5kc2hha2UsICIoSSIgRklMRV9ERVNDUklQVE9SIFNTTF9DQUxMQkFDS1MgIklaW0IpSSIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfcmVuZWdvdGlhdGUsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9nZXRfY2VydGlmaWNhdGUsICIoSSlbW0IiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4sICIoSSlbW0IiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3JlYWQsICIoSSIgRklMRV9ERVNDUklQVE9SIFNTTF9DQUxMQkFDS1MgIltCSUlJKUkiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3dyaXRlLCAiKEkiIEZJTEVfREVTQ1JJUFRPUiBTU0xfQ0FMTEJBQ0tTICJbQklJSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9pbnRlcnJ1cHQsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zaHV0ZG93biwgIihJIiBGSUxFX0RFU0NSSVBUT1IgU1NMX0NBTExCQUNLUyAiKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2ZyZWUsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9TRVNTSU9OX3Nlc3Npb25faWQsICIoSSlbQiIpLAotICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfU0VTU0lPTl9nZXRfdGltZSwgIihJKUoiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX1NFU1NJT05fZ2V0X3ZlcnNpb24sICIoSSlMamF2YS9sYW5nL1N0cmluZzsiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX1NFU1NJT05fY2lwaGVyLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9TRVNTSU9OX2ZyZWUsICIoSSlWIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGkyZF9TU0xfU0VTU0lPTiwgIihJKVtCIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIGQyaV9TU0xfU0VTU0lPTiwgIihbQilJIiksCi0gICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9DVFhfZW5hYmxlX25wbiwgIihJKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX0NUWF9kaXNhYmxlX25wbiwgIihJKVYiKSwKLSAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2dldF9ucG5fbmVnb3RpYXRlZF9wcm90b2NvbCwgIihJKVtCIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIE9CSl90eHQybmlkLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIE9CSl90eHQybmlkX2xvbmdOYW1lLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgT0JKX3R4dDJuaWRfb2lkLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgY3JlYXRlX0JJT19JbnB1dFN0cmVhbSwgIihMb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMQklPSW5wdXRTdHJlYW07KUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgY3JlYXRlX0JJT19PdXRwdXRTdHJlYW0sICIoTGphdmEvaW8vT3V0cHV0U3RyZWFtOylKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEJJT19yZWFkLCAiKEpbQilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEJJT193cml0ZSwgIihKW0JJSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIEJJT19mcmVlLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfQ1RYX25ldywgIigpSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfQ1RYX2ZyZWUsICIoSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCwgIihKW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfbmV3LCAiKEopSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZW5hYmxlX3Rsc19jaGFubmVsX2lkLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X3Rsc19jaGFubmVsX2lkLCAiKEopW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3VzZV9PcGVuU1NMX1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkLCAiKEpKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3VzZV9QS0NTOF9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCwgIihKW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfdXNlX09wZW5TU0xfUHJpdmF0ZUtleSwgIihKSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF91c2VfUHJpdmF0ZUtleSwgIihKW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfdXNlX2NlcnRpZmljYXRlLCAiKEpbW0IpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXksICIoSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QsICIoSltbQilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9nZXRfbW9kZSwgIihKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3NldF9tb2RlLCAiKEpKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2NsZWFyX21vZGUsICIoSkopSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X29wdGlvbnMsICIoSilKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfb3B0aW9ucywgIihKSilKIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9jbGVhcl9vcHRpb25zLCAiKEpKKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3NldF9jaXBoZXJfbGlzdHMsICIoSltMamF2YS9sYW5nL1N0cmluZzspViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfc2V0X3ZlcmlmeSwgIihKSSlWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfc2Vzc2lvbiwgIihKSilWIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkLCAiKEpaKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lLCAiKEpMamF2YS9sYW5nL1N0cmluZzspViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X3NlcnZlcm5hbWUsICIoSilMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2RvX2hhbmRzaGFrZSwgIihKIiBGSUxFX0RFU0NSSVBUT1IgU1NMX0NBTExCQUNLUyAiSVpbQilJIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9yZW5lZ290aWF0ZSwgIihKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2dldF9jZXJ0aWZpY2F0ZSwgIihKKVtbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbiwgIihKKVtbQiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfcmVhZCwgIihKIiBGSUxFX0RFU0NSSVBUT1IgU1NMX0NBTExCQUNLUyAiW0JJSUkpSSIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfd3JpdGUsICIoSiIgRklMRV9ERVNDUklQVE9SIFNTTF9DQUxMQkFDS1MgIltCSUlJKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX2ludGVycnVwdCwgIihKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX3NodXRkb3duLCAiKEoiIEZJTEVfREVTQ1JJUFRPUiBTU0xfQ0FMTEJBQ0tTICIpViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZnJlZSwgIihKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX1NFU1NJT05fc2Vzc2lvbl9pZCwgIihKKVtCIiksCisgICAgTkFUSVZFX01FVEhPRChOYXRpdmVDcnlwdG8sIFNTTF9TRVNTSU9OX2dldF90aW1lLCAiKEopSiIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfU0VTU0lPTl9nZXRfdmVyc2lvbiwgIihKKUxqYXZhL2xhbmcvU3RyaW5nOyIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfU0VTU0lPTl9jaXBoZXIsICIoSilMamF2YS9sYW5nL1N0cmluZzsiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX1NFU1NJT05fZnJlZSwgIihKKVYiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgaTJkX1NTTF9TRVNTSU9OLCAiKEopW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgZDJpX1NTTF9TRVNTSU9OLCAiKFtCKUoiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgU1NMX0NUWF9lbmFibGVfbnBuLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfQ1RYX2Rpc2FibGVfbnBuLCAiKEopViIpLAorICAgIE5BVElWRV9NRVRIT0QoTmF0aXZlQ3J5cHRvLCBTU0xfZ2V0X25wbl9uZWdvdGlhdGVkX3Byb3RvY29sLCAiKEopW0IiKSwKKyAgICBOQVRJVkVfTUVUSE9EKE5hdGl2ZUNyeXB0bywgRVJSX3BlZWtfbGFzdF9lcnJvciwgIigpSiIpLAogfTsKLQogdm9pZCByZWdpc3Rlcl9vcmdfYXBhY2hlX2hhcm1vbnlfeG5ldF9wcm92aWRlcl9qc3NlX05hdGl2ZUNyeXB0byhKTklFbnYqIGVudikgewogICAgIEpOSV9UUkFDRSgicmVnaXN0ZXJfb3JnX2FwYWNoZV9oYXJtb255X3huZXRfcHJvdmlkZXJfanNzZV9OYXRpdmVDcnlwdG8iKTsKLSAgICAvLyBSZWdpc3RlciBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk5hdGl2ZUNyeXB0byBtZXRob2RzCi0gICAgam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgIm9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvIiwgc05hdGl2ZUNyeXB0b01ldGhvZHMsIE5FTEVNKHNOYXRpdmVDcnlwdG9NZXRob2RzKSk7CisgICAgam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgIm9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc05hdGl2ZUNyeXB0b01ldGhvZHMsIE5FTEVNKHNOYXRpdmVDcnlwdG9NZXRob2RzKSk7CisKKyAgICBlbnYtPkdldEphdmFWTSgmZ0phdmFWTSk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IGxvY2FsQ2xhc3MoZW52LAorICAgICAgICAgICAgZW52LT5GaW5kQ2xhc3MoIm9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTEJJT0lucHV0U3RyZWFtIikpOworICAgIG9wZW5Tc2xPdXRwdXRTdHJlYW1DbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8amNsYXNzPihlbnYtPk5ld0dsb2JhbFJlZihsb2NhbENsYXNzLmdldCgpKSk7CisgICAgaWYgKG9wZW5Tc2xPdXRwdXRTdHJlYW1DbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmluZCBjbGFzcyBPcGVuU1NMQklPSW5wdXRTdHJlYW0iKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBpbnB1dFN0cmVhbV9yZWFkTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRChKbmlDb25zdGFudHM6OmlucHV0U3RyZWFtQ2xhc3MsICJyZWFkIiwgIihbQilJIik7CisgICAgb3BlblNzbElucHV0U3RyZWFtX3JlYWRMaW5lTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRChvcGVuU3NsT3V0cHV0U3RyZWFtQ2xhc3MsICJyZWFkTGluZSIsCisgICAgICAgICAgICAiKFtCKUkiKTsKKyAgICBvdXRwdXRTdHJlYW1fd3JpdGVNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKEpuaUNvbnN0YW50czo6b3V0cHV0U3RyZWFtQ2xhc3MsICJ3cml0ZSIsICIoW0IpViIpOworICAgIG91dHB1dFN0cmVhbV9mbHVzaE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoSm5pQ29uc3RhbnRzOjpvdXRwdXRTdHJlYW1DbGFzcywgImZsdXNoIiwgIigpViIpOwogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvc3ViLm1rIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvc3ViLm1rCmluZGV4IGQ1NzA1YTYuLjdlYTUwMzMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL21haW4vbmF0aXZlL3N1Yi5taworKysgYi9sdW5pL3NyYy9tYWluL25hdGl2ZS9zdWIubWsKQEAgLTUsNiArNSw3IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJQXN5bmNocm9ub3VzU29ja2V0Q2xvc2VNb25pdG9yLmNwcCBcCisJSWN1VXRpbGl0aWVzLmNwcCBcCiAJSm5pQ29uc3RhbnRzLmNwcCBcCiAJSm5pRXhjZXB0aW9uLmNwcCBcCiAJTmV0d29ya1V0aWxpdGllcy5jcHAgXApAQCAtMzAsNiArMzEsNyBAQAogCWphdmFfdXRpbF96aXBfQ1JDMzIuY3BwIFwKIAlqYXZhX3V0aWxfemlwX0RlZmxhdGVyLmNwcCBcCiAJamF2YV91dGlsX3ppcF9JbmZsYXRlci5jcHAgXAorCWxpYmNvcmVfaWN1X0FscGhhYmV0aWNJbmRleC5jcHAgXAogCWxpYmNvcmVfaWN1X0lDVS5jcHAgXAogCWxpYmNvcmVfaWN1X05hdGl2ZUJyZWFrSXRlcmF0b3IuY3BwIFwKIAlsaWJjb3JlX2ljdV9OYXRpdmVDb2xsYXRpb24uY3BwIFwKQEAgLTM4LDcgKzQwLDggQEAKIAlsaWJjb3JlX2ljdV9OYXRpdmVJRE4uY3BwIFwKIAlsaWJjb3JlX2ljdV9OYXRpdmVOb3JtYWxpemVyLmNwcCBcCiAJbGliY29yZV9pY3VfTmF0aXZlUGx1cmFsUnVsZXMuY3BwIFwKLQlsaWJjb3JlX2ljdV9UaW1lWm9uZXMuY3BwIFwKKwlsaWJjb3JlX2ljdV9UaW1lWm9uZU5hbWVzLmNwcCBcCisJbGliY29yZV9pY3VfVHJhbnNsaXRlcmF0b3IuY3BwIFwKIAlsaWJjb3JlX2lvX0FzeW5jaHJvbm91c0Nsb3NlTW9uaXRvci5jcHAgXAogCWxpYmNvcmVfaW9fTWVtb3J5LmNwcCBcCiAJbGliY29yZV9pb19Pc0NvbnN0YW50cy5jcHAgXApAQCAtNDgsNiArNTEsNyBAQAogCW9yZ19hcGFjaGVfaGFybW9ueV94bmV0X3Byb3ZpZGVyX2pzc2VfTmF0aXZlQ3J5cHRvLmNwcCBcCiAJcmVhZGxpbmsuY3BwIFwKIAlyZWFscGF0aC5jcHAgXAorCXN1bl9taXNjX1Vuc2FmZS5jcHAgXAogCXRvU3RyaW5nQXJyYXkuY3BwIFwKIAl2YWx1ZU9mLmNwcAogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS9zdW5fbWlzY19VbnNhZmUuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvc3VuX21pc2NfVW5zYWZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGEyM2JlCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvc3VuX21pc2NfVW5zYWZlLmNwcApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVbnNhZmUiCisKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiSm5pQ29uc3RhbnRzLmgiCisKK3N0YXRpYyBqb2JqZWN0IFVuc2FmZV9hbGxvY2F0ZUluc3RhbmNlKEpOSUVudiogZW52LCBqY2xhc3MsIGpjbGFzcyBjKSB7CisgIHJldHVybiBlbnYtPkFsbG9jT2JqZWN0KGMpOworfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgIE5BVElWRV9NRVRIT0QoVW5zYWZlLCBhbGxvY2F0ZUluc3RhbmNlLCAiKExqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvT2JqZWN0OyIpLAorfTsKK3ZvaWQgcmVnaXN0ZXJfc3VuX21pc2NfVW5zYWZlKEpOSUVudiogZW52KSB7CisgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJzdW4vbWlzYy9VbnNhZmUiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL21haW4vbmF0aXZlL3RvU3RyaW5nQXJyYXkuY3BwIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvdG9TdHJpbmdBcnJheS5jcHAKaW5kZXggYWZmZDIzOC4uOTY0MGQyMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvdG9TdHJpbmdBcnJheS5jcHAKKysrIGIvbHVuaS9zcmMvbWFpbi9uYXRpdmUvdG9TdHJpbmdBcnJheS5jcHAKQEAgLTY2LDMgKzY2LDM3IEBACiAgICAgQXJyYXlHZXR0ZXIgZ2V0dGVyKHN0cmluZ3MpOwogICAgIHJldHVybiB0b1N0cmluZ0FycmF5KGVudiwgJmNvdW50ZXIsICZnZXR0ZXIpOwogfQorCisvKiogQ29udmVydHMgYSBKYXZhIFN0cmluZ1tdIHRvIGEgMC10ZXJtaW5hdGVkIGNoYXIqKi4gKi8KK2NoYXIqKiBjb252ZXJ0U3RyaW5ncyhKTklFbnYqIGVudiwgam9iamVjdEFycmF5IGphdmFBcnJheSkgeworICAgIGlmIChqYXZhQXJyYXkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGphdmFBcnJheSk7CisgICAgY2hhcioqIGFycmF5ID0gbmV3IGNoYXIqW2xlbmd0aCArIDFdOworICAgIGFycmF5W2xlbmd0aF0gPSAwOworICAgIGZvciAoanNpemUgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqYXZhRW50cnkoZW52LCByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGphdmFBcnJheSwgaSkpKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoZXNlIHN0cmluZ3MgdG8gY29uc3QtdW5mcmllbmRseSBjb2RlLgorICAgICAgICBjaGFyKiBlbnRyeSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoamF2YUVudHJ5LmdldCgpLCBOVUxMKSk7CisgICAgICAgIGFycmF5W2ldID0gZW50cnk7CisgICAgfQorCisgICAgcmV0dXJuIGFycmF5OworfQorCisvKiogRnJlZXMgYSBjaGFyKiogd2hpY2ggd2FzIGNvbnZlcnRlZCBmcm9tIGEgSmF2YSBTdHJpbmdbXS4gKi8KK3ZvaWQgZnJlZVN0cmluZ3MoSk5JRW52KiBlbnYsIGpvYmplY3RBcnJheSBqYXZhQXJyYXksIGNoYXIqKiBhcnJheSkgeworICAgIGlmIChqYXZhQXJyYXkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXZhQXJyYXkpOworICAgIGZvciAoanNpemUgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqYXZhRW50cnkoZW52LCByZWludGVycHJldF9jYXN0PGpzdHJpbmc+KGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGphdmFBcnJheSwgaSkpKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoamF2YUVudHJ5LmdldCgpLCBhcnJheVtpXSk7CisgICAgfQorCisgICAgZGVsZXRlW10gYXJyYXk7Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy9tYWluL25hdGl2ZS90b1N0cmluZ0FycmF5LmggYi9sdW5pL3NyYy9tYWluL25hdGl2ZS90b1N0cmluZ0FycmF5LmgKaW5kZXggODVlZmNiMC4uYzY1YjhhZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvbWFpbi9uYXRpdmUvdG9TdHJpbmdBcnJheS5oCisrKyBiL2x1bmkvc3JjL21haW4vbmF0aXZlL3RvU3RyaW5nQXJyYXkuaApAQCAtNjQsMyArNjQsNiBAQAogCiBqb2JqZWN0QXJyYXkgdG9TdHJpbmdBcnJheShKTklFbnYqIGVudiwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzdHJpbmdzKTsKIGpvYmplY3RBcnJheSB0b1N0cmluZ0FycmF5KEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBjb25zdCogc3RyaW5ncyk7CisKK2NoYXIqKiBjb252ZXJ0U3RyaW5ncyhKTklFbnYqIGVudiwgam9iamVjdEFycmF5IGphdmFBcnJheSk7Cit2b2lkIGZyZWVTdHJpbmdzKEpOSUVudiogZW52LCBqb2JqZWN0QXJyYXkgamF2YUFycmF5LCBjaGFyKiogYXJyYXkpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvaWN1L0FscGhhYmV0aWNJbmRleFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9BbHBoYWJldGljSW5kZXhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiOTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9BbHBoYWJldGljSW5kZXhUZXN0LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGxpYmNvcmUuaWN1OworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIEFscGhhYmV0aWNJbmRleFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgeworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEhhc0xhYmVsKEFscGhhYmV0aWNJbmRleCBhaSwgU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkTGFiZWwpIHsKKyAgICBhaS5hZGRMYWJlbHMoTG9jYWxlLlVTKTsKKyAgICBpbnQgaW5kZXggPSBhaS5nZXRCdWNrZXRJbmRleChzdHJpbmcpOworICAgIFN0cmluZyBsYWJlbCA9IGFpLmdldEJ1Y2tldExhYmVsKGluZGV4KTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMYWJlbCwgbGFiZWwpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9lbigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEVuZ2xpc2ggW0EtWl0KKyAgICBBbHBoYWJldGljSW5kZXggZW4gPSBuZXcgQWxwaGFiZXRpY0luZGV4KExvY2FsZS5FTkdMSVNIKTsKKyAgICBhc3NlcnRIYXNMYWJlbChlbiwgIkFsbGVuIiwgIkEiKTsKKyAgICBhc3NlcnRIYXNMYWJlbChlbiwgImFsbGVuIiwgIkEiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfamEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBbHBoYWJldGljSW5kZXggamEgPSBuZXcgQWxwaGFiZXRpY0luZGV4KExvY2FsZS5KQVBBTkVTRSk7CisKKyAgICAvLyBKYXBhbmVzZQorICAgIC8vICAgc29ydHMgaGlyYWdhbmEva2F0YWthbmEsIEthbmppL0NoaW5lc2UsIEVuZ2xpc2gsIG90aGVyCisgICAgLy8g4oCmLCDjgYIsIOOBiywg44GVLCDjgZ8sIOOBqiwg44GvLCDjgb4sIOOChCwg44KJLCDjgo8sIOKApgorICAgIC8vIGhpcmFnYW5hICJhIgorICAgIGFzc2VydEhhc0xhYmVsKGphLCAiQWxsZW4iLCAiQSIpOworICAgIGFzc2VydEhhc0xhYmVsKGphLCAiXHUzMDQxIiwgIlx1MzA0MiIpOworICAgIC8vIGthdGFrYW5hICJhIgorICAgIGFzc2VydEhhc0xhYmVsKGphLCAiXHUzMGExIiwgIlx1MzA0MiIpOworCisgICAgLy8gS2FuamkgKHNvcnRzIHRvIGluZmxvdyBzZWN0aW9uKQorICAgIGFzc2VydEhhc0xhYmVsKGphLCAiXHU2NWU1IiwgIiIpOworCisgICAgLy8gRW5nbGlzaAorICAgIGFzc2VydEhhc0xhYmVsKGphLCAiU21pdGgiLCAiUyIpOworCisgICAgLy8gQ2hpbmVzZSAoc29ydHMgdG8gaW5mbG93IHNlY3Rpb24pCisgICAgYXNzZXJ0SGFzTGFiZWwoamEsICJcdTZjODgiIC8qIFNoZW4vQ2hlbiAqLywgIiIpOworCisgICAgLy8gS29yZWFuIEhhbmd1bCAoc29ydHMgdG8gb3ZlcmZsb3cgc2VjdGlvbikKKyAgICBhc3NlcnRIYXNMYWJlbChqYSwgIlx1MTEwMCIsICIiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3Rfa28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBLb3JlYW4gKHNvcnRzIEtvcmVhbiwgdGhlbiBFbmdsaXNoKQorICAgIC8vIOKApiwg4YSALCDhhIIsIOGEgywg4YSFLCDhhIYsIOGEhywg4YSJLCDhhIssIOGEjCwg4YSOLCDhhI8sIOGEkCwg4YSRLCDhhJIsIOKApgorICAgIEFscGhhYmV0aWNJbmRleCBrbyA9IG5ldyBBbHBoYWJldGljSW5kZXgoTG9jYWxlLktPUkVBTik7CisgICAgYXNzZXJ0SGFzTGFiZWwoa28sICJcdTExMDAiLCAiXHUxMTAwIik7CisgICAgYXNzZXJ0SGFzTGFiZWwoa28sICJcdTMxMzEiLCAiXHUxMTAwIik7CisgICAgYXNzZXJ0SGFzTGFiZWwoa28sICJcdTExMDEiLCAiXHUxMTAwIik7CisgICAgYXNzZXJ0SGFzTGFiZWwoa28sICJcdTExNjEiLCAiXHUxMTEyIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X2NzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQ3plY2gKKyAgICAvLyDigKYsIFtBLUNdLCDEjCxbRC1IXSwgQ0gsIFtJLVJdLCDFmCwgUywgxaAsIFtULVpdLCDFvSwg4oCmCisgICAgQWxwaGFiZXRpY0luZGV4IGNzID0gbmV3IEFscGhhYmV0aWNJbmRleChuZXcgTG9jYWxlKCJjcyIpKTsKKyAgICBhc3NlcnRIYXNMYWJlbChjcywgIkNlbmEiLCAiQyIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAixIzDoXAiLCAiXHUwMTBjIik7CisgICAgYXNzZXJ0SGFzTGFiZWwoY3MsICJSdWRhIiwgIlIiKTsKKyAgICBhc3NlcnRIYXNMYWJlbChjcywgIsWYYWRhIiwgIlx1MDE1OCIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAiU2Vsa2EiLCAiUyIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAixaDDoWxhIiwgIlx1MDE2MCIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAiWmVicmEiLCAiWiIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAixb3DoWJhIiwgIlx1MDE3ZCIpOworICAgIGFzc2VydEhhc0xhYmVsKGNzLCAiQ2hhdGEiLCAiQ0giKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfZnIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBGcmVuY2g6IFtBLVpdIChubyBhY2NlbnRlZCBjaGFycykKKyAgICBBbHBoYWJldGljSW5kZXggZnIgPSBuZXcgQWxwaGFiZXRpY0luZGV4KExvY2FsZS5GUkVOQ0gpOworICAgIGFzc2VydEhhc0xhYmVsKGZyLCAiw5hmZXIiLCAiTyIpOworICAgIGFzc2VydEhhc0xhYmVsKGZyLCAixZJzdGVyIiwgIk8iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfZGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBEYW5pc2g6IFtBLVpdLCDDhiwgw5gsIMOFCisgICAgQWxwaGFiZXRpY0luZGV4IGRhID0gbmV3IEFscGhhYmV0aWNJbmRleChuZXcgTG9jYWxlKCJkYSIpKTsKKyAgICBhc3NlcnRIYXNMYWJlbChkYSwgIsOGbmVzIiwgIlx1MDBjNiIpOworICAgIGFzc2VydEhhc0xhYmVsKGRhLCAiw5hmZXIiLCAiXHUwMGQ4Iik7CisgICAgYXNzZXJ0SGFzTGFiZWwoZGEsICLFknN0ZXIiLCAiXHUwMGQ4Iik7CisgICAgYXNzZXJ0SGFzTGFiZWwoZGEsICLDhWfDpXJkIiwgIlx1MDBjNSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEdlcm1hbjogW0EtWl0gKG5vIMOfIG9yIHVtbGF1dGVkIGNoYXJhY3RlcnMgaW4gc3RhbmRhcmQgYWxwaGFiZXQpCisgICAgQWxwaGFiZXRpY0luZGV4IGRlID0gbmV3IEFscGhhYmV0aWNJbmRleChMb2NhbGUuR0VSTUFOKTsKKyAgICBhc3NlcnRIYXNMYWJlbChkZSwgIsOfaW5kIiwgIlMiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUaGFpIChzb3J0cyBFbmdsaXNoIHRoZW4gVGhhaSkKKyAgICAvLyDigKYsIOC4gSwg4LiCLCDguIMsIOC4hCwg4LiFLCDguIYsIOC4hywg4LiILCDguIksIOC4iiwg4LiLLCDguIwsIOC4jSwg4LiOLCDguI8sIOC4kCwg4LiRLCDguJIsIOC4kywg4LiULCDguJUsIOC4liwg4LiXLCDguJgsIOC4mSwg4LiaLCDguJssIOC4nCwg4LidLCDguJ4sIOC4nywg4LigLCDguKEsIOC4oiwg4LijLCDguKQsIOC4pSwg4LimLCDguKcsIOC4qCwg4LipLCDguKosIOC4qywg4LisLCDguK0sIOC4riwg4oCmLAorICAgIEFscGhhYmV0aWNJbmRleCB0aCA9IG5ldyBBbHBoYWJldGljSW5kZXgobmV3IExvY2FsZSgidGgiKSk7CisgICAgYXNzZXJ0SGFzTGFiZWwodGgsICJcdTBlMmRcdTBlMDdcdTBlMDRcdTBlNGNcdTBlNDBcdTBlMjVcdTBlNDdcdTBlMDEiLCAiXHUwZTJkIik7CisgICAgYXNzZXJ0SGFzTGFiZWwodGgsICJcdTBlMmFcdTBlMzRcdTBlMDdcdTBlMmJcdTBlNDBcdTBlMmFcdTBlMTlcdTBlMzUiLCAiXHUwZTJhIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X2FyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQXJhYmljIChzb3J0cyBFbmdsaXNoIHRoZW4gQXJhYmljKQorICAgIC8vIOKApiwg2KcsINioLCDYqiwg2KssINisLCDYrSwg2K4sINivLCDYsCwg2LEsINiyLCDYsywg2LQsINi1LCDYtiwg2LcsINi4LCDYuSwg2LosINmBLCDZgiwg2YMsINmELCDZhSwg2YYsINmHLCDZiCwg2YosIOKApgorICAgIEFscGhhYmV0aWNJbmRleCBhciA9IG5ldyBBbHBoYWJldGljSW5kZXgobmV3IExvY2FsZSgiYXIiKSk7CisgICAgYXNzZXJ0SGFzTGFiZWwoYXIsICJcdTA2NDZcdTA2NDhcdTA2MzEiLCAvKiBOb29yICovICJcdTA2NDYiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBIZWJyZXcgKHNvcnRzIEVuZ2xpc2ggdGhlbiBIZWJyZXcpCisgICAgLy8g4oCmLCDXkCwg15EsINeSLCDXkywg15QsINeVLCDXliwg15csINeYLCDXmSwg15ssINecLCDXniwg16AsINehLCDXoiwg16QsINemLCDXpywg16gsINepLCDXqiwg4oCmCisgICAgQWxwaGFiZXRpY0luZGV4IGhlID0gbmV3IEFscGhhYmV0aWNJbmRleChuZXcgTG9jYWxlKCJoZSIpKTsKKyAgICBhc3NlcnRIYXNMYWJlbChoZSwgIlx1MDVlNFx1MDVlOFx1MDVkOVx1MDVkM1x1MDVkZVx1MDVkZiIsICJcdTA1ZTQiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfemhfQ04oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTaW1wbGlmaWVkIENoaW5lc2UgKGRlZmF1bHQgY29sbGF0b3IgUGlueWluKTogW0EtWl0KKyAgICAvLyBTaGVuL0NoZW4gKHNpbXBsaWZpZWQpOiBzaG91bGQgYmUsIHVzdWFsbHksICdTJyBmb3IgbmFtZSBjb2xsYXRvciBhbmQgJ0MnIGZvciBhcHBzL290aGVyCisgICAgQWxwaGFiZXRpY0luZGV4IHpoX0NOID0gbmV3IEFscGhhYmV0aWNJbmRleChuZXcgTG9jYWxlKCJ6aCIsICJDTiIpKTsKKworICAgIC8vIEppYS9HdTogc2hvdWxkIGJlLCB1c3VhbGx5LCAnSicgZm9yIG5hbWUgY29sbGF0b3IgYW5kICdHJyBmb3IgYXBwcy9vdGhlcgorICAgIGFzc2VydEhhc0xhYmVsKHpoX0NOLCAiXHU4ZDNlIiwgIkoiKTsKKworICAgIC8vIFNoZW4vQ2hlbgorICAgIGFzc2VydEhhc0xhYmVsKHpoX0NOLCAiXHU2Yzg4IiwgIkMiKTsgLy8gaWN1NGMgNTAgZG9lcyBub3Qgc3BlY2lhbGl6ZSBmb3IgbmFtZXMuCisgICAgLy8gU2hlbi9DaGVuICh0cmFkaXRpb25hbCkKKyAgICBhc3NlcnRIYXNMYWJlbCh6aF9DTiwgIlx1NzAwYiIsICJTIik7IC8vIGljdTRjIDUwIGdldHMgdGhpcyB3cm9uZy4KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfemhfVFcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUcmFkaXRpb25hbCBDaGluZXNlCisgICAgLy8g4oCmLCDkuIAsIOS4gSwg5LiILCDkuI0sIOS4lCwg5LieLCDkuLIsIOS4piwg5LqtLCDkuZgsIOS5viwg5YKALCDkuoIsIOWDjiwg5YO1LCDlhJAsIOWEnywg5Y+iLCDlhLMsIOWatCwg5YS3LCDlhLssIOWbjCwg5ZuRLCDlu7MsIOKApgorICAgIC8vIFNoZW4vQ2hlbgorICAgIEFscGhhYmV0aWNJbmRleCB6aF9UVyA9IG5ldyBBbHBoYWJldGljSW5kZXgobmV3IExvY2FsZSgiemgiLCAiVFciKSk7CisgICAgYXNzZXJ0SGFzTGFiZWwoemhfVFcsICJcdTZjODgiLCAiXHU0ZTMyIik7CisgICAgYXNzZXJ0SGFzTGFiZWwoemhfVFcsICJcdTcwMGIiLCAiXHU1M2UyIik7CisgICAgLy8gSmlhL0d1CisgICAgYXNzZXJ0SGFzTGFiZWwoemhfVFcsICJcdThkM2UiLCAiXHU0ZTU4Iik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnN0cnVjdG9yX05QRSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBuZXcgQWxwaGFiZXRpY0luZGV4KG51bGwpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9hZGRMYWJlbHNfTlBFKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWxwaGFiZXRpY0luZGV4IGFpID0gbmV3IEFscGhhYmV0aWNJbmRleChMb2NhbGUuVVMpOworICAgIHRyeSB7CisgICAgICBhaS5hZGRMYWJlbHMobnVsbCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ1Y2tldEluZGV4X05QRSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFscGhhYmV0aWNJbmRleCBhaSA9IG5ldyBBbHBoYWJldGljSW5kZXgoTG9jYWxlLlVTKTsKKyAgICB0cnkgeworICAgICAgYWkuZ2V0QnVja2V0SW5kZXgobnVsbCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJ1Y2tldExhYmVsX2ludmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBbHBoYWJldGljSW5kZXggYWkgPSBuZXcgQWxwaGFiZXRpY0luZGV4KExvY2FsZS5VUyk7CisgICAgdHJ5IHsKKyAgICAgIGFpLmdldEJ1Y2tldExhYmVsKC0xKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgYWkuZ2V0QnVja2V0TGFiZWwoMTIzNDU2KTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9JQ1VUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9pY3UvSUNVVGVzdC5qYXZhCmluZGV4IGE3ZTczMmMuLjlkOTg5MmMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9JQ1VUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvaWN1L0lDVVRlc3QuamF2YQpAQCAtNDAsNiArNDAsMTUgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChJQ1UuZ2V0QXZhaWxhYmxlTG9jYWxlcygpWzBdKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJlc3REYXRlVGltZVBhdHRlcm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIE1NTU0iLCBJQ1UuZ2V0QmVzdERhdGVUaW1lUGF0dGVybigiTU1NTWQiLCAiY2FfRVMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZCAnZGUnIE1NTU0iLCBJQ1UuZ2V0QmVzdERhdGVUaW1lUGF0dGVybigiTU1NTWQiLCAiZXNfRVMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZC4gTU1NTSIsIElDVS5nZXRCZXN0RGF0ZVRpbWVQYXR0ZXJuKCJNTU1NZCIsICJkZV9DSCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNTU1NIGQiLCBJQ1UuZ2V0QmVzdERhdGVUaW1lUGF0dGVybigiTU1NTWQiLCAiZW5fVVMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZCBMTExMIiwgSUNVLmdldEJlc3REYXRlVGltZVBhdHRlcm4oIk1NTU1kIiwgImZhX0lSIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk3mnIhk5pelIiwgSUNVLmdldEJlc3REYXRlVGltZVBhdHRlcm4oIk1NTU1kIiwgImphX0pQIikpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9jYWxlRnJvbVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBsb2NhbGVGcm9tU3RyaW5nIGlzIHByZXR0eSBsZW5pZW50LiBTb21lIG9mIHRoZXNlIGNhbid0IGJlIHJvdW5kLXRyaXBwZWQKICAgICAgICAgLy8gdGhyb3VnaCBMb2NhbGUudG9TdHJpbmcuCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9pY3UvTG9jYWxlRGF0YVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9Mb2NhbGVEYXRhVGVzdC5qYXZhCmluZGV4IGU0MTJhMWQuLjI3ZWRhODYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9Mb2NhbGVEYXRhVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9Mb2NhbGVEYXRhVGVzdC5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZ2V0IHRoZSBsb2NhbGUgZGF0YSBmb3IgYWxsIGtub3duIGxvY2FsZXMuCiAgICAgICAgIGZvciAoTG9jYWxlIGwgOiBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpKSB7CiAgICAgICAgICAgICBMb2NhbGVEYXRhIGQgPSBMb2NhbGVEYXRhLmdldChsKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihsICsgIiA6ICIgKyBkLnllc3RlcmRheSArICIgIiArIGQudG9kYXkgKyAiICIgKyBkLnRvbW9ycm93KTsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIuZm9ybWF0KCIlMTBzICUxMHMgJTEwc1xuIiwgbCwgZC50aW1lRm9ybWF0MTIsIGQudGltZUZvcm1hdDI0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjUsMTEgKzY1LDExIEBACiAgICAgICAgIExvY2FsZURhdGEgbCA9IExvY2FsZURhdGEuZ2V0KG5ldyBMb2NhbGUoImNzIiwgIkNaIikpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygibGVkbmEiLCBsLmxvbmdNb250aE5hbWVzWzBdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZWQiLCBsLnNob3J0TW9udGhOYW1lc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygibGVkIiwgbC5zaG9ydE1vbnRoTmFtZXNbMF0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBsLnRpbnlNb250aE5hbWVzWzBdKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoImxlZGVuIiwgbC5sb25nU3RhbmRBbG9uZU1vbnRoTmFtZXNbMF0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEuIiwgbC5zaG9ydFN0YW5kQWxvbmVNb250aE5hbWVzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZWQiLCBsLnNob3J0U3RhbmRBbG9uZU1vbnRoTmFtZXNbMF0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoImwiLCBsLnRpbnlTdGFuZEFsb25lTW9udGhOYW1lc1swXSk7CiAgICAgfQogCkBAIC03OCwxMSArNzgsNDUgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMoItCy0L7RgdC60YDQtdGB0LXQvdGM0LUiLCBsLmxvbmdXZWVrZGF5TmFtZXNbMV0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoItCy0YEiLCBsLnNob3J0V2Vla2RheU5hbWVzWzFdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCLQkiIsIGwudGlueVdlZWtkYXlOYW1lc1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygi0LLRgSIsIGwudGlueVdlZWtkYXlOYW1lc1sxXSk7CiAKICAgICAgICAgLy8gUnVzc2lhbiBzdGFuZC1hbG9uZSB3ZWVrZGF5IG5hbWVzIGdldCBhbiBpbml0aWFsIGNhcGl0YWwuCiAgICAgICAgIGFzc2VydEVxdWFscygi0JLQvtGB0LrRgNC10YHQtdC90YzQtSIsIGwubG9uZ1N0YW5kQWxvbmVXZWVrZGF5TmFtZXNbMV0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoItCS0YEiLCBsLnNob3J0U3RhbmRBbG9uZVdlZWtkYXlOYW1lc1sxXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygi0JIiLCBsLnRpbnlTdGFuZEFsb25lV2Vla2RheU5hbWVzWzFdKTsKICAgICB9CisKKyAgICAvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTM4ODQ0CisgICAgcHVibGljIHZvaWQgdGVzdERlY2ltYWxGb3JtYXRTeW1ib2xzX2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvY2FsZURhdGEgZXMgPSBMb2NhbGVEYXRhLmdldChuZXcgTG9jYWxlKCJlcyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcsJywgZXMuZGVjaW1hbFNlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygnLicsIGVzLmdyb3VwaW5nU2VwYXJhdG9yKTsKKworICAgICAgICBMb2NhbGVEYXRhIGVzXzQxOSA9IExvY2FsZURhdGEuZ2V0KG5ldyBMb2NhbGUoImVzIiwgIjQxOSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcuJywgZXNfNDE5LmRlY2ltYWxTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoJywnLCBlc180MTkuZ3JvdXBpbmdTZXBhcmF0b3IpOworCisgICAgICAgIExvY2FsZURhdGEgZXNfVVMgPSBMb2NhbGVEYXRhLmdldChuZXcgTG9jYWxlKCJlcyIsICJVUyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcuJywgZXNfVVMuZGVjaW1hbFNlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygnLCcsIGVzX1VTLmdyb3VwaW5nU2VwYXJhdG9yKTsKKworICAgICAgICBMb2NhbGVEYXRhIGVzX01YID0gTG9jYWxlRGF0YS5nZXQobmV3IExvY2FsZSgiZXMiLCAiTVgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnLicsIGVzX01YLmRlY2ltYWxTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoJywnLCBlc19NWC5ncm91cGluZ1NlcGFyYXRvcik7CisKKyAgICAgICAgTG9jYWxlRGF0YSBlc19BUiA9IExvY2FsZURhdGEuZ2V0KG5ldyBMb2NhbGUoImVzIiwgIkFSIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoJywnLCBlc19BUi5kZWNpbWFsU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcuJywgZXNfQVIuZ3JvdXBpbmdTZXBhcmF0b3IpOworICAgIH0KKworICAgIC8vIGh0dHA6Ly9iLzc5MjQ5NzAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZUZvcm1hdDEyQW5kMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxlRGF0YSBlbl9VUyA9IExvY2FsZURhdGEuZ2V0KExvY2FsZS5VUyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaDptbSBhIiwgZW5fVVMudGltZUZvcm1hdDEyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJISDptbSIsIGVuX1VTLnRpbWVGb3JtYXQyNCk7CisKKyAgICAgICAgTG9jYWxlRGF0YSBqYV9KUCA9IExvY2FsZURhdGEuZ2V0KExvY2FsZS5KQVBBTik7CisgICAgICAgIGFzc2VydEVxdWFscygiYUs6bW0iLCBqYV9KUC50aW1lRm9ybWF0MTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkg6bW0iLCBqYV9KUC50aW1lRm9ybWF0MjQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9UcmFuc2xpdGVyYXRvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2ljdS9UcmFuc2xpdGVyYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY3OTgxCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvaWN1L1RyYW5zbGl0ZXJhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBsaWJjb3JlLmljdTsKKworcHVibGljIGNsYXNzIFRyYW5zbGl0ZXJhdG9yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKFN0cmluZyBpZCA6IFRyYW5zbGl0ZXJhdG9yLmdldEF2YWlsYWJsZUlEcygpKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oaWQpOworICAgICAgVHJhbnNsaXRlcmF0b3IgdCA9IG5ldyBUcmFuc2xpdGVyYXRvcihpZCk7CisgICAgICB0LnRyYW5zbGl0ZXJhdGUoImhlbGxvIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9Vbmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFRyYW5zbGl0ZXJhdG9yIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIlVua25vd24iKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9udWxsX2lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFRyYW5zbGl0ZXJhdG9yIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IobnVsbCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X251bGxfc3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFRyYW5zbGl0ZXJhdG9yIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkFueS1VcHBlciIpOworICAgICAgdC50cmFuc2xpdGVyYXRlKG51bGwpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9BbnlfVXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUcmFuc2xpdGVyYXRvciB0ID0gbmV3IFRyYW5zbGl0ZXJhdG9yKCJBbnktVXBwZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhFTExPIFdPUkxEISIsIHQudHJhbnNsaXRlcmF0ZSgiSGVMbE8gV29SbEQhIikpOworICAgIGFzc2VydEVxdWFscygiU1RSQVNTRSIsIHQudHJhbnNsaXRlcmF0ZSgiU3RyYcOfZSIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfQW55X0xvd2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVHJhbnNsaXRlcmF0b3IgdCA9IG5ldyBUcmFuc2xpdGVyYXRvcigiQW55LUxvd2VyIik7CisgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyB3b3JsZCEiLCB0LnRyYW5zbGl0ZXJhdGUoIkhlTGxPIFdvUmxEISIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfR3JlZWtfTGF0aW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgZ3JlZWsgPSAizprOsc67zrfOvM6tz4HOsSDOus+Mz4POvM61ISI7CisKKyAgICAvLyBUcmFuc2xpdGVyYXRlIEdyZWVrIHRvIExhdGluLCB0aGVuIHRvIHBsYWluIEFTQ0lJLgorICAgIFRyYW5zbGl0ZXJhdG9yIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkdyZWVrLUxhdGluIik7CisgICAgU3RyaW5nIGxhdGluID0gdC50cmFuc2xpdGVyYXRlKGdyZWVrKTsKKyAgICB0ID0gbmV3IFRyYW5zbGl0ZXJhdG9yKCJMYXRpbi1Bc2NpaSIpOworICAgIFN0cmluZyBhc2NpaSA9IHQudHJhbnNsaXRlcmF0ZShsYXRpbik7CisgICAgYXNzZXJ0RXF1YWxzKCJLYWzEk23DqXJhIGvDs3NtZSEiLCBsYXRpbik7CisgICAgYXNzZXJ0RXF1YWxzKCJLYWxlbWVyYSBrb3NtZSEiLCBhc2NpaSk7CisKKyAgICAvLyBVc2UgYWx0ZXJuYXRpdmUgdHJhbnNsaXRlcmF0aW9uIHZhcmlhbnRzLgorICAgIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkdyZWVrLUxhdGluL0JHTiIpOworICAgIGFzc2VydEVxdWFscygiS2FsaW1lzIFyYSBrb8yBc21lISIsIHQudHJhbnNsaXRlcmF0ZShncmVlaykpOworICAgIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkdyZWVrLUxhdGluL1VOR0VHTiIpOworICAgIGFzc2VydEVxdWFscygiS2FsacyxbcOpcmEga8Ozc21lISIsdC50cmFuc2xpdGVyYXRlKGdyZWVrKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X0hhbl9MYXRpbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRyYW5zbGl0ZXJhdG9yIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkhhbi1MYXRpbiIpOworICAgIGFzc2VydEVxdWFscygiaMOgbiB6w6wvaMOgbiB6w6wiLCB0LnRyYW5zbGl0ZXJhdGUoIuaxieWtly/mvKLlrZciKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoImNow6luIiwgdC50cmFuc2xpdGVyYXRlKCJcdTZjODgiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJzaMSbbiIsIHQudHJhbnNsaXRlcmF0ZSgiXHU3MDBiIikpOworICAgIGFzc2VydEVxdWFscygiamnHjiIsIHQudHJhbnNsaXRlcmF0ZSgiXHU4ZDNlIikpOworCisgICAgdCA9IG5ldyBUcmFuc2xpdGVyYXRvcigiSGFuLUxhdGluL05hbWVzIik7CisgICAgYXNzZXJ0RXF1YWxzKCJzaMSbbiIsIHQudHJhbnNsaXRlcmF0ZSgiXHU2Yzg4IikpOworICAgIGFzc2VydEVxdWFscygic2jEm24iLCB0LnRyYW5zbGl0ZXJhdGUoIlx1NzAwYiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImrHkGEiLCB0LnRyYW5zbGl0ZXJhdGUoIlx1OGQzZSIpKTsKKworICAgIHQgPSBuZXcgVHJhbnNsaXRlcmF0b3IoIkhhbi1MYXRpbi9OYW1lczsgTGF0aW4tQXNjaWk7IEFueS1VcHBlciIpOworICAgIGFzc2VydEVxdWFscygiU0hFTiIsIHQudHJhbnNsaXRlcmF0ZSgiXHU2Yzg4IikpOworICAgIGFzc2VydEVxdWFscygiU0hFTiIsIHQudHJhbnNsaXRlcmF0ZSgiXHU3MDBiIikpOworICAgIGFzc2VydEVxdWFscygiSklBIiwgdC50cmFuc2xpdGVyYXRlKCJcdThkM2UiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2lvL0Rpc2tMcnVDYWNoZVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2lvL0Rpc2tMcnVDYWNoZVRlc3QuamF2YQppbmRleCAyNzk2YjY1Li43YTViZmE1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9pby9EaXNrTHJ1Q2FjaGVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvaW8vRGlza0xydUNhY2hlVGVzdC5qYXZhCkBAIC01NzksNiArNTc5LDQ0IEBACiAgICAgICAgIGFzc2VydFZhbHVlKCJCIiwgImIiLCAiYiIpOwogICAgIH0KIAorICAgIC8qKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9KYWtlV2hhcnRvbi9EaXNrTHJ1Q2FjaGUvaXNzdWVzLzI4Ij5Jc3N1ZSAjMjg8L2E+ICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRKb3VybmFsT25SZXBlYXRlZFJlYWRzV2l0aE9wZW5BbmRDbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXQoImEiLCAiYSIsICJhIik7CisgICAgICAgIHNldCgiYiIsICJiIiwgImIiKTsKKyAgICAgICAgbG9uZyBsYXN0Sm91cm5hbExlbmd0aCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBsb25nIGpvdXJuYWxMZW5ndGggPSBqb3VybmFsRmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGFzc2VydFZhbHVlKCJhIiwgImEiLCAiYSIpOworICAgICAgICAgICAgYXNzZXJ0VmFsdWUoImIiLCAiYiIsICJiIik7CisgICAgICAgICAgICBjYWNoZS5jbG9zZSgpOworICAgICAgICAgICAgY2FjaGUgPSBEaXNrTHJ1Q2FjaGUub3BlbihjYWNoZURpciwgYXBwVmVyc2lvbiwgMiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgaWYgKGpvdXJuYWxMZW5ndGggPCBsYXN0Sm91cm5hbExlbmd0aCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJKb3VybmFsIGNvbXBhY3RlZCBmcm9tICVzIGJ5dGVzIHRvICVzIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEpvdXJuYWxMZW5ndGgsIGpvdXJuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyB0ZXN0IHBhc3NlZCEKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RKb3VybmFsTGVuZ3RoID0gam91cm5hbExlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9KYWtlV2hhcnRvbi9EaXNrTHJ1Q2FjaGUvaXNzdWVzLzI4Ij5Jc3N1ZSAjMjg8L2E+ICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRKb3VybmFsT25SZXBlYXRlZEVkaXRzV2l0aE9wZW5BbmRDbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIGxhc3RKb3VybmFsTGVuZ3RoID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGxvbmcgam91cm5hbExlbmd0aCA9IGpvdXJuYWxGaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgc2V0KCJhIiwgImEiLCAiYSIpOworICAgICAgICAgICAgc2V0KCJiIiwgImIiLCAiYiIpOworICAgICAgICAgICAgY2FjaGUuY2xvc2UoKTsKKyAgICAgICAgICAgIGNhY2hlID0gRGlza0xydUNhY2hlLm9wZW4oY2FjaGVEaXIsIGFwcFZlcnNpb24sIDIsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGlmIChqb3VybmFsTGVuZ3RoIDwgbGFzdEpvdXJuYWxMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiSm91cm5hbCBjb21wYWN0ZWQgZnJvbSAlcyBieXRlcyB0byAlcyBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RKb3VybmFsTGVuZ3RoLCBqb3VybmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RKb3VybmFsTGVuZ3RoID0gam91cm5hbExlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQ3JlYXRlc0RpcmVjdG9yeUlmTmVjZXNzYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGNhY2hlLmNsb3NlKCk7CiAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoamF2YVRtcERpciwgInRlc3RPcGVuQ3JlYXRlc0RpcmVjdG9yeUlmTmVjZXNzYXJ5Iik7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2lvL0ludGVycnVwdGVkU3RyZWFtVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9pby9JbnRlcnJ1cHRlZFN0cmVhbVRlc3QuamF2YQppbmRleCBlNDZkZjVkLi4zOWMwYWQzIDEwMDc1NQotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2lvL0ludGVycnVwdGVkU3RyZWFtVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvaW8vSW50ZXJydXB0ZWRTdHJlYW1UZXN0LmphdmEKQEAgLTQ3LDcgKzQ3LDkgQEAKICAgICBwcml2YXRlIFNvY2tldFtdIHNvY2tldHM7CiAKICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7IC8vIGNsZWFyIGludGVycnVwdGVkIGJpdAorICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJydXB0ZWQgYml0IHRvIG1ha2Ugc3VyZSBhbiBlYXJsaWVyIHRlc3QgZGlkCisgICAgICAgIC8vIG5vdCBsZWF2ZSB1cyBpbiBhIGJhZCBzdGF0ZS4KKyAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCkBAIC0xMjMsNyArMTI1LDcgQEAKICAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgd2FpdEZvckludGVycnVwdCh0aHJlYWQpOworICAgICAgICAgICAgY29uZmlybUludGVycnVwdGVkKHRocmVhZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNCw3ICsxMzYsNyBAQAogICAgICAgICAgICAgZmFpbCgpOwogICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3YWl0Rm9ySW50ZXJydXB0KHRocmVhZCk7CisgICAgICAgICAgICBjb25maXJtSW50ZXJydXB0ZWQodGhyZWFkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ1LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBmYWlsKCk7CiAgICAgICAgIH0gY2F0Y2ggKENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3YWl0Rm9ySW50ZXJydXB0KHRocmVhZCk7CisgICAgICAgICAgICBjb25maXJtSW50ZXJydXB0ZWQodGhyZWFkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU4LDcgKzE2MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHdhaXRGb3JJbnRlcnJ1cHQodGhyZWFkKTsKKyAgICAgICAgICAgIGNvbmZpcm1JbnRlcnJ1cHRlZCh0aHJlYWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzEsNyArMTczLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgd2FpdEZvckludGVycnVwdCh0aHJlYWQpOworICAgICAgICAgICAgY29uZmlybUludGVycnVwdGVkKHRocmVhZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4NSw3ICsxODcsNyBAQAogICAgICAgICB9IGNhdGNoIChDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9IGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3YWl0Rm9ySW50ZXJydXB0KHRocmVhZCk7CisgICAgICAgICAgICBjb25maXJtSW50ZXJydXB0ZWQodGhyZWFkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjA0LDE1ICsyMDYsOSBAQAogICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckludGVycnVwdChUaHJlYWQgdGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRocmVhZC5qb2luKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IGEgcmFjZSBiZXR3ZWVuIFRocmVhZC5pbnRlcnJ1cHQgaW4KLSAgICAgICAgICAgIC8vIGludGVycnVwdE1lTGF0ZXIgYW5kIFRocmVhZC5qb2luIGhlcmUuIE1vc3Qgb2YgdGhlIHRpbWUKLSAgICAgICAgICAgIC8vIHdlIHdvbid0IGdldCBhbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgYnV0IG9jY2FzaW9uYWxseQotICAgICAgICAgICAgLy8gd2UgZG8sIHNvIGZvciBub3cgaWdub3JlIHRoaXMgZXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gaHR0cDovL2IvNjk1MTE1NwotICAgICAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25maXJtSW50ZXJydXB0ZWQoVGhyZWFkIHRocmVhZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdmFsaWRhdGUgYW5kIGNsZWFyIGludGVycnVwdGVkIGJpdCBiZWZvcmUgam9pbgorICAgICAgICBhc3NlcnRUcnVlKFRocmVhZC5pbnRlcnJ1cHRlZCgpKTsKKyAgICAgICAgdGhyZWFkLmpvaW4oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvQ2hhcmFjdGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL0NoYXJhY3RlclRlc3QuamF2YQppbmRleCA1ZGJjMjhlLi45NDM4ZjIwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvQ2hhcmFjdGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbGFuZy9DaGFyYWN0ZXJUZXN0LmphdmEKQEAgLTc0LDggKzc0LDkgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBDaGFyYWN0ZXIuZ2V0TmFtZSByZXF1aXJlcyB0aGUgY29ycmVzcG9uZGluZyBJQ1UgZGF0YS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOVUxMIiwgQ2hhcmFjdGVyLmdldE5hbWUoMHgwMDAwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQkVMTCIsIENoYXJhY3Rlci5nZXROYW1lKDB4MDAwNykpOworICAgICAgICAvLyBDaGFuZ2VkIGZyb20gIk5VTEwiIGFuZCAiQkVMTCIgYnkgVW5pY29kZSA0OS4yCisgICAgICAgIGFzc2VydEVxdWFscygiPGNvbnRyb2wtMDAwMD4iLCBDaGFyYWN0ZXIuZ2V0TmFtZSgweDAwMDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8Y29udHJvbC0wMDA3PiIsIENoYXJhY3Rlci5nZXROYW1lKDB4MDAwNykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkxBVElOIFNNQUxMIExFVFRFUiBMIiwgQ2hhcmFjdGVyLmdldE5hbWUoJ2wnKSk7CiAgICAgICAgIC8vIFRoaXMgY2hhbmdlZCBuYW1lIGZyb20gVW5pY29kZSAxLjAuIFVzZWQgdG8gYmUgIk9QRU5JTkcuLi4iLgogICAgICAgICBhc3NlcnRFcXVhbHMoIkxFRlQgQ1VSTFkgQlJBQ0tFVCIsIENoYXJhY3Rlci5nZXROYW1lKCd7JykpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL09sZENsYXNzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL09sZENsYXNzVGVzdC5qYXZhCmluZGV4IGM1MTY0NjcuLjBmN2NlNDIgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbGFuZy9PbGRDbGFzc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvT2xkQ2xhc3NUZXN0LmphdmEKQEAgLTk4OSwxMiArOTg5LDEyIEBACiAgICAgICAgIENsYXNzIGNsYXp6ID0gZ2V0Q2xhc3MoKTsKIAogICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKCJIZWxsb1dvcmxkLnR4dCIpOwotICAgICAgICBhc3NlcnQoc3RyZWFtICE9IG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0cmVhbSk7CiAKICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzIwXTsKICAgICAgICAgaW50IGxlbmd0aCA9IHN0cmVhbS5yZWFkKGJ1ZmZlcik7CiAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgICAgIGFzc2VydCgiSGVsbG8sIFdvcmxkLiIuZXF1YWxzKHMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbywgV29ybGQuXG4iLCAgcyk7CiAKICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CiAgICAgfQpAQCAtMTAwMywxMiArMTAwMywxMiBAQAogICAgICAgICBDbGFzcyBjbGF6eiA9IGdldENsYXNzKCk7CiAKICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL2xpYmNvcmUvamF2YS9sYW5nL0hlbGxvV29ybGQudHh0Iik7Ci0gICAgICAgIGFzc2VydChzdHJlYW0gIT0gbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3RyZWFtKTsKIAogICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjBdOwogICAgICAgICBpbnQgbGVuZ3RoID0gc3RyZWFtLnJlYWQoYnVmZmVyKTsKICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0KCJIZWxsbywgV29ybGQuIi5lcXVhbHMocykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvLCBXb3JsZC5cbiIsIHMpOwogCiAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwogCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvT2xkVGhyZWFkVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL09sZFRocmVhZFRlc3QuamF2YQppbmRleCAyYjMwNGYyLi4wMzAzMWFjIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvT2xkVGhyZWFkVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbGFuZy9PbGRUaHJlYWRUZXN0LmphdmEKQEAgLTMwNyw2ICszMDcsNyBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXRlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFRocmVhZC5TdGF0ZS5SVU5OQUJMRSwgc3RhdGUpOwogCisgICAgICAgIHJ1biA9IHRydWU7CiAgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOwogICAgICAgICBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgVGhyZWFkIHRoID0gbmV3IFRocmVhZCgpIHsKQEAgLTM2OSw3ICszNzAsNyBAQAogICAgICAgICB0aC5qb2luKDEwMDApOwogICAgICAgICBhc3NlcnRFcXVhbHMoVGhyZWFkLlN0YXRlLlRFUk1JTkFURUQsIHRoLmdldFN0YXRlKCkpOwogICAgIH0KLSAgICB2b2xhdGlsZSBib29sZWFuIHJ1biA9IHRydWU7CisgICAgdm9sYXRpbGUgYm9vbGVhbiBydW47CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2hvbGRzTG9jaygpIHsKICAgICAgICAgTW9uaXRvcmVkQ2xhc3MgbW9uaXRvciA9IG5ldyBNb25pdG9yZWRDbGFzcygpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL1N0cmluZ1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbGFuZy9TdHJpbmdUZXN0LmphdmEKaW5kZXggOTlkYmE0OS4uMmM3ZDNkNCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9sYW5nL1N0cmluZ1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL2xhbmcvU3RyaW5nVGVzdC5qYXZhCkBAIC0yMjgsNiArMjI4LDcgQEAKICAgICAgICAgc3RhdGljIFN0cmluZyBsaXRlcmFsID0gIls1MDU4LCA5OTYyLCAxNTYzLCA1NzQ0XSI7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJJTklOR19ET1RfQUJPVkUgPSAiXHUwMzA3IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFUSU5fQ0FQSVRBTF9JID0gIkkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVRJTl9DQVBJVEFMX0lfV0lUSF9ET1RfQUJPVkUgPSAiXHUwMTMwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFUSU5fU01BTExfSSA9ICJpIjsKQEAgLTI2NSw4ICsyNjYsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoTEFUSU5fU01BTExfRE9UTEVTU19JLCBMQVRJTl9TTUFMTF9ET1RMRVNTX0kudG9Mb3dlckNhc2UoZW5VcykpOwogCiAgICAgICAgIGFzc2VydEVxdWFscyhMQVRJTl9DQVBJVEFMX0ksIExBVElOX1NNQUxMX0RPVExFU1NfSS50b1VwcGVyQ2FzZShlblVzKSk7Ci0gICAgICAgIC8vIGh0dHA6Ly9iLzMzMjU3OTk6IEFuZHJvaWQgZmFpbHMgdGhpcyB3aXRoIGFuIGV4dHJhIGNvbWJpbmluZyAiZG90IGFib3ZlIi4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBVElOX1NNQUxMX0ksIExBVElOX0NBUElUQUxfSV9XSVRIX0RPVF9BQk9WRS50b0xvd2VyQ2FzZShlblVzKSk7CisgICAgICAgIC8vIGh0dHA6Ly9iLzMzMjU3OTk6IHRoZSBSSSBmYWlscyB0aGlzIGJlY2F1c2UgaXQncyB1c2luZyBhbiBvYnNvbGV0ZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIHJ1bGVzLgorICAgICAgICAvLyBBbmRyb2lkIGNvcnJlY3RseSBwcmVzZXJ2ZXMgY2Fub25pY2FsIGVxdWl2YWxlbmNlLiAoU2VlIHRoZSBzZXBhcmF0ZSB0ZXN0IGZvciB0cl9UUi4pCisgICAgICAgIGFzc2VydEVxdWFscyhMQVRJTl9TTUFMTF9JICsgQ09NQklOSU5HX0RPVF9BQk9WRSwgTEFUSU5fQ0FQSVRBTF9JX1dJVEhfRE9UX0FCT1ZFLnRvTG93ZXJDYXNlKGVuVXMpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSWdub3JlQ2FzZV90cl9UUigpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbWF0aC9CaWdEZWNpbWFsVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9tYXRoL0JpZ0RlY2ltYWxUZXN0LmphdmEKaW5kZXggZTc3MWU5Zi4uZTljMmIwYyAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9tYXRoL0JpZ0RlY2ltYWxUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9tYXRoL0JpZ0RlY2ltYWxUZXN0LmphdmEKQEAgLTY0LDQgKzY0LDI4IEBACiAgICAgICAgIEJpZ0RlY2ltYWwgcm91bmRlZCA9IGJpZ0RlY2ltYWwucm91bmQobmV3IE1hdGhDb250ZXh0KDIsIFJvdW5kaW5nTW9kZS5GTE9PUikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjAuOTkiLCByb3VuZGVkLnRvU3RyaW5nKCkpOwogICAgIH0KKworICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTQzNDgwCisgICAgcHVibGljIHZvaWQgdGVzdFByZWNpc2lvbkZyb21TdHJpbmcoKSB7CisgICAgICBCaWdEZWNpbWFsIGEgPSBuZXcgQmlnRGVjaW1hbCgiLTAuMDExMTExMTExMTExMTExMTExMTExIik7CisgICAgICBCaWdEZWNpbWFsIGIgPSBhLm11bHRpcGx5KEJpZ0RlY2ltYWwuT05FKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKCItMC4wMTExMTExMTExMTExMTExMTExMTEiLCBhLnRvU3RyaW5nKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCItMC4wMTExMTExMTExMTExMTExMTExMTEiLCBiLnRvU3RyaW5nKCkpOworCisgICAgICBhc3NlcnRFcXVhbHMoMjAsIGEucHJlY2lzaW9uKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBiLnByZWNpc2lvbigpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBhLnNjYWxlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBiLnNjYWxlKCkpOworCisgICAgICBhc3NlcnRFcXVhbHMoIi0xMTExMTExMTExMTExMTExMTExMSIsIGEudW5zY2FsZWRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCItMTExMTExMTExMTExMTExMTExMTEiLCBiLnVuc2NhbGVkVmFsdWUoKS50b1N0cmluZygpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgICAgYXNzZXJ0RXF1YWxzKGIsIGEpOworCisgICAgICBhc3NlcnRFcXVhbHMoMCwgYS5zdWJ0cmFjdChiKS5zaWdudW0oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgYS5jb21wYXJlVG8oYikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbmV0L1VSTFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbmV0L1VSTFRlc3QuamF2YQppbmRleCA5NjIwODhlLi5hMTg4MTZiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL25ldC9VUkxUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9uZXQvVVJMVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBpbXBvcnQgamF2YS5uZXQuSW5ldDZBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgbGliY29yZS51dGlsLlNlcmlhbGl6YXRpb25UZXN0ZXI7CkBAIC02OTQsNSArNjk2LDM1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiYV9iLmMuZC5uZXQiLCB1cmwuZ2V0SG9zdCgpKTsKICAgICB9CiAKKyAgICAvLyBodHRwOi8vYi83MzY5Nzc4CisgICAgcHVibGljIHZvaWQgdGVzdFRvVVJJTGVuaWFudFRocm93c1VSSVN5bnRheEV4Y2VwdGlvbldpdGhQYXJ0aWFsVHJhaWxpbmdFc2NhcGUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBpZiB0aGVyZSBhIHBhcnRpYWwgdHJhaWxpbmcgZXNjYXBlIHRoYXQgd2UgZG9uJ3QgdGhyb3cgdGhlIHdyb25nIGV4Y2VwdGlvbgorICAgICAgICBVUkxbXSBiYWRVcmxzID0gbmV3IFVSTFtdIHsKKyAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8/Zm9vPSUlYmFyIiksCisgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vP2Zvbz0lJWJhciUiKSwKKyAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8/Zm9vPSUlYmFyJTIiKSwKKyAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8/Zm9vPSUlYmFyJSUiKSwKKyAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8/Zm9vPSUlYmFyJSUlIiksCisgICAgICAgICAgICBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vP2Zvbz0lJWJhciUlJSUiKSwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChVUkwgYmFkVXJsIDogYmFkVXJscykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiYWRVcmwudG9VUklMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgcHJvcGVybHkgaGFuZGxlIGFuIG5vcm1hbCBlc2NhcGUgYXQgdGhlIGVuZCBvZiBhIHN0cmluZworICAgICAgICBTdHJpbmdbXSBnb29kVXJscyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tLz9mb289YmFyIiwKKyAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vP2Zvbz1iYXIlMjAiLAorICAgICAgICB9OworICAgICAgICBmb3IgKFN0cmluZyBnb29kVXJsIDogZ29vZFVybHMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgVVJJKGdvb2RVcmwpLCBuZXcgVVJMKGdvb2RVcmwpLnRvVVJJTGVuaWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEFkZGluZyBhIG5ldyB0ZXN0PyBDb25zaWRlciBhZGRpbmcgYW4gZXF1aXZhbGVudCB0ZXN0IHRvIFVSSVRlc3QuamF2YQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9uaW8vQnVmZmVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9uaW8vQnVmZmVyVGVzdC5qYXZhCmluZGV4IDJhODk1ZmMuLjRjNTAwYTUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbmlvL0J1ZmZlclRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL25pby9CdWZmZXJUZXN0LmphdmEKQEAgLTM1LDYgKzM1LDYyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVHJ5IHRvIGNyZWF0ZSBhIHtAbGluayBNYXBwZWRCeXRlQnVmZmVyfSBmcm9tIC9kZXYvemVybywgdG8gc2VlIGlmCisgICAgICogd2Ugc3VwcG9ydCBtYXBwaW5nIFVOSVggY2hhcmFjdGVyIGRldmljZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERldlplcm9NYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSgiL2Rldi96ZXJvIiwgInIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgbWJiID0gcmFmLmdldENoYW5uZWwoKS5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIDY1NTM2KTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGFycmF5IGluaXRpYWxpemVkIHRvIGFsbCAiKGJ5dGUpIDEiCisgICAgICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGJ1ZjEsIChieXRlKSAxKTsKKworICAgICAgICAgICAgLy8gUmVhZCBmcm9tIG1hcHBlZCAvZGV2L3plcm8sIGFuZCBvdmVyd3JpdGUgdGhpcyBhcnJheS4KKyAgICAgICAgICAgIG1iYi5nZXQoYnVmMSk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgemVybworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKSAwLCBidWYxW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgbGliY29yZS5qYXZhLm5pby5CdWZmZXJUZXN0I3Rlc3REZXZaZXJvTWFwKCl9LCBidXQgdHJ5IHRvIHNlZQorICAgICAqIGlmIHdlIGNhbiB3cml0ZSB0byB0aGUgVU5JWCBjaGFyYWN0ZXIgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZXZaZXJvTWFwUlcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSgiL2Rldi96ZXJvIiwgInJ3Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIG1iYiA9IHJhZi5nZXRDaGFubmVsKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfV1JJVEUsIDY1NTM2LCAxMzEwNzIpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gYXJyYXkgaW5pdGlhbGl6ZWQgdG8gYWxsICIoYnl0ZSkgMSIKKyAgICAgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgQXJyYXlzLmZpbGwoYnVmMSwgKGJ5dGUpIDEpOworCisgICAgICAgICAgICAvLyBQdXQgYWxsICIoYnl0ZSkgMSJzIGludG8gdGhlIC9kZXYvemVybyBNYXBwZWRCeXRlQnVmZmVyLgorICAgICAgICAgICAgbWJiLnB1dChidWYxKTsKKworICAgICAgICAgICAgbWJiLnBvc2l0aW9uKDApOworCisgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgIG1iYi5nZXQoYnVmMik7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgb25lCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY1NTM2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDEsIGJ1ZjJbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmFmLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZVN3YXBwZWRCdWxrR2V0RGlyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRlc3RCeXRlU3dhcHBlZEJ1bGtHZXQoQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgxMCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvbmlvL2NoYXJzZXQvQ2hhcnNldFRlc3QuamF2YQppbmRleCBhZjliYzU5Li4yNGRhYTUyIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0VGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiBwdWJsaWMgY2xhc3MgQ2hhcnNldFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewogICAgIHB1YmxpYyB2b2lkIHRlc3RfZ3VhcmFudGVlZENoYXJzZXRzQXZhaWxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMyw2ICszNCwyOCBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSk7CiAgICAgfQogCisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD00Mjc2OQorICAgIHB1YmxpYyB2b2lkIHRlc3RfNDI3NjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzZXQuYXZhaWxhYmxlQ2hhcnNldHMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdGhyZWFkcy5hZGQodCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFRocmVhZCB0IDogdGhyZWFkcykgeworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoVGhyZWFkIHQgOiB0aHJlYWRzKSB7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RfYWxsQXZhaWxhYmxlQ2hhcnNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gaW5zdGFudGlhdGUgZXZlcnkgQ2hhcnNldCwgQ2hhcnNldERlY29kZXIsIGFuZCBDaGFyc2V0RW5jb2Rlci4KICAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldE5hbWUgOiBDaGFyc2V0LmF2YWlsYWJsZUNoYXJzZXRzKCkua2V5U2V0KCkpIHsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvclRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvclRlc3QuamF2YQppbmRleCBjYzkwMTQ3Li5hODZhODg0IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMCBAQAogCiBwYWNrYWdlIGxpYmNvcmUuamF2YS5zZWN1cml0eTsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CkBAIC0zMCw3ICszNCwxMSBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVByaXZhdGVLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ0dlblBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYzsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuWDUwOUVuY29kZWRLZXlTcGVjOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zOSw2ICs0Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkRIUGFyYW1ldGVyU3BlYzsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtNTQsMTYgKzYzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gc2VydmljZS5nZXRBbGdvcml0aG0oKTsKKyAgICAgICAgICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBkZXRlY3QgaWYgd2UncmUgcnVubmluZyBpbiB2b2dhciBhbmQgcnVuIHRoZSBmdWxsIHRlc3QKKyAgICAgICAgICAgICAgICBpZiAoIkRIIi5lcXVhbHMoYWxnb3JpdGhtKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBnZXRESFBhcmFtcygpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoU3RyaW5nKQogICAgICAgICAgICAgICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtwZzEgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKGFsZ29yaXRobSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbGdvcml0aG0sIGtwZzEuZ2V0QWxnb3JpdGhtKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtwZzEuaW5pdGlhbGl6ZShwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRlc3RfS2V5UGFpckdlbmVyYXRvcihrcGcxKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKFN0cmluZywgUHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga3BnMiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtLCBwcm92aWRlcik7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbGdvcml0aG0sIGtwZzIuZ2V0QWxnb3JpdGhtKCkpOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvdmlkZXIsIGtwZzIuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAga3BnMi5pbml0aWFsaXplKHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdGVzdF9LZXlQYWlyR2VuZXJhdG9yKGtwZzIpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoU3RyaW5nLCBTdHJpbmcpCkBAIC03MSw2ICs5Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWxnb3JpdGhtLCBrcGczLmdldEFsZ29yaXRobSgpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLCBrcGczLmdldFByb3ZpZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtwZzMuaW5pdGlhbGl6ZShwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRlc3RfS2V5UGFpckdlbmVyYXRvcihrcGczKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQcm9ibGVtIHRlc3RpbmcgS2V5UGFpckdlbmVyYXRvci4iICsgYWxnb3JpdGhtLCBlKTsKQEAgLTEwOSw5ICsxMzQsMjEgQEAKICAgICAgICAgcHV0S2V5U2l6ZSgiRGlmZmllSGVsbG1hbiIsIDUxMik7CiAgICAgICAgIHB1dEtleVNpemUoIkRpZmZpZUhlbGxtYW4iLCA1MTIrNjQpOwogICAgICAgICBwdXRLZXlTaXplKCJEaWZmaWVIZWxsbWFuIiwgMTAyNCk7CisgICAgICAgIHB1dEtleVNpemUoIkVDIiwgMTkyKTsKKyAgICAgICAgcHV0S2V5U2l6ZSgiRUMiLCAyMjQpOwogICAgICAgICBwdXRLZXlTaXplKCJFQyIsIDI1Nik7CisgICAgICAgIHB1dEtleVNpemUoIkVDIiwgMzg0KTsKKyAgICAgICAgcHV0S2V5U2l6ZSgiRUMiLCA1MjEpOwogICAgIH0KIAorICAgIC8qKiBFbGxpcHRpYyBDdXJ2ZSBDcnlwdG8gbmFtZWQgY3VydmVzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ19OQU1FRF9DVVJWRVMgPSB7CisgICAgICAgIC8vIE5JU1QgUC0xOTIgYWthIFNFQ0cgc2VjcDE5MnIxIGFrYSBBTlNJIFg5LjYyIHByaW1lMTkydjEKKyAgICAgICAgInNlY3AxOTJyMSIsICJwcmltZTE5MnYxIiwKKyAgICAgICAgLy8gTklTVCBQLTI1NiBha2EgU0VDRyBzZWNwMjU2cjEgYWthIEFOU0kgWDkuNjIgcHJpbWUyNTZ2MQorICAgICAgICAic2VjcDI1NnIxIiwgInByaW1lMjU2djEiLAorICAgIH07CisKICAgICBwcml2YXRlIHZvaWQgdGVzdF9LZXlQYWlyR2VuZXJhdG9yKEtleVBhaXJHZW5lcmF0b3Iga3BnKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gd2l0aG91dCBhIGNhbGwgdG8gaW5pdGlhbGl6ZQogICAgICAgICB0ZXN0X0tleVBhaXIoa3BnLCBrcGcuZ2VuS2V5UGFpcigpKTsKQEAgLTEzMiw2ICsxNjksMjMgQEAKICAgICAgICAgICAgIHRlc3RfS2V5UGFpcihrcGcsIGtwZy5nZW5LZXlQYWlyKCkpOwogICAgICAgICAgICAgdGVzdF9LZXlQYWlyKGtwZywga3BnLmdlbmVyYXRlS2V5UGFpcigpKTsKICAgICAgICAgfQorCisgICAgICAgIGlmICgoIkVDIi5lcXVhbHMoYWxnb3JpdGhtKSkgfHwgKCJFQ0RIIi5lcXVhbHMoYWxnb3JpdGhtKSkKKyAgICAgICAgICAgICAgICB8fCAoIkVDRFNBIi5lcXVhbHMoYWxnb3JpdGhtKSkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGN1cnZlTmFtZSA6IEVDX05BTUVEX0NVUlZFUykgeworICAgICAgICAgICAgICAgIGtwZy5pbml0aWFsaXplKG5ldyBFQ0dlblBhcmFtZXRlclNwZWMoY3VydmVOYW1lKSk7CisgICAgICAgICAgICAgICAgdGVzdF9LZXlQYWlyKGtwZywga3BnLmdlbktleVBhaXIoKSk7CisgICAgICAgICAgICAgICAgdGVzdF9LZXlQYWlyKGtwZywga3BnLmdlbmVyYXRlS2V5UGFpcigpKTsKKworICAgICAgICAgICAgICAgIGtwZy5pbml0aWFsaXplKG5ldyBFQ0dlblBhcmFtZXRlclNwZWMoY3VydmVOYW1lKSwgKFNlY3VyZVJhbmRvbSkgbnVsbCk7CisgICAgICAgICAgICAgICAgdGVzdF9LZXlQYWlyKGtwZywga3BnLmdlbktleVBhaXIoKSk7CisgICAgICAgICAgICAgICAgdGVzdF9LZXlQYWlyKGtwZywga3BnLmdlbmVyYXRlS2V5UGFpcigpKTsKKworICAgICAgICAgICAgICAgIGtwZy5pbml0aWFsaXplKG5ldyBFQ0dlblBhcmFtZXRlclNwZWMoY3VydmVOYW1lKSwgbmV3IFNlY3VyZVJhbmRvbSgpKTsKKyAgICAgICAgICAgICAgICB0ZXN0X0tleVBhaXIoa3BnLCBrcGcuZ2VuS2V5UGFpcigpKTsKKyAgICAgICAgICAgICAgICB0ZXN0X0tleVBhaXIoa3BnLCBrcGcuZ2VuZXJhdGVLZXlQYWlyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RfS2V5UGFpcihLZXlQYWlyR2VuZXJhdG9yIGtwZywgS2V5UGFpciBrcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNDksNiArMjAzLDE5IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwoay5nZXRFbmNvZGVkKCkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGsuZ2V0Rm9ybWF0KCkpOwogCisgICAgICAgIC8vIFRlc3Qgc2VyaWFsaXphdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTYzODQpOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qoayk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgICAgIEtleSBpbmZsYXRlZEtleSA9IChLZXkpIG9pcy5yZWFkT2JqZWN0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhrLCBpbmZsYXRlZEtleSk7CisgICAgICAgIH0KKwogICAgICAgICB0ZXN0X0tleVdpdGhBbGxLZXlGYWN0b3JpZXMoayk7CiAgICAgfQogCkBAIC0xNzIsOCArMjM5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIFBLQ1M4RW5jb2RlZEtleVNwZWMgc3BlYyA9IG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKGVuY29kZWQpOwogICAgICAgICAgICAgICAgICAgICBLZXlGYWN0b3J5IGtmID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrLmdldEFsZ29yaXRobSgpLCBwKTsKICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUtleSBwcml2S2V5ID0ga2YuZ2VuZXJhdGVQcml2YXRlKHNwZWMpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByaXZLZXkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocHJpdktleS5nZXRFbmNvZGVkKCksIGVuY29kZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChrLmdldEFsZ29yaXRobSgpICsgIiwgcHJvdmlkZXI9IiArIHAuZ2V0TmFtZSgpLCBwcml2S2V5KTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBFQyBrZXlzIGFyZSB1bmlxdWUgYmVjYXVzZSB0aGV5IGNhbiBoYXZlIGV4cGxpY2l0IHBhcmFtZXRlcnMgb3IgYSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgKiBuYW1lLiBDaGVjayB0aGVtIHNwZWNpYWxseSBzbyB0aGlzIHRlc3QgY2FuIGNvbnRpbnVlIHRvIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgaW5zdGFuY2VvZiBFQ1ByaXZhdGVLZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVDUHJpdmF0ZUtleUVxdWFscygoRUNQcml2YXRlS2V5KSBrLCAoRUNQcml2YXRlS2V5KSBwcml2S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrLmdldEFsZ29yaXRobSgpICsgIiwgcHJvdmlkZXI9IiArIHAuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZW5jb2RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwcml2S2V5LmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiWC41MDkiLmVxdWFscyhrLmdldEZvcm1hdCgpKSkgewogICAgICAgICAgICAgICAgICAgICBYNTA5RW5jb2RlZEtleVNwZWMgc3BlYyA9IG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoZW5jb2RlZCk7CiAgICAgICAgICAgICAgICAgICAgIEtleUZhY3Rvcnkga2YgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGsuZ2V0QWxnb3JpdGhtKCksIHApOwpAQCAtMTg1LDYgKzI2MywzMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFQ1ByaXZhdGVLZXlFcXVhbHMoRUNQcml2YXRlS2V5IGV4cGVjdGVkLCBFQ1ByaXZhdGVLZXkgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRTKCksIGFjdHVhbC5nZXRTKCkpOworICAgICAgICBhc3NlcnRFQ1BhcmFtZXRlcnNFcXVhbHMoZXhwZWN0ZWQuZ2V0UGFyYW1zKCksIGFjdHVhbC5nZXRQYXJhbXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFQ1BhcmFtZXRlcnNFcXVhbHMoRUNQYXJhbWV0ZXJTcGVjIGV4cGVjdGVkLCBFQ1BhcmFtZXRlclNwZWMgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRDdXJ2ZSgpLCBhY3R1YWwuZ2V0Q3VydmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRHZW5lcmF0b3IoKSwgYWN0dWFsLmdldEdlbmVyYXRvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE9yZGVyKCksIGFjdHVhbC5nZXRPcmRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldENvZmFjdG9yKCksIGFjdHVhbC5nZXRDb2ZhY3RvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBESCBwYXJhbWV0ZXJzIHByZS1nZW5lcmF0ZWQgc28gdGhhdCB0aGUgdGVzdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcuCisgICAgICogVGhlc2UgcGFyYW1ldGVycyB3ZXJlIGdlbmVyYXRlZCB3aXRoOgorICAgICAqCisgICAgICogb3BlbnNzbCBnZW5kaCA1MTIgfCBvcGVuc3NsIGRocGFyYW1zIC1DCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZXRESFBhcmFtcygpIHsKKyAgICAgICAgQmlnSW50ZWdlciBwID0gbmV3IEJpZ0ludGVnZXIoIkU3QUIxNzY4QkQ3NUNEMjQ3MDA5NjBGRkEzMkQzRjE1NTczNDRFNTg3MTAxMjM3NTMyQ0M2NDE2NDZFRDdBN0MxMDQ3NDMzNzdGNkQ0NjI1MTY5OEI2NjVDRTJBNkNCQUI2NzE0QzI1NjlBN0QyQ0EyMkMwQ0YwM0ZBNDBBQzkzIiwgMTYpOworICAgICAgICBCaWdJbnRlZ2VyIGcgPSBuZXcgQmlnSW50ZWdlcigiMDIiLCAxNik7CisgICAgICAgIHJldHVybiBuZXcgREhQYXJhbWV0ZXJTcGVjKHAsIGcsIDUxMik7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEU0FfUCA9IG5ldyBCaWdJbnRlZ2VyKG5ldyBieXRlW10gewogICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDYxLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4ODksIChieXRlKSAweGVmLCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4YTksCiAgICAgICAgIChieXRlKSAweDRlLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4NjcsIChieXRlKSAweDY0LCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAxLCAoYnl0ZSkgMHhmZSwKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKaW5kZXggNjNkYWE4OC4uNGUyY2Y2MSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9TaWduYXR1cmVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEwIEBACiAKIHBhY2thZ2UgbGliY29yZS5qYXZhLnNlY3VyaXR5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5OYXRpdmVDcnlwdG9UZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xQcm92aWRlcjsKKwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CkBAIC0yNyw2ICszMSw3IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUtleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHJpdmF0ZUtleVNwZWM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVB1YmxpY0tleVNwZWM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOwpAQCAtMzgsNiArNDMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogcHVibGljIGNsYXNzIFNpZ25hdHVyZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CkBAIC01Niw3ICs2Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSBzZXJ2aWNlLmdldEFsZ29yaXRobSgpOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEtleVBhaXIga3AgPSBrZXlQYWlyKGFsZ29yaXRobSk7CisgICAgICAgICAgICAgICAgICAgIEtleVBhaXIga3AgPSBrZXlQYWlyKGFsZ29yaXRobSwgcHJvdmlkZXIuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gU2lnbmF0dXJlLmdldEluc3RhbmNlKFN0cmluZykKICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlIHNpZzEgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsZ29yaXRobSwgc2lnMS5nZXRBbGdvcml0aG0oKSk7CkBAIC04MCwxMCArODYsODIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VfT3BlblNTTF9FTkdJTkUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBlbV9wcml2YXRlID0gIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiIKKyAgICAgICAgICAgICAgICArICJNSUlDWEFJQkFBS0JnUURwbTRLYW14dWxKbnljRXpOT05HTTdwMEN2QWFvWnhKRWQ1RHZpbzViNkJST2RDdFJOXG4iCisgICAgICAgICAgICAgICAgKyAibEVzQis5dnRCNXRoa3lEVkM3TitJVzBBanR5REU2aDJRUCtBV2ErYzRkaDBSTTJ1TlZYa1VXUHJBOEMrK0dIdlxuIgorICAgICAgICAgICAgICAgICsgIkVEbHhaelJHaVFFTXVpcHBZZkl5QlZrTys0K0dSdm5rRzRkS2p6eHJRWVBxS1VLM0M0UGdGVzJGZXdJREFRQUJcbiIKKyAgICAgICAgICAgICAgICArICJBb0dBR1VUU0JzazZYMDNmY3I1ODhUdW5kRDl1TnIvMlYxMDAyVWZqMW1zZG5LUEo4RlhJaXkrOFFWV3QvMkN3XG4iCisgICAgICAgICAgICAgICAgKyAiUlFpMkozVmhrQVlybFVEZXgycnI4UWFzM0U5dXV3S2dnL01aNEVzSmJuS0tna2Q3dUJaZm1aMm9nY05KODJ1N1xuIgorICAgICAgICAgICAgICAgICsgInRlVmlqRnBkc1ZMRGE5YWN6RXBwdDVzWnp5VGFCcm92clJiK0FJUkRwTXczSTBFQ1FRRDNKa1dlUVVBOUlzMVZcbiIKKyAgICAgICAgICAgICAgICArICJ6MFgvbHkva2FRS1FMbHJ3WU5kaUtGMHFPcHlUTEFndUk3YXNBUzcyWmo3ZlRoazViSExNK21tZ1l3a2ljSUliXG4iCisgICAgICAgICAgICAgICAgKyAiNjdKMzJHUWJBa0VBOGZrWHFFbndNRllTa1JtVDlNL3FVa3dXVXNNVzEyL0FvWkZJNWd3S05ESFpZeHl0R0dMd1xuIgorICAgICAgICAgICAgICAgICsgIm1DLy8wcUtueWVVRzAwdnowNnZMQXBlNC9TcTRPRGU2SVFKQkFMRUdhc3RGOVp0VXVEc0VjaUQyeThrUkpsTGJcbiIKKyAgICAgICAgICAgICAgICArICJ3U3Q0VWczdTEzeU42dVRIbnp4ZFBGVExyRFcxV3NkY0MxbEVRcDVycHdqSXB4eFI5Zi9GdlZsMlY0MENRSE9ZXG4iCisgICAgICAgICAgICAgICAgKyAiRjZFaGtVakdGYUNUbzRiMFBIQ01RSzNRM1B5V09tUDB6K3AySGZuSlJweCtlb0tINFlBU2poZkY5SG9TbXl3ZFxuIgorICAgICAgICAgICAgICAgICsgIndLR0NGRDFzMWNhN3ZiMjlnWUVDUUg4NkdtWVpzRG9MTld1ckVWSmJrbUNyN1gxK3h3aW02dW1kck5LUjI3UDdcbiIKKyAgICAgICAgICAgICAgICArICJGMXkwU2EzWVkrTGlpUmIrSVJTV0Uvb25sUCsyOExJeldHRjRsY1RmRE1jPVxuIgorICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tIjsKKworICAgICAgICBmaW5hbCBieXRlW10gZGVyX3B1YmxpYyA9IG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4OUYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDJBLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDg2LCAoYnl0ZSkgMHhGNywKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAwLAorICAgICAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4OEQsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODEsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4ODksIChieXRlKSAweDAyLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg5QiwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDlBLCAoYnl0ZSkgMHg5QiwgKGJ5dGUpIDB4MUIsIChieXRlKSAweEE1LAorICAgICAgICAgICAgICAgIChieXRlKSAweDI2LCAoYnl0ZSkgMHg3QywgKGJ5dGUpIDB4OUMsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4NEUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDYzLCAoYnl0ZSkgMHgzQiwgKGJ5dGUpIDB4QTcsIChieXRlKSAweDQwLCAoYnl0ZSkgMHhBRiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4QUEsIChieXRlKSAweDE5LCAoYnl0ZSkgMHhDNCwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDFELAorICAgICAgICAgICAgICAgIChieXRlKSAweEU0LCAoYnl0ZSkgMHgzQiwgKGJ5dGUpIDB4RTIsIChieXRlKSAweEEzLCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4RkEsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDUsIChieXRlKSAweDEzLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweEQ0LCAoYnl0ZSkgMHg0RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4NEIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhGQiwgKGJ5dGUpIDB4REIsIChieXRlKSAweEVELAorICAgICAgICAgICAgICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg5QiwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDkzLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweEIzLCAoYnl0ZSkgMHg3RSwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDZELCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4REMsIChieXRlKSAweDgzLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4QTgsIChieXRlKSAweDc2LAorICAgICAgICAgICAgICAgIChieXRlKSAweDQwLCAoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDU5LCAoYnl0ZSkgMHhBRiwgKGJ5dGUpIDB4OUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4RTEsIChieXRlKSAweEQ4LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweENELCAoYnl0ZSkgMHhBRSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4NTUsIChieXRlKSAweEU0LCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4NjMsIChieXRlKSAweEVCLAorICAgICAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHhDMCwgKGJ5dGUpIDB4QkUsIChieXRlKSAweEY4LCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4RUYsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MTAsIChieXRlKSAweDM5LCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NjcsIChieXRlKSAweDM0LCAoYnl0ZSkgMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBDLCAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4MkEsIChieXRlKSAweDY5LAorICAgICAgICAgICAgICAgIChieXRlKSAweDYxLCAoYnl0ZSkgMHhGMiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDA1LCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4MEUsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4RkIsIChieXRlKSAweDhGLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4NDYsIChieXRlKSAweEY5LCAoYnl0ZSkgMHhFNCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxQiwgKGJ5dGUpIDB4ODcsIChieXRlKSAweDRBLCAoYnl0ZSkgMHg4RiwgKGJ5dGUpIDB4M0MsIChieXRlKSAweDZCLAorICAgICAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4RUEsIChieXRlKSAweDI5LCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4QjcsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDgzLCAoYnl0ZSkgMHhFMCwgKGJ5dGUpIDB4MTUsIChieXRlKSAweDZELCAoYnl0ZSkgMHg4NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxCisgICAgICAgIH07CisKKyAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHRlc3QgdGhpcyBvbiB0aGUgT3BlblNTTCBwcm92aWRlci4KKyAgICAgICAgUHJvdmlkZXIgcCA9IFNlY3VyaXR5LmdldFByb3ZpZGVyKE9wZW5TU0xQcm92aWRlci5QUk9WSURFUl9OQU1FKTsKKworICAgICAgICAvKiBFTkdJTkUtYmFzZWQgcHJpdmF0ZSBrZXkgKi8KKyAgICAgICAgTmF0aXZlQ3J5cHRvVGVzdC5sb2FkVGVzdEVuZ2luZSgpOworICAgICAgICBPcGVuU1NMRW5naW5lIGVuZ2luZSA9IE9wZW5TU0xFbmdpbmUuZ2V0SW5zdGFuY2UoTmF0aXZlQ3J5cHRvVGVzdC5URVNUX0VOR0lORV9JRCk7CisgICAgICAgIFByaXZhdGVLZXkgcHJpdktleSA9IGVuZ2luZS5nZXRQcml2YXRlS2V5QnlJZChwZW1fcHJpdmF0ZSk7CisgICAgICAgIGFzc2VydFRydWUocHJpdktleSBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXkpOworCisgICAgICAgIC8qIE5vbi1FTkdJTkUtYmFzZWQgcHVibGljIGtleSAqLworICAgICAgICBLZXlGYWN0b3J5IGtmID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiUlNBIiwgcCk7CisgICAgICAgIFB1YmxpY0tleSBwdWJLZXkgPSBrZi5nZW5lcmF0ZVB1YmxpYyhuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGRlcl9wdWJsaWMpKTsKKworICAgICAgICBLZXlQYWlyIGtwID0gbmV3IEtleVBhaXIocHViS2V5LCBwcml2S2V5KTsKKworICAgICAgICBTZXQ8UHJvdmlkZXIuU2VydmljZT4gc2VydmljZXMgPSBwLmdldFNlcnZpY2VzKCk7CisgICAgICAgIGZvciAoUHJvdmlkZXIuU2VydmljZSBzZXJ2aWNlIDogc2VydmljZXMpIHsKKyAgICAgICAgICAgIGlmICgiU2lnbmF0dXJlIi5lcXVhbHMoc2VydmljZS5nZXRUeXBlKCkpICYmIHNlcnZpY2UuZ2V0QWxnb3JpdGhtKCkuY29udGFpbnMoIlJTQSIpKSB7CisgICAgICAgICAgICAgICAgU2lnbmF0dXJlIHNpZzEgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2Uoc2VydmljZS5nZXRBbGdvcml0aG0oKSwgcCk7CisgICAgICAgICAgICAgICAgdGVzdF9TaWduYXR1cmUoc2lnMSwga3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEtleVBhaXI+IGtleXBhaXJBbGdvcml0aG1Ub0luc3RhbmNlCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgS2V5UGFpcj4oKTsKIAotICAgIHByaXZhdGUgS2V5UGFpciBrZXlQYWlyKFN0cmluZyBzaWdBbGdvcml0aG0pIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgS2V5UGFpciBrZXlQYWlyKFN0cmluZyBzaWdBbGdvcml0aG0sIFN0cmluZyBwcm92aWRlck5hbWUpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoc2lnQWxnb3JpdGhtLmVuZHNXaXRoKCJFbmNyeXB0aW9uIikpIHsKICAgICAgICAgICAgIHNpZ0FsZ29yaXRobSA9IHNpZ0FsZ29yaXRobS5zdWJzdHJpbmcoMCwgc2lnQWxnb3JpdGhtLmxlbmd0aCgpLSJFbmNyeXB0aW9uIi5sZW5ndGgoKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnlUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5VGVzdC5qYXZhCmluZGV4IGU5YTkxZGQuLjAzNDgyYjQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnlUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYsMTEgKzE2LDQ0IEBACiAKIHBhY2thZ2UgbGliY29yZS5qYXZhLnNlY3VyaXR5LmNlcnQ7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5VjNDZXJ0aWZpY2F0ZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLng1MDkuZXh0ZW5zaW9uLkF1dGhvcml0eUtleUlkZW50aWZpZXJTdHJ1Y3R1cmU7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS54NTA5LmV4dGVuc2lvbi5TdWJqZWN0S2V5SWRlbnRpZmllclN0cnVjdHVyZTsKKwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PcHRpb25hbERhdGFFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBsaWJjb3JlLmphdmEuc2VjdXJpdHkuU3RhbmRhcmROYW1lczsKIAogcHVibGljIGNsYXNzIENlcnRpZmljYXRlRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTg0LDEwICsxMTcsMTkgQEAKICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOwogCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZUNlcnRpZmljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKSk7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiLCAiQkMiKSk7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiLCAiRFJMQ2VydEZhY3RvcnkiKSk7CisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJDZXJ0aWZpY2F0ZUZhY3RvcnkuWDUwOSIpOworICAgICAgICBmb3IgKFByb3ZpZGVyIHAgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWDUwOSIsIHApOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0ZXN0X2dlbmVyYXRlQ2VydGlmaWNhdGUoY2YpOworICAgICAgICAgICAgICAgIHRlc3RfZ2VuZXJhdGVDZXJ0aWZpY2F0ZV9JbnB1dFN0cmVhbV9PZmZzZXRfQ29ycmVjdChjZik7CisgICAgICAgICAgICAgICAgdGVzdF9nZW5lcmF0ZUNlcnRpZmljYXRlX0lucHV0U3RyZWFtX0VtcHR5KGNmKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUHJvYmxlbSB0ZXN0aW5nICIgKyBwLmdldE5hbWUoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICBwcml2YXRlIHZvaWQgdGVzdF9nZW5lcmF0ZUNlcnRpZmljYXRlKENlcnRpZmljYXRlRmFjdG9yeSBjZikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSB2YWxpZCA9IFZBTElEX0NFUlRJRklDQVRFX1BFTS5nZXRCeXRlcygpOwogICAgICAgICBDZXJ0aWZpY2F0ZSBjID0gY2YuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsaWQpKTsKQEAgLTEwMSw0ICsxNDMsMzI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdGVzdF9nZW5lcmF0ZUNlcnRpZmljYXRlX0lucHV0U3RyZWFtX0VtcHR5KENlcnRpZmljYXRlRmFjdG9yeSBjZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBjID0gY2YuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKKyAgICAgICAgICAgIGlmICghIkJDIi5lcXVhbHMoY2YuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IENlcnRpZmljYXRlRXhjZXB0aW9uOiAiICsgY2YuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0TnVsbChjKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCJCQyIuZXF1YWxzKGNmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCByZXR1cm4gbnVsbDogIiArIGNmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0X2dlbmVyYXRlQ2VydGlmaWNhdGVfSW5wdXRTdHJlYW1fT2Zmc2V0X0NvcnJlY3QoQ2VydGlmaWNhdGVGYWN0b3J5IGNmKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSB2YWxpZCA9IFZBTElEX0NFUlRJRklDQVRFX1BFTS5nZXRCeXRlcygpOworCisgICAgICAgIGJ5dGVbXSBkb3VibGVDZXJ0aWZpY2F0ZURhdGEgPSBuZXcgYnl0ZVt2YWxpZC5sZW5ndGggKiAyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWxpZCwgMCwgZG91YmxlQ2VydGlmaWNhdGVEYXRhLCAwLCB2YWxpZC5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbGlkLCAwLCBkb3VibGVDZXJ0aWZpY2F0ZURhdGEsIHZhbGlkLmxlbmd0aCwgdmFsaWQubGVuZ3RoKTsKKyAgICAgICAgTWVhc3VyZWRJbnB1dFN0cmVhbSBjZXJ0U3RyZWFtID0gbmV3IE1lYXN1cmVkSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGRvdWJsZUNlcnRpZmljYXRlRGF0YSkpOworICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoY2VydFN0cmVhbSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2VydGlmaWNhdGUpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsaWQubGVuZ3RoLCBjZXJ0U3RyZWFtLmdldENvdW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3h5IHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGFuIElucHV0U3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lYXN1cmVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgbG9uZyBtQ291bnQgPSAwOworCisgICAgICAgIHByaXZhdGUgbG9uZyBtTWFya2VkID0gMDsKKworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIG1TdHJlYW07CisKKyAgICAgICAgcHVibGljIE1lYXN1cmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKKyAgICAgICAgICAgIG1TdHJlYW0gPSBpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IG5leHRCeXRlID0gbVN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBtQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBuZXh0Qnl0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1TdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgbUNvdW50ICs9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IGNvdW50ID0gbVN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgbUNvdW50ICs9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBieXRlQ291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIGNvdW50ID0gbVN0cmVhbS5za2lwKGJ5dGVDb3VudCk7CisgICAgICAgICAgICBtQ291bnQgKz0gY291bnQ7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbVN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgeworICAgICAgICAgICAgbU1hcmtlZCA9IG1Db3VudDsKKyAgICAgICAgICAgIG1TdHJlYW0ubWFyayhyZWFkbGltaXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5tYXJrU3VwcG9ydGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Db3VudCA9IG1NYXJrZWQ7CisgICAgICAgICAgICBtU3RyZWFtLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDZXJ0UGF0aCB0ZXN0cyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUNlcnRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleUhvbGRlciBjYSA9IGdlbmVyYXRlQ2VydGlmaWNhdGUodHJ1ZSwgbnVsbCk7CisgICAgICAgIEtleUhvbGRlciBjZXJ0MSA9IGdlbmVyYXRlQ2VydGlmaWNhdGUodHJ1ZSwgY2EpOworICAgICAgICBLZXlIb2xkZXIgY2VydDIgPSBnZW5lcmF0ZUNlcnRpZmljYXRlKGZhbHNlLCBjZXJ0MSk7CisgICAgICAgIEtleUhvbGRlciBjZXJ0MyA9IGdlbmVyYXRlQ2VydGlmaWNhdGUoZmFsc2UsIGNlcnQyKTsKKworICAgICAgICBMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMgPSBuZXcgQXJyYXlMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4oKTsKKyAgICAgICAgY2VydHMuYWRkKGNlcnQzLmNlcnRpZmljYXRlKTsKKyAgICAgICAgY2VydHMuYWRkKGNlcnQyLmNlcnRpZmljYXRlKTsKKyAgICAgICAgY2VydHMuYWRkKGNlcnQxLmNlcnRpZmljYXRlKTsKKworICAgICAgICBMaXN0PFg1MDlDZXJ0aWZpY2F0ZT4gZHVwbGljYXRlZENlcnRzID0gbmV3IEFycmF5TGlzdDxYNTA5Q2VydGlmaWNhdGU+KGNlcnRzKTsKKyAgICAgICAgZHVwbGljYXRlZENlcnRzLmFkZChjZXJ0Mi5jZXJ0aWZpY2F0ZSk7CisKKyAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIkNlcnRpZmljYXRlRmFjdG9yeS5YNTA5Iik7CisgICAgICAgIGZvciAoUHJvdmlkZXIgcCA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIsIHApOworCisgICAgICAgICAgICAvLyBEdXBsaWNhdGUgY2VydGlmaWNhdGVzIGNhbiBjYXVzZSBhbiBleGNlcHRpb24uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2VydFBhdGggZHVwbGljYXRlZFBhdGggPSBjZi5nZW5lcmF0ZUNlcnRQYXRoKGR1cGxpY2F0ZWRDZXJ0cyk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZFBhdGguZ2V0RW5jb2RlZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiZHVwbGljYXRlIGNlcnRpZmljYXRlcyBzaG91bGQgY2F1c2UgZmFpbHVyZTogIiArIHAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFTdGFuZGFyZE5hbWVzLklTX1JJKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJkdXBsaWNhdGUgY2VydGlmaWNhdGVzIHNob3VsZCBwYXNzOiAiICsgcC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZXN0Q2VydFBhdGhFbmNvZGluZyhjZiwgY2VydHMsIG51bGwpOworCisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIGVuY29kaW5nIGVudHJpZXMgYXJlIHRoZSBzYW1lLiAqLworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdDEgPSBjZi5nZXRDZXJ0UGF0aEVuY29kaW5ncygpOworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdDIgPSBjZi5nZW5lcmF0ZUNlcnRQYXRoKGNlcnRzKS5nZXRFbmNvZGluZ3MoKTsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocC5nZXROYW1lKCksIGl0MS5oYXNOZXh0KCksIGl0Mi5oYXNOZXh0KCkpOworICAgICAgICAgICAgICAgIGlmICghaXQxLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBpdDEubmV4dCgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwLmdldE5hbWUoKSwgZW5jb2RpbmcsIGl0Mi5uZXh0KCkpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXQxLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGJlIGFibGUgdG8gcmVtb3ZlIGZyb20gaXRlcmF0b3IiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGl0Mi5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlbW92ZSBmcm9tIGl0ZXJhdG9yIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBOb3cgdGVzdCB1c2luZyB0aGlzIGVuY29kaW5nLiAqLworICAgICAgICAgICAgICAgIHRlc3RDZXJ0UGF0aEVuY29kaW5nKGNmLCBjZXJ0cywgZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDZXJ0UGF0aEVuY29kaW5nKENlcnRpZmljYXRlRmFjdG9yeSBjZiwgTGlzdDxYNTA5Q2VydGlmaWNhdGU+IGV4cGVjdGVkQ2VydHMsCisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXJOYW1lID0gY2YuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkgKyAiWyIgKyBlbmNvZGluZyArICJdIjsKKworICAgICAgICBmaW5hbCBDZXJ0UGF0aCBwYXRoRnJvbUxpc3QgPSBjZi5nZW5lcmF0ZUNlcnRQYXRoKGV4cGVjdGVkQ2VydHMpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgd2UgY2FuIG1vZGlmeSBhbmQgZGlzY2FyZC4KKyAgICAgICAgZmluYWwgYnl0ZVtdIGVuY29kZWRDb3B5OworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgZW5jb2RlZENvcHkgPSBwYXRoRnJvbUxpc3QuZ2V0RW5jb2RlZCgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlck5hbWUsIGVuY29kZWRDb3B5KTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWRlbXBvdGVuY2UKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcm92aWRlck5hbWUsIEFycmF5cy50b1N0cmluZyhwYXRoRnJvbUxpc3QuZ2V0RW5jb2RlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGVuY29kZWRDb3B5KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGVkQ29weSA9IHBhdGhGcm9tTGlzdC5nZXRFbmNvZGVkKGVuY29kaW5nKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvdmlkZXJOYW1lLCBlbmNvZGVkQ29weSk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlkZW1wb3RlbmNlCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvdmlkZXJOYW1lLCBBcnJheXMudG9TdHJpbmcocGF0aEZyb21MaXN0LmdldEVuY29kZWQoZW5jb2RpbmcpKSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGVuY29kZWRDb3B5KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgdG8gbW9kaWZ5IGJ5dGUgYXJyYXkuCisgICAgICAgIGVuY29kZWRDb3B5WzBdIF49IChieXRlKSAweEZGOworCisgICAgICAgIC8vIEdldCBhIHJlYWwgY29weSB3ZSB3aWxsIHVzZSBpZiB0aGUgdGVzdCBwcm9jZWVkcy4KKyAgICAgICAgZmluYWwgYnl0ZVtdIGVuY29kZWQ7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBlbmNvZGVkID0gcGF0aEZyb21MaXN0LmdldEVuY29kZWQoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvdmlkZXJOYW1lLCBlbmNvZGVkQ29weSk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlkZW1wb3RlbmNlCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvdmlkZXJOYW1lLCBBcnJheXMudG9TdHJpbmcocGF0aEZyb21MaXN0LmdldEVuY29kZWQoKSksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhlbmNvZGVkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGVkID0gcGF0aEZyb21MaXN0LmdldEVuY29kZWQoZW5jb2RpbmcpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlck5hbWUsIGVuY29kZWRDb3B5KTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWRlbXBvdGVuY2UKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcm92aWRlck5hbWUsIEFycmF5cy50b1N0cmluZyhwYXRoRnJvbUxpc3QuZ2V0RW5jb2RlZChlbmNvZGluZykpLAorICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZW5jb2RlZCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKHByb3ZpZGVyTmFtZSwgQXJyYXlzLnRvU3RyaW5nKGVuY29kZWQpLmVxdWFscyhBcnJheXMudG9TdHJpbmcoZW5jb2RlZENvcHkpKSk7CisKKyAgICAgICAgZW5jb2RlZENvcHlbMF0gXj0gKGJ5dGUpIDB4RkY7CisgICAgICAgIGFzc2VydEVxdWFscyhwcm92aWRlck5hbWUsIEFycmF5cy50b1N0cmluZyhlbmNvZGVkKSwgQXJyYXlzLnRvU3RyaW5nKGVuY29kZWRDb3B5KSk7CisKKyAgICAgICAgZmluYWwgQ2VydFBhdGggYWN0dWFsUGF0aDsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGFjdHVhbFBhdGggPSBjZi5nZW5lcmF0ZUNlcnRQYXRoKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGVkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3R1YWxQYXRoID0gY2YuZ2VuZXJhdGVDZXJ0UGF0aChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCksIGVuY29kaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBLQ1M3IGNlcnRpZmljYXRlIGJhZ3MgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGluIG9yZGVyLgorICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBDZXJ0aWZpY2F0ZT4gYWN0dWFsQ2VydHM7CisgICAgICAgIGlmICghIlBLQ1M3Ii5lcXVhbHMoZW5jb2RpbmcpKSB7CisgICAgICAgICAgICBhY3R1YWxDZXJ0cyA9IGFjdHVhbFBhdGguZ2V0Q2VydGlmaWNhdGVzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvdmlkZXJOYW1lLCBleHBlY3RlZENlcnRzLCBhY3R1YWxDZXJ0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3R1YWxDZXJ0cyA9IHBhdGhGcm9tTGlzdC5nZXRDZXJ0aWZpY2F0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3R1YWxDZXJ0cy5yZW1vdmUoMCk7CisgICAgICAgICAgICBmYWlsKCJMaXN0IG9mIGNlcnRpZmljYXRlIHNob3VsZCBiZSBpbW11dGFibGUiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KGFjdHVhbFBhdGgpOworICAgICAgICBvb3MuY2xvc2UoKTsKKworICAgICAgICBieXRlW10gc2VyaWFsaXplZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkKTsKKyAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgICAgICBPYmplY3Qgb3V0cHV0ID0gb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm92aWRlck5hbWUsIG91dHB1dCBpbnN0YW5jZW9mIENlcnRQYXRoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocHJvdmlkZXJOYW1lLCBhY3R1YWxQYXRoLCAoQ2VydFBhdGgpIG91dHB1dCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXlIb2xkZXIgeworICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlOworCisgICAgICAgIHB1YmxpYyBQcml2YXRlS2V5IHByaXZhdGVLZXk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHN0YXRpYyBLZXlIb2xkZXIgZ2VuZXJhdGVDZXJ0aWZpY2F0ZShib29sZWFuIGlzQ2EsIEtleUhvbGRlciBpc3N1ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEYXRlIHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7CisKKyAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIGNhbC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworICAgICAgICBjYWwuc2V0KDIxMDAsIDAsIDEsIDAsIDAsIDApOyAvLyBKYW4gMSwgMjEwMCBVVEMKKyAgICAgICAgRGF0ZSBleHBpcnlEYXRlID0gY2FsLmdldFRpbWUoKTsKKworICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtwZyA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIlJTQSIpOworICAgICAgICBLZXlQYWlyIGtleVBhaXIgPSBrcGcuZ2VuZXJhdGVLZXlQYWlyKCk7CisKKyAgICAgICAgQmlnSW50ZWdlciBzZXJpYWw7CisgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzdWVyUHJpbmNpcGFsOworICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YmplY3RQcmluY2lwYWw7CisgICAgICAgIFByaXZhdGVLZXkgY2FLZXk7CisgICAgICAgIGlmIChpc3N1ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VyaWFsID0gaXNzdWVyLmNlcnRpZmljYXRlLmdldFNlcmlhbE51bWJlcigpLmFkZChCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgICAgICBzdWJqZWN0UHJpbmNpcGFsID0gbmV3IFg1MDBQcmluY2lwYWwoIkNOPVRlc3QgQ2VydGlmaWNhdGUgU2VyaWFsICMiICsgc2VyaWFsLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaXNzdWVyUHJpbmNpcGFsID0gaXNzdWVyLmNlcnRpZmljYXRlLmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCk7CisgICAgICAgICAgICBjYUtleSA9IGlzc3Vlci5wcml2YXRlS2V5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VyaWFsID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgICAgICBzdWJqZWN0UHJpbmNpcGFsID0gbmV3IFg1MDBQcmluY2lwYWwoIkNOPVRlc3QgQ0EsIE89VGVzdHMsIEM9VVMiKTsKKyAgICAgICAgICAgIGlzc3VlclByaW5jaXBhbCA9IHN1YmplY3RQcmluY2lwYWw7CisgICAgICAgICAgICBjYUtleSA9IGtleVBhaXIuZ2V0UHJpdmF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNDb25zdHJhaW50cyBiYXNpY0NvbnN0cmFpbnRzOworICAgICAgICBpZiAoaXNDYSkgeworICAgICAgICAgICAgYmFzaWNDb25zdHJhaW50cyA9IG5ldyBCYXNpY0NvbnN0cmFpbnRzKDEwIC0gc2VyaWFsLmludFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzaWNDb25zdHJhaW50cyA9IG5ldyBCYXNpY0NvbnN0cmFpbnRzKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIFg1MDlWM0NlcnRpZmljYXRlR2VuZXJhdG9yIGNlcnRHZW4gPSBuZXcgWDUwOVYzQ2VydGlmaWNhdGVHZW5lcmF0b3IoKTsKKworICAgICAgICBjZXJ0R2VuLnNldFNlcmlhbE51bWJlcihzZXJpYWwpOworICAgICAgICBjZXJ0R2VuLnNldElzc3VlckROKGlzc3VlclByaW5jaXBhbCk7CisgICAgICAgIGNlcnRHZW4uc2V0Tm90QmVmb3JlKHN0YXJ0RGF0ZSk7CisgICAgICAgIGNlcnRHZW4uc2V0Tm90QWZ0ZXIoZXhwaXJ5RGF0ZSk7CisgICAgICAgIGNlcnRHZW4uc2V0U3ViamVjdEROKHN1YmplY3RQcmluY2lwYWwpOworICAgICAgICBjZXJ0R2VuLnNldFB1YmxpY0tleShrZXlQYWlyLmdldFB1YmxpYygpKTsKKyAgICAgICAgY2VydEdlbi5zZXRTaWduYXR1cmVBbGdvcml0aG0oIlNIQTF3aXRoUlNBIik7CisKKyAgICAgICAgaWYgKGlzc3VlciAhPSBudWxsKSB7CisgICAgICAgICAgICBjZXJ0R2VuLmFkZEV4dGVuc2lvbihYNTA5RXh0ZW5zaW9ucy5BdXRob3JpdHlLZXlJZGVudGlmaWVyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF1dGhvcml0eUtleUlkZW50aWZpZXJTdHJ1Y3R1cmUoaXNzdWVyLmNlcnRpZmljYXRlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjZXJ0R2VuLmFkZEV4dGVuc2lvbihYNTA5RXh0ZW5zaW9ucy5BdXRob3JpdHlLZXlJZGVudGlmaWVyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF1dGhvcml0eUtleUlkZW50aWZpZXJTdHJ1Y3R1cmUoa2V5UGFpci5nZXRQdWJsaWMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgY2VydEdlbi5hZGRFeHRlbnNpb24oWDUwOUV4dGVuc2lvbnMuU3ViamVjdEtleUlkZW50aWZpZXIsIGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBTdWJqZWN0S2V5SWRlbnRpZmllclN0cnVjdHVyZShrZXlQYWlyLmdldFB1YmxpYygpKSk7CisgICAgICAgIGNlcnRHZW4uYWRkRXh0ZW5zaW9uKFg1MDlFeHRlbnNpb25zLkJhc2ljQ29uc3RyYWludHMsIHRydWUsIGJhc2ljQ29uc3RyYWludHMpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gY2VydEdlbi5nZW5lcmF0ZShjYUtleSk7CisKKyAgICAgICAgS2V5SG9sZGVyIGhvbGRlciA9IG5ldyBLZXlIb2xkZXIoKTsKKyAgICAgICAgaG9sZGVyLmNlcnRpZmljYXRlID0gY2VydDsKKyAgICAgICAgaG9sZGVyLnByaXZhdGVLZXkgPSBrZXlQYWlyLmdldFByaXZhdGUoKTsKKworICAgICAgICByZXR1cm4gaG9sZGVyOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDUkxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3YzE1YgotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBsaWJjb3JlLmphdmEuc2VjdXJpdHkuY2VydDsKKworaW1wb3J0IHRlc3RzLnN1cHBvcnQucmVzb3VyY2UuU3VwcG9ydF9SZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTEVudHJ5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFg1MDlDUkxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgUHJvdmlkZXJbXSBtWDUwOVByb3ZpZGVyczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX1JTQSA9ICJ4NTA5L2NlcnQtcnNhLmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9EU0EgPSAieDUwOS9jZXJ0LWRzYS5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTF9SU0EgPSAieDUwOS9jcmwtcnNhLmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMX1JTQV9EU0EgPSAieDUwOS9jcmwtcnNhLWRzYS5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTF9VTlNVUFBPUlRFRCA9ICJ4NTA5L2NybC11bnN1cHBvcnRlZC5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTF9SU0FfREFURVMgPSAieDUwOS9jcmwtcnNhLWRhdGVzLnR4dCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMX1JTQV9EU0FfREFURVMgPSAieDUwOS9jcmwtcnNhLWRzYS1kYXRlcy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSTF9SU0FfU0lHID0gIng1MDkvY3JsLXJzYS1zaWcuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxfUlNBX1RCUyA9ICJ4NTA5L2NybC1yc2EtdGJzLmRlciI7CisKKyAgICBwcml2YXRlIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZiwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRTdHJlYW0obmFtZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICIgKyBuYW1lLCBpcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IChYNTA5Q2VydGlmaWNhdGUpIGYuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShpcyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGMpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFg1MDlDUkwgZ2V0Q1JMKENlcnRpZmljYXRlRmFjdG9yeSBmLCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlzID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKG5hbWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGaWxlIGRvZXMgbm90IGV4aXN0OiAiICsgbmFtZSwgaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWDUwOUNSTCBjcmwgPSAoWDUwOUNSTCkgZi5nZW5lcmF0ZUNSTChpcyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNybCk7CisgICAgICAgICAgICByZXR1cm4gY3JsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZ2V0UmVzb3VyY2VBc0J5dGVzKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gcmlzID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKG5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmlzKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtyaXMuYXZhaWxhYmxlKCldOworICAgICAgICAgICAgZGlzLnJlYWRGdWxseShidWYpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERhdGU+IGdldENybERhdGVzKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgRGF0ZT4gZGF0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGU+KCk7CisgICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NTSBkZCBISDptbTpzcyB5eXl5IHp6eiIpOworCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHJpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbShuYW1lKTsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgYnVmID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyaXMpKTsKKworICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBidWYucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZignPScpOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgZmluYWwgRGF0ZSB2YWx1ZSA9IHNkZi5wYXJzZShsaW5lLnN1YnN0cmluZyhpbmRleCArIDEpKTsKKyAgICAgICAgICAgICAgICBkYXRlcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBkYXRlczsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShlcnJCdWZmZXIpOworCisgICAgICAgIGZvciAoUHJvdmlkZXIgcCA6IG1YNTA5UHJvdmlkZXJzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIsIHApOworICAgICAgICAgICAgICAgIGlzUmV2b2tlZChmKTsKKyAgICAgICAgICAgICAgICBnZXRUeXBlKGYpOworICAgICAgICAgICAgICAgIGdldEVuY29kZWQoZik7CisgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbihmKTsKKyAgICAgICAgICAgICAgICBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKGYpOworICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZShmKTsKKyAgICAgICAgICAgICAgICBnZXRUQlNDZXJ0TGlzdChmKTsKKyAgICAgICAgICAgICAgICBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKGYpOworICAgICAgICAgICAgICAgIGdldFRoaXNVcGRhdGVOZXh0VXBkYXRlKGYpOworICAgICAgICAgICAgICAgIGdldFNpZ0FsZ05hbWUoZik7CisgICAgICAgICAgICAgICAgZ2V0U2lnQWxnT0lEKGYpOworICAgICAgICAgICAgICAgIHRlc3RfdG9TdHJpbmcoZik7CisgICAgICAgICAgICAgICAgdGVzdF9lcXVhbHMoZik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkVycm9yIGVuY291bnRlcmVkIGNoZWNraW5nICIgKyBwLmdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgaWYgKGVyckJ1ZmZlci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcnMgZW5jb3VudGVyZWQ6XG5cbiIgKyBlcnJCdWZmZXIudG9TdHJpbmcoKSArICJcblxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0VHlwZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENSTCBjcmxSc2EgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYLjUwOSIsIGNybFJzYS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpc1Jldm9rZWQoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcnNhQ2VydCA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGRzYUNlcnQgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0RTQSk7CisgICAgICAgIFg1MDlDUkwgY3JsUnNhID0gZ2V0Q1JMKGYsIENSTF9SU0EpOworICAgICAgICBYNTA5Q1JMIGNybFJzYURzYSA9IGdldENSTChmLCBDUkxfUlNBX0RTQSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcmxSc2EuaXNSZXZva2VkKHJzYUNlcnQpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3JsUnNhLmlzUmV2b2tlZChkc2FDZXJ0KSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcmxSc2FEc2EuaXNSZXZva2VkKHJzYUNlcnQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcmxSc2FEc2EuaXNSZXZva2VkKGRzYUNlcnQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY3JsUnNhLmlzUmV2b2tlZChudWxsKSk7CisgICAgICAgICAgICBpZiAoIkJDIi5lcXVhbHMoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJCb3VuY3lDYXN0bGUgdGhyb3dzIG9uIG51bGwgaW5wdXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCEiQkMiLmVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgdGhyb3cgb24gbnVsbCBpbnB1dCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFRoaXNVcGRhdGVOZXh0VXBkYXRlKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeworICAgICAgICAgICAgWDUwOUNSTCBjcmwgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBEYXRlPiBkYXRlcyA9IGdldENybERhdGVzKENSTF9SU0FfREFURVMpOworCisgICAgICAgICAgICBEYXRlIGxhc3RVcGRhdGUgPSBkYXRlcy5nZXQoImxhc3RVcGRhdGUiKTsKKyAgICAgICAgICAgIERhdGUgbmV4dFVwZGF0ZSA9IGRhdGVzLmdldCgibmV4dFVwZGF0ZSIpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxhc3RVcGRhdGUpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXh0VXBkYXRlKTsKKworICAgICAgICAgICAgYXNzZXJ0RGF0ZUVxdWFscyhsYXN0VXBkYXRlLCBjcmwuZ2V0VGhpc1VwZGF0ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydERhdGVFcXVhbHMobmV4dFVwZGF0ZSwgY3JsLmdldE5leHRVcGRhdGUoKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBYNTA5Q1JMIGNybCA9IGdldENSTChmLCBDUkxfUlNBX0RTQSk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBEYXRlPiBkYXRlcyA9IGdldENybERhdGVzKENSTF9SU0FfRFNBX0RBVEVTKTsKKworICAgICAgICAgICAgRGF0ZSBsYXN0VXBkYXRlID0gZGF0ZXMuZ2V0KCJsYXN0VXBkYXRlIik7CisgICAgICAgICAgICBEYXRlIG5leHRVcGRhdGUgPSBkYXRlcy5nZXQoIm5leHRVcGRhdGUiKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsYXN0VXBkYXRlKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV4dFVwZGF0ZSk7CisKKyAgICAgICAgICAgIGFzc2VydERhdGVFcXVhbHMobGFzdFVwZGF0ZSwgY3JsLmdldFRoaXNVcGRhdGUoKSk7CisgICAgICAgICAgICBhc3NlcnREYXRlRXF1YWxzKG5leHRVcGRhdGUsIGNybC5nZXROZXh0VXBkYXRlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFNpZ0FsZ05hbWUoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q1JMIGNybFJzYSA9IGdldENSTChmLCBDUkxfUlNBKTsKKworICAgICAgICBTdHJpbmcgYWN0dWFsID0gY3JsUnNhLmdldFNpZ0FsZ05hbWUoKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOworCisgICAgICAgIC8vIEJvdW5jeWNhc3RsZSBpcyBicm9rZW4KKyAgICAgICAgaWYgKCJCQyIuZXF1YWxzKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMi44NDAuMTEzNTQ5LjEuMS41IiwgYWN0dWFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU0hBMVdJVEhSU0EiLCBhY3R1YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFNpZ0FsZ09JRChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDUkwgY3JsUnNhID0gZ2V0Q1JMKGYsIENSTF9SU0EpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMS4yLjg0MC4xMTM1NDkuMS4xLjUiLCBjcmxSc2EuZ2V0U2lnQWxnT0lEKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRWZXJzaW9uKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNSTCBjcmxSc2EgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNybFJzYS5nZXRWZXJzaW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNSTCBjcmxSc2EgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNybFJzYS5oYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkpOworCisgICAgICAgIFg1MDlDUkwgdW5zdXBwb3J0ZWRDcmwgPSBnZXRDUkwoZiwgQ1JMX1VOU1VQUE9SVEVEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bnN1cHBvcnRlZENybC5oYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTaWduYXR1cmUoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q1JMIGNybFJzYSA9IGdldENSTChmLCBDUkxfUlNBKTsKKyAgICAgICAgYnl0ZVtdIGV4cGVjdGVkID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENSTF9SU0FfU0lHKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGV4cGVjdGVkKSwgQXJyYXlzLnRvU3RyaW5nKGNybFJzYS5nZXRTaWduYXR1cmUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRUQlNDZXJ0TGlzdChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDUkwgY3JsUnNhID0gZ2V0Q1JMKGYsIENSTF9SU0EpOworICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBnZXRSZXNvdXJjZUFzQnl0ZXMoQ1JMX1JTQV9UQlMpOworCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpLCBBcnJheXMudG9TdHJpbmcoY3JsUnNhLmdldFRCU0NlcnRMaXN0KCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0RW5jb2RlZChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDUkwgY3JsUnNhID0gZ2V0Q1JMKGYsIENSTF9SU0EpOworCisgICAgICAgIGJ5dGVbXSBjcmxSc2FCeXRlcyA9IGdldFJlc291cmNlQXNCeXRlcyhDUkxfUlNBKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGNybFJzYUJ5dGVzKSwgQXJyYXlzLnRvU3RyaW5nKGNybFJzYS5nZXRFbmNvZGVkKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERhdGVFcXVhbHMoRGF0ZSBkYXRlMSwgRGF0ZSBkYXRlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkIE1NTSB5eXl5IEhIOm1tOnNzIik7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdDEgPSBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUxKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdDIgPSBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0MSwgcmVzdWx0Mik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJzYUNybChDZXJ0aWZpY2F0ZUZhY3RvcnkgZiwgWDUwOUNSTEVudHJ5IHJzYUVudHJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyc2FFbnRyeSk7CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJzYUNlcnQgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIE1hcDxTdHJpbmcsIERhdGU+IGRhdGVzID0gZ2V0Q3JsRGF0ZXMoQ1JMX1JTQV9EU0FfREFURVMpOworICAgICAgICBEYXRlIGV4cGVjdGVkRGF0ZSA9IGRhdGVzLmdldCgibGFzdFVwZGF0ZSIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyc2FDZXJ0LmdldFNlcmlhbE51bWJlcigpLCByc2FFbnRyeS5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydERhdGVFcXVhbHMoZXhwZWN0ZWREYXRlLCByc2FFbnRyeS5nZXRSZXZvY2F0aW9uRGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyc2FFbnRyeS5nZXRDZXJ0aWZpY2F0ZUlzc3VlcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocnNhRW50cnkuaGFzRXh0ZW5zaW9ucygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyc2FFbnRyeS5nZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSk7CisgICAgICAgIGFzc2VydE51bGwocnNhRW50cnkuZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREc2FDcmwoQ2VydGlmaWNhdGVGYWN0b3J5IGYsIFg1MDlDUkxFbnRyeSBkc2FFbnRyeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBkc2FDZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9EU0EpOworICAgICAgICBNYXA8U3RyaW5nLCBEYXRlPiBkYXRlcyA9IGdldENybERhdGVzKENSTF9SU0FfRFNBX0RBVEVTKTsKKyAgICAgICAgRGF0ZSBleHBlY3RlZERhdGUgPSBkYXRlcy5nZXQoImxhc3RVcGRhdGUiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZHNhQ2VydC5nZXRTZXJpYWxOdW1iZXIoKSwgZHNhRW50cnkuZ2V0U2VyaWFsTnVtYmVyKCkpOworICAgICAgICBhc3NlcnREYXRlRXF1YWxzKGV4cGVjdGVkRGF0ZSwgZHNhRW50cnkuZ2V0UmV2b2NhdGlvbkRhdGUoKSk7CisgICAgICAgIGFzc2VydE51bGwoZHNhRW50cnkuZ2V0Q2VydGlmaWNhdGVJc3N1ZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoZHNhRW50cnkuaGFzRXh0ZW5zaW9ucygpKTsKKyAgICAgICAgLyogVE9ETzogZ2V0IHRoZSBPSUQgKi8KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkc2FFbnRyeS5nZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKSk7CisgICAgICAgIC8qIFRPRE86IGdldCB0aGUgT0lEICovCisgICAgICAgIGFzc2VydE5vdE51bGwoZHNhRW50cnkuZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNSTCBjcmxSc2EgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSByc2FDZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgZHNhQ2VydCA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfRFNBKTsKKworICAgICAgICBTZXQ8PyBleHRlbmRzIFg1MDlDUkxFbnRyeT4gZW50cmllcyA9IGNybFJzYS5nZXRSZXZva2VkQ2VydGlmaWNhdGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBlbnRyaWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoWDUwOUNSTEVudHJ5IGUgOiBlbnRyaWVzKSB7CisgICAgICAgICAgICBhc3NlcnRSc2FDcmwoZiwgZSk7CisgICAgICAgIH0KKworICAgICAgICBYNTA5Q1JMIGNybFJzYURzYSA9IGdldENSTChmLCBDUkxfUlNBX0RTQSk7CisgICAgICAgIFNldDw/IGV4dGVuZHMgWDUwOUNSTEVudHJ5PiBlbnRyaWVzMiA9IGNybFJzYURzYS5nZXRSZXZva2VkQ2VydGlmaWNhdGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBlbnRyaWVzMi5zaXplKCkpOworICAgICAgICBhc3NlcnRSc2FDcmwoZiwgY3JsUnNhRHNhLmdldFJldm9rZWRDZXJ0aWZpY2F0ZShyc2FDZXJ0KSk7CisgICAgICAgIGFzc2VydERzYUNybChmLCBjcmxSc2FEc2EuZ2V0UmV2b2tlZENlcnRpZmljYXRlKGRzYUNlcnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdF90b1N0cmluZyhDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDUkwgY3JsMSA9IGdldENSTChmLCBDUkxfUlNBKTsKKyAgICAgICAgWDUwOUNSTCBjcmwyID0gZ2V0Q1JMKGYsIENSTF9SU0EpOworCisgICAgICAgIFg1MDlDUkwgY3JsUnNhRHNhID0gZ2V0Q1JMKGYsIENSTF9SU0FfRFNBKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGNybDEpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoY3JsUnNhRHNhKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY3JsMS50b1N0cmluZygpLCBjcmwyLnRvU3RyaW5nKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKGNybDEudG9TdHJpbmcoKS5lcXVhbHMoY3JsUnNhRHNhLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdF9lcXVhbHMoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q1JMIGNybDEgPSBnZXRDUkwoZiwgQ1JMX1JTQSk7CisgICAgICAgIFg1MDlDUkwgY3JsMiA9IGdldENSTChmLCBDUkxfUlNBKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJzYUNlcnQgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisKKyAgICAgICAgWDUwOUNSTCBjcmxSc2FEc2EgPSBnZXRDUkwoZiwgQ1JMX1JTQV9EU0EpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjcmwxLCBjcmwyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3JsMS5lcXVhbHMoY3JsUnNhRHNhKSk7CisKKyAgICAgICAgWDUwOUNSTEVudHJ5IGVudHJ5MSA9IGNybDEuZ2V0UmV2b2tlZENlcnRpZmljYXRlKHJzYUNlcnQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGVudHJ5MSk7CisgICAgICAgIFg1MDlDUkxFbnRyeSBlbnRyeTIgPSBjcmwyLmdldFJldm9rZWRDZXJ0aWZpY2F0ZShyc2FDZXJ0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbnRyeTIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhlbnRyeTEsIGVudHJ5Mik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtWDUwOVByb3ZpZGVycyA9IFNlY3VyaXR5LmdldFByb3ZpZGVycygiQ2VydGlmaWNhdGVGYWN0b3J5Llg1MDkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBlMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGxpYmNvcmUuamF2YS5zZWN1cml0eS5jZXJ0OworCitpbXBvcnQgdGVzdHMuc3VwcG9ydC5yZXNvdXJjZS5TdXBwb3J0X1Jlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlg1MDlFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGxpYmNvcmUuamF2YS5zZWN1cml0eS5TdGFuZGFyZE5hbWVzOworCitwdWJsaWMgY2xhc3MgWDUwOUNlcnRpZmljYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFByb3ZpZGVyW10gbVg1MDlQcm92aWRlcnM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9SU0EgPSAieDUwOS9jZXJ0LXJzYS5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfRFNBID0gIng1MDkvY2VydC1kc2EuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0VDID0gIng1MDkvY2VydC1lYy5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfS0VZVVNBR0VfRVhUUkFMT05HID0gIng1MDkvY2VydC1rZXlVc2FnZS1leHRyYUxvbmcuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0VYVEVOREVES0VZVVNBR0UgPSAieDUwOS9jZXJ0LWV4dGVuZGVkS2V5VXNhZ2UuZGVyIjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDRVJUX1JTQV9UQlMgPSAieDUwOS9jZXJ0LXJzYS10YnMuZGVyIjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDRVJUX1JTQV9TSUdOQVRVUkUgPSAieDUwOS9jZXJ0LXJzYS1zaWcuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX1VTRVJXSVRIUEFUSExFTiA9ICJ4NTA5L2NlcnQtdXNlcldpdGhQYXRoTGVuLmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9DQSA9ICJ4NTA5L2NlcnQtY2EuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0NBV0lUSFBBVEhMRU4gPSAieDUwOS9jZXJ0LWNhV2l0aFBhdGhMZW4uZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0lOVkFMSURJUCA9ICJ4NTA5L2NlcnQtaW52YWxpZGlwLmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9JUFY2ID0gIng1MDkvY2VydC1pcHY2LmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9BTFRfT1RIRVIgPSAieDUwOS9jZXJ0LWFsdC1vdGhlci5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfQUxUX0VNQUlMID0gIng1MDkvY2VydC1hbHQtZW1haWwuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0FMVF9ETlMgPSAieDUwOS9jZXJ0LWFsdC1kbnMuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX0FMVF9ESVJOQU1FID0gIng1MDkvY2VydC1hbHQtZGlybmFtZS5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfQUxUX1VSSSA9ICJ4NTA5L2NlcnQtYWx0LXVyaS5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfQUxUX1JJRCA9ICJ4NTA5L2NlcnQtYWx0LXJpZC5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfQUxUX05PTkUgPSAieDUwOS9jZXJ0LWFsdC1ub25lLmRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9VTlNVUFBPUlRFRCA9ICJ4NTA5L2NlcnQtdW5zdXBwb3J0ZWQuZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUU19YNTA5X1BFTSA9ICJ4NTA5L2NlcnRzLnBlbSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVFNfWDUwOV9ERVIgPSAieDUwOS9jZXJ0cy5kZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRTX1BLQ1M3X1BFTSA9ICJ4NTA5L2NlcnRzLXBrNy5wZW0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRTX1BLQ1M3X0RFUiA9ICJ4NTA5L2NlcnRzLXBrNy5kZXIiOworCisgICAgLyoqIEEgbGlzdCBvZiBjZXJ0cyB0aGF0IGFyZSBhbGwgc2xpZ2h0bHkgZGlmZmVyZW50LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBUklPVVNfQ0VSVFMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgQ0VSVF9SU0EsIENFUlRfRFNBLCBDRVJUX0VDLAorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZiwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRTdHJlYW0obmFtZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICIgKyBuYW1lLCBpcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFg1MDlDZXJ0aWZpY2F0ZSkgZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlPiBnZXRDZXJ0aWZpY2F0ZXMoQ2VydGlmaWNhdGVGYWN0b3J5IGYsIFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlzID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKG5hbWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGaWxlIGRvZXMgbm90IGV4aXN0OiAiICsgbmFtZSwgaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYNTA5Q2VydGlmaWNhdGU+KSBmLmdlbmVyYXRlQ2VydGlmaWNhdGVzKGlzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUHVibGljS2V5IGdldFJzYUNlcnRpZmljYXRlUHVibGljS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHJpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgieDUwOS9jZXJ0LXJzYS1wdWJrZXkuZGVyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJpcy5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGZpbmFsIERhdGFJbnB1dFN0cmVhbSBpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmlzKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBrZXlCeXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgaXMucmVhZEZ1bGx5KGtleUJ5dGVzKTsKKworICAgICAgICAgICAgZmluYWwgS2V5RmFjdG9yeSBrZiA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlJTQSIpOworICAgICAgICAgICAgcmV0dXJuIGtmLmdlbmVyYXRlUHVibGljKG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoa2V5Qnl0ZXMpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIERhdGVbXSBnZXRSc2FDZXJ0aWZpY2F0ZURhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHJpcyA9IFN1cHBvcnRfUmVzb3VyY2VzLmdldFN0cmVhbSgieDUwOS9jZXJ0LXJzYS1kYXRlcy50eHQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG5vdEJlZm9yZT1EZWMgMjYgMDA6MTk6MTQgMjAxMiBHTVQKKyAgICAgICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NTSBkZCBISDptbTpzcyB5eXl5IHp6eiIpOworCisgICAgICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBidWYgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHJpcykpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWYucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZignPScpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJub3RCZWZvcmUiLCBsaW5lLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgZmluYWwgRGF0ZSBzdGFydERhdGUgPSBzZGYucGFyc2UobGluZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7CisKKyAgICAgICAgICAgIGxpbmUgPSBidWYucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vdEFmdGVyIiwgbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKyAgICAgICAgICAgIGZpbmFsIERhdGUgZW5kRGF0ZSA9IHNkZi5wYXJzZShsaW5lLnN1YnN0cmluZyhpbmRleCArIDEpKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdGFydERhdGUuYmVmb3JlKGVuZERhdGUpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZW5kRGF0ZS5hZnRlcihzdGFydERhdGUpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlW10geyBzdGFydERhdGUsIGVuZERhdGUgfTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEJpZ0ludGVnZXIgZ2V0UnNhQ2VydGlmaWNhdGVTZXJpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gcmlzID0gU3VwcG9ydF9SZXNvdXJjZXMuZ2V0U3RyZWFtKCJ4NTA5L2NlcnQtcnNhLXNlcmlhbC50eHQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJ1ZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmlzKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnVmLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoJz0nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic2VyaWFsIiwgbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgMSksIDE2KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRSZXNvdXJjZUFzQnl0ZXMoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSByaXMgPSBTdXBwb3J0X1Jlc291cmNlcy5nZXRTdHJlYW0obmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShyaXMpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3Jpcy5hdmFpbGFibGUoKV07CisgICAgICAgICAgICBkaXMucmVhZEZ1bGx5KGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldFJzYUNlcnRpZmljYXRlU2lnbmF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUFzQnl0ZXMoQ0VSVF9SU0FfU0lHTkFUVVJFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRSc2FDZXJ0aWZpY2F0ZVRicygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRfUlNBX1RCUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9Qcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyQnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBuZXcgUHJpbnRTdHJlYW0oZXJyQnVmZmVyKTsKKworICAgICAgICBmb3IgKFByb3ZpZGVyIHAgOiBtWDUwOVByb3ZpZGVycykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiLCBwKTsKKyAgICAgICAgICAgICAgICBnZXRQdWJsaWNLZXkoZik7CisgICAgICAgICAgICAgICAgZ2V0VHlwZShmKTsKKyAgICAgICAgICAgICAgICBjaGVja19lcXVhbHMoZik7CisgICAgICAgICAgICAgICAgY2hlY2tfdG9TdHJpbmcoZik7CisgICAgICAgICAgICAgICAgY2hlY2tfaGFzaENvZGUoZik7CisgICAgICAgICAgICAgICAgY2hlY2tWYWxpZGl0eShmKTsKKyAgICAgICAgICAgICAgICBnZXRWZXJzaW9uKGYpOworICAgICAgICAgICAgICAgIGdldFNlcmlhbE51bWJlcihmKTsKKyAgICAgICAgICAgICAgICBnZXRJc3N1ZXJETihmKTsKKyAgICAgICAgICAgICAgICBnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKGYpOworICAgICAgICAgICAgICAgIGdldFN1YmplY3RETihmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0VW5pcXVlSUQoZik7CisgICAgICAgICAgICAgICAgZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoZik7CisgICAgICAgICAgICAgICAgZ2V0Tm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlcyhmKTsKKyAgICAgICAgICAgICAgICBnZXRTaWdBbGdOYW1lKGYpOworICAgICAgICAgICAgICAgIGdldFNpZ0FsZ09JRChmKTsKKyAgICAgICAgICAgICAgICBnZXRTaWdBbGdQYXJhbXMoZik7CisgICAgICAgICAgICAgICAgZ2V0SXNzdWVyVW5pcXVlSUQoZik7CisgICAgICAgICAgICAgICAgZ2V0U3ViamVjdFVuaXF1ZUlEKGYpOworICAgICAgICAgICAgICAgIGdldEtleVVzYWdlKGYpOworICAgICAgICAgICAgICAgIGdldEV4dGVuZGVkS2V5VXNhZ2UoZik7CisgICAgICAgICAgICAgICAgZ2V0QmFzaWNDb25zdHJhaW50cyhmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19JUFY2KGYpOworICAgICAgICAgICAgICAgIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzX0ludmFsaWRJUChmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19PdGhlcihmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19FbWFpbChmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19ETlMoZik7CisgICAgICAgICAgICAgICAgZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXNfRGlyTmFtZShmKTsKKyAgICAgICAgICAgICAgICBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19VUkkoZik7CisgICAgICAgICAgICAgICAgZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXNfUklEKGYpOworICAgICAgICAgICAgICAgIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzX05vbmUoZik7CisgICAgICAgICAgICAgICAgZ2V0SXNzdWVyQWx0ZXJuYXRpdmVOYW1lcyhmKTsKKyAgICAgICAgICAgICAgICBnZXRUQlNDZXJ0aWZpY2F0ZShmKTsKKyAgICAgICAgICAgICAgICBnZXRTaWduYXR1cmUoZik7CisgICAgICAgICAgICAgICAgaGFzVW5zdXBwb3J0ZWRDcml0aWNhbEV4dGVuc2lvbihmKTsKKyAgICAgICAgICAgICAgICBnZXRFbmNvZGVkKGYpOworICAgICAgICAgICAgICAgIHZlcmlmeShmKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNlcnRpZmljYXRlX1BFTV9UcmFpbGluZ0RhdGEoZik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDZXJ0aWZpY2F0ZV9ERVJfVHJhaWxpbmdEYXRhKGYpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1g1MDlfUEVNKGYpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1g1MDlfREVSKGYpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1BLQ1M3X1BFTShmKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNlcnRpZmljYXRlc19QS0NTN19ERVIoZik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDZXJ0aWZpY2F0ZXNfRW1wdHkoZik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDZXJ0aWZpY2F0ZXNfWDUwOV9QRU1fVHJhaWxpbmdEYXRhKGYpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1g1MDlfREVSX1RyYWlsaW5nRGF0YShmKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNlcnRpZmljYXRlc19QS0NTN19QRU1fVHJhaWxpbmdEYXRhKGYpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1BLQ1M3X0RFUl9UcmFpbGluZ0RhdGEoZik7CisgICAgICAgICAgICAgICAgdGVzdF9TZXJpYWxpemF0aW9uKGYpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJFcnJvciBlbmNvdW50ZXJlZCBjaGVja2luZyAiICsgcC5nZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIGlmIChlcnJCdWZmZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3JzIGVuY291bnRlcmVkOlxuXG4iICsgZXJyQnVmZmVyLnRvU3RyaW5nKCkgKyAiXG5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFB1YmxpY0tleShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBQdWJsaWNLZXkgZXhwZWN0ZWQgPSBnZXRSc2FDZXJ0aWZpY2F0ZVB1YmxpY0tleSgpOworCisgICAgICAgIFB1YmxpY0tleSBhY3R1YWwgPSBjLmdldFB1YmxpY0tleSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQuZ2V0RW5jb2RlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhhY3R1YWwuZ2V0RW5jb2RlZCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFR5cGUoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYLjUwOSIsIGMuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5KENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIFB1YmxpY0tleSBzaWduZXIgPSBnZXRSc2FDZXJ0aWZpY2F0ZVB1YmxpY0tleSgpOworCisgICAgICAgIGMudmVyaWZ5KHNpZ25lcik7CisKKyAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrcGcgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJSU0EiKTsKKyAgICAgICAgS2V5UGFpciBwYWlyID0ga3BnLmdlbmVyYXRlS2V5UGFpcigpOworICAgICAgICBQdWJsaWNLZXkgaW52YWxpZEtleSA9IHBhaXIuZ2V0UHVibGljKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMudmVyaWZ5KGludmFsaWRLZXkpOworICAgICAgICAgICAgZmFpbCgiUlNBIHNpZ25hdHVyZSBzaG91bGQgbm90IHZlcmlmeSIpOworICAgICAgICB9IGNhdGNoIChTaWduYXR1cmVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJTaWduYXR1cmUuIiArIGMuZ2V0U2lnQWxnTmFtZSgpKTsKKyAgICAgICAgZm9yIChQcm92aWRlciBwIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBjLnZlcmlmeShzaWduZXIsIHAuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjLnZlcmlmeShpbnZhbGlkS2V5LCBwLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiUlNBIHNpZ25hdHVyZSBzaG91bGQgbm90IHZlcmlmeSIpOworICAgICAgICAgICAgfSBjYXRjaCAoU2lnbmF0dXJlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tfZXF1YWxzKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMxID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYzIgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMxLCBjMik7CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMzID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9EU0EpOworICAgICAgICBhc3NlcnRGYWxzZShjMS5lcXVhbHMoYzMpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYzMuZXF1YWxzKGMxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrX3RvU3RyaW5nKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMxID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQxID0gYzEudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChvdXRwdXQxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQxLmxlbmd0aCgpID4gMCk7CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMyID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBhc3NlcnRFcXVhbHMoYzEudG9TdHJpbmcoKSwgYzIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMzID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9EU0EpOworICAgICAgICBhc3NlcnRGYWxzZShjMy50b1N0cmluZygpLmVxdWFscyhjMS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrX2hhc2hDb2RlKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMxID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYzIgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMxLmhhc2hDb2RlKCksIGMyLmhhc2hDb2RlKCkpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjMyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfRFNBKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYzMuaGFzaENvZGUoKSA9PSBjMS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tWYWxpZGl0eShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBEYXRlW10gZGF0ZXMgPSBnZXRSc2FDZXJ0aWZpY2F0ZURhdGVzKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGNlcnRpZmljYXRlIHZhbGlkaXR5IHBlcmlvZHMgaW4gdGhlIHRlc3QgY2VydGlmaWNhdGUgTVVTVCBsaWUKKyAgICAgICAgICogd2l0aGluIHRoZSB0ZXN0ZWQgcGVyaW9kLiBUaGUgQVBJIGRvZXNuJ3QgYXBwZWFyIHRvIGFsbG93IGFueSBvdGhlcgorICAgICAgICAgKiB3YXkgdG8gdGVzdCB0aGlzIGNvZGUgcGF0aCBhcyBhbiB1bnByaXZpbGVnZWQgdXNlci4KKyAgICAgICAgICovCisgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub3cuYWZ0ZXIoZGF0ZXNbMF0pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub3cuYmVmb3JlKGRhdGVzWzFdKSk7CisKKyAgICAgICAgLyogVGhpcyBhc3N1bWVzIHRoZSBzY3JpcHQgbWFrZXMgYSBsb25nLWxpdmVkIGNlcnQuICovCisgICAgICAgIGMuY2hlY2tWYWxpZGl0eSgpOworCisgICAgICAgIC8qIEEgZGF5IGFmdGVyIHRoZSBzdGFydCBkYXRlLiAqLworICAgICAgICBjYWwuc2V0VGltZShkYXRlc1swXSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX01PTlRILCAxKTsKKyAgICAgICAgYy5jaGVja1ZhbGlkaXR5KGNhbC5nZXRUaW1lKCkpOworCisgICAgICAgIC8qIEEgc2Vjb25kIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZS4gKi8KKyAgICAgICAgY2FsLnNldFRpbWUoZGF0ZXNbMV0pOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgLTEpOworICAgICAgICBjLmNoZWNrVmFsaWRpdHkoY2FsLmdldFRpbWUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbC5zZXRUaW1lKGRhdGVzWzBdKTsKKyAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCAtMSk7CisgICAgICAgICAgICBjLmNoZWNrVmFsaWRpdHkoY2FsLmdldFRpbWUoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlc1swXSk7CisgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1PTlRILCAtNik7CisgICAgICAgICAgICBjLmNoZWNrVmFsaWRpdHkoY2FsLmdldFRpbWUoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlc1sxXSk7CisgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgMSk7CisgICAgICAgICAgICBjLmNoZWNrVmFsaWRpdHkoY2FsLmdldFRpbWUoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbC5zZXRUaW1lKGRhdGVzWzFdKTsKKyAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgMSk7CisgICAgICAgICAgICBjLmNoZWNrVmFsaWRpdHkoY2FsLmdldFRpbWUoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFZlcnNpb24oQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGMuZ2V0VmVyc2lvbigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U2VyaWFsTnVtYmVyKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIEJpZ0ludGVnZXIgYWN0dWFsID0gZ2V0UnNhQ2VydGlmaWNhdGVTZXJpYWwoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLCBjLmdldFNlcmlhbE51bWJlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0SXNzdWVyRE4oQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKworICAgICAgICBQcmluY2lwYWwgcHJpbmMgPSBjLmdldElzc3VlckROKCk7CisgICAgICAgIGlmIChTdGFuZGFyZE5hbWVzLklTX1JJKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk9VPU5ldE9wcywgTz1HZW5pdXMuY29tIEluYywgTD1TYW4gTWF0ZW8sIFNUPUNhbGlmb3JuaWEsIEM9VVMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIkJDIi5lcXVhbHMoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBpcyBpdCBhY2NlcHRhYmxlIHRvIGhhdmUgdGhpcyBpbiByZXZlcnNlIG9yZGVyPworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQz1VUyxTVD1DYWxpZm9ybmlhLEw9U2FuIE1hdGVvLE89R2VuaXVzLmNvbSBJbmMsT1U9TmV0T3BzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPVT1OZXRPcHMsTz1HZW5pdXMuY29tIEluYyxMPVNhbiBNYXRlbyxTVD1DYWxpZm9ybmlhLEM9VVMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMyID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBhc3NlcnRFcXVhbHMocHJpbmMsIGMyLmdldElzc3VlckROKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGV4cGVjdGVkID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgMHgzMCwgMHg2MCwgMHgzMSwgMHgwYiwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwMywgMHg1NSwgMHgwNCwgMHgwNiwgMHgxMywKKyAgICAgICAgICAgICAgICAweDAyLCAweDU1LCAweDUzLCAweDMxLCAweDEzLCAweDMwLCAweDExLCAweDA2LCAweDAzLCAweDU1LCAweDA0LCAweDA4LAorICAgICAgICAgICAgICAgIDB4MTMsIDB4MGEsIDB4NDMsIDB4NjEsIDB4NmMsIDB4NjksIDB4NjYsIDB4NmYsIDB4NzIsIDB4NmUsIDB4NjksIDB4NjEsCisgICAgICAgICAgICAgICAgMHgzMSwgMHgxMiwgMHgzMCwgMHgxMCwgMHgwNiwgMHgwMywgMHg1NSwgMHgwNCwgMHgwNywgMHgxMywgMHgwOSwgMHg1MywKKyAgICAgICAgICAgICAgICAweDYxLCAweDZlLCAweDIwLCAweDRkLCAweDYxLCAweDc0LCAweDY1LCAweDZmLCAweDMxLCAweDE3LCAweDMwLCAweDE1LAorICAgICAgICAgICAgICAgIDB4MDYsIDB4MDMsIDB4NTUsIDB4MDQsIDB4MGEsIDB4MTMsIDB4MGUsIDB4NDcsIDB4NjUsIDB4NmUsIDB4NjksIDB4NzUsCisgICAgICAgICAgICAgICAgMHg3MywgMHgyZSwgMHg2MywgMHg2ZiwgMHg2ZCwgMHgyMCwgMHg0OSwgMHg2ZSwgMHg2MywgMHgzMSwgMHgwZiwgMHgzMCwKKyAgICAgICAgICAgICAgICAweDBkLCAweDA2LCAweDAzLCAweDU1LCAweDA0LCAweDBiLCAweDEzLCAweDA2LCAweDRlLCAweDY1LCAweDc0LCAweDRmLAorICAgICAgICAgICAgICAgIDB4NzAsIDB4NzMKKyAgICAgICAgfTsKKyAgICAgICAgWDUwMFByaW5jaXBhbCBwcmluYyA9IGMuZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwcmluYy5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPVT1OZXRPcHMsTz1HZW5pdXMuY29tIEluYyxMPVNhbiBNYXRlbyxTVD1DYWxpZm9ybmlhLEM9VVMiLAorICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdT1uZXRvcHMsbz1nZW5pdXMuY29tIGluYyxsPXNhbiBtYXRlbyxzdD1jYWxpZm9ybmlhLGM9dXMiLAorICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLkNBTk9OSUNBTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9VPU5ldE9wcywgTz1HZW5pdXMuY29tIEluYywgTD1TYW4gTWF0ZW8sIFNUPUNhbGlmb3JuaWEsIEM9VVMiLAorICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzE3NzkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPVT1OZXRPcHMsTz1HZW5pdXMuY29tIEluYyxMPVNhbiBNYXRlbyxTVD1DYWxpZm9ybmlhLEM9VVMiLAorICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZShYNTAwUHJpbmNpcGFsLlJGQzIyNTMpKTsKKworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYzIgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmluYywgYzIuZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U3ViamVjdEROKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisKKyAgICAgICAgUHJpbmNpcGFsIHByaW5jID0gYy5nZXRTdWJqZWN0RE4oKTsKKyAgICAgICAgaWYgKFN0YW5kYXJkTmFtZXMuSVNfUkkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiT1U9TmV0T3BzLCBPPUdlbml1cy5jb20gSW5jLCBMPVNhbiBNYXRlbywgU1Q9Q2FsaWZvcm5pYSwgQz1VUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgiQkMiLmVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGlzIGl0IGFjY2VwdGFibGUgdG8gaGF2ZSB0aGlzIGluIHJldmVyc2Ugb3JkZXI/CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDPVVTLFNUPUNhbGlmb3JuaWEsTD1TYW4gTWF0ZW8sTz1HZW5pdXMuY29tIEluYyxPVT1OZXRPcHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk9VPU5ldE9wcyxPPUdlbml1cy5jb20gSW5jLEw9U2FuIE1hdGVvLFNUPUNhbGlmb3JuaWEsQz1VUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYzIgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmluYywgYzIuZ2V0U3ViamVjdEROKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0VW5pcXVlSUQoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvKiBUaGlzIGNlcnRpZmljYXRlIGhhcyBubyB1bmlxdWUgSUQuICovCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICBhc3NlcnROdWxsKGMuZ2V0U3ViamVjdFVuaXF1ZUlEKCkpOworCisgICAgICAgIC8vIFRPRE86IGdlbmVyYXRlIGNlcnRpZmljYXRlIHRoYXQgaGFzIGEgU3ViamVjdFVuaXF1ZUlEIGZpZWxkLgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRJc3N1ZXJVbmlxdWVJRChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8qIFRoaXMgY2VydGlmaWNhdGUgaGFzIG5vIHVuaXF1ZSBJRC4gKi8KKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIGFzc2VydE51bGwoYy5nZXRJc3N1ZXJVbmlxdWVJRCgpKTsKKworICAgICAgICAvLyBUT0RPOiBnZW5lcmF0ZSBjZXJ0aWZpY2F0ZSB0aGF0IGhhcyBhIElzc3VlclVuaXF1ZUlEIGZpZWxkLgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0WDUwMFByaW5jaXBhbChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworCisgICAgICAgIGZpbmFsIGJ5dGVbXSBleHBlY3RlZCA9IG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIDB4MzAsIDB4NjAsIDB4MzEsIDB4MGIsIDB4MzAsIDB4MDksIDB4MDYsIDB4MDMsIDB4NTUsIDB4MDQsIDB4MDYsIDB4MTMsCisgICAgICAgICAgICAgICAgMHgwMiwgMHg1NSwgMHg1MywgMHgzMSwgMHgxMywgMHgzMCwgMHgxMSwgMHgwNiwgMHgwMywgMHg1NSwgMHgwNCwgMHgwOCwKKyAgICAgICAgICAgICAgICAweDEzLCAweDBhLCAweDQzLCAweDYxLCAweDZjLCAweDY5LCAweDY2LCAweDZmLCAweDcyLCAweDZlLCAweDY5LCAweDYxLAorICAgICAgICAgICAgICAgIDB4MzEsIDB4MTIsIDB4MzAsIDB4MTAsIDB4MDYsIDB4MDMsIDB4NTUsIDB4MDQsIDB4MDcsIDB4MTMsIDB4MDksIDB4NTMsCisgICAgICAgICAgICAgICAgMHg2MSwgMHg2ZSwgMHgyMCwgMHg0ZCwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2ZiwgMHgzMSwgMHgxNywgMHgzMCwgMHgxNSwKKyAgICAgICAgICAgICAgICAweDA2LCAweDAzLCAweDU1LCAweDA0LCAweDBhLCAweDEzLCAweDBlLCAweDQ3LCAweDY1LCAweDZlLCAweDY5LCAweDc1LAorICAgICAgICAgICAgICAgIDB4NzMsIDB4MmUsIDB4NjMsIDB4NmYsIDB4NmQsIDB4MjAsIDB4NDksIDB4NmUsIDB4NjMsIDB4MzEsIDB4MGYsIDB4MzAsCisgICAgICAgICAgICAgICAgMHgwZCwgMHgwNiwgMHgwMywgMHg1NSwgMHgwNCwgMHgwYiwgMHgxMywgMHgwNiwgMHg0ZSwgMHg2NSwgMHg3NCwgMHg0ZiwKKyAgICAgICAgICAgICAgICAweDcwLCAweDczCisgICAgICAgIH07CisgICAgICAgIFg1MDBQcmluY2lwYWwgcHJpbmMgPSBjLmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHByaW5jLmdldEVuY29kZWQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9VPU5ldE9wcyxPPUdlbml1cy5jb20gSW5jLEw9U2FuIE1hdGVvLFNUPUNhbGlmb3JuaWEsQz1VUyIsCisgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm91PW5ldG9wcyxvPWdlbml1cy5jb20gaW5jLGw9c2FuIG1hdGVvLHN0PWNhbGlmb3JuaWEsYz11cyIsCisgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKFg1MDBQcmluY2lwYWwuQ0FOT05JQ0FMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT1U9TmV0T3BzLCBPPUdlbml1cy5jb20gSW5jLCBMPVNhbiBNYXRlbywgU1Q9Q2FsaWZvcm5pYSwgQz1VUyIsCisgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKFg1MDBQcmluY2lwYWwuUkZDMTc3OSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9VPU5ldE9wcyxPPUdlbml1cy5jb20gSW5jLEw9U2FuIE1hdGVvLFNUPUNhbGlmb3JuaWEsQz1VUyIsCisgICAgICAgICAgICAgICAgICAgICBwcmluYy5nZXROYW1lKFg1MDBQcmluY2lwYWwuUkZDMjI1MykpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjMiA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByaW5jLCBjMi5nZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERhdGVFcXVhbHMoRGF0ZSBkYXRlMSwgRGF0ZSBkYXRlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkIE1NTSB5eXl5IEhIOm1tOnNzIik7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdDEgPSBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUxKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdDIgPSBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0MSwgcmVzdWx0Mik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldE5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZXMoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgRGF0ZVtdIGRhdGVzID0gZ2V0UnNhQ2VydGlmaWNhdGVEYXRlcygpOworCisgICAgICAgIGFzc2VydERhdGVFcXVhbHMoZGF0ZXNbMF0sIGMuZ2V0Tm90QmVmb3JlKCkpOworICAgICAgICBhc3NlcnREYXRlRXF1YWxzKGRhdGVzWzFdLCBjLmdldE5vdEFmdGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTaWdBbGdOYW1lKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHRlc3QgY2VydGlmaWNhdGUgaXMgc2hhMVdpdGhSU0FFbmNyeXB0aW9uICovCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU0hBMVdJVEhSU0EiLCBjLmdldFNpZ0FsZ05hbWUoKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSB0ZXN0IGNlcnRpZmljYXRlIGlzIHNoYTFXaXRoUlNBRW5jcnlwdGlvbiAqLworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0RTQSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNIQTFXSVRIRFNBIiwgYy5nZXRTaWdBbGdOYW1lKCkudG9VcHBlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgdGVzdCBjZXJ0aWZpY2F0ZSBpcyBzaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9FQyk7CisgICAgICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiU0hBMVdJVEhFQ0RTQSIsIGMuZ2V0U2lnQWxnTmFtZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVDRFNBIiwgYy5nZXRTaWdBbGdOYW1lKCkudG9VcHBlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U2lnQWxnT0lEKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHRlc3QgY2VydGlmaWNhdGUgaXMgc2hhMVdpdGhSU0FFbmNyeXB0aW9uICovCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMS4yLjg0MC4xMTM1NDkuMS4xLjUiLCBjLmdldFNpZ0FsZ09JRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSB0ZXN0IGNlcnRpZmljYXRlIGlzIHNoYTFXaXRoUlNBRW5jcnlwdGlvbiAqLworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0RTQSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMi44NDAuMTAwNDAuNC4zIiwgYy5nZXRTaWdBbGdPSUQoKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgdGVzdCBjZXJ0aWZpY2F0ZSBpcyBzaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9FQyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMi44NDAuMTAwNDUuNC4xIiwgYy5nZXRTaWdBbGdPSUQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U2lnQWxnUGFyYW1zKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgICAgICAvLyBIYXJtb255IGFuZCBCQyBhcmUgYnJva2VuPworICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyID0gZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICgiRFJMQ2VydEZhY3RvcnkiLmVxdWFscyhwcm92aWRlcikgfHwgIkJDIi5lcXVhbHMocHJvdmlkZXIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjLmdldFNpZ0FsZ1BhcmFtcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCBjLmdldFNpZ0FsZ1BhcmFtcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9EU0EpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCBjLmdldFNpZ0FsZ1BhcmFtcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9FQyk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIGMuZ2V0U2lnQWxnUGFyYW1zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldEtleVVzYWdlKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHRlc3QgY2VydGlmaWNhdGUgaXMgc2hhMVdpdGhSU0FFbmNyeXB0aW9uICovCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgICAgIGJvb2xlYW5bXSBleHBlY3RlZCA9IG5ldyBib29sZWFuW10geworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogZGlnaXRhbFNpZ25hdHVyZSAoMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIG5vblJlcHVkaWF0aW9uICAgKDEpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBrZXlFbmNpcGhlcm1lbnQgICgyKSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogZGF0YUVuY2lwaGVybWVudCAoMykgKi8KKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGtleUFncmVlbWVudCAgICAgKDQpICovCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBrZXlDZXJ0U2lnbiAgICAgICg1KSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogY1JMU2lnbiAgICAgICAgICAoNikgKi8KKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGVuY2lwaGVyT25seSAgICAgKDcpICovCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBkZWNpcGhlck9ubHkgICAgICg4KSAqLworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpLCBBcnJheXMudG9TdHJpbmcoYy5nZXRLZXlVc2FnZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgdGVzdCBjZXJ0aWZpY2F0ZSBpcyBzaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9EU0EpOworICAgICAgICAgICAgYm9vbGVhbltdIGV4cGVjdGVkID0gbmV3IGJvb2xlYW5bXSB7CisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBkaWdpdGFsU2lnbmF0dXJlICgwKSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogbm9uUmVwdWRpYXRpb24gICAoMSkgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGtleUVuY2lwaGVybWVudCAgKDIpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBkYXRhRW5jaXBoZXJtZW50ICgzKSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyoga2V5QWdyZWVtZW50ICAgICAoNCkgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGtleUNlcnRTaWduICAgICAgKDUpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjUkxTaWduICAgICAgICAgICg2KSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogZW5jaXBoZXJPbmx5ICAgICAoNykgKi8KKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGRlY2lwaGVyT25seSAgICAgKDgpICovCisgICAgICAgICAgICB9OworICAgICAgICAgICAgYm9vbGVhbltdIGFjdHVhbCA9IGMuZ2V0S2V5VXNhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5LCBhY3R1YWwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpLCBBcnJheXMudG9TdHJpbmcoYWN0dWFsKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgdGVzdCBjZXJ0aWZpY2F0ZSBpcyBzaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9FQyk7CisgICAgICAgICAgICBib29sZWFuW10gZXhwZWN0ZWQgPSBuZXcgYm9vbGVhbltdIHsKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGRpZ2l0YWxTaWduYXR1cmUgKDApICovCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBub25SZXB1ZGlhdGlvbiAgICgxKSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyoga2V5RW5jaXBoZXJtZW50ICAoMikgKi8KKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGRhdGFFbmNpcGhlcm1lbnQgKDMpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBrZXlBZ3JlZW1lbnQgICAgICg0KSAqLworICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyoga2V5Q2VydFNpZ24gICAgICAoNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGNSTFNpZ24gICAgICAgICAgKDYpICovCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNpcGhlck9ubHkgICAgICg3KSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogZGVjaXBoZXJPbmx5ICAgICAoOCkgKi8KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBib29sZWFuW10gYWN0dWFsID0gYy5nZXRLZXlVc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGFjdHVhbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhleHBlY3RlZCksIEFycmF5cy50b1N0cmluZyhhY3R1YWwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFsbCB0aGUgYml0cyBhcmUgc2V0IGluIGFkZGl0aW9uIHRvIHNvbWUgZXh0cmEgb25lcy4gKi8KKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9LRVlVU0FHRV9FWFRSQUxPTkcpOworICAgICAgICAgICAgYm9vbGVhbltdIGV4cGVjdGVkID0gbmV3IGJvb2xlYW5bXSB7CisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBkaWdpdGFsU2lnbmF0dXJlICgwKSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogbm9uUmVwdWRpYXRpb24gICAoMSkgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGtleUVuY2lwaGVybWVudCAgKDIpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBkYXRhRW5jaXBoZXJtZW50ICgzKSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyoga2V5QWdyZWVtZW50ICAgICAoNCkgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGtleUNlcnRTaWduICAgICAgKDUpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjUkxTaWduICAgICAgICAgICg2KSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogZW5jaXBoZXJPbmx5ICAgICAoNykgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGRlY2lwaGVyT25seSAgICAgKDgpICovCisgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiA/Pz8/PyAgICAgICAgICAgICg5KSAqLworICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogPz8/Pz8gICAgICAgICAgICgxMCkgKi8KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBib29sZWFuW10gYWN0dWFsID0gYy5nZXRLZXlVc2FnZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCBhY3R1YWwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpLCBBcnJheXMudG9TdHJpbmcoYWN0dWFsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0RXh0ZW5kZWRLZXlVc2FnZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vIEV4dGVuZGVkS2V5VXNhZ2Ugc2VjdGlvbiAqLworICAgICAgICAgICAgZmluYWwgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gYWN0dWFsID0gYy5nZXRFeHRlbmRlZEtleVVzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGFjdHVhbCk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvKiBFeHRlbmRlZEtleVVzYWdlIHNlY3Rpb24gd2l0aCBvbmUgZW50cnkgb2YgT0lEIDEuMi4zLjQgKi8KKyAgICAgICAgICAgIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9FWFRFTkRFREtFWVVTQUdFKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhY3R1YWwgPSBjLmdldEV4dGVuZGVkS2V5VXNhZ2UoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhY3R1YWwuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMS4yLjMuNCIsIGFjdHVhbC5nZXQoMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldEJhc2ljQ29uc3RyYWludHMoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvKiBOb24tQ0EgY2VydCB3aXRoIG5vIHBhdGhMZW5Db25zdHJhaW50ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIC0xLCBjLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb24tQ0EgY2VydCB3aXRoIHBhdGhMZW5Db25zdHJhaW50ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9VU0VSV0lUSFBBVEhMRU4pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIC0xLCBjLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDQSBjZXJ0IHdpdGggbm8gcGF0aExlbkNvbnN0cmFpbnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0NBKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCBJbnRlZ2VyLk1BWF9WQUxVRSwgYy5nZXRCYXNpY0NvbnN0cmFpbnRzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ0EgY2VydCB3aXRoIHBhdGhMZW5Db25zdHJhaW50PTEwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9DQVdJVEhQQVRITEVOKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpLCAxMCwgYy5nZXRCYXNpY0NvbnN0cmFpbnRzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEVuY29kaW5nIG9mOiAgT0lEOjEuMi4zLjQsIFVURjg6dGVzdDEgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0T0lEVGVzdEJ5dGVzKCkgeworICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlW10geyAweDMwLCAweDEwLCAweDA2LCAweDAzLCAweDJhLCAweDAzLCAweDA0LCAoYnl0ZSkgMHhhMCwKKyAgICAgICAgICAgICAgICAgICAgMHgwOSwgKGJ5dGUpIDB4YTAsIDB4MDcsIDB4MGMsIDB4MDUsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MzEgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4YTAsIDB4MGUsIDB4MDYsIDB4MDMsIDB4MmEsIDB4MDMsIDB4MDQsCisgICAgICAgICAgICAgICAgICAgIChieXRlKSAweGEwLCAweDA3LCAweDBjLCAweDA1LCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDMxIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgQ29sbGVjdGlvbjxMaXN0PD8+PiBjb2wgPSBjLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCk7CisKKyAgICAgICAgY2hlY2tBbHRlcm5hdGl2ZU5hbWVzKGNvbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWx0ZXJuYXRpdmVOYW1lcyhDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbCk7CisKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIENvbGxlY3Rpb24gaXMgdW5tb2RpZmlhYmxlLiAqLworICAgICAgICB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbC5hZGQobmV3IEFycmF5TGlzdDxPYmplY3Q+KCkpOworICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCBiZSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZXJlIHNob3VsZCBiZSA5IHR5cGVzIG9mIGFsdGVybmF0aXZlIG5hbWVzIGluIHRoaXMgdGVzdAorICAgICAgICAgKiBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW5bXSB0eXBlc0ZvdW5kID0gbmV3IGJvb2xlYW5bOV07CisKKyAgICAgICAgZm9yIChMaXN0PD8+IGl0ZW0gOiBjb2wpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBMaXN0IGlzIHVubW9kaWZpYWJsZS4gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGJlIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXRlbS5nZXQoMCkgaW5zdGFuY2VvZiBJbnRlZ2VyKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gKEludGVnZXIpIGl0ZW0uZ2V0KDApOworICAgICAgICAgICAgdHlwZXNGb3VuZFt0eXBlXSA9IHRydWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBPdGhlck5hbWUgKi8KKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGVyID0gZ2V0T0lEVGVzdEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhkZXIpLCBBcnJheXMudG9TdHJpbmcoKGJ5dGVbXSkgaXRlbS5nZXQoMSkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogcmZjODIyTmFtZTogSUE1U3RyaW5nICovCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4NTA5QGV4YW1wbGUuY29tIiwgKFN0cmluZykgaXRlbS5nZXQoMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBkTlNOYW1lOiBJQTVTdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIng1MDkuZXhhbXBsZS5jb20iLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8qIHg0MDBBZGRyZXNzOiBPUkFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVOU1VQUE9SVEVEIiwgKFN0cmluZykgaXRlbS5nZXQoMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBkaXJlY3RvcnlOYW1lOiBOYW1lICovCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDTj3iiIbGkixPVT3DnGJlciBGcsOuZW5kcyxPPUF3ZXNvbWUgRHVkZXMsQz1VUyIsIChTdHJpbmcpIGl0ZW0uZ2V0KDEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogLyogZWRpUGFydHlOYW1lICovCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVTlNVUFBPUlRFRCIsIEFycmF5cy50b1N0cmluZygoYnl0ZVtdKSBpdGVtLmdldCgxKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OiAvKiB1bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyOiBJQTVTdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP3E9YXdlc29tZW5lc3MiLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8qIGlQQWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiMTkyLjE2OC4wLjEiLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjIuMy40IiwgKFN0cmluZykgaXRlbS5nZXQoMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2V0PEludGVnZXI+IG1pc3NpbmcgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzRm91bmQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghdHlwZXNGb3VuZFtpXSkgeworICAgICAgICAgICAgICAgIG1pc3NpbmcuYWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZml4IFguNDAwIG5hbWVzIGFuZCBlZGlQYXJ0eU5hbWUKKyAgICAgICAgbWlzc2luZy5yZW1vdmUoMyk7CisgICAgICAgIG1pc3NpbmcucmVtb3ZlKDUpOworCisgICAgICAgIGlmICghbWlzc2luZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgdHlwZXM6ICIgKyBBcnJheXMudG9TdHJpbmcobWlzc2luZy50b0FycmF5KG5ldyBJbnRlZ2VyW21pc3Npbmcuc2l6ZSgpXSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19JUFY2KENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0lQVjYpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCA9IGMuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIGNvbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbC5zaXplKCkpOworICAgICAgICBMaXN0PD8+IGl0ZW0gPSBjb2wuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmdldCgwKSBpbnN0YW5jZW9mIEludGVnZXIpOworICAgICAgICBhc3NlcnRUcnVlKDcgPT0gKEludGVnZXIpIGl0ZW0uZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDEpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgLy8gUkkgZG9lc24ndCBhcHBseSBhbGwgdGhlIElQdjYgc2hvcnRlbmluZyBydWxlcworICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAxOmRiODowOjA6MDpmZjAwOjQyOjgzMjkiLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDE6ZGI4OjpmZjAwOjQyOjgzMjkiLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXNfSW52YWxpZElQKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0lOVkFMSURJUCk7CisgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gYy5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOworICAgICAgICBhc3NlcnROdWxsKGNvbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzX090aGVyKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0FMVF9PVEhFUik7CisgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gYy5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSwgY29sKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29sLnNpemUoKSk7CisgICAgICAgIExpc3Q8Pz4gaXRlbSA9IGNvbC5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDApIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgICAgIGFzc2VydFRydWUoMCA9PSAoSW50ZWdlcikgaXRlbS5nZXQoMCkpOworCisgICAgICAgIC8qIE9JRDoxLjIuMy40LCBVVEY4OnRlc3QxICovCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkZXIgPSBnZXRPSURUZXN0Qnl0ZXMoKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGFjdHVhbCA9IChieXRlW10pIGl0ZW0uZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGRlciksIEFycmF5cy50b1N0cmluZyhhY3R1YWwpKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGJ5dGVbXSBhcnJheSBpc24ndCBtb2RpZmllZCBieSBvdXIgdGVzdC4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgYWN0dWFsWzBdIF49IChieXRlKSAweEZGOworICAgICAgICAgICAgYnl0ZVtdIGFjdHVhbDIgPSAoYnl0ZVtdKSBjLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0KDEpOworCisgICAgICAgICAgICBpZiAoIVN0YW5kYXJkTmFtZXMuSVNfUkkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGRlciksIEFycmF5cy50b1N0cmluZyhhY3R1YWwyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFJJIGlzIGJyb2tlbiBoZXJlLiAqLworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYWN0dWFsKSwgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19FbWFpbChDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9BTFRfRU1BSUwpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCA9IGMuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIGNvbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbC5zaXplKCkpOworICAgICAgICBMaXN0PD8+IGl0ZW0gPSBjb2wuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmdldCgwKSBpbnN0YW5jZW9mIEludGVnZXIpOworICAgICAgICBhc3NlcnRUcnVlKDEgPT0gKEludGVnZXIpIGl0ZW0uZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDEpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4NTA5QGV4YW1wbGUuY29tIiwgKFN0cmluZykgaXRlbS5nZXQoMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19ETlMoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfQUxUX0ROUyk7CisgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gYy5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSwgY29sKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29sLnNpemUoKSk7CisgICAgICAgIExpc3Q8Pz4gaXRlbSA9IGNvbC5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDApIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgICAgIGFzc2VydFRydWUoMiA9PSAoSW50ZWdlcikgaXRlbS5nZXQoMCkpOworCisgICAgICAgIGFzc2VydFRydWUoaXRlbS5nZXQoMSkgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIng1MDkuZXhhbXBsZS5jb20iLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzX0Rpck5hbWUoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfQUxUX0RJUk5BTUUpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCA9IGMuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIGNvbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbC5zaXplKCkpOworICAgICAgICBMaXN0PD8+IGl0ZW0gPSBjb2wuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmdldCgwKSBpbnN0YW5jZW9mIEludGVnZXIpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy52YWx1ZU9mKChJbnRlZ2VyKSBpdGVtLmdldCgwKSksIDQgPT0gKEludGVnZXIpIGl0ZW0uZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDEpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDTj3iiIbGkixPVT3DnGJlciBGcsOuZW5kcyxPPUF3ZXNvbWUgRHVkZXMsQz1VUyIsIChTdHJpbmcpIGl0ZW0uZ2V0KDEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXNfVVJJKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX0FMVF9VUkkpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCA9IGMuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGYuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCksIGNvbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbC5zaXplKCkpOworICAgICAgICBMaXN0PD8+IGl0ZW0gPSBjb2wuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmdldCgwKSBpbnN0YW5jZW9mIEludGVnZXIpOworICAgICAgICBhc3NlcnRUcnVlKDYgPT0gKEludGVnZXIpIGl0ZW0uZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDEpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLz9xPWF3ZXNvbWVuZXNzIiwgKFN0cmluZykgaXRlbS5nZXQoMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc19SSUQoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfQUxUX1JJRCk7CisgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gYy5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSwgY29sKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29sLnNpemUoKSk7CisgICAgICAgIExpc3Q8Pz4gaXRlbSA9IGNvbC5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uZ2V0KDApIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgICAgIGFzc2VydFRydWUoOCA9PSAoSW50ZWdlcikgaXRlbS5nZXQoMCkpOworCisgICAgICAgIGFzc2VydFRydWUoaXRlbS5nZXQoMSkgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMi4zLjQiLCAoU3RyaW5nKSBpdGVtLmdldCgxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzX05vbmUoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfQUxUX05PTkUpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbCA9IGMuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb2wpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGMgPSBnZXRDZXJ0aWZpY2F0ZShmLCBDRVJUX1JTQSk7CisgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gY29sID0gYy5nZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKCk7CisKKyAgICAgICAgY2hlY2tBbHRlcm5hdGl2ZU5hbWVzKGNvbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldFNpZ25hdHVyZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZ2V0UnNhQ2VydGlmaWNhdGVTaWduYXR1cmUoKSksCisgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoYy5nZXRTaWduYXR1cmUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRUQlNDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjID0gZ2V0Q2VydGlmaWNhdGUoZiwgQ0VSVF9SU0EpOworCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoZ2V0UnNhQ2VydGlmaWNhdGVUYnMoKSksCisgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoYy5nZXRUQlNDZXJ0aWZpY2F0ZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYy5oYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSB1bnN1cHBvcnRlZCA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfVU5TVVBQT1JURUQpOworICAgICAgICBhc3NlcnRUcnVlKHVuc3VwcG9ydGVkLmhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldEVuY29kZWQoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYyA9IGdldENlcnRpZmljYXRlKGYsIENFUlRfUlNBKTsKKworICAgICAgICBieXRlW10gY0J5dGVzID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRfUlNBKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGNCeXRlcyksIEFycmF5cy50b1N0cmluZyhjLmdldEVuY29kZWQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNlcnRpZmljYXRlX1BFTV9UcmFpbGluZ0RhdGEoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gY2VydHNCeXRlcyA9IGdldFJlc291cmNlQXNCeXRlcyhDRVJUU19YNTA5X1BFTSk7CisgICAgICAgIGJ5dGVbXSBjZXJ0c1R3aWNlID0gbmV3IGJ5dGVbY2VydHNCeXRlcy5sZW5ndGggKiAyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjZXJ0c0J5dGVzLCAwLCBjZXJ0c1R3aWNlLCAwLCBjZXJ0c0J5dGVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2VydHNCeXRlcywgMCwgY2VydHNUd2ljZSwgY2VydHNCeXRlcy5sZW5ndGgsIGNlcnRzQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0c1R3aWNlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydHNCeXRlcy5sZW5ndGggKiAyLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkgZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGJhaXMpOworICAgICAgICAvLyBUT0RPOiBJZiB3ZSBoYWQgYSBzaW5nbGUgUEVNIGNlcnRpZmljYXRlLCB3ZSBjb3VsZCBrbm93IGV4YWN0IGJ5dGVzLgorICAgICAgICBhc3NlcnRUcnVlKGNlcnRzQnl0ZXMubGVuZ3RoIDwgYmFpcy5hdmFpbGFibGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2VydGlmaWNhdGVfREVSX1RyYWlsaW5nRGF0YShDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBjZXJ0MUJ5dGVzID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRfUlNBKTsKKyAgICAgICAgYnl0ZVtdIGNlcnQxV2l0aFRyYWlsaW5nID0gbmV3IGJ5dGVbY2VydDFCeXRlcy5sZW5ndGggKiAyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjZXJ0MUJ5dGVzLCAwLCBjZXJ0MVdpdGhUcmFpbGluZywgMCwgY2VydDFCeXRlcy5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNlcnQxQnl0ZXMsIDAsIGNlcnQxV2l0aFRyYWlsaW5nLCBjZXJ0MUJ5dGVzLmxlbmd0aCwgY2VydDFCeXRlcy5sZW5ndGgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnQxV2l0aFRyYWlsaW5nKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydDFCeXRlcy5sZW5ndGggKiAyLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkgZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGJhaXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydDFCeXRlcy5sZW5ndGgsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNlcnRpZmljYXRlc19YNTA5X0RFUihDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8qIERFUi1lbmNvZGVkIGxpc3Qgb2YgY2VydGlmaWNhdGVzICovCisgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMgPSBnZXRDZXJ0aWZpY2F0ZXMoZiwgQ0VSVFNfWDUwOV9ERVIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNlcnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNlcnRzLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1g1MDlfUEVNKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLyogUEVNLWVuY29kZWQgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgKi8KKyAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlPiBjZXJ0cyA9IGdldENlcnRpZmljYXRlcyhmLCBDRVJUU19YNTA5X1BFTSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2VydHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2VydHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDZXJ0aWZpY2F0ZXNfUEtDUzdfUEVNKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLyogUEVNLWVuY29kZWQgUEtDUzcgYmFnIG9mIGNlcnRpZmljYXRlcyAqLworICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYNTA5Q2VydGlmaWNhdGU+IGNlcnRzID0gZ2V0Q2VydGlmaWNhdGVzKGYsIENFUlRTX1BLQ1M3X1BFTSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2VydHMpOworICAgICAgICBpZiAoIkJDIi5lcXVhbHMoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIC8vIEJvdW5jeWNhc3RsZSBpcyBicm9rZW4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjZXJ0cy5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNlcnRzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDZXJ0aWZpY2F0ZXNfUEtDUzdfREVSKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLyogREVSLWVuY29kZWQgUEtDUzcgYmFnIG9mIGNlcnRpZmljYXRlcyAqLworICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYNTA5Q2VydGlmaWNhdGU+IGNlcnRzID0gZ2V0Q2VydGlmaWNhdGVzKGYsIENFUlRTX1BLQ1M3X0RFUik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2VydHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2VydHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDZXJ0aWZpY2F0ZXNfRW1wdHkoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2VydGlmaWNhdGU+IGNlcnRzID0gZi5nZW5lcmF0ZUNlcnRpZmljYXRlcyhpcyk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjZXJ0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjZXJ0cy5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNlcnRpZmljYXRlc19YNTA5X1BFTV9UcmFpbGluZ0RhdGEoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gY2VydEJ5dGVzID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRTX1g1MDlfUEVNKTsKKyAgICAgICAgYnl0ZVtdIGNlcnRzUGx1c0V4dHJhID0gbmV3IGJ5dGVbY2VydEJ5dGVzLmxlbmd0aCArIDQwOTZdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNlcnRCeXRlcywgMCwgY2VydHNQbHVzRXh0cmEsIDAsIGNlcnRCeXRlcy5sZW5ndGgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnRzUGx1c0V4dHJhKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydHNQbHVzRXh0cmEubGVuZ3RoLCBiYWlzLmF2YWlsYWJsZSgpKTsKKworICAgICAgICAvLyBSSSBpcyBicm9rZW4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMgPSAoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlPikKKyAgICAgICAgICAgICAgICAgICAgZi5nZW5lcmF0ZUNlcnRpZmljYXRlcyhiYWlzKTsKKyAgICAgICAgICAgIGlmIChTdGFuZGFyZE5hbWVzLklTX1JJKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiUkkgZmFpbHMgb24gdGhpcyB0ZXN0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKFN0YW5kYXJkTmFtZXMuSVNfUkkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQm91bmN5Y2FzdGxlIGlzIGJyb2tlbgorICAgICAgICBpZiAoIkJDIi5lcXVhbHMoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDk2LCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNlcnRpZmljYXRlc19YNTA5X0RFUl9UcmFpbGluZ0RhdGEoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gY2VydEJ5dGVzID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRTX1g1MDlfREVSKTsKKyAgICAgICAgYnl0ZVtdIGNlcnRzUGx1c0V4dHJhID0gbmV3IGJ5dGVbY2VydEJ5dGVzLmxlbmd0aCArIDQwOTZdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNlcnRCeXRlcywgMCwgY2VydHNQbHVzRXh0cmEsIDAsIGNlcnRCeXRlcy5sZW5ndGgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnRzUGx1c0V4dHJhKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY2VydHNQbHVzRXh0cmEubGVuZ3RoLCBiYWlzLmF2YWlsYWJsZSgpKTsKKworICAgICAgICAvLyBSSSBpcyBicm9rZW4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMgPSAoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlPikKKyAgICAgICAgICAgICAgICAgICAgZi5nZW5lcmF0ZUNlcnRpZmljYXRlcyhiYWlzKTsKKyAgICAgICAgICAgIGlmIChTdGFuZGFyZE5hbWVzLklTX1JJKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiUkkgZmFpbHMgb24gdGhpcyB0ZXN0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKFN0YW5kYXJkTmFtZXMuSVNfUkkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQm91bmN5Y2FzdGxlIGlzIGJyb2tlbgorICAgICAgICBpZiAoIkJDIi5lcXVhbHMoZi5nZXRQcm92aWRlcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDk2LCBiYWlzLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNlcnRpZmljYXRlc19QS0NTN19QRU1fVHJhaWxpbmdEYXRhKENlcnRpZmljYXRlRmFjdG9yeSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGNlcnRCeXRlcyA9IGdldFJlc291cmNlQXNCeXRlcyhDRVJUU19QS0NTN19QRU0pOworICAgICAgICBieXRlW10gY2VydHNQbHVzRXh0cmEgPSBuZXcgYnl0ZVtjZXJ0Qnl0ZXMubGVuZ3RoICsgNDA5Nl07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2VydEJ5dGVzLCAwLCBjZXJ0c1BsdXNFeHRyYSwgMCwgY2VydEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY2VydHNQbHVzRXh0cmEpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0c1BsdXNFeHRyYS5sZW5ndGgsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYNTA5Q2VydGlmaWNhdGU+IGNlcnRzID0gKENvbGxlY3Rpb248PyBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZT4pCisgICAgICAgICAgICAgICAgZi5nZW5lcmF0ZUNlcnRpZmljYXRlcyhiYWlzKTsKKworICAgICAgICAvLyBCb3VuY3ljYXN0bGUgaXMgYnJva2VuCisgICAgICAgIGlmICgiQkMiLmVxdWFscyhmLmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwOTYsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2VydGlmaWNhdGVzX1BLQ1M3X0RFUl9UcmFpbGluZ0RhdGEoQ2VydGlmaWNhdGVGYWN0b3J5IGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gY2VydEJ5dGVzID0gZ2V0UmVzb3VyY2VBc0J5dGVzKENFUlRTX1BLQ1M3X0RFUik7CisgICAgICAgIGJ5dGVbXSBjZXJ0c1BsdXNFeHRyYSA9IG5ldyBieXRlW2NlcnRCeXRlcy5sZW5ndGggKyA0MDk2XTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjZXJ0Qnl0ZXMsIDAsIGNlcnRzUGx1c0V4dHJhLCAwLCBjZXJ0Qnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0c1BsdXNFeHRyYSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNlcnRzUGx1c0V4dHJhLmxlbmd0aCwgYmFpcy5hdmFpbGFibGUoKSk7CisgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFg1MDlDZXJ0aWZpY2F0ZT4gY2VydHMgPSAoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWDUwOUNlcnRpZmljYXRlPikKKyAgICAgICAgICAgICAgICBmLmdlbmVyYXRlQ2VydGlmaWNhdGVzKGJhaXMpOworCisgICAgICAgIC8vIFJJIGlzIGJyb2tlbgorICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwOTYsIGJhaXMuYXZhaWxhYmxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RfU2VyaWFsaXphdGlvbihDZXJ0aWZpY2F0ZUZhY3RvcnkgZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGNlcnROYW1lIDogVkFSSU9VU19DRVJUUykgeworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGV4cGVjdGVkID0gZ2V0Q2VydGlmaWNhdGUoZiwgY2VydE5hbWUpOworCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoZXhwZWN0ZWQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnl0ZVtdIGNlcnRCeXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0Qnl0ZXMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisKKyAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYWN0dWFsID0gKFg1MDlDZXJ0aWZpY2F0ZSkgb2lzLnJlYWRPYmplY3QoKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0TmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGJhaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgbVg1MDlQcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIkNlcnRpZmljYXRlRmFjdG9yeS5YNTA5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9jZXJ0L2NlcnRzLmRlciBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9jZXJ0cy5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvY2VydC9jZXJ0cy5kZXIKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9CcmVha0l0ZXJhdG9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggNDVkMzFiNS4uNDc3MDFjOCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L0JyZWFrSXRlcmF0b3JUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgbGliY29yZS5qYXZhLnRleHQ7CiAKIGltcG9ydCBqYXZhLnRleHQuQnJlYWtJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIHB1YmxpYyBjbGFzcyBCcmVha0l0ZXJhdG9yVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CkBAIC01MCw2ICs1MSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgQnJlYWtJdGVyYXRvciIsIGl0MiAhPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpKTsKICAgICB9CiAKKyAgICAvLyBodHRwOi8vYi83MzA3MTU0IC0gd2UgdXNlZCB0byBwaW4gYW4gdW5ib3VuZGVkIG51bWJlciBvZiBjaGFyW11zLCByZWx5aW5nIG9uIGZpbmFsaXphdGlvbi4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBjcyA9IHsgJ2EnIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgKytpKSB7CisgICAgICAgICAgICBCcmVha0l0ZXJhdG9yIGl0ID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoTG9jYWxlLlVTKTsKKyAgICAgICAgICAgIGl0LnNldFRleHQobmV3IFN0cmluZyhjcykpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFdvcmRCb3VuZGFyaWVzKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKQEAgLTE2Myw0ICsxNzMsMzEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9NDExNDMKKyAgICAvLyBUaGlzIGNvZGUgaXMgaW5oZXJlbnRseSB1bnNhZmUgYW5kIGNyYXp5OworICAgIC8vIHdlJ3JlIGp1c3QgdHJ5aW5nIHRvIHByb3Zva2UgbmF0aXZlIGNyYXNoZXMhCisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRCcmVha0l0ZXJhdG9yQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJyZWFrSXRlcmF0b3IgaXQgPSBCcmVha0l0ZXJhdG9yLmdldENoYXJhY3Rlckluc3RhbmNlKCk7CisKKyAgICAgICAgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2V0VGV4dCgic29tZSBleGFtcGxlIHRleHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gaXQuZmlyc3QoKTsgaW5kZXggIT0gQnJlYWtJdGVyYXRvci5ET05FOyBpbmRleCA9IGl0Lm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aHJlYWRzLmFkZCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoVGhyZWFkIHQgOiB0aHJlYWRzKSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpIHsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzVGVzdC5qYXZhCmluZGV4IDMxOWE3NmUuLmUxM2U0ZGYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9sc1Rlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHNUZXN0LmphdmEKQEAgLTY3LDkgKzY3LDEwIEBACiAgICAgICAgIGFzc2VydEVxdWFscygic3R5Y3puaWEiLCBmb3JtYXREYXRlKHBsLCAiTU1NTSIsIG9yaWdpbmFsRGZzKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygic3R5Y3plXHUwMTQ0IiwgZm9ybWF0RGF0ZShwbCwgIkxMTEwiLCBvcmlnaW5hbERmcykpOwogCi0gICAgICAgIC8vIFdoZXJlYXMgdGhlIGRlc2VyaWFsaXplZCBvYmplY3QgY2FuJ3QsIGJlY2F1c2UgaXQgbG9zdCB0aGUgc3RyaW5ncy4uLgorICAgICAgICAvLyBCdXQgdGhlIGRlc2VyaWFsaXplZCBvYmplY3QgaXMgc2NyZXdlZCBiZWNhdXNlIHRoZSBSSSdzIHNlcmlhbGl6ZWQgZm9ybSBkb2Vzbid0CisgICAgICAgIC8vIGNvbnRhaW4gdGhlIGxvY2FsZSBvciB0aGUgbmVjZXNzYXJ5IHN0cmluZ3MuIERvbid0IHNlcmlhbGl6ZSBEYXRlRm9ybWF0U3ltYm9scywgZm9sa3MhCiAgICAgICAgIGFzc2VydEVxdWFscygic3R5Y3puaWEiLCBmb3JtYXREYXRlKHBsLCAiTU1NTSIsIGRlc2VyaWFsaXplZERmcykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN0eWN6bmlhIiwgZm9ybWF0RGF0ZShwbCwgIkxMTEwiLCBkZXNlcmlhbGl6ZWREZnMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYW51YXJ5IiwgZm9ybWF0RGF0ZShwbCwgIkxMTEwiLCBkZXNlcmlhbGl6ZWREZnMpKTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBmb3JtYXREYXRlKExvY2FsZSBsLCBTdHJpbmcgZm10LCBEYXRlRm9ybWF0U3ltYm9scyBkZnMpIHsKQEAgLTEyMyw0ICsxMjQsMzggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhyb3cpLCAiVVRDIiwgcm93WzJdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhyb3cpLCAiVVRDIiwgcm93WzRdKTsKICAgICB9CisKKyAgICAvLyBodHRwOi8vYi84MTI4NDYwCisgICAgLy8gSWYgaWN1NGMgZG9lc24ndCBhY3R1YWxseSBoYXZlIGEgbmFtZSwgd2UgYXJyYW5nZSB0byByZXR1cm4gbnVsbCBmcm9tIG5hdGl2ZSBjb2RlIHJhdGhlcgorICAgIC8vIHRoYXQgdXNlIGljdTRjJ3MgcHJvYmFibHktb3V0LW9mLWRhdGUgdGltZSB6b25lIHRyYW5zaXRpb24gZGF0YS4KKyAgICAvLyBnZXRab25lU3RyaW5ncyBoYXMgdG8gcGFwZXIgb3ZlciB0aGlzLgorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Wm9uZVN0cmluZ3Nfbm9fbnVsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW11bXSBhcnJheSA9IERhdGVGb3JtYXRTeW1ib2xzLmdldEluc3RhbmNlKExvY2FsZS5VUykuZ2V0Wm9uZVN0cmluZ3MoKTsKKyAgICAgICAgaW50IGZhaWxDb3VudCA9IDA7CisgICAgICAgIGZvciAoU3RyaW5nW10gcm93IDogYXJyYXkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiByb3cpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihBcnJheXMudG9TdHJpbmcocm93KSk7CisgICAgICAgICAgICAgICAgICAgICsrZmFpbENvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmFpbENvdW50KTsKKyAgICB9CisKKyAgICAvLyBodHRwOi8vYi83OTU1NjE0CisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRab25lU3RyaW5nc19BcGlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdW10gYXJyYXkgPSBEYXRlRm9ybWF0U3ltYm9scy5nZXRJbnN0YW5jZShMb2NhbGUuVVMpLmdldFpvbmVTdHJpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJvdyA9IGFycmF5W2ldOworICAgICAgICAgICAgLy8gUGFjaWZpYy9BcGlhIGlzIHNvbWV3aGF0IGFyYml0cmFyeTsgd2UganVzdCB3YW50IGEgem9uZSB3ZSBoYXZlIHRvIGdlbmVyYXRlCisgICAgICAgICAgICAvLyAiR01UIiBzdHJpbmdzIGZvciB0aGUgc2hvcnQgbmFtZXMuCisgICAgICAgICAgICBpZiAocm93WzBdLmVxdWFscygiUGFjaWZpYy9BcGlhIikpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbW9hIFN0YW5kYXJkIFRpbWUiLCByb3dbMV0pOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiR01UKzEzOjAwIiwgcm93WzJdKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbW9hIERheWxpZ2h0IFRpbWUiLCByb3dbM10pOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiR01UKzE0OjAwIiwgcm93WzRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9OdW1iZXJGb3JtYXRUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvTnVtYmVyRm9ybWF0VGVzdC5qYXZhCmluZGV4IGMyNjIxYjQuLmNlODBiZDEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9OdW1iZXJGb3JtYXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L051bWJlckZvcm1hdFRlc3QuamF2YQpAQCAtNzAsOSArNzAsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIE51bWJlckZvcm1hdCBudW1iZXJGb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0TnVtYmVySW5zdGFuY2UobmV3IExvY2FsZSgiYXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIywjIzAuIyMjOyMsIyMwLiMjIy0iLCAoKERlY2ltYWxGb3JtYXQpIG51bWJlckZvcm1hdCkudG9QYXR0ZXJuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMwLiMjIzsjMC4jIyMtIiwgKChEZWNpbWFsRm9ybWF0KSBudW1iZXJGb3JtYXQpLnRvUGF0dGVybigpKTsKICAgICAgICAgTnVtYmVyRm9ybWF0IGludGVnZXJGb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0SW50ZWdlckluc3RhbmNlKG5ldyBMb2NhbGUoImFyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMsIyMwOyMsIyMwLSIsICgoRGVjaW1hbEZvcm1hdCkgaW50ZWdlckZvcm1hdCkudG9QYXR0ZXJuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMwOyMwLSIsICgoRGVjaW1hbEZvcm1hdCkgaW50ZWdlckZvcm1hdCkudG9QYXR0ZXJuKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfbnVtYmVyTG9jYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC04Miw4ICs4Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKGFyYWJpYyk7CiAgICAgICAgIGFzc2VydEVxdWFscygnXHUwNjYwJywgbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKGFyYWJpYykuZ2V0WmVyb0RpZ2l0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDY2MVx1MDY2Y1x1MDY2Mlx1MDY2M1x1MDY2NFx1MDY2Y1x1MDY2NVx1MDY2Nlx1MDY2N1x1MDY2Y1x1MDY2OFx1MDY2OVx1MDY2MCIsCi0gICAgICAgICAgICAgICAgbmYuZm9ybWF0KDEyMzQ1Njc4OTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCLZodmi2aPZpNml2abZp9mo2anZoCIsIG5mLmZvcm1hdCgxMjM0NTY3ODkwKSk7CiAgICAgfQogCiAgICAgLy8gRm9ybWF0dGluZyBwZXJjZW50YWdlcyBpcyBjb25mdXNpbmcgYnV0IGRlbGliZXJhdGUuCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvT2xkRGVjaW1hbEZvcm1hdFN5bWJvbHNUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvT2xkRGVjaW1hbEZvcm1hdFN5bWJvbHNUZXN0LmphdmEKaW5kZXggMmYxYTNjYy4uYzA3ODY4NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L09sZERlY2ltYWxGb3JtYXRTeW1ib2xzVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGREZWNpbWFsRm9ybWF0U3ltYm9sc1Rlc3QuamF2YQpAQCAtMzMsMTYgKzMzLDE4IEBACiAgICAgcHVibGljIHZvaWQgdGVzdF9SSUhhcm1vbnlfY29tcGF0aWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIHN5bWJvbHMgPSBuZXcgRGVjaW1hbEZvcm1hdFN5bWJvbHMoCi0gICAgICAgICAgICAgICAgICAgIExvY2FsZS5GUkFOQ0UpOworICAgICAgICAgICAgRGVjaW1hbEZvcm1hdFN5bWJvbHMgc3ltYm9scyA9IG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuRlJBTkNFKTsKICAgICAgICAgICAgIGkgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKAogICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXphdGlvbi9qYXZhL3RleHQvRGVjaW1hbEZvcm1hdFN5bWJvbHMuc2VyIikpOwotICAgICAgICAgICAgRGVjaW1hbEZvcm1hdFN5bWJvbHMgc3ltYm9sc0QgPSAoRGVjaW1hbEZvcm1hdFN5bWJvbHMpIGkKLSAgICAgICAgICAgICAgICAgICAgLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzeW1ib2xzLCBzeW1ib2xzRCk7CisgICAgICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyByaVN5bWJvbHMgPSAoRGVjaW1hbEZvcm1hdFN5bWJvbHMpIGkucmVhZE9iamVjdCgpOworICAgICAgICAgICAgLy8gUkkncyBkZWZhdWx0IE5hTiBpcyBVK0ZGRkQsIEhhcm1vbnkncyBpcyBiYXNlZCBvbiBJQ1UKKyAgICAgICAgICAgIC8vIFRoaXMgc3VnZ2VzdHMgYW4gUkkgYnVnLCBhc3N1bWluZyB0aGF0IG5vbi1VVEY4IGJ5dGVzIGFyZSBVVEY4IGFuZAorICAgICAgICAgICAgLy8gZ2V0dGluZyBhIGNvbnZlcnNpb24gZmFpbHVyZS4KKyAgICAgICAgICAgIHJpU3ltYm9scy5zZXROYU4oIk5hTiIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bWJvbHMsIHJpU3ltYm9scyk7CiAgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGxvYWQgL3NlcmlhbGl6YXRpb24vamF2YS90ZXh0LyIgKwogICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbEZvcm1hdFN5bWJvbHMuc2VyIiwgaSk7CkBAIC01NCw3ICs1Niw2IEBACiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGFzc2VydERlY2ltYWxGb3JtYXRTeW1ib2xzUklGcmFuY2UoZGZzKTsKICAgICB9CiAKIApAQCAtMTIxLDggKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgJyMnLCBkZnMuZ2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKCkpOwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGFzc2VydERlY2ltYWxGb3JtYXRTeW1ib2xzUklGcmFuY2UoRGVjaW1hbEZvcm1hdFN5bWJvbHMgZGZzKSB7Ci0gICAgICAgIC8vIFZhbHVlcyBiYXNlZCBvbiBKYXZhIDEuNSBSSSBEZWNpbWFsRm9ybWF0U3ltYm9scyBmb3IgTG9jYWxlLkZSQU5DRQorICAgIHB1YmxpYyB2b2lkIHRlc3RfRGVjaW1hbEZvcm1hdFN5bWJvbHNfRnJhbmNlKCkgewogICAgICAgICAvKgogICAgICAgICAgKiBjdXJyZW5jeSA9IFtFVVJdCiAgICAgICAgICAqIGN1cnJlbmN5U3ltYm9sID0gW1UrMjBhY10gLy8gRVVSTyBTSUdOCkBAIC0xMzMsMTIgKzEzMywxMyBAQAogICAgICAgICAgKiBpbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wgPSBbRVVSXQogICAgICAgICAgKiBtaW51c1NpZ24gPSBbLV1bVSswMDJkXQogICAgICAgICAgKiBtb25ldGFyeURlY2ltYWxTZXBhcmF0b3IgPSBbLF1bVSswMDJjXQotICAgICAgICAgKiBuYU4gPSBbVStmZmZkXSAvLyBSRVBMQUNFTUVOVCBDSEFSQUNURVIKKyAgICAgICAgICogbmFOID0gIk5hTiIKICAgICAgICAgICogcGF0dGVyblNlcGFyYXRvciA9IFs7XVtVKzAwM2JdCiAgICAgICAgICAqIHBlck1pbGwgPSBbVSsyMDMwXSAvLyBQRVIgTUlMTEUKICAgICAgICAgICogcGVyY2VudCA9IFslXVtVKzAwMjVdCiAgICAgICAgICAqIHplcm9EaWdpdCA9IFswXVtVKzAwMzBdCiAgICAgICAgICAqLworICAgICAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZnMgPSBuZXcgRGVjaW1hbEZvcm1hdFN5bWJvbHMoTG9jYWxlLkZSQU5DRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRVVSIiwgZGZzLmdldEN1cnJlbmN5KCkuZ2V0Q3VycmVuY3lDb2RlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjBBQyIsIGRmcy5nZXRDdXJyZW5jeVN5bWJvbCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCcsJywgZGZzLmdldERlY2ltYWxTZXBhcmF0b3IoKSk7CkBAIC0xNTEsNyArMTUyLDcgQEAKICAgICAgICAgLy8gUkkncyBkZWZhdWx0IE5hTiBpcyBVK0ZGRkQsIEhhcm1vbnkncyBpcyBiYXNlZCBvbiBJQ1UKICAgICAgICAgLy8gVGhpcyBzdWdnZXN0cyBhbiBSSSBidWcsIGFzc3VtaW5nIHRoYXQgbm9uLVVURjggYnl0ZXMgYXJlIFVURjggYW5kCiAgICAgICAgIC8vIGdldHRpbmcgYSBjb252ZXJzaW9uIGZhaWx1cmUuCi0gICAgICAgIGFzc2VydEVxdWFscygiXHVGRkZEIiwgZGZzLmdldE5hTigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYU4iLCBkZnMuZ2V0TmFOKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ1x1MDAzYicsIGRmcy5nZXRQYXR0ZXJuU2VwYXJhdG9yKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoJ1x1MjAzMCcsIGRmcy5nZXRQZXJNaWxsKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoJyUnLCBkZnMuZ2V0UGVyY2VudCgpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGROdW1iZXJGb3JtYXRUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvT2xkTnVtYmVyRm9ybWF0VGVzdC5qYXZhCmluZGV4IDY0ZmQ3Y2EuLjdiYjU1NDUgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGROdW1iZXJGb3JtYXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L09sZE51bWJlckZvcm1hdFRlc3QuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICBMb2NhbGUgYXJMb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJBRSIpOwogICAgICAgICBpZiAoU3VwcG9ydF9Mb2NhbGUuaXNMb2NhbGVBdmFpbGFibGUoYXJMb2NhbGUpKSB7CiAgICAgICAgICAgICBmb3JtYXQgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZShhckxvY2FsZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiMsIyMwOyMsIyMwLSIsIGZvcm1hdC50b1BhdHRlcm4oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiMwOyMwLSIsIGZvcm1hdC50b1BhdHRlcm4oKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDY2Ni0iLCBmb3JtYXQuZm9ybWF0KC02KSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoLTM2KSwgZm9ybWF0LnBhcnNlKCIzNi0iKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoLTM2KSwgZm9ybWF0LnBhcnNlT2JqZWN0KCIzNi0iKSk7CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3RleHQvT2xkU2ltcGxlRGF0ZUZvcm1hdFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGRTaW1wbGVEYXRlRm9ybWF0VGVzdC5qYXZhCmluZGV4IGZmMjRiYjYuLjFjYzc1NTQgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGRTaW1wbGVEYXRlRm9ybWF0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9PbGRTaW1wbGVEYXRlRm9ybWF0VGVzdC5qYXZhCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICAgICAgdGVzdC50ZXN0KCIgTU0iLCBjYWwsICIgMDYiLCBEYXRlRm9ybWF0Lk1PTlRIX0ZJRUxEKTsKICAgICAgICAgdGVzdC50ZXN0KCIgTU1NIiwgY2FsLCAiIEp1biIsIERhdGVGb3JtYXQuTU9OVEhfRklFTEQpOwogICAgICAgICB0ZXN0LnRlc3QoIiBNTU1NIiwgY2FsLCAiIEp1bmUiLCBEYXRlRm9ybWF0Lk1PTlRIX0ZJRUxEKTsKLSAgICAgICAgdGVzdC50ZXN0KCIgTU1NTU0iLCBjYWwsICIgSnVuZSIsIERhdGVGb3JtYXQuTU9OVEhfRklFTEQpOworICAgICAgICB0ZXN0LnRlc3QoIiBNTU1NTSIsIGNhbCwgIiBKIiwgRGF0ZUZvcm1hdC5NT05USF9GSUVMRCk7CiAKICAgICAgICAgdGVzdC50ZXN0KCIgZCIsIGNhbCwgIiAyIiwgRGF0ZUZvcm1hdC5EQVRFX0ZJRUxEKTsKICAgICAgICAgdGVzdC50ZXN0KCIgZCIsIG5ldyBHcmVnb3JpYW5DYWxlbmRhcigxOTk5LCBDYWxlbmRhci5OT1ZFTUJFUiwgMTIpLApAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgICAgIHRlc3QudGVzdCgiIEVFIiwgY2FsLCAiIFdlZCIsIERhdGVGb3JtYXQuREFZX09GX1dFRUtfRklFTEQpOwogICAgICAgICB0ZXN0LnRlc3QoIiBFRUUiLCBjYWwsICIgV2VkIiwgRGF0ZUZvcm1hdC5EQVlfT0ZfV0VFS19GSUVMRCk7CiAgICAgICAgIHRlc3QudGVzdCgiIEVFRUUiLCBjYWwsICIgV2VkbmVzZGF5IiwgRGF0ZUZvcm1hdC5EQVlfT0ZfV0VFS19GSUVMRCk7Ci0gICAgICAgIHRlc3QudGVzdCgiIEVFRUVFIiwgY2FsLCAiIFdlZG5lc2RheSIsIERhdGVGb3JtYXQuREFZX09GX1dFRUtfRklFTEQpOworICAgICAgICB0ZXN0LnRlc3QoIiBFRUVFRSIsIGNhbCwgIiBXIiwgRGF0ZUZvcm1hdC5EQVlfT0ZfV0VFS19GSUVMRCk7CiAKICAgICAgICAgdGVzdC50ZXN0KCIgRCIsIGNhbCwgIiAxNTMiLCBEYXRlRm9ybWF0LkRBWV9PRl9ZRUFSX0ZJRUxEKTsKICAgICAgICAgdGVzdC50ZXN0KCIgREQiLCBjYWwsICIgMTUzIiwgRGF0ZUZvcm1hdC5EQVlfT0ZfWUVBUl9GSUVMRCk7CkBAIC00MDUsNyArNDA1LDggQEAKIAogICAgICAgICBmb3JtYXQuc2V0VGltZVpvbmUodHowMDAxKTsKICAgICAgICAgdGVzdC50ZXN0KCIgWiIsIGNhbCwgIiArMDAwMSIsIERhdGVGb3JtYXQuVElNRVpPTkVfRklFTEQpOwotICAgICAgICB0ZXN0LnRlc3QoIiBaWlpaIiwgY2FsLCAiICswMDAxIiwgRGF0ZUZvcm1hdC5USU1FWk9ORV9GSUVMRCk7CisgICAgICAgIHRlc3QudGVzdCgiIFpaWloiLCBjYWwsICIgR01UKzAwOjAxIiwgRGF0ZUZvcm1hdC5USU1FWk9ORV9GSUVMRCk7CisgICAgICAgIHRlc3QudGVzdCgiIFpaWlpaIiwgY2FsLCAiICswMDowMSIsIERhdGVGb3JtYXQuVElNRVpPTkVfRklFTEQpOwogICAgICAgICBmb3JtYXQuc2V0VGltZVpvbmUodHowMTMwKTsKICAgICAgICAgdGVzdC50ZXN0KCIgWiIsIGNhbCwgIiArMDEzMCIsIERhdGVGb3JtYXQuVElNRVpPTkVfRklFTEQpOwogICAgICAgICBmb3JtYXQuc2V0VGltZVpvbmUodHpNaW51czAxMzApOwpAQCAtNDQxLDIyICs0NDIsMTggQEAKICAgICAgICAgRGF0ZSB3aW50ZXJEYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDE5OTksIENhbGVuZGFyLkpBTlVBUlksIDEyKS5nZXRUaW1lKCk7CiAKICAgICAgICAgRm9ybWF0VGVzdGVyIHRlc3QgPSBuZXcgRm9ybWF0VGVzdGVyKCk7Ci0gICAgICAgIHRlc3QudmVyaWZ5Rm9ybWF0VGltZXpvbmUoIkdNVC03IiwgIkdNVC0wNzowMCwgR01ULTA3OjAwIiwgIi0wNzAwLCAtMDcwMCIsIHN1bW1lckRhdGUpOwotICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJHTVQtNyIsICJHTVQtMDc6MDAsIEdNVC0wNzowMCIsICItMDcwMCwgLTA3MDAiLCB3aW50ZXJEYXRlKTsKKyAgICAgICAgdGVzdC52ZXJpZnlGb3JtYXRUaW1lem9uZSgiR01ULTciLCAiR01ULTA3OjAwLCBHTVQtMDc6MDAiLCAiLTA3MDAsIEdNVC0wNzowMCIsIHN1bW1lckRhdGUpOworICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJHTVQtNyIsICJHTVQtMDc6MDAsIEdNVC0wNzowMCIsICItMDcwMCwgR01ULTA3OjAwIiwgd2ludGVyRGF0ZSk7CiAKLSAgICAgICAgdGVzdC52ZXJpZnlGb3JtYXRUaW1lem9uZSgiR01UKzE0IiwgIkdNVCsxNDowMCwgR01UKzE0OjAwIiwgIisxNDAwLCArMTQwMCIsIHN1bW1lckRhdGUpOwotICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJHTVQrMTQiLCAiR01UKzE0OjAwLCBHTVQrMTQ6MDAiLCAiKzE0MDAsICsxNDAwIiwgd2ludGVyRGF0ZSk7CisgICAgICAgIHRlc3QudmVyaWZ5Rm9ybWF0VGltZXpvbmUoIkdNVCsxNCIsICJHTVQrMTQ6MDAsIEdNVCsxNDowMCIsICIrMTQwMCwgR01UKzE0OjAwIiwgc3VtbWVyRGF0ZSk7CisgICAgICAgIHRlc3QudmVyaWZ5Rm9ybWF0VGltZXpvbmUoIkdNVCsxNCIsICJHTVQrMTQ6MDAsIEdNVCsxNDowMCIsICIrMTQwMCwgR01UKzE0OjAwIiwgd2ludGVyRGF0ZSk7CiAKLSAgICAgICAgdGVzdC52ZXJpZnlGb3JtYXRUaW1lem9uZSgiQW1lcmljYS9Mb3NfQW5nZWxlcyIsICJQRFQsIFBhY2lmaWMgRGF5bGlnaHQgVGltZSIsCi0gICAgICAgICAgICAgICAgIi0wNzAwLCAtMDcwMCIsIHN1bW1lckRhdGUpOwotICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJBbWVyaWNhL0xvc19BbmdlbGVzIiwgIlBTVCwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwKLSAgICAgICAgICAgICAgICAiLTA4MDAsIC0wODAwIiwgd2ludGVyRGF0ZSk7CisgICAgICAgIHRlc3QudmVyaWZ5Rm9ybWF0VGltZXpvbmUoIkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCAiUERULCBQYWNpZmljIERheWxpZ2h0IFRpbWUiLCAiLTA3MDAsIEdNVC0wNzowMCIsIHN1bW1lckRhdGUpOworICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJBbWVyaWNhL0xvc19BbmdlbGVzIiwgIlBTVCwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgIi0wODAwLCBHTVQtMDg6MDAiLCB3aW50ZXJEYXRlKTsKIAogICAgICAgICAvLyB0aGlzIGZhaWxzIG9uIHRoZSBSSSEKLSAgICAgICAgdGVzdC52ZXJpZnlGb3JtYXRUaW1lem9uZSgiQW1lcmljYS9EZXRyb2l0IiwgIkVEVCwgRWFzdGVybiBEYXlsaWdodCBUaW1lIiwKLSAgICAgICAgICAgICAgICAiLTA0MDAsIC0wNDAwIiwgc3VtbWVyRGF0ZSk7Ci0gICAgICAgIHRlc3QudmVyaWZ5Rm9ybWF0VGltZXpvbmUoIkFtZXJpY2EvRGV0cm9pdCIsICJFU1QsIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsCi0gICAgICAgICAgICAgICAgIi0wNTAwLCAtMDUwMCIsIHdpbnRlckRhdGUpOworICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJBbWVyaWNhL0RldHJvaXQiLCAiRURULCBFYXN0ZXJuIERheWxpZ2h0IFRpbWUiLCAiLTA0MDAsIEdNVC0wNDowMCIsIHN1bW1lckRhdGUpOworICAgICAgICB0ZXN0LnZlcmlmeUZvcm1hdFRpbWV6b25lKCJBbWVyaWNhL0RldHJvaXQiLCAiRVNULCBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAiLTA1MDAsIEdNVC0wNTowMCIsIHdpbnRlckRhdGUpOwogCiAgICAgICAgIGFzc2VydEZhbHNlKHRlc3QudGVzdHNGYWlsZWQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXRUZXN0LmphdmEKaW5kZXggY2Q1NGQxZS4uMjFkNzMwMiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXRUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXRUZXN0LmphdmEKQEAgLTc3LDYgKzc3LDEwNCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoQ2FsZW5kYXIuVFVFU0RBWSwgcGFyc2VEYXRlKHJ1LCAiY2NjYyIsICJcdTA0MTJcdTA0NDJcdTA0M2VcdTA0NDBcdTA0M2RcdTA0MzhcdTA0M2EiKS5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspKTsKICAgICB9CiAKKyAgICAvLyBUaGUgUkkgZmFpbHMgdGhpcyB0ZXN0IGJlY2F1c2UgaXQgZG9lc24ndCBmdWxseSBzdXBwb3J0IFVUUyAjMzUuCisgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk2MTYKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml2ZUNvdW50X3BhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIC8vIEl0J3MgcHJldHR5IHNpbGx5IHRvIHRyeSB0byBwYXJzZSB0aGUgc2hvcnRlc3QgbmFtZXMsIGJlY2F1c2UgdGhleSdyZSBhbG1vc3QgYWx3YXlzIGFtYmlndW91cy4KKyAgICAgIHRyeSB7CisgICAgICAgIHBhcnNlRGF0ZShMb2NhbGUuRU5HTElTSCwgIk1NTU1NIiwgIkoiKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoanVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIGV4cGVjdGVkKSB7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBwYXJzZURhdGUoTG9jYWxlLkVOR0xJU0gsICJMTExMTCIsICJKIik7CisgICAgICAgIGZhaWwoKTsKKyAgICAgIH0gY2F0Y2ggKGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvciBleHBlY3RlZCkgeworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcGFyc2VEYXRlKExvY2FsZS5FTkdMSVNILCAiRUVFRUUiLCAiVCIpOworICAgICAgICBmYWlsKCk7CisgICAgICB9IGNhdGNoIChqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXhwZWN0ZWQpIHsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHBhcnNlRGF0ZShMb2NhbGUuRU5HTElTSCwgImNjY2NjIiwgIlQiKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoanVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIGV4cGVjdGVkKSB7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIFJJIGZhaWxzIHRoaXMgdGVzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgZnVsbHkgc3VwcG9ydCBVVFMgIzM1LgorICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTM5NjE2CisgICAgcHVibGljIHZvaWQgdGVzdEZpdmVDb3VudF9NKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBUaW1lWm9uZS5zZXREZWZhdWx0KFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiTSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiMDEiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiTU0iKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkphbiIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJNTU0iKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIkphbnVhcnkiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiTU1NTSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiSiIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJNTU1NTSIpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgUkkgZmFpbHMgdGhpcyB0ZXN0IGJlY2F1c2UgaXQgZG9lc24ndCBmdWxseSBzdXBwb3J0IFVUUyAjMzUuCisgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk2MTYKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml2ZUNvdW50X0woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFRpbWVab25lLnNldERlZmF1bHQoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiMSIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJMIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCIwMSIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJMTCIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiSmFuIiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgIkxMTCIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiSmFudWFyeSIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJMTExMIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJKIiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgIkxMTExMIikpOworICAgIH0KKworICAgIC8vIFRoZSBSSSBmYWlscyB0aGlzIHRlc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGZ1bGx5IHN1cHBvcnQgVVRTICMzNS4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0zOTYxNgorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXZlQ291bnRfRSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgVGltZVpvbmUuc2V0RGVmYXVsdChUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHUiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiRSIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGh1IiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgIkVFIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHUiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiRUVFIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHVyc2RheSIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJFRUVFIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUIiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgIkVFRUVFIikpOworICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJUaCIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJFRUVFRUUiKSk7IC8vIGljdTRjIGRvZXNuJ3Qgc3VwcG9ydCA2LgorICAgIH0KKworICAgIC8vIFRoZSBSSSBmYWlscyB0aGlzIHRlc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGZ1bGx5IHN1cHBvcnQgVVRTICMzNS4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0zOTYxNgorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXZlQ291bnRfYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgVGltZVpvbmUuc2V0RGVmYXVsdChUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHUiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiYyIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiVGh1IiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgImNjIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHUiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiY2NjIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUaHVyc2RheSIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJjY2NjIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJUIiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgImNjY2NjIikpOworICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJUaCIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJjY2NjY2MiKSk7IC8vIGljdTRjIGRvZXNuJ3Qgc3VwcG9ydCA2LgorICAgIH0KKworICAgIC8vIFRoZSBSSSBmYWlscyB0aGlzIHRlc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGZ1bGx5IHN1cHBvcnQgVVRTICMzNS4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0zOTYxNgorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXZlQ291bnRfWigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgVGltZVpvbmUuc2V0RGVmYXVsdChUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCIrMDAwMCIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJaIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCIrMDAwMCIsIGZvcm1hdERhdGUoTG9jYWxlLkVOR0xJU0gsICJaWiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiKzAwMDAiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiWlpaIikpOworICAgICAgYXNzZXJ0RXF1YWxzKCJHTVQrMDA6MDAiLCBmb3JtYXREYXRlKExvY2FsZS5FTkdMSVNILCAiWlpaWiIpKTsKKyAgICAgIGFzc2VydEVxdWFscygiKzAwOjAwIiwgZm9ybWF0RGF0ZShMb2NhbGUuRU5HTElTSCwgIlpaWlpaIikpOworICAgIH0KKworICAgIC8vIFRoZSBSSSBmYWlscyB0aGlzIHRlc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGZ1bGx5IHN1cHBvcnQgVVRTICMzNS4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0zOTYxNgorICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyc2luZ19aKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBUaW1lWm9uZS5zZXREZWZhdWx0KFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMTMyNTQyMTI0MDAwMEwsIHBhcnNlVGltZSgieXl5eS1NTS1kZCcgJ1oiLCAiMjAxMi0wMS0wMSAtMTIzNCIpKTsKKyAgICAgIGFzc2VydEVxdWFscygxMzI1NDIxMjQwMDAwTCwgcGFyc2VUaW1lKCJ5eXl5LU1NLWRkJyAnWloiLCAiMjAxMi0wMS0wMSAtMTIzNCIpKTsKKyAgICAgIGFzc2VydEVxdWFscygxMzI1NDIxMjQwMDAwTCwgcGFyc2VUaW1lKCJ5eXl5LU1NLWRkJyAnWlpaIiwgIjIwMTItMDEtMDEgLTEyMzQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMTMyNTQyMTI0MDAwMEwsIHBhcnNlVGltZSgieXl5eS1NTS1kZCcgJ1paWloiLCAiMjAxMi0wMS0wMSBHTVQtMTI6MzQiKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMTMyNTQyMTI0MDAwMEwsIHBhcnNlVGltZSgieXl5eS1NTS1kZCcgJ1paWlpaIiwgIjIwMTItMDEtMDEgLTEyOjM0IikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgcGFyc2VUaW1lKFN0cmluZyBmbXQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgcmV0dXJuIHBhcnNlRGF0ZShMb2NhbGUuRU5HTElTSCwgZm10LCB2YWx1ZSkuZ2V0VGltZSgpLmdldFRpbWUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0MjAzOCgpIHsKICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBISDptbTpzcyB5eXl5IiwgTG9jYWxlLlVTKTsKICAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CkBAIC05MiwxMyArMTkwLDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiU3VuIEZlYiAwNyAwNjoyODoxNiAyMTA2IiwKICAgICAgICAgICAgICAgICBmb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCgyTCArIEludGVnZXIuTUFYX1ZBTFVFICsgSW50ZWdlci5NQVhfVkFMVUUpICogMTAwMEwpKSk7CiAgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0RGF0ZShMb2NhbGUgbCwgU3RyaW5nIGZtdCkgewogICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmbXQsIGwpOwogICAgICAgICBkYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CiAgICAgICAgIHJldHVybiBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgwKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDYWxlbmRhciBwYXJzZURhdGUoTG9jYWxlIGwsIFN0cmluZyBmbXQsIFN0cmluZyB2YWx1ZSkgeworICAgIHByaXZhdGUgc3RhdGljIENhbGVuZGFyIHBhcnNlRGF0ZShMb2NhbGUgbCwgU3RyaW5nIGZtdCwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZm10LCBsKTsKICAgICAgICAgUGFyc2VQb3NpdGlvbiBwcCA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOwogICAgICAgICBEYXRlIGQgPSBzZGYucGFyc2UodmFsdWUsIHBwKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb25UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjkwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbGliY29yZS5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGZpbmFsIGNsYXNzIEFic3RyYWN0Q29sbGVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MzY1MTkKKyAgcHVibGljIHZvaWQgdGVzdF90b0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4gbSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgIGFzc2VydFRydWUobS52YWx1ZXMoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvbik7CisKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIGZpbmlzaGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgVGhyZWFkIHJlYWRlciA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKCFmaW5pc2hlZC5nZXQoKSkgeworICAgICAgICAgIG0udmFsdWVzKCkudG9BcnJheSgpOworICAgICAgICAgIG0udmFsdWVzKCkudG9BcnJheShuZXcgSW50ZWdlclttLnNpemUoKV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICBUaHJlYWQgbXV0YXRvciA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgICAgICAgIG0ucHV0KC1pLCAtaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyArK2kpIHsKKyAgICAgICAgICBtLnB1dChpLCBpKTsKKyAgICAgICAgICBtLnJlbW92ZShpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5pc2hlZC5zZXQodHJ1ZSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICByZWFkZXIuc3RhcnQoKTsKKyAgICBtdXRhdG9yLnN0YXJ0KCk7CisgICAgcmVhZGVyLmpvaW4oKTsKKyAgICBtdXRhdG9yLmpvaW4oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL0N1cnJlbmN5VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL0N1cnJlbmN5VGVzdC5qYXZhCmluZGV4IDEzZTIyNDIuLjg1MDRlYWYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9DdXJyZW5jeVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvQ3VycmVuY3lUZXN0LmphdmEKQEAgLTY4LDQgKzY4LDE3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBDdXJyZW5jeS5nZXRJbnN0YW5jZSgiSlBZIikuZ2V0RGVmYXVsdEZyYWN0aW9uRGlnaXRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIEN1cnJlbmN5LmdldEluc3RhbmNlKCJYWFgiKS5nZXREZWZhdWx0RnJhY3Rpb25EaWdpdHMoKSk7CiAgICAgfQorCisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0zODYyMgorICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3ltYm9sXzM4NjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoZSBDTERSIGRhdGEgaGFkIHRoZSBQb3J0dWd1ZXNlIHN5bWJvbCBmb3IgIkVVUiIgaW4gcHQsIG5vdCBpbiBwdF9QVC4KKyAgICAgICAgLy8gV2Ugd2VyZW4ndCBmYWxsaW5nIGJhY2sgZnJvbSBwdF9QVCB0byBwdCwgc28gd2UgZGlkbid0IGZpbmQgaXQgYW5kIHdvdWxkCisgICAgICAgIC8vIGRlZmF1bHQgdG8gVSswMEE0IENVUlJFTkNZIFNJR04gKMKkKSByYXRoZXIgdGhhbiDigqwuCisgICAgICAgIExvY2FsZSBwdF9CUiA9IG5ldyBMb2NhbGUoInB0IiwgIkJSIik7CisgICAgICAgIExvY2FsZSBwdF9QVCA9IG5ldyBMb2NhbGUoInB0IiwgIlBUIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUiQiLCBDdXJyZW5jeS5nZXRJbnN0YW5jZShwdF9CUikuZ2V0U3ltYm9sKHB0X0JSKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUiQiLCBDdXJyZW5jeS5nZXRJbnN0YW5jZShwdF9CUikuZ2V0U3ltYm9sKHB0X1BUKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi4oKsIiwgQ3VycmVuY3kuZ2V0SW5zdGFuY2UocHRfUFQpLmdldFN5bWJvbChwdF9CUikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIuKCrCIsIEN1cnJlbmN5LmdldEluc3RhbmNlKHB0X1BUKS5nZXRTeW1ib2wocHRfUFQpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvRXZpbE1hcFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9FdmlsTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNWY5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvRXZpbE1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbGliY29yZS5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBFdmlsTWFwVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXZpbE1hcDxLLFY+IGV4dGVuZHMgQWJzdHJhY3RNYXA8SyxWPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8RW50cnk8SyxWPj4gZW50cmllcyA9IG5ldyBIYXNoU2V0PEVudHJ5PEssVj4+KCk7CisKKyAgICBwdWJsaWMgRXZpbE1hcCgpIHsKKyAgICAgIGVudHJpZXMuYWRkKG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeSgiaGkiLCAidGhlcmUiKSk7CisgICAgfQorCisgICAgLy8gQ2xhaW0gd2UncmUgZW1wdHkuLi4KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBzaXplKCkgeyByZXR1cm4gMDsgfQorICAgIC8vIC4uLmJ1dCBwb3RlbnRpYWxseSByZXR1cm4gbWFueSBlbnRyaWVzLgorICAgIEBPdmVycmlkZSBwdWJsaWMgU2V0PEVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsgcmV0dXJuIGVudHJpZXM7IH0KKworICAgIC8vIER1bW15IGltcGxlbWVudGF0aW9uLCBub3QgcmVsZXZhbnQgZm9yIHRoaXMgdGVzdCBidXQKKyAgICAvLyBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IEFic3RyYWN0TWFwLgorICAgIEBPdmVycmlkZSBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsKSB7IHJldHVybiB2YWw7IH0KKyAgfQorCisgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTQ4MDU1CisgIHB1YmxpYyB2b2lkIHRlc3RfNDgwNTVfSGFzaE1hcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZXZpbCA9IG5ldyBFdmlsTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGV2aWwucHV0KCJoaSIsICJ0aGVyZSIpOworICAgIC8vIENvcnJ1cHQgb25lIEhhc2hNYXAuLi4KKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oZXZpbCk7CisgICAgLy8gLi4uYW5kIG5vdyB0aGV5J3JlIGFsbCBjb3JydXB0ZWQuCisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGFzc2VydE51bGwobWFwMi5nZXQoImhpIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF80ODA1NV9IYXNodGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGV2aWwgPSBuZXcgRXZpbE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBldmlsLnB1dCgiaGkiLCAidGhlcmUiKTsKKyAgICAvLyBDb3JydXB0IG9uZSBIYXNodGFibGUuLi4KKyAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KGV2aWwpOworICAgIC8vIC4uLmFuZCBub3cgdGhleSdyZSBhbGwgY29ycnVwdGVkLgorICAgIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gbWFwMiA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgYXNzZXJ0TnVsbChtYXAyLmdldCgiaGkiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0XzQ4MDU1X0xpbmtlZEhhc2hNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGV2aWwgPSBuZXcgRXZpbE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBldmlsLnB1dCgiaGkiLCAidGhlcmUiKTsKKyAgICAvLyBDb3JydXB0IG9uZSBMaW5rZWRIYXNoTWFwLi4uCisgICAgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGV2aWwpOworICAgIC8vIC4uLmFuZCBub3cgdGhleSdyZSBhbGwgY29ycnVwdGVkLgorICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcDIgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBhc3NlcnROdWxsKG1hcDIuZ2V0KCJoaSIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfNDgwNTVfV2Vha0hhc2hNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGV2aWwgPSBuZXcgRXZpbE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBldmlsLnB1dCgiaGkiLCAidGhlcmUiKTsKKyAgICAvLyBDb3JydXB0IG9uZSBXZWFrSGFzaE1hcC4uLgorICAgIFdlYWtIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgV2Vha0hhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGV2aWwpOworICAgIC8vIC4uLmFuZCBub3cgdGhleSdyZSBhbGwgY29ycnVwdGVkLgorICAgIFdlYWtIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAyID0gbmV3IFdlYWtIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGFzc2VydE51bGwobWFwMi5nZXQoImhpIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF80ODA1NV9JZGVudGl0eUhhc2hNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGV2aWwgPSBuZXcgRXZpbE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBldmlsLnB1dCgiaGkiLCAidGhlcmUiKTsKKyAgICAvLyBDb3JydXB0IG9uZSBJZGVudGl0eUhhc2hNYXAuLi4KKyAgICBJZGVudGl0eUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBJZGVudGl0eUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGV2aWwpOworICAgIC8vIC4uLmFuZCBub3cgdGhleSdyZSBhbGwgY29ycnVwdGVkLgorICAgIElkZW50aXR5SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwMiA9IG5ldyBJZGVudGl0eUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgYXNzZXJ0TnVsbChtYXAyLmdldCgiaGkiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0XzQ4MDU1X0NvbmN1cnJlbnRIYXNoTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBldmlsID0gbmV3IEV2aWxNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgZXZpbC5wdXQoImhpIiwgInRoZXJlIik7CisgICAgLy8gQ29ycnVwdCBvbmUgQ29uY3VycmVudEhhc2hNYXAuLi4KKyAgICBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPihldmlsKTsKKyAgICAvLyAuLi5hbmQgbm93IHRoZXkncmUgYWxsIGNvcnJ1cHRlZC4KKyAgICBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwMiA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBhc3NlcnROdWxsKG1hcDIuZ2V0KCJoaSIpKTsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvTG9jYWxlVGVzdC5qYXZhCmluZGV4IGIxNDZiMWEuLmIwNTIyYTMgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9Mb2NhbGVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL0xvY2FsZVRlc3QuamF2YQpAQCAtMjgsMTUgKzI4LDMzIEBACiAKIHB1YmxpYyBjbGFzcyBMb2NhbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKICAgICAvLyBodHRwOi8vYi8yNjExMzExOyBpZiB0aGVyZSdzIG5vIGRpc3BsYXkgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50LCB1c2UgdGhlIHJhdyBjb2Rlcy4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXlOYW1lX3JhdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2NhbGUgd2VpcmQgPSBuZXcgTG9jYWxlKCJBYUJiQ2MiLCAiRGRFZUZmIiwgIkdnSGhJaSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFhYmJjYyIsIHdlaXJkLmdldExhbmd1YWdlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdlaXJkLmdldERpc3BsYXlMYW5ndWFnZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEREVFRkYiLCB3ZWlyZC5nZXRDb3VudHJ5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdlaXJkLmdldERpc3BsYXlDb3VudHJ5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkdnSGhJaSIsIHdlaXJkLmdldFZhcmlhbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd2VpcmQuZ2V0RGlzcGxheVZhcmlhbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWFiYmNjIChEREVFRkYsR2dIaElpKSIsIHdlaXJkLmdldERpc3BsYXlOYW1lKCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheU5hbWVfaW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2NhbGUgaW52YWxpZCA9IG5ldyBMb2NhbGUoIkFhQmJDYyIsICJEZEVlRmYiLCAiR2dIaElpIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWJiY2MiLCBpbnZhbGlkLmdldExhbmd1YWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRERUVGRiIsIGludmFsaWQuZ2V0Q291bnRyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZ0hoSWkiLCBpbnZhbGlkLmdldFZhcmlhbnQoKSk7CisKKyAgICAgICAgLy8gQW5kcm9pZCB1c2luZyBpY3U0YyA8IDQ5LjIgcmV0dXJuZWQgZW1wdHkgc3RyaW5ncyBmb3IgZGlzcGxheSBsYW5ndWFnZSwgY291bnRyeSwKKyAgICAgICAgLy8gYW5kIHZhcmlhbnQsIGJ1dCBhIGRpc3BsYXkgbmFtZSBtYWRlIHVwIG9mIHRoZSByYXcgc3RyaW5ncy4KKyAgICAgICAgLy8gTmV3ZXIgcmVsZWFzZXMgcmV0dXJuIHNsaWdodGx5IGRpZmZlcmVudCByZXN1bHRzLCBidXQgbm8gbGVzcyB1bnJlYXNvbmFibGUuCisgICAgICAgIGFzc2VydEVxdWFscygiYWFiYmNjIiwgaW52YWxpZC5nZXREaXNwbGF5TGFuZ3VhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaW52YWxpZC5nZXREaXNwbGF5Q291bnRyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEREVFRkZfR0dISElJIiwgaW52YWxpZC5nZXREaXNwbGF5VmFyaWFudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWJiY2MgKERERUVGRixEREVFRkZfR0dISElJKSIsIGludmFsaWQuZ2V0RGlzcGxheU5hbWUoKSk7CisgICAgfQorCisgICAgLy8gaHR0cDovL2IvMjYxMTMxMTsgaWYgdGhlcmUncyBubyBkaXNwbGF5IGxhbmd1YWdlL2NvdW50cnkvdmFyaWFudCwgdXNlIHRoZSByYXcgY29kZXMuCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZV91bmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvY2FsZSB1bmtub3duID0gbmV3IExvY2FsZSgieHgiLCAiWVkiLCAiVHJhZGl0aW9uYWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eCIsIHVua25vd24uZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVkiLCB1bmtub3duLmdldENvdW50cnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVHJhZGl0aW9uYWwiLCB1bmtub3duLmdldFZhcmlhbnQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eCIsIHVua25vd24uZ2V0RGlzcGxheUxhbmd1YWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllZIiwgdW5rbm93bi5nZXREaXNwbGF5Q291bnRyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUUkFESVRJT05BTCIsIHVua25vd24uZ2V0RGlzcGxheVZhcmlhbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieHggKFlZLFRSQURJVElPTkFMKSIsIHVua25vd24uZ2V0RGlzcGxheU5hbWUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZV9lYXN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00NiwxNSArNjQsMjIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXV0c2NoIiwgTG9jYWxlLkdFUk1BTi5nZXREaXNwbGF5TGFuZ3VhZ2UoTG9jYWxlLkdFUk1BTikpOwogICAgIH0KIAotICAgIC8vIGh0dHA6Ly9iLzcyOTEzNTU7IExvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UgZmFpbHMgZm9yIHRsIGluIHRsIGluIElDVSA0LjkuCiAgICAgcHVibGljIHZvaWQgdGVzdF90bCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBJbiBqYi1tcjEsIHdlIGhhZCBhIGxhc3QtbWludXRlIGhhY2sgdG8gYWx3YXlzIHJldHVybiAiRmlsaXBpbm8iIGJlY2F1c2UKKyAgICAgICAgLy8gaWN1NGMgNC44IGRpZG4ndCBoYXZlIGFueSBsb2NhbGl6YXRpb25zIGZvciBmaWwuIChodHRwOi8vYi83MjkxMzU1KQogICAgICAgICBMb2NhbGUgdGwgPSBuZXcgTG9jYWxlKCJ0bCIpOwogICAgICAgICBMb2NhbGUgdGxfUEggPSBuZXcgTG9jYWxlKCJ0bCIsICJQSCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGlwaW5vIiwgdGwuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZS5FTkdMSVNIKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRmlsaXBpbm8iLCB0bF9QSC5nZXREaXNwbGF5TGFuZ3VhZ2UoTG9jYWxlLkVOR0xJU0gpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWxpcGlubyIsIHRsLmdldERpc3BsYXlMYW5ndWFnZSh0bCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGlwaW5vIiwgdGxfUEguZ2V0RGlzcGxheUxhbmd1YWdlKHRsX1BIKSk7Ci0gICAgfQorCisgICAgICAgIC8vIEFmdGVyIHRoZSBpY3U0YyA0LjkgdXBncmFkZSwgd2UgY291bGQgbG9jYWxpemUgImZpbCIgY29ycmVjdGx5LCB0aG91Z2ggd2UKKyAgICAgICAgLy8gbmVlZGVkIGFub3RoZXIgaGFjayB0byBzdXBwbHkgImZpbCIgaW5zdGVhZCBvZiAidGwiIHRvIGljdTRjLiAoaHR0cDovL2IvODAyMzI4OCkKKyAgICAgICAgTG9jYWxlIGVzX01YID0gbmV3IExvY2FsZSgiZXMiLCAiTVgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxpcGlubyIsIHRsLmdldERpc3BsYXlMYW5ndWFnZShlc19NWCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGlwaW5vIiwgdGxfUEguZ2V0RGlzcGxheUxhbmd1YWdlKGVzX01YKSk7CisgICAgICB9CiAKICAgICAvLyBodHRwOi8vYi8zNDUyNjExOyBMb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlIGZhaWxzIGZvciB0aGUgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMuCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZV9vYnNvbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL09sZEFuZHJvaWRMb2NhbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvT2xkQW5kcm9pZExvY2FsZVRlc3QuamF2YQppbmRleCA4ZmJlNWZmLi5hZDkwMDlhIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvT2xkQW5kcm9pZExvY2FsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvT2xkQW5kcm9pZExvY2FsZVRlc3QuamF2YQpAQCAtNjEsMTQgKzYxLDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiU3VuZGF5IiwgZW5nU3ltYm9scy5nZXRXZWVrZGF5cygpW0NhbGVuZGFyLlNVTkRBWV0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlNvbm50YWciLCBkZXVTeW1ib2xzLmdldFdlZWtkYXlzKClbQ2FsZW5kYXIuU1VOREFZXSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDZW50cmFsIEV1cm9wZWFuIFRpbWUiLAorICAgICAgICBhc3NlcnRFcXVhbHMoIkNlbnRyYWwgRXVyb3BlYW4gU3RhbmRhcmQgVGltZSIsCiAgICAgICAgICAgICAgICAgYmVybGluLmdldERpc3BsYXlOYW1lKGZhbHNlLCBUaW1lWm9uZS5MT05HLCBlbmcpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDZW50cmFsIEV1cm9wZWFuIFN1bW1lciBUaW1lIiwKICAgICAgICAgICAgICAgICBiZXJsaW4uZ2V0RGlzcGxheU5hbWUodHJ1ZSwgVGltZVpvbmUuTE9ORywgZW5nKSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXR0ZWxldXJvcFx1MDBFNGlzY2hlIFplaXQiLAorICAgICAgICBhc3NlcnRFcXVhbHMoIk1pdHRlbGV1cm9ww6Rpc2NoZSBOb3JtYWx6ZWl0IiwKICAgICAgICAgICAgICAgICBiZXJsaW4uZ2V0RGlzcGxheU5hbWUoZmFsc2UsIFRpbWVab25lLkxPTkcsIGRldSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk1pdHRlbGV1cm9wXHUwMEU0aXNjaGUgU29tbWVyemVpdCIsCisgICAgICAgIGFzc2VydEVxdWFscygiTWl0dGVsZXVyb3DDpGlzY2hlIFNvbW1lcnplaXQiLAogICAgICAgICAgICAgICAgIGJlcmxpbi5nZXREaXNwbGF5TmFtZSh0cnVlLCBUaW1lWm9uZS5MT05HLCBkZXUpKTsKIAogICAgICAgICBhc3NlcnRUcnVlKGVuZ1N5bWJvbHMuZ2V0Wm9uZVN0cmluZ3MoKS5sZW5ndGggPiAxMDApOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL09sZFRpbWVab25lVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL09sZFRpbWVab25lVGVzdC5qYXZhCmluZGV4IDRlZDg5ZGUuLjAzYTQ5Y2EgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9PbGRUaW1lWm9uZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvT2xkVGltZVpvbmVUZXN0LmphdmEKQEAgLTExNiw5ICsxMTYsOSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCB0ei5nZXREaXNwbGF5TmFtZShmYWxzZSwgMSwgTG9jYWxlLlVLKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKFN1cHBvcnRfTG9jYWxlLmlzTG9jYWxlQXZhaWxhYmxlKExvY2FsZS5GUkFOQ0UpKSB7Ci0gICAgICAgICAgICAvL1JJIGZhaWxzIG9uIGZvbGxvd2luZyBsaW5lLiBSSSBhbHdheXMgcmV0dXJucyBzaG9ydCB0aW1lIHpvbmUgbmFtZSBhcyAiUFNUIgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVVEMtMDg6MDAiLCAgICAgICAgICAgICB0ei5nZXREaXNwbGF5TmFtZShmYWxzZSwgMCwgTG9jYWxlLkZSQU5DRSkpOwotICAgICAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlOiBSSSBoYXMgIkhldXJlIiwgQ0xEUi9JQ1UgaGFzICJoZXVyZSIuCisgICAgICAgICAgICAvLyBSSSBhbHdheXMgcmV0dXJucyBzaG9ydCB0aW1lIHpvbmUgbmFtZSBhcyAiUFNUIgorICAgICAgICAgICAgLy8gSUNVIHpvbmUvcm9vdC50eHQgcGF0Y2hlZCB0byBhbGxvdyBtZXRhem9uZSBuYW1lcy4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUFNUIiwgICAgICAgICAgICAgdHouZ2V0RGlzcGxheU5hbWUoZmFsc2UsIDAsIExvY2FsZS5GUkFOQ0UpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaGV1cmUgYXZhbmNcdTAwZTllIGR1IFBhY2lmaXF1ZSIsIHR6LmdldERpc3BsYXlOYW1lKHRydWUsICAxLCBMb2NhbGUuRlJBTkNFKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImhldXJlIG5vcm1hbGUgZHUgUGFjaWZpcXVlIiwgdHouZ2V0RGlzcGxheU5hbWUoZmFsc2UsIDEsIExvY2FsZS5GUkFOQ0UpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL1RpbWVab25lVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL1RpbWVab25lVGVzdC5qYXZhCmluZGV4IDZlOGI4ZDguLjA4ZDFlNjkgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9UaW1lWm9uZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvVGltZVpvbmVUZXN0LmphdmEKQEAgLTIxMSw0ICsyMTEsMTExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQorCisgICAgLy8gaHR0cDovL2IvNzk1NTYxNCBhbmQgaHR0cDovL2IvODAyNjc3Ni4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGxheU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIHRpbWUgem9uZXMgdGhhdCB1c2UgRFNUIGJ1dCBoYXZlIHRoZSBzYW1lIGRpc3BsYXkgbmFtZSBmb3IKKyAgICAgICAgLy8gYm90aCBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZS4KKyAgICAgICAgU3RyaW5nQnVpbGRlciBmYWlsdXJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGlkIDogVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzKCkpIHsKKyAgICAgICAgICAgIFRpbWVab25lIHR6ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoaWQpOworICAgICAgICAgICAgU3RyaW5nIGxvbmdEc3QgPSB0ei5nZXREaXNwbGF5TmFtZSh0cnVlLCBUaW1lWm9uZS5MT05HLCBMb2NhbGUuVVMpOworICAgICAgICAgICAgU3RyaW5nIGxvbmdTdGQgPSB0ei5nZXREaXNwbGF5TmFtZShmYWxzZSwgVGltZVpvbmUuTE9ORywgTG9jYWxlLlVTKTsKKyAgICAgICAgICAgIFN0cmluZyBzaG9ydERzdCA9IHR6LmdldERpc3BsYXlOYW1lKHRydWUsIFRpbWVab25lLlNIT1JULCBMb2NhbGUuVVMpOworICAgICAgICAgICAgU3RyaW5nIHNob3J0U3RkID0gdHouZ2V0RGlzcGxheU5hbWUoZmFsc2UsIFRpbWVab25lLlNIT1JULCBMb2NhbGUuVVMpOworCisgICAgICAgICAgICBpZiAodHoudXNlRGF5bGlnaHRUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbG9uZyBzdGQgYW5kIGRzdCBzdHJpbmdzIG11c3QgZGlmZmVyIQorICAgICAgICAgICAgICAgIGlmIChsb25nRHN0LmVxdWFscyhsb25nU3RkKSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXG4lMjBzOiBMRD0nJXMnIExTPSclcychIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGxvbmdEc3QsIGxvbmdTdGQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhlIHNob3J0IHN0ZCBhbmQgZHN0IHN0cmluZ3MgbXVzdCBkaWZmZXIhCisgICAgICAgICAgICAgICAgaWYgKHNob3J0RHN0LmVxdWFscyhzaG9ydFN0ZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlxuJTIwczogU0Q9JyVzJyBTUz0nJXMnISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBzaG9ydERzdCwgc2hvcnRTdGQpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2hvcnQgc3RkIG1hdGNoZXMgdGhlIGxvbmcgZHN0LCBvciB0aGUgbG9uZyBzdGQgbWF0Y2hlcyB0aGUgc2hvcnQgZHN0LAorICAgICAgICAgICAgICAgIC8vIGl0IHByb2JhYmx5IG1lYW5zIHdlIGhhdmUgYSB0aW1lIHpvbmUgdGhhdCBpY3U0YyBkb2Vzbid0IGJlbGlldmUgaGFzIGV2ZXIKKyAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBkc3QuCisgICAgICAgICAgICAgICAgaWYgKHNob3J0U3RkLmVxdWFscyhsb25nRHN0KSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXG4lMjBzOiBTUz0nJXMnIExEPSclcychIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIHNob3J0U3RkLCBsb25nRHN0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb25nU3RkLmVxdWFscyhzaG9ydERzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlxuJTIwczogTFM9JyVzJyBTRD0nJXMnISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBsb25nU3RkLCBzaG9ydERzdCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRoZSBsb25nIGFuZCBzaG9ydCBkc3Qgc3RyaW5ncyBtdXN0IGRpZmZlciEKKyAgICAgICAgICAgICAgICBpZiAobG9uZ0RzdC5lcXVhbHMoc2hvcnREc3QpICYmICFsb25nRHN0LnN0YXJ0c1dpdGgoIkdNVCIpKSB7CisgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXG4lMjBzOiBMRD0nJXMnIFNEPSclcychIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBsb25nRHN0LCBzaG9ydERzdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgd2hlbmV2ZXIgYSBkaXNwbGF5IG5hbWUgaXMganVzdCBhIEdNVCBzdHJpbmcgdGhhdCBpdCdzIHRoZQorICAgICAgICAgICAgLy8gcmlnaHQgR01UIHN0cmluZy4KKyAgICAgICAgICAgIFN0cmluZyBnbXREc3QgPSBmb3JtYXRHbXRTdHJpbmcodHosIHRydWUpOworICAgICAgICAgICAgU3RyaW5nIGdtdFN0ZCA9IGZvcm1hdEdtdFN0cmluZyh0eiwgZmFsc2UpOworICAgICAgICAgICAgaWYgKGlzR210U3RyaW5nKGxvbmdEc3QpICYmICFsb25nRHN0LmVxdWFscyhnbXREc3QpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlxuJXM6IExEICVzIiwgaWQsIGxvbmdEc3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc0dtdFN0cmluZyhsb25nU3RkKSAmJiAhbG9uZ1N0ZC5lcXVhbHMoZ210U3RkKSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcbiVzOiBMUyAlcyIsIGlkLCBsb25nU3RkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNHbXRTdHJpbmcoc2hvcnREc3QpICYmICFzaG9ydERzdC5lcXVhbHMoZ210RHN0KSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcbiVzOiBTRCAlcyIsIGlkLCBzaG9ydERzdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzR210U3RyaW5nKHNob3J0U3RkKSAmJiAhc2hvcnRTdGQuZXF1YWxzKGdtdFN0ZCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXG4lczogU1MgJXMiLCBpZCwgc2hvcnRTdGQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGZhaWx1cmVzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTYW50aWFnbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUaW1lWm9uZSB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKCJBbWVyaWNhL1NhbnRpYWdvIik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2hpbGUgU3VtbWVyIFRpbWUiLCB0ei5nZXREaXNwbGF5TmFtZSh0cnVlLCBUaW1lWm9uZS5MT05HLCBMb2NhbGUuVVMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGlsZSBTdGFuZGFyZCBUaW1lIiwgdHouZ2V0RGlzcGxheU5hbWUoZmFsc2UsIFRpbWVab25lLkxPTkcsIExvY2FsZS5VUykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdNVC0wMzowMCIsIHR6LmdldERpc3BsYXlOYW1lKHRydWUsIFRpbWVab25lLlNIT1JULCBMb2NhbGUuVVMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHTVQtMDQ6MDAiLCB0ei5nZXREaXNwbGF5TmFtZShmYWxzZSwgVGltZVpvbmUuU0hPUlQsIExvY2FsZS5VUykpOworICAgIH0KKworICAgIC8vIGh0dHA6Ly9iLzc5NTU2MTQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBpYSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUaW1lWm9uZSB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKCJQYWNpZmljL0FwaWEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYW1vYSBEYXlsaWdodCBUaW1lIiwgdHouZ2V0RGlzcGxheU5hbWUodHJ1ZSwgVGltZVpvbmUuTE9ORywgTG9jYWxlLlVTKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2Ftb2EgU3RhbmRhcmQgVGltZSIsIHR6LmdldERpc3BsYXlOYW1lKGZhbHNlLCBUaW1lWm9uZS5MT05HLCBMb2NhbGUuVVMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHTVQrMTQ6MDAiLCB0ei5nZXREaXNwbGF5TmFtZSh0cnVlLCBUaW1lWm9uZS5TSE9SVCwgTG9jYWxlLlVTKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR01UKzEzOjAwIiwgdHouZ2V0RGlzcGxheU5hbWUoZmFsc2UsIFRpbWVab25lLlNIT1JULCBMb2NhbGUuVVMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR210U3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoIkdNVCsiKSB8fCBzLnN0YXJ0c1dpdGgoIkdNVC0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R210U3RyaW5nKFRpbWVab25lIHR6LCBib29sZWFuIGRheWxpZ2h0KSB7CisgICAgICAgIGludCBvZmZzZXQgPSB0ei5nZXRSYXdPZmZzZXQoKTsKKyAgICAgICAgaWYgKGRheWxpZ2h0KSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gdHouZ2V0RFNUU2F2aW5ncygpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCAvPSA2MDAwMDsKKyAgICAgICAgY2hhciBzaWduID0gJysnOworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgc2lnbiA9ICctJzsKKyAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkdNVCVjJTAyZDolMDJkIiwgc2lnbiwgb2Zmc2V0IC8gNjAsIG9mZnNldCAlIDYwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsRGlzcGxheU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmb3IgKExvY2FsZSBsb2NhbGUgOiBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGlkIDogVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzKCkpIHsKKyAgICAgICAgICBUaW1lWm9uZSB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKGlkKTsKKyAgICAgICAgICBhc3NlcnROb3ROdWxsKHR6LmdldERpc3BsYXlOYW1lKGZhbHNlLCBUaW1lWm9uZS5MT05HLCBsb2NhbGUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC9yZWdleC9PbGRNYXRjaGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL3JlZ2V4L09sZE1hdGNoZXJUZXN0LmphdmEKaW5kZXggMDdkOTllOS4uYmQ2MTA5YiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL3JlZ2V4L09sZE1hdGNoZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL3JlZ2V4L09sZE1hdGNoZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIAogcGFja2FnZSBsaWJjb3JlLmphdmEudXRpbC5yZWdleDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtNjA2LDQgKzYwNyw0MCBAQAogICAgICAgICBhc3NlcnRUcnVlKCJcdTAwZWEiLm1hdGNoZXMoIlxcdyIpKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCiAgICAgICAgIGFzc2VydEZhbHNlKCJcdTAwZWEiLm1hdGNoZXMoIlxcVyIpKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCiAgICAgfQorCisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD00MTE0MworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50TWF0Y2hlckFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIihefFxcVykoW2Etel0pIik7CisgICAgICAgIGZpbmFsIE1hdGNoZXIgbSA9IHAubWF0Y2hlcigiIik7CisKKyAgICAgICAgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAic29tZSBleGFtcGxlIHRleHQiOworICAgICAgICAgICAgICAgICAgICAgICAgbS5yZXNldChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgbS5ncm91cCgxKSArIG0uZ3JvdXAoMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmFwcGVuZFRhaWwoc2IpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGluaGVyZW50bHkgdW5zYWZlIGFuZCBjcmF6eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBqdXN0IHRyeWluZyB0byBwcm92b2tlIG5hdGl2ZSBjcmFzaGVzIQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aHJlYWRzLmFkZCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoVGhyZWFkIHQgOiB0aHJlYWRzKSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpIHsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL3ppcC9aaXBGaWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS91dGlsL3ppcC9aaXBGaWxlVGVzdC5qYXZhCmluZGV4IGFmY2VhYmEuLjQ5ZGMwNTAgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvdXRpbC96aXAvWmlwRmlsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3V0aWwvemlwL1ppcEZpbGVUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CkBAIC0zNSw3ICszNiw2IEBACiBpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgWmlwRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KICAgICAvKioKICAgICAgKiBFeGVyY2lzZSBJbmZsYXRlcidzIGFiaWxpdHkgdG8gcmVmaWxsIHRoZSB6bGliJ3MgaW5wdXQgYnVmZmVyLiBBcyBvZiB0aGlzCiAgICAgICogd3JpdGluZywgdGhpcyBidWZmZXIncyBtYXggc2l6ZSBpcyA2NEtpQiBjb21wcmVzc2VkIGJ5dGVzLiBXZSdsbCB3cml0ZSBhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEluZmxhdGluZ0ZpbGVzUmVxdWlyaW5nWmlwUmVmaWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG9yaWdpbmFsU2l6ZSA9IDEwMjQgKiAxMDI0OwogICAgICAgICBieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShjcmVhdGVaaXBGaWxlKG9yaWdpbmFsU2l6ZSkpOworICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShjcmVhdGVaaXBGaWxlKDEsIG9yaWdpbmFsU2l6ZSkpOwogICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZSA9IHppcEZpbGUuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKICAgICAgICAgICAgIFppcEVudHJ5IHppcEVudHJ5ID0gZS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhpcyB0ZXN0IG5lZWRzID42NCBLaUIgb2YgY29tcHJlc3NlZCBkYXRhIHRvIGV4ZXJjaXNlIEluZmxhdGVyIiwKQEAgLTEyMSw3MiArMTIxLDMwMyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsYXRpbmdTdHJlYW1zUmVxdWlyaW5nWmlwUmVmaWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG9yaWdpbmFsU2l6ZSA9IDEwMjQgKiAxMDI0OwogICAgICAgICBieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotICAgICAgICBaaXBJbnB1dFN0cmVhbSBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGNyZWF0ZVppcEZpbGUob3JpZ2luYWxTaXplKSkpOworICAgICAgICBaaXBJbnB1dFN0cmVhbSBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGNyZWF0ZVppcEZpbGUoMSwgb3JpZ2luYWxTaXplKSkpOwogICAgICAgICB3aGlsZSAoaW4uZ2V0TmV4dEVudHJ5KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgd2hpbGUgKGluLnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGgpICE9IC0xKSB7fQogICAgICAgICB9CiAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29tcHJlc3NlcyBhIHNpbmdsZSByYW5kb20gZmlsZSBpbnRvIGEgLnppcCBhcmNoaXZlLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjcmVhdGVaaXBGaWxlKGludCB1bmNvbXByZXNzZWRTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHJlc3VsdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlppcEZpbGVUZXN0IiwgInppcCIpOwotICAgICAgICByZXN1bHQuZGVsZXRlT25FeGl0KCk7CisgICAgcHVibGljIHZvaWQgdGVzdFppcEZpbGVXaXRoTG90c09mRW50cmllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBleHBlY3RlZEVudHJ5Q291bnQgPSA2NCoxMDI0IC0gMTsKKyAgICAgICAgRmlsZSBmID0gY3JlYXRlWmlwRmlsZShleHBlY3RlZEVudHJ5Q291bnQsIDApOworICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmKTsKKyAgICAgICAgaW50IGVudHJ5Q291bnQgPSAwOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZSA9IHppcEZpbGUuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKKyAgICAgICAgICAgIFppcEVudHJ5IHppcEVudHJ5ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgKytlbnRyeUNvdW50OworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEVudHJ5Q291bnQsIGVudHJ5Q291bnQpOworICAgICAgICB6aXBGaWxlLmNsb3NlKCk7CisgICAgfQogCi0gICAgICAgIFppcE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlc3VsdCkpOwotICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeSgicmFuZG9tIik7Ci0gICAgICAgIG91dC5wdXROZXh0RW50cnkoZW50cnkpOworICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MzYxODcKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwRmlsZUxhcmdlclRoYW4yR2lCKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZhbHNlKSB7IC8vIFRPRE86IHRoaXMgdGVzdCByZXF1aXJlcyB0b28gbXVjaCB0aW1lIGFuZCB0b28gbXVjaCBkaXNrIHNwYWNlIQorICAgICAgICAgICAgRmlsZSBmID0gY3JlYXRlWmlwRmlsZSgxMDI0LCAzKjEwMjQqMTAyNCk7CisgICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmKTsKKyAgICAgICAgICAgIGludCBlbnRyeUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlID0gemlwRmlsZS5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IHppcEVudHJ5ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICsrZW50cnlDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDI0LCBlbnRyeUNvdW50KTsKKyAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RaaXA2NFN1cHBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlWmlwRmlsZSg2NCoxMDI0LCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsgLy8gTWFrZSB0aGlzIHRlc3QgbW9yZSBsaWtlIHRlc3RIdWdlWmlwRmlsZSB3aGVuIHdlIGhhdmUgWmlwNjQgc3VwcG9ydC4KKyAgICAgICAgfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzc2VzIHRoZSBnaXZlbiBudW1iZXIgb2YgZmlsZXMsIGVhY2ggb2YgdGhlIGdpdmVuIHNpemUsIGludG8gYSAuemlwIGFyY2hpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVppcEZpbGUoaW50IGVudHJ5Q291bnQsIGludCBlbnRyeVNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gY3JlYXRlVGVtcG9yYXJ5WmlwRmlsZSgpOwogCiAgICAgICAgIGJ5dGVbXSB3cml0ZUJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwogICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuY29tcHJlc3NlZFNpemU7IGkgKz0gd3JpdGVCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHdyaXRlQnVmZmVyKTsKLSAgICAgICAgICAgIG91dC53cml0ZSh3cml0ZUJ1ZmZlciwgMCwgTWF0aC5taW4od3JpdGVCdWZmZXIubGVuZ3RoLCB1bmNvbXByZXNzZWRTaXplIC0gaSkpOworCisgICAgICAgIFppcE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShyZXN1bHQpKSk7CisgICAgICAgIGZvciAoaW50IGVudHJ5ID0gMDsgZW50cnkgPCBlbnRyeUNvdW50OyArK2VudHJ5KSB7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShJbnRlZ2VyLnRvSGV4U3RyaW5nKGVudHJ5KSk7CisgICAgICAgICAgICBvdXQucHV0TmV4dEVudHJ5KHplKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeVNpemU7IGkgKz0gd3JpdGVCdWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmFuZG9tLm5leHRCeXRlcyh3cml0ZUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVDb3VudCA9IE1hdGgubWluKHdyaXRlQnVmZmVyLmxlbmd0aCwgZW50cnlTaXplIC0gaSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHdyaXRlQnVmZmVyLCAwLCBieXRlQ291bnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQuY2xvc2VFbnRyeSgpOwogICAgICAgICB9CiAKLSAgICAgICAgb3V0LmNsb3NlRW50cnkoKTsKICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9CisgICAgfQogCi0gICAgICBwdWJsaWMgdm9pZCB0ZXN0SHVnZVppcEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgIGludCBleHBlY3RlZEVudHJ5Q291bnQgPSA2NCoxMDI0IC0gMTsKLSAgICAgICAgICBGaWxlIGYgPSBjcmVhdGVIdWdlWmlwRmlsZShleHBlY3RlZEVudHJ5Q291bnQpOwotICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGYpOwotICAgICAgICAgIGludCBlbnRyeUNvdW50ID0gMDsKLSAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZSA9IHppcEZpbGUuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICsrZW50cnlDb3VudDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRW50cnlDb3VudCwgZW50cnlDb3VudCk7Ci0gICAgICAgICAgemlwRmlsZS5jbG9zZSgpOwotICAgICAgfQorICAgIHByaXZhdGUgRmlsZSBjcmVhdGVUZW1wb3JhcnlaaXBGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJaaXBGaWxlVGVzdCIsICJ6aXAiKTsKKyAgICAgICAgcmVzdWx0LmRlbGV0ZU9uRXhpdCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotICAgICAgcHVibGljIHZvaWQgdGVzdFppcDY0U3VwcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgY3JlYXRlSHVnZVppcEZpbGUoNjQqMTAyNCk7Ci0gICAgICAgICAgICAgIGZhaWwoKTsgLy8gTWFrZSB0aGlzIHRlc3QgbW9yZSBsaWtlIHRlc3RIdWdlWmlwRmlsZSB3aGVuIHdlIGhhdmUgWmlwNjQgc3VwcG9ydC4KLSAgICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICB9Ci0gICAgICB9CisgICAgcHJpdmF0ZSBaaXBPdXRwdXRTdHJlYW0gY3JlYXRlWmlwT3V0cHV0U3RyZWFtKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpKSk7CisgICAgfQogCi0gICAgICAvKioKLSAgICAgICAqIENvbXByZXNzZXMgdGhlIGdpdmVuIG51bWJlciBvZiBlbXB0eSBmaWxlcyBpbnRvIGEgLnppcCBhcmNoaXZlLgotICAgICAgICovCi0gICAgICBwcml2YXRlIEZpbGUgY3JlYXRlSHVnZVppcEZpbGUoaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgIEZpbGUgcmVzdWx0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiWmlwRmlsZVRlc3QiLCAiemlwIik7Ci0gICAgICAgICAgcmVzdWx0LmRlbGV0ZU9uRXhpdCgpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTVE9SRUQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBaaXBPdXRwdXRTdHJlYW0gb3V0ID0gY3JlYXRlWmlwT3V0cHV0U3RyZWFtKGNyZWF0ZVRlbXBvcmFyeVppcEZpbGUoKSk7CisgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwogCi0gICAgICAgICAgWmlwT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlc3VsdCkpKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoSW50ZWdlci50b0hleFN0cmluZyhpKSk7Ci0gICAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoZW50cnkpOwotICAgICAgICAgICAgICBvdXQuY2xvc2VFbnRyeSgpOwotICAgICAgICAgIH0KKyAgICAgICAgLy8gTWlzc2luZyBDUkMsIHNpemUsIGFuZCBjb21wcmVzc2VkIHNpemUgPT4gZmFpbHVyZS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJhIik7CisgICAgICAgICAgICB6ZS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKKyAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQogCi0gICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KKyAgICAgICAgLy8gTWlzc2luZyBDUkMgYW5kIGNvbXByZXNzZWQgc2l6ZSA9PiBmYWlsdXJlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoImEiKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICAgICAgemUuc2V0U2l6ZSgwKTsKKyAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1pc3NpbmcgQ1JDIGFuZCBzaXplID0+IGZhaWx1cmUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgiYSIpOworICAgICAgICAgICAgemUuc2V0TWV0aG9kKFppcEVudHJ5LlNUT1JFRCk7CisgICAgICAgICAgICB6ZS5zZXRTaXplKDApOworICAgICAgICAgICAgemUuc2V0Q29tcHJlc3NlZFNpemUoMCk7CisgICAgICAgICAgICBvdXQucHV0TmV4dEVudHJ5KHplKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaXNzaW5nIHNpemUgYW5kIGNvbXByZXNzZWQgc2l6ZSA9PiBmYWlsdXJlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoImEiKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICAgICAgemUuc2V0Q3JjKGNyYy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1pc3Npbmcgc2l6ZSBpcyBjb3BpZWQgZnJvbSBjb21wcmVzc2VkIHNpemUuCisgICAgICAgIHsKKyAgICAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJva2F5MSIpOworICAgICAgICAgICAgemUuc2V0TWV0aG9kKFppcEVudHJ5LlNUT1JFRCk7CisgICAgICAgICAgICB6ZS5zZXRDcmMoY3JjLmdldFZhbHVlKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHplLmdldFNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHplLmdldENvbXByZXNzZWRTaXplKCkpOworCisgICAgICAgICAgICB6ZS5zZXRDb21wcmVzc2VkU2l6ZSgwKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB6ZS5nZXRTaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHplLmdldENvbXByZXNzZWRTaXplKCkpOworCisgICAgICAgICAgICBvdXQucHV0TmV4dEVudHJ5KHplKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHplLmdldFNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgemUuZ2V0Q29tcHJlc3NlZFNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaXNzaW5nIGNvbXByZXNzZWQgc2l6ZSBpcyBjb3BpZWQgZnJvbSBzaXplLgorICAgICAgICB7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgib2theTIiKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICAgICAgemUuc2V0Q3JjKGNyYy5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB6ZS5nZXRTaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsKKworICAgICAgICAgICAgemUuc2V0U2l6ZSgwKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHplLmdldFNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHplLmdldENvbXByZXNzZWRTaXplKCkpOworCisgICAgICAgICAgICBvdXQucHV0TmV4dEVudHJ5KHplKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHplLmdldFNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgemUuZ2V0Q29tcHJlc3NlZFNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaXNtYXRjaGVkIHNpemUgYW5kIGNvbXByZXNzZWQgc2l6ZSA9PiBmYWlsdXJlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoImEiKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICAgICAgemUuc2V0Q3JjKGNyYy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHplLnNldENvbXByZXNzZWRTaXplKDEpOworICAgICAgICAgICAgemUuc2V0U2l6ZSgwKTsKKyAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV2ZXJ5dGhpbmcgcHJlc2VudCA9PiBzdWNjZXNzLgorICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgib2theSIpOworICAgICAgICB6ZS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKKyAgICAgICAgemUuc2V0Q3JjKGNyYy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgemUuc2V0U2l6ZSgwKTsKKyAgICAgICAgemUuc2V0Q29tcHJlc3NlZFNpemUoMCk7CisgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworCisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG1ha2VTdHJpbmcoaW50IGNvdW50LCBTdHJpbmcgY2gpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRGaWxlQ29tbWVudCA9ICIxIFx1MDY2NiAyIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkRW50cnlDb21tZW50ID0gImEgXHUwNjY2IGIiOworCisgICAgICAgIEZpbGUgZmlsZSA9IGNyZWF0ZVRlbXBvcmFyeVppcEZpbGUoKTsKKyAgICAgICAgWmlwT3V0cHV0U3RyZWFtIG91dCA9IGNyZWF0ZVppcE91dHB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICAvLyBJcyBmaWxlIGNvbW1lbnQgbGVuZ3RoIGNoZWNraW5nIGRvbmUgb24gYnl0ZXMgb3IgY2hhcmFjdGVycz8gKFNob3VsZCBiZSBieXRlcy4pCisgICAgICAgIG91dC5zZXRDb21tZW50KG51bGwpOworICAgICAgICBvdXQuc2V0Q29tbWVudChtYWtlU3RyaW5nKDB4ZmZmZiwgImEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQuc2V0Q29tbWVudChtYWtlU3RyaW5nKDB4ZmZmZiArIDEsICJhIikpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LnNldENvbW1lbnQobWFrZVN0cmluZygweGZmZmYsICJcdTA2NjYiKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoImEiKTsKKworICAgICAgICAvLyBJcyBlbnRyeSBjb21tZW50IGxlbmd0aCBjaGVja2luZyBkb25lIG9uIGJ5dGVzIG9yIGNoYXJhY3RlcnM/IChTaG91bGQgYmUgYnl0ZXMuKQorICAgICAgICB6ZS5zZXRDb21tZW50KG51bGwpOworICAgICAgICB6ZS5zZXRDb21tZW50KG1ha2VTdHJpbmcoMHhmZmZmLCAiYSIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHplLnNldENvbW1lbnQobWFrZVN0cmluZygweGZmZmYgKyAxLCAiYSIpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHplLnNldENvbW1lbnQobWFrZVN0cmluZygweGZmZmYsICJcdTA2NjYiKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgemUuc2V0Q29tbWVudChleHBlY3RlZEVudHJ5Q29tbWVudCk7CisgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICBvdXQuY2xvc2VFbnRyeSgpOworCisgICAgICAgIG91dC5zZXRDb21tZW50KGV4cGVjdGVkRmlsZUNvbW1lbnQpOworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKKyAgICAgICAgLy8gVE9ETzogdGhlcmUncyBjdXJyZW50bHkgbm8gQVBJIGZvciByZWFkaW5nIHRoZSBmaWxlIGNvbW1lbnQgLS0tIHN0cmluZ3MoMSkgdGhlIGZpbGU/CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEVudHJ5Q29tbWVudCwgemlwRmlsZS5nZXRFbnRyeSgiYSIpLmdldENvbW1lbnQoKSk7CisgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUxlbmd0aENoZWNrcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIElzIGVudHJ5IG5hbWUgbGVuZ3RoIGNoZWNraW5nIGRvbmUgb24gYnl0ZXMgb3IgY2hhcmFjdGVycz8KKyAgICAgICAgLy8gUmVhbGx5IGl0IHNob3VsZCBiZSBieXRlcywgYnV0IHRoZSBSSSBvbmx5IGNoZWNrcyBjaGFyYWN0ZXJzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICAgICAgICAvLyBBbmRyb2lkIGRvZXMgdGhlIHNhbWUsIGJlY2F1c2UgaXQncyBjaGVhcC4uLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFppcEVudHJ5KChTdHJpbmcpIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIG5ldyBaaXBFbnRyeShtYWtlU3RyaW5nKDB4ZmZmZiwgImEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgWmlwRW50cnkobWFrZVN0cmluZygweGZmZmYgKyAxLCAiYSIpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyAuLi5idXQgQW5kcm9pZCB3b24ndCBsZXQgeW91IGNyZWF0ZSBhIHppcCBmaWxlIHdpdGggYSB0cnVuY2F0ZWQgbmFtZS4KKyAgICAgICAgWmlwT3V0cHV0U3RyZWFtIG91dCA9IGNyZWF0ZVppcE91dHB1dFN0cmVhbShjcmVhdGVUZW1wb3JhcnlaaXBGaWxlKCkpOworICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShtYWtlU3RyaW5nKDB4ZmZmZiwgIlx1MDY2NiIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICAgICAgZmFpbCgpOyAvLyBUaGUgUkkgZmFpbHMgdGhpcyB0ZXN0OyBpdCBqdXN0IGNoZWNrcyB0aGUgY2hhcmFjdGVyIGNvdW50IGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBvdXQuY2xvc2VFbnRyeSgpOworICAgICAgICBvdXQucHV0TmV4dEVudHJ5KG5ldyBaaXBFbnRyeSgib2theSIpKTsgLy8gWmlwT3V0cHV0U3RyZWFtLmNsb3NlIHRocm93cyBpZiB5b3UgYWRkIG5vdGhpbmchCisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeSgidGVzdCIpOworICAgICAgICB6ZS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKKyAgICAgICAgemUuc2V0U2l6ZSg0KTsKKworICAgICAgICAvLyBzZXRDcmMgdGFrZXMgYSBsb25nLCBub3QgYW4gaW50LCBzbyAtMSBpc24ndCBhIHZhbGlkIENSQzMyIChiZWNhdXNlIGl0J3MgNjQgYml0cykuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB6ZS5zZXRDcmMoLTEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFlvdSBjYW4gc2V0IHRoZSBDUkMzMiB0byAweGZmZmZmZmZmIGlmIHlvdSdyZSBzbGlnaHRseSBtb3JlIGNhcmVmdWwgdGhvdWdoLi4uCisgICAgICAgIHplLnNldENyYygweGZmZmZmZmZmTCk7CisgICAgICAgIGFzc2VydEVxdWFscygweGZmZmZmZmZmTCwgemUuZ2V0Q3JjKCkpOworCisgICAgICAgIC8vIEFuZCBpdCBhY3R1YWxseSB3b3JrcywgZXZlbiB0aG91Z2ggd2UgdXNlIC0xTCB0byBtZWFuICJubyBDUkMgc2V0Ii4uLgorICAgICAgICBaaXBPdXRwdXRTdHJlYW0gb3V0ID0gY3JlYXRlWmlwT3V0cHV0U3RyZWFtKGNyZWF0ZVRlbXBvcmFyeVppcEZpbGUoKSk7CisgICAgICAgIG91dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICBvdXQud3JpdGUoLTEpOworICAgICAgICBvdXQud3JpdGUoLTEpOworICAgICAgICBvdXQud3JpdGUoLTEpOworICAgICAgICBvdXQud3JpdGUoLTEpOworICAgICAgICBvdXQuY2xvc2VFbnRyeSgpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9jcnlwdG8vQ2lwaGVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YXgvY3J5cHRvL0NpcGhlclRlc3QuamF2YQppbmRleCA2OGE0NmYzLi45ZjE5ZWVmIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9jcnlwdG8vQ2lwaGVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L2NyeXB0by9DaXBoZXJUZXN0LmphdmEKQEAgLTU4LDYgKzU4LDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgbGliY29yZS5qYXZhLnNlY3VyaXR5LlN0YW5kYXJkTmFtZXM7CiBpbXBvcnQgbGliY29yZS5qYXZhLnNlY3VyaXR5LlRlc3RLZXlTdG9yZTsKK2ltcG9ydCBsaWJjb3JlLnV0aWwuRW1wdHlBcnJheTsKIAogcHVibGljIGZpbmFsIGNsYXNzIENpcGhlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTY3LDcgKzY4LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFFU19QUk9WSURFUlMgPSAoKFN0YW5kYXJkTmFtZXMuSVNfUkkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBTdHJpbmdbXSB7ICJTdW5KQ0UiIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFN0cmluZ1tdIHsgIkJDIiB9KTsgLy8gVE9PRDogLCAiQW5kcm9pZE9wZW5TU0wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTdHJpbmdbXSB7ICJCQyIsICJBbmRyb2lkT3BlblNTTCIgfSk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1VOTElNSVRFRDsKICAgICBzdGF0aWMgewpAQCAtMTE4LDE0ICsxMTksMTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgaW50IGdldEVuY3J5cHRNb2RlKFN0cmluZyBhbGdvcml0aG0pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNXcmFwKGFsZ29yaXRobSkpIHsKKyAgICAgICAgaWYgKGlzT25seVdyYXBwaW5nQWxnb3JpdGhtKGFsZ29yaXRobSkpIHsKICAgICAgICAgICAgIHJldHVybiBDaXBoZXIuV1JBUF9NT0RFOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBDaXBoZXIuRU5DUllQVF9NT0RFOwogICAgIH0KIAogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBpbnQgZ2V0RGVjcnlwdE1vZGUoU3RyaW5nIGFsZ29yaXRobSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1dyYXAoYWxnb3JpdGhtKSkgeworICAgICAgICBpZiAoaXNPbmx5V3JhcHBpbmdBbGdvcml0aG0oYWxnb3JpdGhtKSkgewogICAgICAgICAgICAgcmV0dXJuIENpcGhlci5VTldSQVBfTU9ERTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQ2lwaGVyLkRFQ1JZUFRfTU9ERTsKQEAgLTIwNSw3ICsyMDYsNyBAQAogICAgICAgICByZXR1cm4gZ2V0QmFzZUFsZ29yaXRobShhbGdvcml0aG0pLmVxdWFscygiUlNBIik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dyYXAoU3RyaW5nIGFsZ29yaXRobSkgeworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPbmx5V3JhcHBpbmdBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgewogICAgICAgICByZXR1cm4gYWxnb3JpdGhtLmVuZHNXaXRoKCJXUkFQIik7CiAgICAgfQogCkBAIC0yMjksOSArMjMwLDYgQEAKICAgICAgICAgICAgIGtleSA9IHNrZi5nZW5lcmF0ZVNlY3JldChuZXcgUEJFS2V5U3BlYygic2VjcmV0Ii50b0NoYXJBcnJheSgpKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoZ2V0QmFzZUFsZ29yaXRobShhbGdvcml0aG0pKTsKLSAgICAgICAgICAgIGlmIChTdGFuZGFyZE5hbWVzLklTX1JJICYmIGFsZ29yaXRobS5lcXVhbHMoIkFFUyIpKSB7Ci0gICAgICAgICAgICAgICAga2cuaW5pdCgxMjgpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAga2V5ID0ga2cuZ2VuZXJhdGVLZXkoKTsKICAgICAgICAgfQogICAgICAgICBFTkNSWVBUX0tFWVMucHV0KGFsZ29yaXRobSwga2V5KTsKQEAgLTY4NSwxMiArNjgzLDE2IEBACiAKICAgICAgICAgaW50IGVuY3J5cHRNb2RlID0gZ2V0RW5jcnlwdE1vZGUoYWxnb3JpdGhtKTsKICAgICAgICAgYy5pbml0KGVuY3J5cHRNb2RlLCBlbmNyeXB0S2V5LCBzcGVjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNpcGhlcklELCBnZXRFeHBlY3RlZEJsb2NrU2l6ZShhbGdvcml0aG0sIGVuY3J5cHRNb2RlLCBwcm92aWRlck5hbWUpLCBjLmdldEJsb2NrU2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNpcGhlcklELCBnZXRFeHBlY3RlZE91dHB1dFNpemUoYWxnb3JpdGhtLCBlbmNyeXB0TW9kZSwgcHJvdmlkZXJOYW1lKSwgYy5nZXRPdXRwdXRTaXplKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNpcGhlcklEICsgIiBnZXRCbG9ja1NpemUoKSIsCisgICAgICAgICAgICAgICAgICAgICBnZXRFeHBlY3RlZEJsb2NrU2l6ZShhbGdvcml0aG0sIGVuY3J5cHRNb2RlLCBwcm92aWRlck5hbWUpLCBjLmdldEJsb2NrU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNpcGhlcklEICsgIiBnZXRPdXRwdXRTaXplKDApIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldEV4cGVjdGVkT3V0cHV0U2l6ZShhbGdvcml0aG0sIGVuY3J5cHRNb2RlLCBwcm92aWRlck5hbWUpLCBjLmdldE91dHB1dFNpemUoMCkpOwogICAgICAgICBpbnQgZGVjcnlwdE1vZGUgPSBnZXREZWNyeXB0TW9kZShhbGdvcml0aG0pOwogICAgICAgICBjLmluaXQoZGVjcnlwdE1vZGUsIGVuY3J5cHRLZXksIHNwZWMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2lwaGVySUQsIGdldEV4cGVjdGVkQmxvY2tTaXplKGFsZ29yaXRobSwgZGVjcnlwdE1vZGUsIHByb3ZpZGVyTmFtZSksIGMuZ2V0QmxvY2tTaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2lwaGVySUQsIGdldEV4cGVjdGVkT3V0cHV0U2l6ZShhbGdvcml0aG0sIGRlY3J5cHRNb2RlLCBwcm92aWRlck5hbWUpLCBjLmdldE91dHB1dFNpemUoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2lwaGVySUQgKyAiIGdldEJsb2NrU2l6ZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldEV4cGVjdGVkQmxvY2tTaXplKGFsZ29yaXRobSwgZGVjcnlwdE1vZGUsIHByb3ZpZGVyTmFtZSksIGMuZ2V0QmxvY2tTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2lwaGVySUQgKyAiIGdldE91dHB1dFNpemUoMCkiLAorICAgICAgICAgICAgICAgICAgICAgZ2V0RXhwZWN0ZWRPdXRwdXRTaXplKGFsZ29yaXRobSwgZGVjcnlwdE1vZGUsIHByb3ZpZGVyTmFtZSksIGMuZ2V0T3V0cHV0U2l6ZSgwKSk7CiAKICAgICAgICAgLy8gVE9ETzogdGVzdCBDaXBoZXIuZ2V0SVYoKQogCkBAIC02OTgsMjQgKzcwMCwzNiBAQAogCiAgICAgICAgIGFzc2VydE51bGwoY2lwaGVySUQsIGMuZ2V0RXhlbXB0aW9uTWVjaGFuaXNtKCkpOwogCi0gICAgICAgIGMuaW5pdChnZXRFbmNyeXB0TW9kZShhbGdvcml0aG0pLCBlbmNyeXB0S2V5LCBzcGVjKTsKLSAgICAgICAgaWYgKGlzV3JhcChhbGdvcml0aG0pKSB7Ci0gICAgICAgICAgICBieXRlW10gY2lwaGVyVGV4dCA9IGMud3JhcChlbmNyeXB0S2V5KTsKLSAgICAgICAgICAgIGMuaW5pdChnZXREZWNyeXB0TW9kZShhbGdvcml0aG0pLCBnZXREZWNyeXB0S2V5KGFsZ29yaXRobSksIHNwZWMpOwotICAgICAgICAgICAgaW50IGtleVR5cGUgPSAoaXNBc3ltbWV0cmljKGFsZ29yaXRobSkpID8gQ2lwaGVyLlBSSVZBVEVfS0VZIDogQ2lwaGVyLlNFQ1JFVF9LRVk7Ci0gICAgICAgICAgICBLZXkgZGVjcnlwdGVkS2V5ID0gYy51bndyYXAoY2lwaGVyVGV4dCwgZW5jcnlwdEtleS5nZXRBbGdvcml0aG0oKSwga2V5VHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVuY3J5cHRLZXkuZ2V0QWxnb3JpdGhtKCk9IiArIGVuY3J5cHRLZXkuZ2V0QWxnb3JpdGhtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVjcnlwdGVkS2V5LmdldEFsZ29yaXRobSgpPSIgKyBkZWNyeXB0ZWRLZXkuZ2V0QWxnb3JpdGhtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIgZW5jcnlwdEtleS5nZXRFbmNvZGVkKCk9IiArIEFycmF5cy50b1N0cmluZyhlbmNyeXB0S2V5LmdldEVuY29kZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVjcnlwdGVkS2V5LmdldEVuY29kZWQoKT0iICsgQXJyYXlzLnRvU3RyaW5nKGRlY3J5cHRlZEtleS5nZXRFbmNvZGVkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRLZXksIGRlY3J5cHRlZEtleSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRlc3Qgd3JhcHBpbmcgYSBrZXkuICBFdmVyeSBjaXBoZXIgc2hvdWxkIGJlIGFibGUgdG8gd3JhcC4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBzbWFsbCBTZWNyZXRLZXkgZm9yIEFFUy4KKyAgICAgICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSgiQUVTIik7CisgICAgICAgICAgICBrZy5pbml0KDEyOCk7CisgICAgICAgICAgICBTZWNyZXRLZXkgc2sgPSBrZy5nZW5lcmF0ZUtleSgpOworCisgICAgICAgICAgICAvLyBXcmFwIGl0CisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLldSQVBfTU9ERSwgZW5jcnlwdEtleSwgc3BlYyk7CisgICAgICAgICAgICBieXRlW10gY2lwaGVyVGV4dCA9IGMud3JhcChzayk7CisKKyAgICAgICAgICAgIC8vIFVud3JhcCBpdAorICAgICAgICAgICAgYy5pbml0KENpcGhlci5VTldSQVBfTU9ERSwgZ2V0RGVjcnlwdEtleShhbGdvcml0aG0pLCBzcGVjKTsKKyAgICAgICAgICAgIEtleSBkZWNyeXB0ZWRLZXkgPSBjLnVud3JhcChjaXBoZXJUZXh0LCBzay5nZXRBbGdvcml0aG0oKSwgQ2lwaGVyLlNFQ1JFVF9LRVkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2lwaGVySUQKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNrLmdldEFsZ29yaXRobSgpPSIgKyBzay5nZXRBbGdvcml0aG0oKQorICAgICAgICAgICAgICAgICAgICArICIgZGVjcnlwdGVkS2V5LmdldEFsZ29yaXRobSgpPSIgKyBkZWNyeXB0ZWRLZXkuZ2V0QWxnb3JpdGhtKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVuY3J5cHRLZXkuZ2V0RW5jb2RlZCgpPSIgKyBBcnJheXMudG9TdHJpbmcoc2suZ2V0RW5jb2RlZCgpKQorICAgICAgICAgICAgICAgICAgICArICIgZGVjcnlwdGVkS2V5LmdldEVuY29kZWQoKT0iICsgQXJyYXlzLnRvU3RyaW5nKGRlY3J5cHRlZEtleS5nZXRFbmNvZGVkKCkpLAorICAgICAgICAgICAgICAgICAgICBzaywgZGVjcnlwdGVkS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNPbmx5V3JhcHBpbmdBbGdvcml0aG0oYWxnb3JpdGhtKSkgeworICAgICAgICAgICAgYy5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGVuY3J5cHRLZXksIHNwZWMpOwogICAgICAgICAgICAgYnl0ZVtdIGNpcGhlclRleHQgPSBjLmRvRmluYWwoT1JJR0lOQUxfUExBSU5fVEVYVCk7Ci0gICAgICAgICAgICBjLmluaXQoZ2V0RGVjcnlwdE1vZGUoYWxnb3JpdGhtKSwgZ2V0RGVjcnlwdEtleShhbGdvcml0aG0pLCBzcGVjKTsKKyAgICAgICAgICAgIGMuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBnZXREZWNyeXB0S2V5KGFsZ29yaXRobSksIHNwZWMpOwogICAgICAgICAgICAgYnl0ZVtdIGRlY3J5cHRlZFBsYWluVGV4dCA9IGMuZG9GaW5hbChjaXBoZXJUZXh0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaXBoZXJJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0RXhwZWN0ZWRQbGFpblRleHQoYWxnb3JpdGhtKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGRlY3J5cHRlZFBsYWluVGV4dCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNpcGhlcklELCBBcnJheXMudG9TdHJpbmcoZ2V0RXhwZWN0ZWRQbGFpblRleHQoYWxnb3JpdGhtKSksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhkZWNyeXB0ZWRQbGFpblRleHQpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTk4OSw3ICsyMDAzLDkgQEAKICAgICAgICAgICAgICAgICBjaGVja0NpcGhlcihwLCBwcm92aWRlcik7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkVycm9yIGVuY291bnRlcmVkIGNoZWNraW5nICIgKyBwLm1vZGUgKyAiLCBrZXlTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHAua2V5Lmxlbmd0aCAqIDgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICArIChwLmtleS5sZW5ndGggKiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggcHJvdmlkZXIgIiArIHByb3ZpZGVyICsgIlxuIik7CisKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDA5LDE4ICsyMDI1LDEwNCBAQAogICAgICAgICBjLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5LCBzcGVjKTsKIAogICAgICAgICBmaW5hbCBieXRlW10gYWN0dWFsQ2lwaGVydGV4dCA9IGMuZG9GaW5hbChwLnBsYWludGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhwLmNpcGhlcnRleHQsIGFjdHVhbENpcGhlcnRleHQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhwLmNpcGhlcnRleHQpLCBBcnJheXMudG9TdHJpbmcoYWN0dWFsQ2lwaGVydGV4dCkpOworCisgICAgICAgIGJ5dGVbXSBlbXB0eUNpcGhlclRleHQgPSBjLmRvRmluYWwoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbXB0eUNpcGhlclRleHQpOwogCiAgICAgICAgIGMuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBrZXksIHNwZWMpOwogCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBhY3R1YWxQbGFpbnRleHQgPSBjLmRvRmluYWwocC5jaXBoZXJ0ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHAucGxhaW50ZXh0LCBhY3R1YWxQbGFpbnRleHQpKTsKKyAgICAgICAgYnl0ZVtdIGVtcHR5UGxhaW5UZXh0ID0gYy5kb0ZpbmFsKGVtcHR5Q2lwaGVyVGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoRW1wdHlBcnJheS5CWVRFKSwgQXJyYXlzLnRvU3RyaW5nKGVtcHR5UGxhaW5UZXh0KSk7CisKKyAgICAgICAgLy8gZW1wdHkgZGVjcnlwdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RhbmRhcmROYW1lcy5JU19SSSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoRW1wdHlBcnJheS5CWVRFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGMuZG9GaW5hbCgpKSk7CisKKyAgICAgICAgICAgICAgICBjLnVwZGF0ZShFbXB0eUFycmF5LkJZVEUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoRW1wdHlBcnJheS5CWVRFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGMuZG9GaW5hbCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyLmVxdWFscygiQkMiKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGMuZG9GaW5hbCgpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjLnVwZGF0ZShFbXB0eUFycmF5LkJZVEUpOworICAgICAgICAgICAgICAgICAgICBjLmRvRmluYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyLmVxdWFscygiQW5kcm9pZE9wZW5TU0wiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoYy5kb0ZpbmFsKCkpOworCisgICAgICAgICAgICAgICAgYy51cGRhdGUoRW1wdHlBcnJheS5CWVRFKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGMuZG9GaW5hbCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJEZWZpbmUgeW91ciBiZWhhdmlvciBoZXJlIGZvciAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gLmRvRmluYWwoaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBhY3R1YWxQbGFpbnRleHQgPSBjLmRvRmluYWwocC5jaXBoZXJ0ZXh0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcocC5wbGFpbnRleHQpLCBBcnJheXMudG9TdHJpbmcoYWN0dWFsUGxhaW50ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAuZG9GaW5hbChpbnB1dCwgb2Zmc2V0LCBsZW4sIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGxhcmdlclRoYW5DaXBoZXJ0ZXh0ID0gbmV3IGJ5dGVbcC5jaXBoZXJ0ZXh0Lmxlbmd0aCArIDVdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwLmNpcGhlcnRleHQsIDAsIGxhcmdlclRoYW5DaXBoZXJ0ZXh0LCA1LCBwLmNpcGhlcnRleHQubGVuZ3RoKTsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGFjdHVhbFBsYWludGV4dCA9IG5ldyBieXRlW2MuZ2V0T3V0cHV0U2l6ZShwLmNpcGhlcnRleHQubGVuZ3RoKV07CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocC5wbGFpbnRleHQubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjLmRvRmluYWwobGFyZ2VyVGhhbkNpcGhlcnRleHQsIDUsIHAuY2lwaGVydGV4dC5sZW5ndGgsIGFjdHVhbFBsYWludGV4dCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhwLnBsYWludGV4dCksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhBcnJheXMuY29weU9mUmFuZ2UoYWN0dWFsUGxhaW50ZXh0LCAwLCBwLnBsYWludGV4dC5sZW5ndGgpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAuZG9GaW5hbChpbnB1dCwgb2Zmc2V0LCBsZW4sIG91dHB1dCwgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gbGFyZ2VyVGhhbkNpcGhlcnRleHQgPSBuZXcgYnl0ZVtwLmNpcGhlcnRleHQubGVuZ3RoICsgMTBdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwLmNpcGhlcnRleHQsIDAsIGxhcmdlclRoYW5DaXBoZXJ0ZXh0LCA1LCBwLmNpcGhlcnRleHQubGVuZ3RoKTsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGFjdHVhbFBsYWludGV4dCA9IG5ldyBieXRlW2MuZ2V0T3V0cHV0U2l6ZShwLmNpcGhlcnRleHQubGVuZ3RoKSArIDJdOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHAucGxhaW50ZXh0Lmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgYy5kb0ZpbmFsKGxhcmdlclRoYW5DaXBoZXJ0ZXh0LCA1LCBwLmNpcGhlcnRleHQubGVuZ3RoLCBhY3R1YWxQbGFpbnRleHQsIDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcocC5wbGFpbnRleHQpLAorICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoQXJyYXlzLmNvcHlPZlJhbmdlKGFjdHVhbFBsYWludGV4dCwgMSwgcC5wbGFpbnRleHQubGVuZ3RoICsgMSkpKTsKKyAgICAgICAgfQogCiAgICAgICAgIENpcGhlciBjTm9QYWQgPSBDaXBoZXIuZ2V0SW5zdGFuY2UocC5tb2RlICsgIi9Ob1BhZGRpbmciLCBwcm92aWRlcik7CiAgICAgICAgIGNOb1BhZC5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgc3BlYyk7CiAKICAgICAgICAgZmluYWwgYnl0ZVtdIGFjdHVhbFBsYWludGV4dFBhZGRlZCA9IGNOb1BhZC5kb0ZpbmFsKHAuY2lwaGVydGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhwLnBsYWludGV4dFBhZGRlZCwgYWN0dWFsUGxhaW50ZXh0UGFkZGVkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcocC5wbGFpbnRleHRQYWRkZWQpLCBBcnJheXMudG9TdHJpbmcoYWN0dWFsUGxhaW50ZXh0UGFkZGVkKSk7CisKKyAgICAgICAgLy8gVGVzdCB3cmFwcGluZyBhIGtleS4gRXZlcnkgY2lwaGVyIHNob3VsZCBiZSBhYmxlIHRvIHdyYXAuCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgc21hbGwgU2VjcmV0S2V5IGZvciBBRVMuCisgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkFFUyIpOworICAgICAgICAgICAga2cuaW5pdCgxMjgpOworICAgICAgICAgICAgU2VjcmV0S2V5IHNrID0ga2cuZ2VuZXJhdGVLZXkoKTsKKworICAgICAgICAgICAgLy8gV3JhcCBpdAorICAgICAgICAgICAgYy5pbml0KENpcGhlci5XUkFQX01PREUsIGtleSwgc3BlYyk7CisgICAgICAgICAgICBieXRlW10gY2lwaGVyVGV4dCA9IGMud3JhcChzayk7CisKKyAgICAgICAgICAgIC8vIFVud3JhcCBpdAorICAgICAgICAgICAgYy5pbml0KENpcGhlci5VTldSQVBfTU9ERSwga2V5LCBzcGVjKTsKKyAgICAgICAgICAgIEtleSBkZWNyeXB0ZWRLZXkgPSBjLnVud3JhcChjaXBoZXJUZXh0LCBzay5nZXRBbGdvcml0aG0oKSwgQ2lwaGVyLlNFQ1JFVF9LRVkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJzay5nZXRBbGdvcml0aG0oKT0iICsgc2suZ2V0QWxnb3JpdGhtKCkgKyAiIGRlY3J5cHRlZEtleS5nZXRBbGdvcml0aG0oKT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWNyeXB0ZWRLZXkuZ2V0QWxnb3JpdGhtKCkgKyAiIGVuY3J5cHRLZXkuZ2V0RW5jb2RlZCgpPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhzay5nZXRFbmNvZGVkKCkpICsgIiBkZWNyeXB0ZWRLZXkuZ2V0RW5jb2RlZCgpPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhkZWNyeXB0ZWRLZXkuZ2V0RW5jb2RlZCgpKSwgc2ssIGRlY3J5cHRlZEtleSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyX1Nob3J0QmxvY2tfRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjAzNyw3ICsyMTM5LDggQEAKICAgICAgICAgICAgICAgICBjaGVja0NpcGhlcl9TaG9ydEJsb2NrX0ZhaWx1cmUocCwgcHJvdmlkZXIpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJFcnJvciBlbmNvdW50ZXJlZCBjaGVja2luZyAiICsgcC5tb2RlICsgIiwga2V5U2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwLmtleS5sZW5ndGggKiA4KSArICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgKyAocC5rZXkubGVuZ3RoICogOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHByb3ZpZGVyICIgKyBwcm92aWRlciArICJcbiIpOwogICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNjUsNCArMjI2OCw3MCBAQAogICAgICAgICB9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UkM0X011bHRpcGxlS2V5U2l6ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFNNQUxMRVNUX0tFWV9TSVpFID0gNDA7CisgICAgICAgIGZpbmFsIGludCBMQVJHRVNUX0tFWV9TSVpFID0gMTAyNDsKKworICAgICAgICAvKiBNYWtlIGFuIGFycmF5IG9mIGtleXMgZm9yIG91ciB0ZXN0cyAqLworICAgICAgICBTZWNyZXRLZXlbXSBrZXlzID0gbmV3IFNlY3JldEtleVtMQVJHRVNUX0tFWV9TSVpFIC0gU01BTExFU1RfS0VZX1NJWkVdOworICAgICAgICB7CisgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkFSQzQiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGtleXNpemUgPSBTTUFMTEVTVF9LRVlfU0laRTsga2V5c2l6ZSA8IExBUkdFU1RfS0VZX1NJWkU7IGtleXNpemUrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGtleXNpemUgLSBTTUFMTEVTVF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICBrZy5pbml0KGtleXNpemUpOworICAgICAgICAgICAgICAgIGtleXNbaW5kZXhdID0ga2cuZ2VuZXJhdGVLZXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGlzIHRvIGNvbXBhcmUgdGhlIG91dHB1dCBvZiB0aGUgZmlyc3QgcHJvdmlkZXIgYWdhaW5zdAorICAgICAgICAgKiBzdWJzZXF1ZW50IHByb3ZpZGVycy4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tMQVJHRVNUX0tFWV9TSVpFIC0gU01BTExFU1RfS0VZX1NJWkVdOworCisgICAgICAgIC8qIEZpbmQgYWxsIHByb3ZpZGVycyB0aGF0IHByb3ZpZGUgQVJDNC4gV2UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSEgKi8KKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmaWx0ZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgZmlsdGVyLnB1dCgiQ2lwaGVyLkFSQzQiLCAiIik7CisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKGZpbHRlcik7CisgICAgICAgIGFzc2VydFRydWUoIlRoZXJlIG11c3QgYmUgc2VjdXJpdHkgcHJvdmlkZXJzIG9mIENpcGhlci5BUkM0IiwgcHJvdmlkZXJzLmxlbmd0aCA+IDApOworCisgICAgICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhpcyBmb3IgbGF0ZXIgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAgICAgU3RyaW5nIGZpcnN0UHJvdmlkZXIgPSBwcm92aWRlcnNbMF0uZ2V0TmFtZSgpOworCisgICAgICAgIGZvciAoUHJvdmlkZXIgcCA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgQ2lwaGVyIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFSQzQiLCBwKTsKKworICAgICAgICAgICAgZm9yIChpbnQga2V5c2l6ZSA9IFNNQUxMRVNUX0tFWV9TSVpFOyBrZXlzaXplIDwgTEFSR0VTVF9LRVlfU0laRTsga2V5c2l6ZSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0ga2V5c2l6ZSAtIFNNQUxMRVNUX0tFWV9TSVpFOworICAgICAgICAgICAgICAgIGZpbmFsIFNlY3JldEtleSBzayA9IGtleXNbaW5kZXhdOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUZXN0IHRoYXQgZW5jcnlwdGlvbiB3b3Jrcy4gRG9uaWcgdGhpcyBpbiBhIGxvb3AgYWxzbyBoYXMgdGhlCisgICAgICAgICAgICAgICAgICogYmVuZWZpdCBvZiB0ZXN0aW5nIHRoYXQgcmUtaW5pdGlhbGl6YXRpb24gd29ya3MgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBjaXBoZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYy5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIHNrKTsKKyAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyVGV4dCA9IGMuZG9GaW5hbChPUklHSU5BTF9QTEFJTl9URVhUKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNpcGhlclRleHQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb21wYXJlIHByb3ZpZGVycyBhZ2FpbnN0IGVhY2hvdGhlciB0byBtYWtlIHN1cmUgdGhleSdyZSBhbGwKKyAgICAgICAgICAgICAgICAgKiBpbiBhZ3JlZW1lbnQuIFRoaXMgaGVscHMgd2hlbiB5b3UgYWRkIGEgYnJhbmQgbmV3IHByb3ZpZGVyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFtpbmRleF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpbmRleF0gPSBBcnJheXMudG9TdHJpbmcoY2lwaGVyVGV4dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0UHJvdmlkZXIgKyAiIHNob3VsZCBvdXRwdXQgdGhlIHNhbWUgYXMgIiArIHAuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBrZXkgc2l6ZSAiICsga2V5c2l6ZSwgZXhwZWN0ZWRbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhjaXBoZXJUZXh0KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYy5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHNrKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYWN0dWFsUGxhaW50ZXh0ID0gYy5kb0ZpbmFsKGNpcGhlclRleHQpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiS2V5IHNpemU6ICIgKyBrZXlzaXplLCBBcnJheXMudG9TdHJpbmcoT1JJR0lOQUxfUExBSU5fVEVYVCksCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoYWN0dWFsUGxhaW50ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YXgvbmV0L3NzbC9EZWZhdWx0SG9zdG5hbWVWZXJpZmllclRlc3QuamF2YQppbmRleCA3Y2I3NzkyLi42OWFlMWMxIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL0RlZmF1bHRIb3N0bmFtZVZlcmlmaWVyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvRGVmYXVsdEhvc3RuYW1lVmVyaWZpZXJUZXN0LmphdmEKQEAgLTMxLDcgKzMxLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuRGVmYXVsdEhvc3RuYW1lVmVyaWZpZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5EaXN0aW5ndWlzaGVkTmFtZVBhcnNlcjsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKQEAgLTQyLDM5ICs0MSw2IEBACiAKICAgICBwcml2YXRlIGZpbmFsIERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKCk7CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RDbigpIHsKLSAgICAgICAgYXNzZXJ0Rmlyc3RDbigiIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEZpcnN0Q24oIm91PXh4eCIsIG51bGwpOwotICAgICAgICBhc3NlcnRGaXJzdENuKCJvdT14eHgsY249eHh4IiwgInh4eCIpOwotICAgICAgICBhc3NlcnRGaXJzdENuKCJvdT14eHgrY249eXl5LGNuPXp6eitjbj1hYmMiLCAieXl5Iik7Ci0gICAgICAgIGFzc2VydEZpcnN0Q24oImNuPWEsY249YiIsICJhIik7Ci0gICAgICAgIGFzc2VydEZpcnN0Q24oImNuPUNjLGNuPUJiLGNuPUFhIiwgIkNjIik7Ci0gICAgICAgIGFzc2VydEZpcnN0Q24oImNuPWltYXAuZ21haWwuY29tIiwgImltYXAuZ21haWwuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0Q25XaXRoT2lkKCkgewotICAgICAgICBhc3NlcnRGaXJzdENuKCIyLjUuNC4zPWEsb3U9eHh4IiwgImEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RDbldpdGhRdW90ZWRTdHJpbmdzKCkgewotICAgICAgICBhc3NlcnRGaXJzdENuKCJjbj1cIlxcXCIgYSAsPTw+IztcIiIsICJcIiBhICw9PD4jOyIpOwotICAgICAgICBhc3NlcnRGaXJzdENuKCJjbj1hYmNcXCxkZWYiLCAiYWJjLGRlZiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaXJzdENuV2l0aFV0ZjgoKSB7Ci0gICAgICAgIGFzc2VydEZpcnN0Q24oImNuPUx1XFxDNFxcOERpXFxDNFxcODciLCAiXHUwMDRjXHUwMDc1XHUwMTBkXHUwMDY5XHUwMTA3Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0Q25XaXRoV2hpdGVzcGFjZSgpIHsKLSAgICAgICAgYXNzZXJ0Rmlyc3RDbigib3U9YSwgY249ICBhICBiICAsbz14IiwgImEgIGIiKTsKLSAgICAgICAgYXNzZXJ0Rmlyc3RDbigiY249XCIgIGEgIGIgIFwiICxvPXgiLCAiICBhICBiICAiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Rmlyc3RDbihTdHJpbmcgZG4sIFN0cmluZyBleHBlY3RlZCkgewotICAgICAgICBYNTAwUHJpbmNpcGFsIHByaW5jaXBhbCA9IG5ldyBYNTAwUHJpbmNpcGFsKGRuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkbjoiICsgZG4sIGV4cGVjdGVkLCBuZXcgRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXIocHJpbmNpcGFsKS5maW5kKCJjbiIpKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5KCkgewogICAgICAgICBhc3NlcnRUcnVlKHZlcmlmaWVyLnZlcmlmeSgiaW1hcC5nLmNvbSIsIG5ldyBTdHViWDUwOUNlcnRpZmljYXRlKCJjbj1pbWFwLmcuY29tIikpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UodmVyaWZpZXIudmVyaWZ5KCJpbWFwLmcuY29tIiwgbmV3IFN0dWJYNTA5Q2VydGlmaWNhdGUoImNuPWltYXAyLmcuY29tIikpKTsKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL0Rpc3Rpbmd1aXNoZWROYW1lUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2M2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL0Rpc3Rpbmd1aXNoZWROYW1lUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGxpYmNvcmUuamF2YXgubmV0LnNzbDsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgZmluYWwgY2xhc3MgRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaXJzdENuKCkgeworICAgICAgICBhc3NlcnRGaXJzdENuKCIiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Rmlyc3RDbigib3U9eHh4IiwgbnVsbCk7CisgICAgICAgIGFzc2VydEZpcnN0Q24oIm91PXh4eCxjbj14eHgiLCAieHh4Iik7CisgICAgICAgIGFzc2VydEZpcnN0Q24oIm91PXh4eCtjbj15eXksY249enp6K2NuPWFiYyIsICJ5eXkiKTsKKyAgICAgICAgYXNzZXJ0Rmlyc3RDbigiY249YSxjbj1iIiwgImEiKTsKKyAgICAgICAgYXNzZXJ0Rmlyc3RDbigiY249Q2MsY249QmIsY249QWEiLCAiQ2MiKTsKKyAgICAgICAgYXNzZXJ0Rmlyc3RDbigiY249aW1hcC5nbWFpbC5jb20iLCAiaW1hcC5nbWFpbC5jb20iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RDbldpdGhPaWQoKSB7CisgICAgICAgIGFzc2VydEZpcnN0Q24oIjIuNS40LjM9YSxvdT14eHgiLCAiYSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaXJzdENuV2l0aFF1b3RlZFN0cmluZ3MoKSB7CisgICAgICAgIGFzc2VydEZpcnN0Q24oImNuPVwiXFxcIiBhICw9PD4jO1wiIiwgIlwiIGEgLD08PiM7Iik7CisgICAgICAgIGFzc2VydEZpcnN0Q24oImNuPWFiY1xcLGRlZiIsICJhYmMsZGVmIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0Q25XaXRoVXRmOCgpIHsKKyAgICAgICAgYXNzZXJ0Rmlyc3RDbigiY249THVcXEM0XFw4RGlcXEM0XFw4NyIsICJcdTAwNGNcdTAwNzVcdTAxMGRcdTAwNjlcdTAxMDciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RDbldpdGhXaGl0ZXNwYWNlKCkgeworICAgICAgICBhc3NlcnRGaXJzdENuKCJvdT1hLCBjbj0gIGEgIGIgICxvPXgiLCAiYSAgYiIpOworICAgICAgICBhc3NlcnRGaXJzdENuKCJjbj1cIiAgYSAgYiAgXCIgLG89eCIsICIgIGEgIGIgICIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGaXJzdENuKFN0cmluZyBkbiwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgICAgIFg1MDBQcmluY2lwYWwgcHJpbmNpcGFsID0gbmV3IFg1MDBQcmluY2lwYWwoZG4pOworICAgICAgICBhc3NlcnRFcXVhbHMoZG4sIGV4cGVjdGVkLCBuZXcgRGlzdGluZ3Vpc2hlZE5hbWVQYXJzZXIocHJpbmNpcGFsKS5maW5kTW9zdFNwZWNpZmljKCJjbiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL1NTTFNvY2tldFRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvU1NMU29ja2V0VGVzdC5qYXZhCmluZGV4IDQwOTUwODEuLjMzMWI5ODEgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvU1NMU29ja2V0VGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvU1NMU29ja2V0VGVzdC5qYXZhCkBAIC00NSwxMSArNDUsMTMgQEAKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnM7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldDsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXI7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IGxpYmNvcmUuamF2YS5zZWN1cml0eS5TdGFuZGFyZE5hbWVzOwogaW1wb3J0IGxpYmNvcmUuamF2YS5zZWN1cml0eS5UZXN0S2V5U3RvcmU7CkBAIC03MSw0MSArNzMsNTEgQEAKICAgICAgICAgICAgICAgICAuYWxpYXNQcmVmaXgoInJzYS1kc2EtZWMiKQogICAgICAgICAgICAgICAgIC5jYSh0cnVlKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgaWYgKFN0YW5kYXJkTmFtZXMuSVNfUkkpIHsKICAgICAgICAgICAgIHRlc3RfU1NMU29ja2V0X2dldFN1cHBvcnRlZENpcGhlclN1aXRlc19jb25uZWN0KHRlc3RLZXlTdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkTmFtZXMuSlNTRV9QUk9WSURFUl9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmROYW1lcy5KU1NFX1BST1ZJREVSX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogICAgICAgICB9IGVsc2UgIHsKICAgICAgICAgICAgIHRlc3RfU1NMU29ja2V0X2dldFN1cHBvcnRlZENpcGhlclN1aXRlc19jb25uZWN0KHRlc3RLZXlTdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYXJtb255SlNTRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFybW9ueUpTU0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKICAgICAgICAgICAgIHRlc3RfU1NMU29ja2V0X2dldFN1cHBvcnRlZENpcGhlclN1aXRlc19jb25uZWN0KHRlc3RLZXlTdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbmRyb2lkT3BlblNTTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZE9wZW5TU0wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKICAgICAgICAgICAgIHRlc3RfU1NMU29ja2V0X2dldFN1cHBvcnRlZENpcGhlclN1aXRlc19jb25uZWN0KHRlc3RLZXlTdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYXJtb255SlNTRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZE9wZW5TU0wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiAgICAgICAgICAgICB0ZXN0X1NTTFNvY2tldF9nZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXNfY29ubmVjdCh0ZXN0S2V5U3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZE9wZW5TU0wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhcm1vbnlKU1NFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKICAgICAgICAgfQotCisgICAgICAgIGlmIChlcnJvci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk9uZSBvciBtb3JlIHByb2JsZW1zIGluICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGVzdF9TU0xTb2NrZXRfZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzX2Nvbm5lY3Q6XG4iICsgZXJyb3IpOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgdm9pZCB0ZXN0X1NTTFNvY2tldF9nZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXNfY29ubmVjdChUZXN0S2V5U3RvcmUgdGVzdEtleVN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50UHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXJQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjbGllbnRTZWN1cmVSZW5lZ290aWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcnZlclNlY3VyZVJlbmVnb3RpYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VydmVyU2VjdXJlUmVuZWdvdGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvcikKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFN0cmluZyBjbGllbnRUb1NlcnZlclN0cmluZyA9ICJ0aGlzIGlzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIuLi4iOwpAQCAtMTgwLDEwICsxOTIsMTMgQEAKICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShlcnJvckV4cGVjdGVkKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBtYXliZUV4cGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlByb2JsZW0gdHJ5aW5nIHRvIGNvbm5lY3QgY2lwaGVyIHN1aXRlICIgKyBjaXBoZXJTdWl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjbGllbnQ9IiArIGNsaWVudFByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlcnZlcj0iICsgc2VydmVyUHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVFeHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gKCJQcm9ibGVtIHRyeWluZyB0byBjb25uZWN0IGNpcGhlciBzdWl0ZSAiICsgY2lwaGVyU3VpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNsaWVudD0iICsgY2xpZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlcnZlcj0iICsgc2VydmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIG1heWJlRXhwZWN0ZWQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKCdcbicpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzMwLDYgKzc0NSw0NyBAQAogICAgICAgICBjLmNsb3NlKCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdF9TU0xTb2NrZXRfVHJ1c3RNYW5hZ2VyUnVudGltZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0U1NMQ29udGV4dCBjID0gVGVzdFNTTENvbnRleHQuY3JlYXRlKCk7CisgICAgICAgIFNTTENvbnRleHQgY2xpZW50Q29udGV4dCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMUyIpOworICAgICAgICBYNTA5VHJ1c3RNYW5hZ2VyIHRydXN0TWFuYWdlciA9IG5ldyBYNTA5VHJ1c3RNYW5hZ2VyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNoZWNrQ2xpZW50VHJ1c3RlZChYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiwgU3RyaW5nIGF1dGhUeXBlKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNoZWNrU2VydmVyVHJ1c3RlZChYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiwgU3RyaW5nIGF1dGhUeXBlKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7ICAvLyB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBjdXN0b20gVHJ1c3RNYW5hZ2VyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldEFjY2VwdGVkSXNzdWVycygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgY2xpZW50Q29udGV4dC5pbml0KG51bGwsIG5ldyBUcnVzdE1hbmFnZXJbXSB7IHRydXN0TWFuYWdlciB9LCBudWxsKTsKKyAgICAgICAgU1NMU29ja2V0IGNsaWVudCA9IChTU0xTb2NrZXQpIGNsaWVudENvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpLmNyZWF0ZVNvY2tldChjLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wb3J0KTsKKyAgICAgICAgZmluYWwgU1NMU29ja2V0IHNlcnZlciA9IChTU0xTb2NrZXQpIGMuc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgRnV0dXJlPFZvaWQ+IGZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydEhhbmRzaGFrZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnN0YXJ0SGFuZHNoYWtlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHdvdWxkIGdldCBhIFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBjaGVja1NlcnZlclRydXN0ZWQuCisgICAgICAgIH0KKyAgICAgICAgZnV0dXJlLmdldCgpOworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyLmNsb3NlKCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NTTFNvY2tldF9nZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVGVzdFNTTENvbnRleHQgYyA9IFRlc3RTU0xDb250ZXh0LmNyZWF0ZSgpOwogICAgICAgICBTU0xTb2NrZXQgY2xpZW50ID0gKFNTTFNvY2tldCkgYy5jbGllbnRDb250ZXh0LmdldFNvY2tldEZhY3RvcnkoKS5jcmVhdGVTb2NrZXQoYy5ob3N0LApkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5VGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXJGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDhhM2ZlMjUuLmFkOTMxYWYgMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmF4L25ldC9zc2wvVHJ1c3RNYW5hZ2VyRmFjdG9yeVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZheC9uZXQvc3NsL1RydXN0TWFuYWdlckZhY3RvcnlUZXN0LmphdmEKQEAgLTUzLDE3ICs1MywyMCBAQAogICAgICAgICByZXR1cm4gVEVTVF9LRVlfU1RPUkU7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycyhTdHJpbmcgYWxnb3JpdGhtKSB7CisgICAgICAgIHJldHVybiAoU3RhbmRhcmROYW1lcy5JU19SSSAmJiBhbGdvcml0aG0uZXF1YWxzKCJQS0lYIikpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeV9nZXREZWZhdWx0QWxnb3JpdGhtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YW5kYXJkTmFtZXMuVFJVU1RfTUFOQUdFUl9GQUNUT1JZX0RFRkFVTFQsIGFsZ29yaXRobSk7CiAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwotICAgICAgICB0ZXN0X1RydXN0TWFuYWdlckZhY3RvcnkodG1mLCBTdGFuZGFyZE5hbWVzLklTX1JJKTsKKyAgICAgICAgdGVzdF9UcnVzdE1hbmFnZXJGYWN0b3J5KHRtZik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXNlbGVzc01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycyBpbXBsZW1lbnRzIE1hbmFnZXJGYWN0b3J5UGFyYW1ldGVycyB7fQogCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeShUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMpCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeShUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZikKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnROb3ROdWxsKHRtZik7CiAgICAgICAgIGFzc2VydE5vdE51bGwodG1mLmdldEFsZ29yaXRobSgpKTsKQEAgLTEwMyw3ICsxMDYsNyBAQAogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHhjcyA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CiAgICAgICAgIFBLSVhCdWlsZGVyUGFyYW1ldGVycyBwYnAgPSBuZXcgUEtJWEJ1aWxkZXJQYXJhbWV0ZXJzKGdldFRlc3RLZXlTdG9yZSgpLmtleVN0b3JlLCB4Y3MpOwogICAgICAgICBDZXJ0UGF0aFRydXN0TWFuYWdlclBhcmFtZXRlcnMgY3B0bXAgPSBuZXcgQ2VydFBhdGhUcnVzdE1hbmFnZXJQYXJhbWV0ZXJzKHBicCk7Ci0gICAgICAgIGlmIChzdXBwb3J0c01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycykgeworICAgICAgICBpZiAoc3VwcG9ydHNNYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnModG1mLmdldEFsZ29yaXRobSgpKSkgewogICAgICAgICAgICAgdG1mLmluaXQoY3B0bXApOwogICAgICAgICAgICAgdGVzdF9UcnVzdE1hbmFnZXJGYWN0b3J5X2dldFRydXN0TWFuYWdlcnModG1mKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE3OSwxMSArMTgyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gc2VydmljZS5nZXRBbGdvcml0aG0oKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzID0gYWxnb3JpdGhtLmVxdWFscygiUEtJWCIpOwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbGdvcml0aG0sIHRtZi5nZXRBbGdvcml0aG0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeSh0bWYsIHN1cHBvcnRzTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9UcnVzdE1hbmFnZXJGYWN0b3J5KHRtZik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgewpAQCAtMTkxLDcgKzE5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsZ29yaXRobSwgdG1mLmdldEFsZ29yaXRobSgpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLCB0bWYuZ2V0UHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeSh0bWYsIHN1cHBvcnRzTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9UcnVzdE1hbmFnZXJGYWN0b3J5KHRtZik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgewpAQCAtMTk5LDcgKzIwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbGdvcml0aG0sIHRtZi5nZXRBbGdvcml0aG0oKSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcm92aWRlciwgdG1mLmdldFByb3ZpZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB0ZXN0X1RydXN0TWFuYWdlckZhY3RvcnkodG1mLCBzdXBwb3J0c01hbmFnZXJGYWN0b3J5UGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RfVHJ1c3RNYW5hZ2VyRmFjdG9yeSh0bWYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUveG1sL0RvbVRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9saWJjb3JlL3htbC9Eb21UZXN0LmphdmEKaW5kZXggODhkYTU2NS4uZTRkNGVjZCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL2xpYmNvcmUveG1sL0RvbVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvbGliY29yZS94bWwvRG9tVGVzdC5qYXZhCkBAIC0xNjU1LDYgKzE2NTUsMTkgQEAKICAgICAgICAgYXNzZXJ0TnVsbCh0ZXh0LmdldE5leHRTaWJsaW5nKCkpOwogICAgIH0KIAorICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MjQ1MzAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0QmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnQgZCA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgZC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoInJvb3QiKSk7CisgICAgICAgIGQuZ2V0Rmlyc3RDaGlsZCgpLmluc2VydEJlZm9yZShkLmNyZWF0ZUVsZW1lbnQoImZvbyIpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBkLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZC5nZXRGaXJzdENoaWxkKCkuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgIGQuZ2V0Rmlyc3RDaGlsZCgpLmluc2VydEJlZm9yZShkLmNyZWF0ZUVsZW1lbnQoImJhciIpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBkLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZC5nZXRGaXJzdENoaWxkKCkuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEJvbUFuZEJ5dGVJbnB1dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10geG1sID0gewogICAgICAgICAgICAgICAgIChieXRlKSAweGVmLCAoYnl0ZSkgMHhiYiwgKGJ5dGUpIDB4YmYsCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJGaWxlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9hcmNoaXZlL3Rlc3RzL2phdmEvdXRpbC9qYXIvSmFyRmlsZVRlc3QuamF2YQppbmRleCAyMjZlYTY2Li42NGExNzliIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2FyY2hpdmUvdGVzdHMvamF2YS91dGlsL2phci9KYXJGaWxlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvYXJjaGl2ZS90ZXN0cy9qYXZhL3V0aWwvamFyL0phckZpbGVUZXN0LmphdmEKQEAgLTY5LDYgKzY5LDEyIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqYXJOYW1lNSA9ICJoeXRzX3NpZ25lZF9pbmMuamFyIjsKIAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGphck5hbWU2ID0gImh5dHNfc2lnbmVkX3NoYTI1NndpdGhyc2EuamFyIjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGphck5hbWU3ID0gImh5dHNfc2lnbmVkX3NoYTI1NmRpZ2VzdF9zaGEyNTZ3aXRocnNhLmphciI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqYXJOYW1lOCA9ICJoeXRzX3NpZ25lZF9zaGE1MTJkaWdlc3Rfc2hhNTEyd2l0aGVjZHNhLmphciI7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlbnRyeU5hbWUgPSAiZm9vL2Jhci9BLmNsYXNzIjsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVudHJ5TmFtZTMgPSAiY291Y291L0ZpbGVBY2Nlc3MuY2xhc3MiOwpAQCAtNTIwLDcgKzUyNiw3IEBACiAgICAgLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBvbiBSSS4gSWYgZW50cnkgc2l6ZSBpcyBzZXQgdXAgaW5jb3JyZWN0bHksCiAgICAgLy8gU2VjdXJpdHlFeGNlcHRpb24gaXMgdGhyb3duLiBCdXQgU2VjdXJpdHlFeGNlcHRpb24gaXMgdGhyb3duIG9uIFJJIG9ubHkKICAgICAvLyBpZiBqYXIgZmlsZSBpcyBzaWduZWQgaW5jb3JyZWN0bHkuCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnB1dFN0cmVhbUxqYXZhX3V0aWxfamFyX0phckVudHJ5X3N1YnRlc3QwKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5wdXRTdHJlYW1MamF2YV91dGlsX2phcl9KYXJFbnRyeV9zdWJ0ZXN0MCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIHNpZ25lZEZpbGUgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3VwcG9ydF9SZXNvdXJjZXMuY29weUZpbGUocmVzb3VyY2VzLCBudWxsLCBqYXJOYW1lNCk7CkBAIC01ODIsNiArNTg4LDQyIEBACiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZHVyaW5nIHRlc3QgNTogIiArIGUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gU0hBMSBkaWdlc3QsIFNIQTI1NndpdGhSU0Egc2lnbmVkIEpBUgorICAgICAgICBjaGVja1NpZ25lZEphcihqYXJOYW1lNik7CisKKyAgICAgICAgLy8gU0hBLTI1NiBkaWdlc3QsIFNIQTI1NndpdGhSU0Egc2lnbmVkIEpBUgorICAgICAgICBjaGVja1NpZ25lZEphcihqYXJOYW1lNyk7CisKKyAgICAgICAgLy8gU0hBLTUxMiBkaWdlc3QsIFNIQTUxMndpdGhFQ0RTQSBzaWduZWQgSkFSCisgICAgICAgIGNoZWNrU2lnbmVkSmFyKGphck5hbWU4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTaWduZWRKYXIoU3RyaW5nIGphck5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdXBwb3J0X1Jlc291cmNlcy5jb3B5RmlsZShyZXNvdXJjZXMsIG51bGwsIGphck5hbWUpOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlcywgamFyTmFtZSk7CisKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSwgdHJ1ZSk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZENlcnRzID0gZmFsc2U7CisKKyAgICAgICAgRW51bWVyYXRpb248SmFyRW50cnk+IGUgPSBqYXJGaWxlLmVudHJpZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKyAgICAgICAgICAgIGlzLnNraXAoMTAwMDAwKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gZW50cnkuZ2V0Q2VydGlmaWNhdGVzKCk7CisgICAgICAgICAgICBpZiAoY2VydHMgIT0gbnVsbCAmJiBjZXJ0cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZm91bmRDZXJ0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJObyBjZXJ0aWZpY2F0ZXMgZm91bmQgZHVyaW5nIHNpZ25lZCBqYXIgdGVzdCBmb3IgamFyIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBqYXJOYW1lICsgIlwiIiwgZm91bmRDZXJ0cyk7CiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vQ2lwaGVyVGVzdC5qYXZhCmluZGV4IGMwN2IxODAuLmI0ZGExYjggMTAwNjQ0Ci0tLSBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9DaXBoZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL0NpcGhlclRlc3QuamF2YQpAQCAtMzYyLDggKzM2Miw4IEBACiAKICAgICAgICAgICAgIGJ5dGVbXSBwbGFpbnRleHRCeXRlcyA9IGxvYWRCeXRlcygiaHl0c18iICsgImRlcy1lZGUzLWNiYy50ZXN0IgogICAgICAgICAgICAgICAgICAgICArIGluZGV4ICsgIi5wbGFpbnRleHQiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk9wZXJhdGlvbiBwcm9kdWNlZCBpbmNvcnJlY3QgcmVzdWx0cyIsIEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIHBsYWludGV4dEJ5dGVzLCBkZWNpcGhlcmVkQ2lwaGVyVGV4dCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcGVyYXRpb24gcHJvZHVjZWQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIGluZGV4ICIgKyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHBsYWludGV4dEJ5dGVzKSwgQXJyYXlzLnRvU3RyaW5nKGRlY2lwaGVyZWRDaXBoZXJUZXh0KSk7CiAgICAgICAgIH0KIAogICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJERVNFREUvQ0JDL1BLQ1M1UGFkZGluZyIpOwpAQCAtNDE4LDggKzQxOCw4IEBACiAKICAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXJUZXh0ID0gbG9hZEJ5dGVzKCJoeXRzXyIgKyAiZGVzLWVkZTMtY2JjLnRlc3QiICsgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgKyAiLmNpcGhlcnRleHQiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk9wZXJhdGlvbiBwcm9kdWNlZCBpbmNvcnJlY3QgcmVzdWx0cyIsIEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFBsYWludGV4dCwgY2lwaGVyVGV4dCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcGVyYXRpb24gcHJvZHVjZWQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIGluZGV4ICIgKyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGNpcGhlclRleHQpLCBBcnJheXMudG9TdHJpbmcoZW5jcnlwdGVkUGxhaW50ZXh0KSk7CiAgICAgICAgIH0KIAogICAgICAgICBieXRlW10gYiA9IHsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMH07CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTWFjVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9jcnlwdG8vdGVzdHMvamF2YXgvY3J5cHRvL01hY1Rlc3QuamF2YQppbmRleCBlODA4YmMxLi5kNjVkZDRiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L2NyeXB0by90ZXN0cy9qYXZheC9jcnlwdG8vTWFjVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvY3J5cHRvL3Rlc3RzL2phdmF4L2NyeXB0by9NYWNUZXN0LmphdmEKQEAgLTI5LDExICsyOSwxNCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QU1NQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBqYXZheC5jcnlwdG8uTWFjOwogaW1wb3J0IGphdmF4LmNyeXB0by5NYWNTcGk7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKIGltcG9ydCBqYXZheC5jcnlwdG8uU2hvcnRCdWZmZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuREhHZW5QYXJhbWV0ZXJTcGVjOwogCkBAIC00MSw2ICs0NCw5IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuY3J5cHRvLnRlc3RzLnN1cHBvcnQuTXlNYWNTcGk7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuU3BpRW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5OYXRpdmVDcnlwdG9UZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xQcm92aWRlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtNDQzLDE5ICs0NDksMTggQEAKICAgICAgICAgU2VjcmV0S2V5U3BlYyBzY3MgPSBuZXcgU2VjcmV0S2V5U3BlYyhiLCAiU0hBMSIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hY3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIG1hY3NbaV0uaW5pdChzY3MpOwotICAgICAgICAgICAgYnl0ZSBbXSByZXMxID0gbWFjc1tpXS5kb0ZpbmFsKCk7Ci0gICAgICAgICAgICBieXRlIFtdIHJlczIgPSBtYWNzW2ldLmRvRmluYWwoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwgcmVzMS5sZW5ndGgsIHJlczIubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvcihpbnQgdCA9IDA7IHQgPCByZXMxLmxlbmd0aDsgdCsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHRzIGFyZSBub3QgdGhlIHNhbWUiLCByZXMxW3RdLCByZXMyW3RdKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVbXSByZXMxID0gbWFjc1tpXS5kb0ZpbmFsKCk7CisgICAgICAgICAgICBieXRlW10gcmVzMiA9IG1hY3NbaV0uZG9GaW5hbCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHRzIGFyZSBub3QgdGhlIHNhbWUiLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ3JhbFRvU3RyaW5nLmJ5dGVzVG9IZXhTdHJpbmcocmVzMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ3JhbFRvU3RyaW5nLmJ5dGVzVG9IZXhTdHJpbmcocmVzMiwgZmFsc2UpKTsKKwogICAgICAgICAgICAgcmVzMiA9IG1hY3NbaV0uZG9GaW5hbCh1cGQpOwogICAgICAgICAgICAgbWFjc1tpXS51cGRhdGUodXBkKTsKICAgICAgICAgICAgIHJlczEgPSBtYWNzW2ldLmRvRmluYWwoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwgcmVzMS5sZW5ndGgsIHJlczIubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvcihpbnQgdCA9IDA7IHQgPCByZXMxLmxlbmd0aDsgdCsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHRzIGFyZSBub3QgdGhlIHNhbWUiLCByZXMxW3RdLCByZXMyW3RdKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0cyBhcmUgbm90IHRoZSBzYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdyYWxUb1N0cmluZy5ieXRlc1RvSGV4U3RyaW5nKHJlczEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdyYWxUb1N0cmluZy5ieXRlc1RvSGV4U3RyaW5nKHJlczIsIGZhbHNlKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgyOCw2ICs4MzMsMTA0IEBACiAgICAgICAgIGFzc2VydE51bGwobWFjLmdldFByb3ZpZGVyKCkpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBURVNUX0lOUFVUID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAweDAxLCAoYnl0ZSkgMHhGRiwgMHg1NSwgKGJ5dGUpIDB4QUEKKyAgICB9OworCisgICAgcHVibGljIHZvaWQgdGVzdF9Db25zaXN0ZW50QmV0d2VlblByb3ZpZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWNyZXRLZXkga2V5ID0gbmV3IFNlY3JldEtleVNwZWMobmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4N2IsIChieXRlKSAweDEwLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NjgsIChieXRlKSAweDNmLCAoYnl0ZSkgMHg3MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4YjUsIChieXRlKSAweGEzLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4OWYsIChieXRlKSAweDU0LAorICAgICAgICAgICAgICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4ZGUsIChieXRlKSAweGE3LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ODEsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MGQsIChieXRlKSAweDg5LCAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4MmUsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg0ZiwKKyAgICAgICAgfSwgIkhtYWNNRDUiKTsKKyAgICAgICAgYnl0ZVtdIGxhYmVsID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4NmIsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjksIChieXRlKSAweDZmLAorICAgICAgICAgICAgICAgIChieXRlKSAweDZlLAorICAgICAgICB9OworICAgICAgICBieXRlW10gc2VlZCA9IG5ldyBieXRlW10geworICAgICAgICAgICAgICAgIChieXRlKSAweDUwLCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDE0LCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4ZGQsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4M2QsIChieXRlKSAweGZhLCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGZlLCAoYnl0ZSkgMHgzYSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4ZTcsIChieXRlKSAweGJjLAorICAgICAgICAgICAgICAgIChieXRlKSAweDg0LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4MGUsIChieXRlKSAweDJkLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4ZDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4NmUsIChieXRlKSAweGI0LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4YmYsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhlNiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4OWQsIChieXRlKSAweDUwLCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDE0LAorICAgICAgICAgICAgICAgIChieXRlKSAweGJjLCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4OWUsIChieXRlKSAweDlhLCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4YTcsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4YWEsIChieXRlKSAweGZlLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweGNiLCAoYnl0ZSkgMHg0YywKKyAgICAgICAgICAgICAgICAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ODcsIChieXRlKSAweDlhLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4MDIsIChieXRlKSAweDI1LAorICAgICAgICAgICAgICAgIChieXRlKSAweGNlLCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDEwLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4OWMsCisgICAgICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4ZTIsCisgICAgICAgIH07CisgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJNYWMuSG1hY01ENSIpOworICAgICAgICBQcm92aWRlciBkZWZQcm92aWRlciA9IG51bGw7CisgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBudWxsOworICAgICAgICBieXRlW10gb3V0cHV0MiA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb3ZpZGVyID0gIiArIHByb3ZpZGVyc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgTWFjIG1hYyA9IE1hYy5nZXRJbnN0YW5jZSgiSG1hY01ENSIsIHByb3ZpZGVyc1tpXSk7CisgICAgICAgICAgICBtYWMuaW5pdChrZXkpOworICAgICAgICAgICAgbWFjLnVwZGF0ZShsYWJlbCk7CisgICAgICAgICAgICBtYWMudXBkYXRlKHNlZWQpOworICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gbmV3IGJ5dGVbbWFjLmdldE1hY0xlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBkZWZQcm92aWRlciA9IHByb3ZpZGVyc1tpXTsKKyAgICAgICAgICAgICAgICBtYWMuZG9GaW5hbChvdXRwdXQsIDApOworICAgICAgICAgICAgICAgIG1hYy5pbml0KG5ldyBTZWNyZXRLZXlTcGVjKGxhYmVsLCAiSG1hY01ENSIpKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQyID0gbWFjLmRvRmluYWwob3V0cHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW21hYy5nZXRNYWNMZW5ndGgoKV07CisgICAgICAgICAgICAgICAgbWFjLmRvRmluYWwodG1wLCAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGVmUHJvdmlkZXIuZ2V0TmFtZSgpICsgIiB2cy4gIiArIHByb3ZpZGVyc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcob3V0cHV0KSwgQXJyYXlzLnRvU3RyaW5nKHRtcCkpOworICAgICAgICAgICAgICAgIG1hYy5pbml0KG5ldyBTZWNyZXRLZXlTcGVjKGxhYmVsLCAiSG1hY01ENSIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGVmUHJvdmlkZXIuZ2V0TmFtZSgpICsgIiB2cy4gIiArIHByb3ZpZGVyc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcob3V0cHV0MiksIEFycmF5cy50b1N0cmluZyhtYWMuZG9GaW5hbChvdXRwdXQpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VfT3BlblNTTF9FTkdJTkUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlY3JldCA9ICItSE1BQy10ZXN0MSI7CisgICAgICAgIGZpbmFsIGJ5dGVbXSB0ZXN0U3RyaW5nID0gInRlc3RpbmcxMjMiLmdldEJ5dGVzKCk7CisKKyAgICAgICAgUHJvdmlkZXIgcCA9IFNlY3VyaXR5LmdldFByb3ZpZGVyKE9wZW5TU0xQcm92aWRlci5QUk9WSURFUl9OQU1FKTsKKyAgICAgICAgTmF0aXZlQ3J5cHRvVGVzdC5sb2FkVGVzdEVuZ2luZSgpOworICAgICAgICBPcGVuU1NMRW5naW5lIGVuZ2luZSA9IE9wZW5TU0xFbmdpbmUuZ2V0SW5zdGFuY2UoTmF0aXZlQ3J5cHRvVGVzdC5URVNUX0VOR0lORV9JRCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlICItSE1BQy0iIHByZWZpeCBpcyBhIHNwZWNpYWwgcHJlZml4IHJlY29nbml6ZWQgYnkKKyAgICAgICAgICogdGVzdF9vcGVuc3NsX2VuZ2luZS5jcHAKKyAgICAgICAgICovCisgICAgICAgIFNlY3JldEtleSBrZXkxID0gZW5naW5lLmdldFNlY3JldEtleUJ5SWQoc2VjcmV0LCAiSG1hY1NIQTI1NiIpOworICAgICAgICBTZWNyZXRLZXkga2V5MWR1cGUgPSBlbmdpbmUuZ2V0U2VjcmV0S2V5QnlJZChzZWNyZXQsICJIbWFjU0hBMjU2Iik7CisKKyAgICAgICAgLyogTm9uLUVOR0lORS1iYXNlZCBTZWNyZXRLZXkgKi8KKyAgICAgICAgU2VjcmV0S2V5IGtleTIgPSBuZXcgU2VjcmV0S2V5U3BlYyhzZWNyZXQuZ2V0Qnl0ZXMoKSwgIkhtYWNTSEEyNTYiKTsKKworICAgICAgICAvKiBUaGUgb25lIHRoYXQgaXMgRU5HSU5FLWJhc2VkIGNhbid0IGJlIGVxdWFsIHRvIGEgbm9uLUVOR0lORSBvbmUuICovCisgICAgICAgIGFzc2VydEZhbHNlKGtleTEuZXF1YWxzKGtleTIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleTEsIGtleTFkdXBlKTsKKyAgICAgICAgYXNzZXJ0TnVsbChrZXkxLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChrZXkxLmdldEVuY29kZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUkFXIiwga2V5Mi5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoc2VjcmV0LmdldEJ5dGVzKCkpLCBBcnJheXMudG9TdHJpbmcoa2V5Mi5nZXRFbmNvZGVkKCkpKTsKKworICAgICAgICBNYWMgbWFjMSA9IE1hYy5nZXRJbnN0YW5jZSgiSG1hY1NIQTI1NiIsIHApOworICAgICAgICBtYWMxLmluaXQoa2V5MSk7CisgICAgICAgIG1hYzEudXBkYXRlKHRlc3RTdHJpbmcpOworICAgICAgICBieXRlW10gb3V0cHV0MSA9IG1hYzEuZG9GaW5hbCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobWFjMS5nZXRNYWNMZW5ndGgoKSwgb3V0cHV0MS5sZW5ndGgpOworCisgICAgICAgIE1hYyBtYWMyID0gTWFjLmdldEluc3RhbmNlKCJIbWFjU0hBMjU2IiwgcCk7CisgICAgICAgIG1hYzIuaW5pdChrZXkyKTsKKyAgICAgICAgbWFjMi51cGRhdGUodGVzdFN0cmluZyk7CisgICAgICAgIGJ5dGVbXSBvdXRwdXQyID0gbWFjMi5kb0ZpbmFsKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhvdXRwdXQyKSwgQXJyYXlzLnRvU3RyaW5nKG91dHB1dDEpKTsKKyAgICB9CisKICAgICBjbGFzcyBNb2NrX01hYyBleHRlbmRzIE1hYyB7CiAgICAgICAgIHByb3RlY3RlZCBNb2NrX01hYyhNYWNTcGkgYXJnMCwgUHJvdmlkZXIgYXJnMSwgU3RyaW5nIGFyZzIpIHsKICAgICAgICAgICAgIHN1cGVyKGFyZzAsIGFyZzEsIGFyZzIpOwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9yZWdleC90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVyblRlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvcmVnZXgvdGVzdHMvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm5UZXN0LmphdmEKaW5kZXggZmZiZGY5ZS4uYTgxZDI5NCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9yZWdleC90ZXN0cy9qYXZhL3V0aWwvcmVnZXgvUGF0dGVyblRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3JlZ2V4L3Rlc3RzL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuVGVzdC5qYXZhCkBAIC0xNzc0LDQgKzE3NzQsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MTkzMDgKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2hpdEVuZCgpIHsKKyAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJeMigyWzQtOV18M1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswLTFdP1xcZD9cXGQpKXszfSQiKTsKKyAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKCIyMjQuLiIpOworICAgICAgICBib29sZWFuIGlzUGFydGlhbE1hdGNoID0gIW0ubWF0Y2hlcygpICYmIG0uaGl0RW5kKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzUGFydGlhbE1hdGNoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL0FsZ05hbWVNYXBwZXJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL0FsZ05hbWVNYXBwZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZWI0MwotLS0gL2Rldi9udWxsCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvQWxnTmFtZU1hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuQWxnTmFtZU1hcHBlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEFsZ05hbWVNYXBwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW11bXSBIQVJEQ09ERURfQUxJQVNFUyA9IHsKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMDA0MC40LjEiLCAgICAgICAiRFNBIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTAwNDAuNC4zIiwgICAgICAgIlNIQTF3aXRoRFNBIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMS4xIiwgICAgIlJTQSJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4xLjEuNCIsICAgICJNRDV3aXRoUlNBIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMS41IiwgICAgIlNIQTF3aXRoUlNBIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjEuMy4xIiwgICAgIkRpZmZpZUhlbGxtYW4ifSwKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS41LjMiLCAgICAicGJlV2l0aE1ENUFuZERFUy1DQkMifSwKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjMiLCAicGJlV2l0aFNIQUFuZDMtS2V5VHJpcGxlREVTLUNCQyJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4xLjEyLjEuNiIsICJwYmVXaXRoU0hBQW5kNDBCaXRSQzItQ0JDIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjMuMiIsICAgICAgIlJDMi1DQkMifSwKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMy4zIiwgICAgICAiUkMyLUVCQyJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4zLjQiLCAgICAgICJSQzQifSwKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMTM1NDkuMy41IiwgICAgICAiUkM0V2l0aE1BQyJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4zLjYiLCAgICAgICJERVN4LUNCQyJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4zLjciLCAgICAgICJUcmlwbGVERVMtQ0JDIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjMuOCIsICAgICAgInJjNUNCQyJ9LAorICAgICAgICAgICAgeyIxLjIuODQwLjExMzU0OS4zLjkiLCAgICAgICJSQzUtQ0JDIn0sCisgICAgICAgICAgICB7IjEuMi44NDAuMTEzNTQ5LjMuMTAiLCAgICAgIkRFU0NETUYifSwKKyAgICAgICAgICAgIHsiMi4yMy40Mi45LjExLjQuMSIsICAgICAgICAiRUNEU0EifSwKKyAgICB9OworCisgICAgcHVibGljIHZvaWQgdGVzdEhhcmRjb2RlZEFsaWFzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVyckJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGVyckJ1ZmZlcik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIQVJEQ09ERURfQUxJQVNFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSEFSRENPREVEX0FMSUFTRVNbaV1bMV0udG9VcHBlckNhc2UoTG9jYWxlLlVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ05hbWVNYXBwZXIubWFwMkFsZ05hbWUoSEFSRENPREVEX0FMSUFTRVNbaV1bMF0pLnRvVXBwZXJDYXNlKExvY2FsZS5VUykpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEhBUkRDT0RFRF9BTElBU0VTW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxnTmFtZU1hcHBlci5tYXAyT0lEKEhBUkRDT0RFRF9BTElBU0VTW2ldWzFdKSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSEFSRENPREVEX0FMSUFTRVNbaV1bMV0udG9VcHBlckNhc2UoTG9jYWxlLlVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ05hbWVNYXBwZXIuZ2V0U3RhbmRhcmROYW1lKEhBUkRDT0RFRF9BTElBU0VTW2ldWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQWxnTmFtZU1hcHBlci5pc09JRChIQVJEQ09ERURfQUxJQVNFU1tpXVswXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJFcnJvciBlbmNvdW50ZXJlZCBjaGVja2luZyAiICsgSEFSRENPREVEX0FMSUFTRVNbaV1bMV0gKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIGlmIChlcnJCdWZmZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3JzIGVuY291bnRlcmVkOlxuXG4iICsgZXJyQnVmZmVyLnRvU3RyaW5nKCkgKyAiXG5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXVtdIE5PTl9IQVJEQ09ERURfQUxJQVNFUyA9IHsKKyAgICAgICAgICAgIHsiMi4xNi44NDAuMS4xMDEuMy40LjIuMyIsICJTSEE1MTIifSwgLy8gVGhpcyBpc24ndCBjdXJyZW50bHkgaGFyZGNvZGVkIGluIEFsZ05hbWVNYXBwZXIKKyAgICAgICAgICAgIHsiMS4yLjg0MC4xMDA0NS4zLjEuNyIsICJwcmltZTI1NnYxIn0sIC8vIE5vIHByb3ZpZGVyIHByb3ZpZGVzIEVDIGN1cnZlcworICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uX0hhcmRjb2RlZF9BbGlhc2VzX0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShlcnJCdWZmZXIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTk9OX0hBUkRDT0RFRF9BTElBU0VTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhbGdOYW1lID0gQWxnTmFtZU1hcHBlci5tYXAyQWxnTmFtZShOT05fSEFSRENPREVEX0FMSUFTRVNbaV1bMF0pOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWxnTmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE5PTl9IQVJEQ09ERURfQUxJQVNFU1tpXVsxXS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBvaWQgPSBBbGdOYW1lTWFwcGVyLm1hcDJPSUQoYWxnTmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvaWQpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhOT05fSEFSRENPREVEX0FMSUFTRVNbaV1bMF0sIG9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkVycm9yIGVuY291bnRlcmVkIGNoZWNraW5nICIgKyBIQVJEQ09ERURfQUxJQVNFU1tpXVsxXSArICJcbiIpOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgaWYgKGVyckJ1ZmZlci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcnMgZW5jb3VudGVyZWQ6XG5cbiIgKyBlcnJCdWZmZXIudG9TdHJpbmcoKSArICJcblxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeTJUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Rlc3RzL2phdmEvc2VjdXJpdHkvS2V5RmFjdG9yeTJUZXN0LmphdmEKaW5kZXggMWJlN2ZhNi4uZjYyMTBhOSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy9qYXZhL3NlY3VyaXR5L0tleUZhY3RvcnkyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMvamF2YS9zZWN1cml0eS9LZXlGYWN0b3J5MlRlc3QuamF2YQpAQCAtODYsMTQgKzg2LDEwIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29uc3RydWN0b3IoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdF9jb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBLZXlGYWN0b3J5U3BpIGtmcyA9IG5ldyBLZXlGYWN0b3J5U3BpU3R1YigpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgS2V5RmFjdG9yeVN0dWIobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIG5ldyBLZXlGYWN0b3J5U3R1YihudWxsLCBudWxsLCBudWxsKTsKIAogICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVycyA9IFNlY3VyaXR5LmdldFByb3ZpZGVycygiS2V5RmFjdG9yeS5EU0EiKTsKICAgICAgICAgaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7CkBAIC0xMDgsMjY1ICsxMDQsMjAwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbmVyYXRlUHJpdmF0ZUxqYXZhX3NlY3VyaXR5X3NwZWNfS2V5U3BlYygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbmVyYXRlUHJpdmF0ZUxqYXZhX3NlY3VyaXR5X3NwZWNfS2V5U3BlYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5CiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZW5lcmF0ZVByaXZhdGUoamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5ZmFjdEFsZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBLZXlQYWlyR2VuZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7IC8vIFdlIGRvbid0IHVzZQotICAgICAgICAgICAgICAgIC8vIGdldEluc3RhbmNlCi0gICAgICAgICAgICAgICAga2V5R2VuLmluaXRpYWxpemUoU3RhbmRhcmROYW1lcy5nZXRNaW5pbXVtS2V5U2l6ZShrZXlmYWN0QWxnc1tpXSksIHJhbmRvbSk7Ci0gICAgICAgICAgICAgICAgS2VlcEFsaXZlIGtlZXBhbGl2ZSA9IGNyZWF0ZUtlZXBBbGl2ZShrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICAgICAgS2V5UGFpciBrZXlzID0ga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpOwotICAgICAgICAgICAgICAgIGlmIChrZWVwYWxpdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZWVwYWxpdmUuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgS2V5U3BlYyBwcml2YXRlS2V5U3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFByaXZhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkTmFtZXMuZ2V0UHJpdmF0ZUtleVNwZWNDbGFzcyhrZXlmYWN0QWxnc1tpXSkpOwotICAgICAgICAgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IGZhY3QuZ2VuZXJhdGVQcml2YXRlKHByaXZhdGVLZXlTcGVjKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNhbWVQcml2YXRlID0gQXJyYXlzLmVxdWFscyhrZXlzLmdldFByaXZhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWQoKSwgcHJpdmF0ZUtleS5nZXRFbmNvZGVkKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVQcml2YXRlIGdlbmVyYXRlZCBkaWZmZXJlbnQga2V5IGZvciBhbGdvcml0aG0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleWZhY3RBbGdzW2ldLCBzYW1lUHJpdmF0ZSk7Ci0gICAgICAgICAgICAgICAgZmFjdC5nZW5lcmF0ZVByaXZhdGUobmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoa2V5cy5nZXRQcml2YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNvZGVkKCkpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImludmFsaWQga2V5IHNwZWMgZm9yIGFsZ29yaXRobSAiICsga2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUpOworICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSwgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga2V5R2VuID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSk7CisgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOyAvLyBXZSBkb24ndCB1c2UKKyAgICAgICAgICAgIC8vIGdldEluc3RhbmNlCisgICAgICAgICAgICBrZXlHZW4uaW5pdGlhbGl6ZShTdGFuZGFyZE5hbWVzLmdldE1pbmltdW1LZXlTaXplKGtleWZhY3RBbGdzW2ldKSwgcmFuZG9tKTsKKyAgICAgICAgICAgIEtlZXBBbGl2ZSBrZWVwYWxpdmUgPSBjcmVhdGVLZWVwQWxpdmUoa2V5ZmFjdEFsZ3NbaV0pOworICAgICAgICAgICAgS2V5UGFpciBrZXlzID0ga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpOworICAgICAgICAgICAgaWYgKGtlZXBhbGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAga2VlcGFsaXZlLmludGVycnVwdCgpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLZXlTcGVjIHByaXZhdGVLZXlTcGVjID0gZmFjdC5nZXRLZXlTcGVjKGtleXMuZ2V0UHJpdmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE5hbWVzLmdldFByaXZhdGVLZXlTcGVjQ2xhc3Moa2V5ZmFjdEFsZ3NbaV0pKTsKKyAgICAgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IGZhY3QuZ2VuZXJhdGVQcml2YXRlKHByaXZhdGVLZXlTcGVjKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2VuZXJhdGVQcml2YXRlIGdlbmVyYXRlZCBkaWZmZXJlbnQga2V5IGZvciBhbGdvcml0aG0gIiArIGtleWZhY3RBbGdzW2ldLAorICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoa2V5cy5nZXRQcml2YXRlKCkuZ2V0RW5jb2RlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHByaXZhdGVLZXkuZ2V0RW5jb2RlZCgpKSk7CisgICAgICAgICAgICBwcml2YXRlS2V5ID0gZmFjdC5nZW5lcmF0ZVByaXZhdGUobmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoa2V5cy5nZXRQcml2YXRlKCkuZ2V0RW5jb2RlZCgpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdlbmVyYXRlUHJpdmF0ZSBnZW5lcmF0ZWQgZGlmZmVyZW50IGtleSBmb3IgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGtleXMuZ2V0UHJpdmF0ZSgpLmdldEVuY29kZWQoKSksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwcml2YXRlS2V5LmdldEVuY29kZWQoKSkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZW5lcmF0ZVB1YmxpY0xqYXZhX3NlY3VyaXR5X3NwZWNfS2V5U3BlYygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dlbmVyYXRlUHVibGljTGphdmFfc2VjdXJpdHlfc3BlY19LZXlTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2VuZXJhdGVQdWJsaWMoamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5ZmFjdEFsZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBLZXlQYWlyR2VuZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHVzZSBnZXRJbnN0YW5jZQotICAgICAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7Ci0gICAgICAgICAgICAgICAga2V5R2VuLmluaXRpYWxpemUoU3RhbmRhcmROYW1lcy5nZXRNaW5pbXVtS2V5U2l6ZShrZXlmYWN0QWxnc1tpXSksIHJhbmRvbSk7Ci0gICAgICAgICAgICAgICAgS2VlcEFsaXZlIGtlZXBhbGl2ZSA9IGNyZWF0ZUtlZXBBbGl2ZShrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICAgICAgS2V5UGFpciBrZXlzID0ga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpOwotICAgICAgICAgICAgICAgIGlmIChrZWVwYWxpdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZWVwYWxpdmUuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEtleVNwZWMgcHVibGljS2V5U3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFB1YmxpYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmROYW1lcy5nZXRQdWJsaWNLZXlTcGVjQ2xhc3Moa2V5ZmFjdEFsZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICBQdWJsaWNLZXkgcHVibGljS2V5ID0gZmFjdC5nZW5lcmF0ZVB1YmxpYyhwdWJsaWNLZXlTcGVjKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNhbWVQdWJsaWMgPSBBcnJheXMuZXF1YWxzKGtleXMuZ2V0UHVibGljKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNvZGVkKCksIHB1YmxpY0tleS5nZXRFbmNvZGVkKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVQdWJsaWMgZ2VuZXJhdGVkIGRpZmZlcmVudCBrZXkgZm9yIGFsZ29yaXRobSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5ZmFjdEFsZ3NbaV0sIHNhbWVQdWJsaWMpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleVNwZWNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImludmFsaWQga2V5IHNwZWMgZm9yIGFsZ29yaXRobSAiICsga2V5ZmFjdEFsZ3NbaV0pOworICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga2V5R2VuID0gS2V5UGFpckdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0pOworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdXNlIGdldEluc3RhbmNlCisgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICAgICAgICAgICAga2V5R2VuLmluaXRpYWxpemUoU3RhbmRhcmROYW1lcy5nZXRNaW5pbXVtS2V5U2l6ZShrZXlmYWN0QWxnc1tpXSksIHJhbmRvbSk7CisgICAgICAgICAgICBLZWVwQWxpdmUga2VlcGFsaXZlID0gY3JlYXRlS2VlcEFsaXZlKGtleWZhY3RBbGdzW2ldKTsKKyAgICAgICAgICAgIEtleVBhaXIga2V5cyA9IGtleUdlbi5nZW5lcmF0ZUtleVBhaXIoKTsKKyAgICAgICAgICAgIGlmIChrZWVwYWxpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtlZXBhbGl2ZS5pbnRlcnJ1cHQoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtleVNwZWMgcHVibGljS2V5U3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFB1YmxpYygpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE5hbWVzLmdldFB1YmxpY0tleVNwZWNDbGFzcyhrZXlmYWN0QWxnc1tpXSkpOworICAgICAgICAgICAgUHVibGljS2V5IHB1YmxpY0tleSA9IGZhY3QuZ2VuZXJhdGVQdWJsaWMocHVibGljS2V5U3BlYyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZVB1YmxpYyBnZW5lcmF0ZWQgZGlmZmVyZW50IGtleSBmb3IgYWxnb3JpdGhtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleWZhY3RBbGdzW2ldICsgIiAocHJvdmlkZXI9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmFjdC5nZXRQcm92aWRlcigpLmdldE5hbWUoKSArICIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoa2V5cy5nZXRQdWJsaWMoKS5nZXRFbmNvZGVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwdWJsaWNLZXkuZ2V0RW5jb2RlZCgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsZ29yaXRobSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5sYW5nLlN0cmluZwogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2V0QWxnb3JpdGhtKCkKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlmYWN0QWxncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBLZXlGYWN0b3J5IGZhY3QgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRBbGdvcml0aG0gb2sgZm9yIGFsZ29yaXRobSAiICsga2V5ZmFjdEFsZ3NbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWN0LmdldEFsZ29yaXRobSgpLmVxdWFscyhrZXlmYWN0QWxnc1tpXSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ly8gZW5kIGZvcgorICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldEFsZ29yaXRobSBvayBmb3IgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgZmFjdC5nZXRBbGdvcml0aG0oKS5lcXVhbHMoa2V5ZmFjdEFsZ3NbaV0pKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlmYWN0QWxncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKEtleUZhY3RvcnkuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0pKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIGFsZ29yaXRobSAiICsga2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ly8gZW5kIGZvcgorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChLZXlGYWN0b3J5LmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldKSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0MTogVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeQogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2V0SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZywKICAgICAgICAgLy8gamF2YS5sYW5nLlN0cmluZykKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3ZpZGVyW10gcHJvdmlkZXJzID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCJLZXlGYWN0b3J5LkRTQSIpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiRFNBIiwgcHJvdmlkZXJzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfS8vIGVuZCBmb3IKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiTm8gcHJvdmlkZXJzIHN1cHBvcnQgS2V5RmFjdG9yeS5EU0EiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldEluc3RhbmNlIGRpZCBub3QgZmluZCBhbGdvcml0aG0iKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIHRoZSBwcm92aWRlciIpOworICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVycyA9IFNlY3VyaXR5LmdldFByb3ZpZGVycygiS2V5RmFjdG9yeS5EU0EiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlcnMpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJEU0EiLCBwcm92aWRlcnNbaV0uZ2V0TmFtZSgpKTsKICAgICAgICAgfQogCisKICAgICAgICAgLy8gVGVzdDI6IFRlc3Qgd2l0aCBudWxsIHByb3ZpZGVyIG5hbWUKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkRTQSIsIChTdHJpbmcpIG51bGwpOwogICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgZ290ICIgKyBlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Byb3ZpZGVyKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2VMamF2YV9sYW5nX1N0cmluZ0xqYXZhX3NlY3VyaXR5X1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QxOiBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5CiAgICAgICAgIC8vIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nLAogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoIktleUZhY3RvcnkuRFNBIik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJEU0EiLCBwcm92aWRlcnNbaV0pOwotICAgICAgICAgICAgICAgIH0vLyBlbmQgZm9yCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhaWwoIk5vIHByb3ZpZGVycyBzdXBwb3J0IEtleUZhY3RvcnkuRFNBIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgYWxnb3JpdGhtIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVycyA9IFNlY3VyaXR5LmdldFByb3ZpZGVycygiS2V5RmFjdG9yeS5EU0EiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlcnMpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJEU0EiLCBwcm92aWRlcnNbaV0pOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVGVzdDI6IFRlc3Qgd2l0aCBudWxsIHByb3ZpZGVyIG5hbWUKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkRTQSIsIChQcm92aWRlcikgbnVsbCk7CiAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBnb3QgIiArIGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlTcGVjTGphdmFfc2VjdXJpdHlfS2V5TGphdmFfbGFuZ19DbGFzcygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEtleVNwZWNMamF2YV9zZWN1cml0eV9LZXlMamF2YV9sYW5nX0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZm9yIG1ldGhvZCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYwogICAgICAgICAvLyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkuZ2V0S2V5U3BlYyhqYXZhLnNlY3VyaXR5LktleSwKICAgICAgICAgLy8gamF2YS5sYW5nLkNsYXNzKQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleWZhY3RBbGdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEtleUZhY3RvcnkgZmFjdCA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck5hbWUpOwotICAgICAgICAgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga2V5R2VuID0gS2V5UGFpckdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldKTsKKyAgICAgICAgICAgIEtleUZhY3RvcnkgZmFjdCA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2Uoa2V5ZmFjdEFsZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtleUdlbiA9IEtleVBhaXJHZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldKTsKIAotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHVzZSBnZXRJbnN0YW5jZQotICAgICAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7Ci0gICAgICAgICAgICAgICAga2V5R2VuLmluaXRpYWxpemUoU3RhbmRhcmROYW1lcy5nZXRNaW5pbXVtS2V5U2l6ZShrZXlmYWN0QWxnc1tpXSksIHJhbmRvbSk7Ci0gICAgICAgICAgICAgICAgS2VlcEFsaXZlIGtlZXBhbGl2ZSA9IGNyZWF0ZUtlZXBBbGl2ZShrZXlmYWN0QWxnc1tpXSk7Ci0gICAgICAgICAgICAgICAgS2V5UGFpciBrZXlzID0ga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpOwotICAgICAgICAgICAgICAgIGlmIChrZWVwYWxpdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZWVwYWxpdmUuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEtleVNwZWMgcHJpdmF0ZUtleVNwZWMgPSBmYWN0LmdldEtleVNwZWMoa2V5cy5nZXRQcml2YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE5hbWVzLmdldFByaXZhdGVLZXlTcGVjQ2xhc3Moa2V5ZmFjdEFsZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICBLZXlTcGVjIHB1YmxpY0tleVNwZWMgPSBmYWN0LmdldEtleVNwZWMoa2V5cy5nZXRQdWJsaWMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkTmFtZXMuZ2V0UHVibGljS2V5U3BlY0NsYXNzKGtleWZhY3RBbGdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgUHJpdmF0ZUtleSBwcml2YXRlS2V5ID0gZmFjdC5nZW5lcmF0ZVByaXZhdGUocHJpdmF0ZUtleVNwZWMpOwotICAgICAgICAgICAgICAgIFB1YmxpY0tleSBwdWJsaWNLZXkgPSBmYWN0LmdlbmVyYXRlUHVibGljKHB1YmxpY0tleVNwZWMpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2FtZVB1YmxpYyA9IEFycmF5cy5lcXVhbHMoa2V5cy5nZXRQdWJsaWMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuY29kZWQoKSwgcHVibGljS2V5LmdldEVuY29kZWQoKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzYW1lUHJpdmF0ZSA9IEFycmF5cy5lcXVhbHMoa2V5cy5nZXRQcml2YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmNvZGVkKCksIHByaXZhdGVLZXkuZ2V0RW5jb2RlZCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlUHJpdmF0ZSBnZW5lcmF0ZWQgZGlmZmVyZW50IGtleSBmb3IgYWxnb3JpdGhtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXlmYWN0QWxnc1tpXSwgc2FtZVByaXZhdGUpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVQdWJsaWMgZ2VuZXJhdGVkIGRpZmZlcmVudCBrZXkgZm9yIGFsZ29yaXRobSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5ZmFjdEFsZ3NbaV0sIHNhbWVQdWJsaWMpOwotICAgICAgICAgICAgICAgIEtleVNwZWMgZW5jb2RlZFNwZWMgPSBmYWN0LmdldEtleVNwZWMoa2V5cy5nZXRQdWJsaWMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW1wcm9wZXIga2V5IHNwZWMgZm9yIGVuY29kZWQgcHVibGljIGtleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkU3BlYy5nZXRDbGFzcygpLmVxdWFscyhYNTA5RW5jb2RlZEtleVNwZWMuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFByaXZhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4RW5jb2RlZEtleVNwZWMuY2xhc3MpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImltcHJvcGVyIGtleSBzcGVjIGZvciBlbmNvZGVkIHByaXZhdGUga2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRTcGVjLmdldENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhQS0NTOEVuY29kZWRLZXlTcGVjLmNsYXNzKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImdldEluc3RhbmNlIGRpZCBub3QgZmluZCBhbGdvcml0aG0gIiArIGtleWZhY3RBbGdzW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiaW52YWxpZCBrZXkgc3BlYyBmb3IgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSk7CisgICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgZ2V0SW5zdGFuY2UKKyAgICAgICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisgICAgICAgICAgICBrZXlHZW4uaW5pdGlhbGl6ZShTdGFuZGFyZE5hbWVzLmdldE1pbmltdW1LZXlTaXplKGtleWZhY3RBbGdzW2ldKSwgcmFuZG9tKTsKKyAgICAgICAgICAgIEtlZXBBbGl2ZSBrZWVwYWxpdmUgPSBjcmVhdGVLZWVwQWxpdmUoa2V5ZmFjdEFsZ3NbaV0pOworICAgICAgICAgICAgS2V5UGFpciBrZXlzID0ga2V5R2VuLmdlbmVyYXRlS2V5UGFpcigpOworICAgICAgICAgICAgaWYgKGtlZXBhbGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAga2VlcGFsaXZlLmludGVycnVwdCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgS2V5U3BlYyBwcml2YXRlS2V5U3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFByaXZhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmROYW1lcy5nZXRQcml2YXRlS2V5U3BlY0NsYXNzKGtleWZhY3RBbGdzW2ldKSk7CisgICAgICAgICAgICBLZXlTcGVjIHB1YmxpY0tleVNwZWMgPSBmYWN0LmdldEtleVNwZWMoa2V5cy5nZXRQdWJsaWMoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmROYW1lcy5nZXRQdWJsaWNLZXlTcGVjQ2xhc3Moa2V5ZmFjdEFsZ3NbaV0pKTsKKyAgICAgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IGZhY3QuZ2VuZXJhdGVQcml2YXRlKHByaXZhdGVLZXlTcGVjKTsKKyAgICAgICAgICAgIFB1YmxpY0tleSBwdWJsaWNLZXkgPSBmYWN0LmdlbmVyYXRlUHVibGljKHB1YmxpY0tleVNwZWMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVQcml2YXRlIGdlbmVyYXRlZCBkaWZmZXJlbnQga2V5IGZvciBhbGdvcml0aG0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5ZmFjdEFsZ3NbaV0gKyAiIChwcm92aWRlcj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmYWN0LmdldFByb3ZpZGVyKCkuZ2V0TmFtZSgpICsgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhrZXlzLmdldFByaXZhdGUoKS5nZXRFbmNvZGVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwcml2YXRlS2V5LmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVQdWJsaWMgZ2VuZXJhdGVkIGRpZmZlcmVudCBrZXkgZm9yIGFsZ29yaXRobSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXlmYWN0QWxnc1tpXSArICIgKHByb3ZpZGVyPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZhY3QuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkgKyAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGtleXMuZ2V0UHVibGljKCkuZ2V0RW5jb2RlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcocHVibGljS2V5LmdldEVuY29kZWQoKSkpOworICAgICAgICAgICAgS2V5U3BlYyBlbmNvZGVkU3BlYyA9IGZhY3QuZ2V0S2V5U3BlYyhrZXlzLmdldFB1YmxpYygpLAorICAgICAgICAgICAgICAgICAgICBYNTA5RW5jb2RlZEtleVNwZWMuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW1wcm9wZXIga2V5IHNwZWMgZm9yIGVuY29kZWQgcHVibGljIGtleSIsCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRTcGVjLmdldENsYXNzKCkuZXF1YWxzKFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzcykpOworICAgICAgICAgICAgZW5jb2RlZFNwZWMgPSBmYWN0LmdldEtleVNwZWMoa2V5cy5nZXRQcml2YXRlKCksCisgICAgICAgICAgICAgICAgICAgIFBLQ1M4RW5jb2RlZEtleVNwZWMuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaW1wcm9wZXIga2V5IHNwZWMgZm9yIGVuY29kZWQgcHJpdmF0ZSBrZXkiLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkU3BlYy5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhQS0NTOEVuY29kZWRLZXlTcGVjLmNsYXNzKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByb3ZpZGVyKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBmb3IgbWV0aG9kIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5LmdldFByb3ZpZGVyKCkKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlmYWN0QWxncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBLZXlGYWN0b3J5IGZhY3QgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldKTsKLSAgICAgICAgICAgICAgICBQcm92aWRlciBwID0gZmFjdC5nZXRQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoInByb3ZpZGVyIGlzIG51bGwgZm9yIGFsZ29yaXRobSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGtleWZhY3RBbGdzW2ldLCBwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZ2V0SW5zdGFuY2UgZGlkIG5vdCBmaW5kIGFsZ29yaXRobSAiICsga2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ly8gZW5kIGZvcgorICAgICAgICAgICAgS2V5RmFjdG9yeSBmYWN0ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSk7CisgICAgICAgICAgICBQcm92aWRlciBwID0gZmFjdC5nZXRQcm92aWRlcigpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgicHJvdmlkZXIgaXMgbnVsbCBmb3IgYWxnb3JpdGhtICIgKyBrZXlmYWN0QWxnc1tpXSwgcCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zbGF0ZUtleUxqYXZhX3NlY3VyaXR5X0tleSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3RyYW5zbGF0ZUtleUxqYXZhX3NlY3VyaXR5X0tleSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGZvciBtZXRob2QgamF2YS5zZWN1cml0eS5LZXkKICAgICAgICAgLy8gamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5LnRyYW5zbGF0ZUtleShqYXZhLnNlY3VyaXR5LktleSkKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlmYWN0QWxncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBLZXlGYWN0b3J5IGZhY3QgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lKTsKLSAgICAgICAgICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtleUdlbiA9IEtleVBhaXJHZW5lcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSk7CisgICAgICAgICAgICBLZXlGYWN0b3J5IGZhY3QgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKGtleWZhY3RBbGdzW2ldLAorICAgICAgICAgICAgICAgICAgICBwcm92aWRlck5hbWUpOworICAgICAgICAgICAgS2V5UGFpckdlbmVyYXRvciBrZXlHZW4gPSBLZXlQYWlyR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShrZXlmYWN0QWxnc1tpXSk7CiAKLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgZ2V0SW5zdGFuY2UKLSAgICAgICAgICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOwotICAgICAgICAgICAgICAgIGtleUdlbi5pbml0aWFsaXplKFN0YW5kYXJkTmFtZXMuZ2V0TWluaW11bUtleVNpemUoa2V5ZmFjdEFsZ3NbaV0pLCByYW5kb20pOwotICAgICAgICAgICAgICAgIEtlZXBBbGl2ZSBrZWVwYWxpdmUgPSBjcmVhdGVLZWVwQWxpdmUoa2V5ZmFjdEFsZ3NbaV0pOwotICAgICAgICAgICAgICAgIEtleVBhaXIga2V5cyA9IGtleUdlbi5nZW5lcmF0ZUtleVBhaXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2VlcGFsaXZlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAga2VlcGFsaXZlLmludGVycnVwdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYWN0LnRyYW5zbGF0ZUtleShrZXlzLmdldFByaXZhdGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoImdldEluc3RhbmNlIGRpZCBub3QgZmluZCBhbGdvcml0aG0gIiArIGtleWZhY3RBbGdzW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZXRJbnN0YW5jZSBkaWQgbm90IGZpbmQgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJnZW5lcmF0ZVB1YmxpYyBkaWQgbm90IGdlbmVyYXRlIHJpZ2h0IHNwZWMgZm9yIGFsZ29yaXRobSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGtleWZhY3RBbGdzW2ldKTsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHVzZSBnZXRJbnN0YW5jZQorICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSA9IG5ldyBTZWN1cmVSYW5kb20oKTsKKyAgICAgICAgICAgIGtleUdlbi5pbml0aWFsaXplKFN0YW5kYXJkTmFtZXMuZ2V0TWluaW11bUtleVNpemUoa2V5ZmFjdEFsZ3NbaV0pLCByYW5kb20pOworICAgICAgICAgICAgS2VlcEFsaXZlIGtlZXBhbGl2ZSA9IGNyZWF0ZUtlZXBBbGl2ZShrZXlmYWN0QWxnc1tpXSk7CisgICAgICAgICAgICBLZXlQYWlyIGtleXMgPSBrZXlHZW4uZ2VuZXJhdGVLZXlQYWlyKCk7CisgICAgICAgICAgICBpZiAoa2VlcGFsaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBrZWVwYWxpdmUuaW50ZXJydXB0KCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWN0LnRyYW5zbGF0ZUtleShrZXlzLmdldFByaXZhdGUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMveDUwOS9TdWJqZWN0UHVibGljS2V5SW5mb1Rlc3QuamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvdGVzdHMveDUwOS9TdWJqZWN0UHVibGljS2V5SW5mb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS90ZXN0cy94NTA5L1N1YmplY3RQdWJsaWNLZXlJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMueDUwOTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Llg1MDlQdWJsaWNLZXk7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeVNwaTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZEtleVNwZWNFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlg1MDlFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU3ViamVjdFB1YmxpY0tleUluZm9UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTkNPREVEX0JST0tFTiA9ICJCUk9LRU4hIi5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIkFTQ0lJIikpOworCisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQdWJsaWNLZXlfV2VsbEtub3duT2lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga3BnID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiUlNBIik7CisgICAgICAgIEtleVBhaXIgcGFpciA9IGtwZy5nZW5lcmF0ZUtleVBhaXIoKTsKKworICAgICAgICBmaW5hbCBSU0FQdWJsaWNLZXkgcnNhUHViS2V5ID0gKFJTQVB1YmxpY0tleSkgcGFpci5nZXRQdWJsaWMoKTsKKworICAgICAgICAvKiBEbyBzb21lIGZhbmN5IGZvb3R3b3JrIHRvIGdldCBhbiBBU04uMSBTdWJqZWN0UHVibGljS2V5IGZvciBSU0EgKi8KKyAgICAgICAgZmluYWwgQVNOMVNlcXVlbmNlIHJzYVB1YktleUluZm8gPSBuZXcgQVNOMVNlcXVlbmNlKG5ldyBBU04xVHlwZVtdIHsKKyAgICAgICAgICAgICAgICBBU04xSW50ZWdlci5nZXRJbnN0YW5jZSgpLCBBU04xSW50ZWdlci5nZXRJbnN0YW5jZSgpLAorICAgICAgICB9KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGdldFZhbHVlcyhPYmplY3Qgb2JqZWN0LCBPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSByc2FQdWJLZXkuZ2V0TW9kdWx1cygpLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzFdID0gcnNhUHViS2V5LmdldFB1YmxpY0V4cG9uZW50KCkudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKiBUaGUgYWxnb3JpdGhtIElEIGZvciBSU0EgZW5jcnlwdGlvbiAqLworICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyIGFsZ2lkID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoIjEuMi44NDAuMTEzNTQ5LjEuMS4xIik7CisKKyAgICAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gc3BraSA9IG5ldyBTdWJqZWN0UHVibGljS2V5SW5mbyhhbGdpZCwgcnNhUHViS2V5SW5mby5lbmNvZGUobnVsbCkpOworCisgICAgICAgIFB1YmxpY0tleSBwdWJLZXkgPSBzcGtpLmdldFB1YmxpY0tleSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHB1YktleSk7CisgICAgICAgIGFzc2VydFRydWUocHViS2V5IGluc3RhbmNlb2YgUlNBUHVibGljS2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFB1YmxpY0tleV9Vbmtub3duX09JRCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyIGFsZ2lkID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoIjEuMzAuOTk5OTk5OTk5OS44NzM0ODc4Iik7CisgICAgICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvIHNwa2kgPSBuZXcgU3ViamVjdFB1YmxpY0tleUluZm8oYWxnaWQsIEVOQ09ERURfQlJPS0VOKTsKKyAgICAgICAgUHVibGljS2V5IHB1YktleSA9IHNwa2kuZ2V0UHVibGljS2V5KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHViS2V5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFg1MDlQdWJsaWNLZXkuY2xhc3MsIHB1YktleS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfVEVTVF9LRVlfT0lEID0gIjEuMzAuOTg3NjU0MzIxLjEuMS4xLjIuMi4yIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHVibGljS2V5X05hbWVLbm93bkJ1dE9ubHlPSURGYWN0b3J5UmVnaXN0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWN1cml0eS5hZGRQcm92aWRlcihuZXcgTXlUZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyIGFsZ2lkID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoTVlfVEVTVF9LRVlfT0lELCAiVW5rbm93bktleSIpOworICAgICAgICAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gc3BraSA9IG5ldyBTdWJqZWN0UHVibGljS2V5SW5mbyhhbGdpZCwgRU5DT0RFRF9CUk9LRU4pOworICAgICAgICAgICAgUHVibGljS2V5IHB1YktleSA9IHNwa2kuZ2V0UHVibGljS2V5KCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHB1YktleSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTXlUZXN0UHVibGljS2V5LmNsYXNzLCBwdWJLZXkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBieXRlW10gZW5jb2RlZCA9IHB1YktleS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhFTkNPREVEX0JST0tFTiksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhBcnJheXMuY29weU9mUmFuZ2UoZW5jb2RlZCwgZW5jb2RlZC5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVOQ09ERURfQlJPS0VOLmxlbmd0aCwgZW5jb2RlZC5sZW5ndGgpKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTZWN1cml0eS5yZW1vdmVQcm92aWRlcihNeVRlc3RQcm92aWRlci5OQU1FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUZXN0UHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTXlUZXN0UHJvdmlkZXIiOworCisgICAgICAgIHByb3RlY3RlZCBNeVRlc3RQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKE5BTUUsIDEuMCwgIk15VGVzdFByb3ZpZGVyIik7CisKKyAgICAgICAgICAgIHB1dCgiS2V5RmFjdG9yeS4iICsgTVlfVEVTVF9LRVlfT0lELCBNeVRlc3RLZXlGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGVzdEtleUZhY3RvcnkgZXh0ZW5kcyBLZXlGYWN0b3J5U3BpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBQdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoS2V5U3BlYyBrZXlTcGVjKSB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCEoa2V5U3BlYyBpbnN0YW5jZW9mIFg1MDlFbmNvZGVkS2V5U3BlYykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24oIk9ubHkgWDUwOUVuY29kZWRLZXlTcGVjIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYNTA5RW5jb2RlZEtleVNwZWMgeDUwOWtzID0gKFg1MDlFbmNvZGVkS2V5U3BlYykga2V5U3BlYzsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlUZXN0UHVibGljS2V5KHg1MDlrcy5nZXRFbmNvZGVkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBQcml2YXRlS2V5IGVuZ2luZUdlbmVyYXRlUHJpdmF0ZShLZXlTcGVjIGtleVNwZWMpIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBLZXlTcGVjPiBUIGVuZ2luZUdldEtleVNwZWMoS2V5IGtleSwgQ2xhc3M8VD4ga2V5U3BlYykKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEtleSBlbmdpbmVUcmFuc2xhdGVLZXkoS2V5IGtleSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGVzdFB1YmxpY0tleSBpbXBsZW1lbnRzIFB1YmxpY0tleSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGRhdGE7CisKKyAgICAgICAgcHVibGljIE15VGVzdFB1YmxpY0tleShieXRlW10gZGF0YSkgeworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiTXlUZXN0UHVibGljS2V5IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ2hhaW5TdHJlbmd0aEFuYWx5emVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvQ2hhaW5TdHJlbmd0aEFuYWx5emVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTg1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9DaGFpblN0cmVuZ3RoQW5hbHl6ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDaGFpblN0cmVuZ3RoQW5hbHl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLy9vcGVuc3NsIHJlcSAteDUwOSAtbm9kZXMgLWRheXMgMzY1IC1zdWJqICcvQz1VUy9TVD1UZXN0c290YS9MPVRlc3R2aWxsZS9DTj10ZXN0LmNvbScgXAorICAgIC8vLW5ld2tleSByc2E6MjA0OCAtc2hhMjU2IC1rZXlvdXQgay5wZW0gLW91dCBnb29kLnBlbQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09EX1BFTSA9ICIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlJRFlUQ0NBa21nQXdJQkFnSUpBUEZYOEtHdUVaY2dNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FY3hDekFKQmdOVlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJBWVRBbFZUTVJFd0R3WURWUVFJREFoVVpYTjBjMjkwWVRFU01CQUdBMVVFQnd3SlZHVnpkSFpwYkd4bE1SRXdcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEd1lEVlFRRERBaDBaWE4wTG1OdmJUQWVGdzB4TWpFd01UVXlNVFEwTVRCYUZ3MHhNekV3TVRVeU1UUTBNVEJhXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVjeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhVWlhOMGMyOTBZVEVTTUJBR0ExVUVCd3dKVkdWelxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRIWnBiR3hsTVJFd0R3WURWUVFEREFoMFpYTjBMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBRENDQVFvQ2dnRUJBTTQ0aHozZVRJTnVBSVM5T1ltZzZEa1VJajNNSXRuNWRnYmNNRWRiWHJoTnBlV1k5M2hvXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV1FGZnNxY1NTeDI4TnpxS0ptblgrY3lpbnpJVWZWZGUvcWNpUDlQN2Z4UkRva1JzZjM0REo2Z1hRcGx6NlAydFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInM0Q1dqWU0rV1hKcnZFVWdMVVEzQ0JWMENDcnRZdkcxQjl3WXNCZEFkV2tWYU14VHZFdDdhVnhjdkpZenArS1VcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRTdIRGcwUFZ4cHR2VUV4SXNrY3FLVm1XN2k3NDhBZ0JMaGQwcjFuRldMdUgyMGQ0MkFvd2phMFdpMTlmV2wyXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VNRXJEUmpHOGpJUFVkU29PTFBWTEdUa3RFcGV4NTF4bkFhWitJN2h5NnpzNTVkcTh1YS9oRS92MmNYSWtpUVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpYcFd5dkkvTWFLRWZleWRMbk5wYTdKM0dwSDNLVzkzSFFjQ0F3RUFBYU5RTUU0d0hRWURWUjBPQkJZRUZBME1cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSSSszaElQQ1NwVlZBcmlzcjNZMy9zaGVNQjhHQTFVZEl3UVlNQmFBRkEwTVJJKzNoSVBDU3BWVkFyaXNyM1kzXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NoZU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZnVU55dXkycWFKdmdET1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsWXVkVHJKUjM4TzNpZDFCNW9LT3pnVEVnUnJmbUhIZnlsb1k0Zkw1Z2pBR05wN3ZkbERLU0hDMkVibzIzL1hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZzUzNU1KMjI5NlI4NTVqYVRNZGtTRTArNEFTcGRtb24xRDAwN0gwRmhMeW9qbEtWdGEzcHFNQUYxenNwMFlGXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWYzVi9yVk1EeENPbmJTbnFBWDArMW5XOFFtNEpncnIzQUFNYWZaazZ5cHEweHVOUW4rc1VXdUlXdzNYdjVKbFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktlaGpudUt0TWdWWWtuMkl0Uk5uVWRobTJkUUsrUGhkYjVZZzhXSFhOL3I5c1pRZE9SZzhGUVM5VGZRSm1pbUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVll1cUE5RHQwSkpaUHVPL1BkMXlBeFdQNE5weFgxeHIzbE5RNWpyVE83MDJRQTNnT3JzY2x1VUxMenJZUjUwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9BamVvcz1cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIjsKKworICAgIC8vb3BlbnNzbCByZXEgLXg1MDkgLW5vZGVzIC1kYXlzIDM2NSAtc3ViaiAnL0M9VVMvU1Q9VGVzdHNvdGEvTD1UZXN0dmlsbGUvQ049dGVzdC5jb20nIFwKKyAgICAvLy1uZXdrZXkgcnNhOjIwNDggLW1kNSAta2V5b3V0IGsucGVtIC1vdXQgbWQ1LnBlbQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRDVfUEVNID0gIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSUlEWVRDQ0FrbWdBd0lCQWdJSkFKc2ZmTWYyY3l4ME1BMEdDU3FHU0liM0RRRUJCQVVBTUVjeEN6QUpCZ05WXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhVWlhOMGMyOTBZVEVTTUJBR0ExVUVCd3dKVkdWemRIWnBiR3hsTVJFd1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR3WURWUVFEREFoMFpYTjBMbU52YlRBZUZ3MHhNakV3TVRVeU1UUXpNelphRncweE16RXdNVFV5TVRRek16WmFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRWN4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaFVaWE4wYzI5MFlURVNNQkFHQTFVRUJ3d0pWR1Z6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZEhacGJHeGxNUkV3RHdZRFZRUUREQWgwWlhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFEQ0NBUW9DZ2dFQkFPSnlpVXdnZi9Wc2RiVFRkeDZkc2I3NDJhZGVCRkJZMUZwU1dDZVFXL0pWdGRNZXBoYktcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQTAwbnU4WHEzZE54OWJwOEFxdnpleUhpL1JCc1pPdGIyZUFzT1hFM1JiRnkyOGVoRFRIZEczNGZSUU5UNmtwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlVIdzh3clVHb3ZNVnFTOGoraVc4SGZBeTNzakFyamUweWd6Mk5JRVRsTlFiRU9pZkFKdFkrQUVmWndaRTAvMFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklNVlA0aHdUbUlneVJlSkJEbUF4MzFjbHdzV1pTUGFyOXgrV1FmZUozcmZ5NUxCQ3RmM1JVYmRnbnZ5bkJIRmtcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGanVjd29xZ09PWHZpQ1d4SWEwRitaQW1aSkJqNStwTE4vVjkyUlhPdTBjMmZSM01mNjhKNjdPSitLNHVlbzFOXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibkJoUnN1bFdNbUdxSVZqWU9aUXhpTnpXWWNPVlhqM0RUUk1DQXdFQUFhTlFNRTR3SFFZRFZSME9CQllFRkpiWVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRVMDZSdUphaU1CczJ2eng1eTBNYmFRT01COEdBMVVkSXdRWU1CYUFGSmJZVFUwNlJ1SmFpTUJzMnZ6eDV5ME1cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYVFPTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdnRUJBRkVreTBqTFRtS2VmRFZYXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOE84NEtvdXBtUTJxUVFCYVFGM0Y1R0V1aGkwcUpSd25tc1drQ21zeFBQNTVTNjdXREZwM0pIK0xYMTRVeEw0VFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZiRzJDWEh0L0JGMXlVM1o4SkJ3eDNiRG1mVW5VT0FGa08zbm1CeWIxMUZ5WlRITXpxNGpwMDNEZXhXUkV2NHFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaTUrNVhiNTZWRUNnQ0gvaG5HcWhRZUZHaGxaVWNTWG9iVmhBVSszOUw2YXpXRUxYeGsxSzRicFZ4WUZHbjFOXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidVorZFdtYjZzblBLRHpHNko1SUlYOFFJczZHOEg2cHRqK1FOb1UvcVRjWkVudXpNSnhwcU1zeXExMEFBK2JZL1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZBWXlYZVptM1hacnRxWW9zRGVpVWRtY0wwampteVF0eU9jQW9WVVFXajFFSnVSalhnNEJ2STZ4eFJBSVBXWVRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRGVXSEpFPVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworCisgICAgLy9vcGVuc3NsIHJlcSAteDUwOSAtbm9kZXMgLWRheXMgMzY1IC1zdWJqICcvQz1VUy9TVD1UZXN0c290YS9MPVRlc3R2aWxsZS9DTj10ZXN0LmNvbScgXAorICAgIC8vLW5ld2tleSByc2E6NTEyIC1zaGEyNTYgLWtleW91dCBrLnBlbSAtb3V0IHNob3J0LnBlbQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9QRU0gPSAiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JSUIxekNDQVlHZ0F3SUJBZ0lKQU94YXo5VHJlRE5JTUEwR0NTcUdTSWIzRFFFQkN3VUFNRWN4Q3pBSkJnTlZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQVlUQWxWVE1SRXdEd1lEVlFRSURBaFVaWE4wYzI5MFlURVNNQkFHQTFVRUJ3d0pWR1Z6ZEhacGJHeGxNUkV3XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHdZRFZRUUREQWgwWlhOMExtTnZiVEFlRncweE1qRXdNVFV5TVRRek1qTmFGdzB4TXpFd01UVXlNVFF6TWpOYVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FY3hDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoVVpYTjBjMjkwWVRFU01CQUdBMVVFQnd3SlZHVnpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkSFpwYkd4bE1SRXdEd1lEVlFRRERBaDBaWE4wTG1OdmJUQmNNQTBHQ1NxR1NJYjNEUUVCQVFVQUEwc0FNRWdDXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVFDb01neEs5SEcwTCtoWEVodDFtS3E2QXBOMyszbG1JRVZVY1dRS0w3RU1tbjkrTDZyVlNKeU9BR3dwVFZHN1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVaNXV1bEMwTGttNS9iektGU3JDZjFqbEFnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCVGRhNjZSWnNnVXZSNGVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyUlNzcTY1SzF4Y3owakFmQmdOVkhTTUVHREFXZ0JUZGE2NlJac2dVdlI0ZTJSU3NxNjVLMXhjejBqQU1CZ05WXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzRFFFQkN3VUFBMEVBWldZZ29ORG42eUV6Y21XZ3NZbkczdzJCVDZmTFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5waTArQVBLV2t3eG5FSmsxa2dwZGVTVE1nYUhBcGhROHFrc0huU2dlQkFKU3MyWkNRTWluVlBnT2c9PVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworCisgICAgcHVibGljIHZvaWQgdGVzdE1ENSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRCYWQoTUQ1X1BFTSwgIldlYWsgaGFzaCBjaGVjayBkaWQgbm90IGZhaWwgYXMgZXhwZWN0ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NTEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEJhZChTSE9SVF9QRU0sICJTaG9ydCBtb2R1bHVzIGNoZWNrIGRpZCBub3QgZmFpbCBhcyBleHBlY3RlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHb29kQ2hhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0R29vZChHT09EX1BFTSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRCYWQoU3RyaW5nIHBlbSwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGVjayhjcmVhdGVDZXJ0KHBlbSkpOworICAgICAgICAgICAgZmFpbChtc2cpOworICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRHb29kKFN0cmluZyBwZW0pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVjayhjcmVhdGVDZXJ0KHBlbSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2soWDUwOUNlcnRpZmljYXRlIGNlcnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiA9IHtjZXJ0fTsKKyAgICAgICAgQ2hhaW5TdHJlbmd0aEFuYWx5emVyLmNoZWNrKGNoYWluKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgY3JlYXRlQ2VydChTdHJpbmcgcGVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYNTA5Iik7CisgICAgICAgIElucHV0U3RyZWFtIHBlbUlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBlbS5nZXRCeXRlcygpKTsKKyAgICAgICAgcmV0dXJuIChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUocGVtSW5wdXQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9OYXRpdmVDcnlwdG9UZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9OYXRpdmVDcnlwdG9UZXN0LmphdmEKaW5kZXggMzAzYzIzNC4uZmJhNjgzYiAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvTmF0aXZlQ3J5cHRvVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL05hdGl2ZUNyeXB0b1Rlc3QuamF2YQpAQCAtMTYsOCArMTYsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlOwogCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5CYXNlRGV4Q2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwpAQCAtMjcsOCArMzEsMTIgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLlByaXZhdGVLZXlFbnRyeTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1ByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkVDUHVibGljS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlQ3J0S2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVDUHJpdmF0ZUtleVNwZWM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNDksOCArNTcsMTAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5OYXRpdmVDcnlwdG8uU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0g7CiAKIHB1YmxpYyBjbGFzcyBOYXRpdmVDcnlwdG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIC8qKiBDb3JyZXNwb25kcyB0byB0aGUgbmF0aXZlIHRlc3QgbGlicmFyeSAibGliamF2YWNvcmV0ZXN0cy5zbyIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VOR0lORV9JRCA9ICJqYXZhY29yZXRlc3RzIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5VTEwgPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVEZXNjcmlwdG9yIElOVkFMSURfRkQgPSBuZXcgRmlsZURlc2NyaXB0b3IoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU0xIYW5kc2hha2VDYWxsYmFja3MgRFVNTVlfQ0IKICAgICAgICAgICAgID0gbmV3IFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3MobnVsbCwgMCwgbnVsbCk7CkBAIC02Miw2ICs3MiwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBDTElFTlRfUFJJVkFURV9LRVk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdW10gQ0xJRU5UX0NFUlRJRklDQVRFUzsKICAgICBwcml2YXRlIHN0YXRpYyBieXRlW11bXSBDQV9QUklOQ0lQQUxTOworICAgIHByaXZhdGUgc3RhdGljIEVDUHJpdmF0ZUtleSBDSEFOTkVMX0lEX1BSSVZBVEVfS0VZOworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBDSEFOTkVMX0lEOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE5hdGl2ZUNyeXB0by5FUlJfcGVla19sYXN0X2Vycm9yKCkpOworICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRTZXJ2ZXJQcml2YXRlS2V5KCkgewogICAgICAgICBpbml0Q2VydHMoKTsKQEAgLTExNCwxMiArMTMxLDMyIEBACiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSAoWDUwOUNlcnRpZmljYXRlKSBrcy5nZXRDZXJ0aWZpY2F0ZShjYUNlcnRBbGlhcyk7CiAgICAgICAgICAgICBYNTAwUHJpbmNpcGFsIHByaW5jaXBhbCA9IGNlcnRpZmljYXRlLmdldElzc3Vlclg1MDBQcmluY2lwYWwoKTsKICAgICAgICAgICAgIENBX1BSSU5DSVBBTFMgPSBuZXcgYnl0ZVtdW10geyBwcmluY2lwYWwuZ2V0RW5jb2RlZCgpIH07CisgICAgICAgICAgICBpbml0Q2hhbm5lbElkS2V5KCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbFNlc3Npb25zKGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgeworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRDaGFubmVsSWRLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKENIQU5ORUxfSURfUFJJVkFURV9LRVkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTklTVCBQLTI1NiBha2EgU0VDRyBzZWNwMjU2cjEgYWthIFg5LjYyIHByaW1lMjU2djEKKyAgICAgICAgT3BlblNTTEVDR3JvdXBDb250ZXh0IG9wZW5Tc2xTcGVjID0gT3BlblNTTEVDR3JvdXBDb250ZXh0LmdldEN1cnZlQnlOYW1lKCJwcmltZTI1NnYxIik7CisgICAgICAgIEJpZ0ludGVnZXIgcyA9IG5ldyBCaWdJbnRlZ2VyKAorICAgICAgICAgICAgICAgICIyMjljZGJiZjQ4OWFlYTU4NDgyOGEyNjFhMjNmOWZmOGIwZjY2ZjdjY2FjOThiZjIwOTZhYjNhZWU0MTQ5N2M1IiwgMTYpOworICAgICAgICBDSEFOTkVMX0lEX1BSSVZBVEVfS0VZID0gbmV3IE9wZW5TU0xFQ1ByaXZhdGVLZXkoCisgICAgICAgICAgICAgICAgbmV3IEVDUHJpdmF0ZUtleVNwZWMocywgb3BlblNzbFNwZWMuZ2V0RUNQYXJhbWV0ZXJTcGVjKCkpKTsKKworICAgICAgICAvLyBDaGFubmVsIElEIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBwdWJsaWMga2V5LgorICAgICAgICBDSEFOTkVMX0lEID0gbmV3IEJpZ0ludGVnZXIoCisgICAgICAgICAgICAgICAgIjcwMmIwNzg3MWZkNzk1NWMzMjBiMjZmMTVlMjQ0ZTQ3ZWVkNjAyNzIxMjRjOTJiOWViZWNmMGI0MmY5MDA2OWIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYjUzNTkyZWJmZWI0ZjE2N2RiZjNjZTYxNTEzYWZiMGUzNTRjNDc5YjFjMWI2OTg3NGZhNDcxMjkzNDk0Zjc3IiwKKyAgICAgICAgICAgICAgICAxNikudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxTZXNzaW9ucyhsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCkgewogICAgICAgICBhc3NlcnRFcXVhbEJ5dGVBcnJheXMoTmF0aXZlQ3J5cHRvLlNTTF9TRVNTSU9OX3Nlc3Npb25faWQoZXhwZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9TRVNTSU9OX3Nlc3Npb25faWQoYWN0dWFsKSk7CiAgICAgfQpAQCAtMTUzLDcgKzE5MCw3IEBACiAgICAgICAgIEtleVBhaXIga3AyID0ga3BnLmdlbmVyYXRlS2V5UGFpcigpOwogICAgICAgICBSU0FQcml2YXRlQ3J0S2V5IHByaXZLZXkyID0gKFJTQVByaXZhdGVDcnRLZXkpIGtwMi5nZXRQcml2YXRlKCk7CiAKLSAgICAgICAgaW50IHBrZXkxID0gMCwgcGtleTFfY29weSA9IDAsIHBrZXkyID0gMDsKKyAgICAgICAgbG9uZyBwa2V5MSA9IDAsIHBrZXkxX2NvcHkgPSAwLCBwa2V5MiA9IDA7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwa2V5MSA9IE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9uZXdfUlNBKHByaXZLZXkxLmdldE1vZHVsdXMoKS50b0J5dGVBcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJpdktleTEuZ2V0UHVibGljRXhwb25lbnQoKS50b0J5dGVBcnJheSgpLApAQCAtMjE5LDkgKzI1Niw5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdF9TU0xfQ1RYX25ldygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShjICE9IE5VTEwpOwotICAgICAgICBpbnQgYzIgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgbG9uZyBjMiA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwogICAgICAgICBhc3NlcnRUcnVlKGMgIT0gYzIpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMyKTsKQEAgLTI0NCw3ICsyODEsNyBAQAogICAgICAgICAgICAgZmFpbCgpOwogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9Ci0gICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChjLCBudWxsKTsKICAgICAgICAgICAgIGZhaWwoKTsKQEAgLTI2MCw4ICsyOTcsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX25ldygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICBpbnQgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShzICE9IE5VTEwpOwogICAgICAgICBhc3NlcnRUcnVlKChOYXRpdmVDcnlwdG8uU1NMX2dldF9vcHRpb25zKHMpICYgMHgwMTAwMDAwMEwpICE9IDApOyAvLyBTU0xfT1BfTk9fU1NMdjIKQEAgLTI3MCw3ICszMDcsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKChOYXRpdmVDcnlwdG8uU1NMX2dldF9vcHRpb25zKHMpICYgTmF0aXZlQ3J5cHRvLlNTTF9PUF9OT19UTFN2MV8xKSA9PSAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgoTmF0aXZlQ3J5cHRvLlNTTF9nZXRfb3B0aW9ucyhzKSAmIE5hdGl2ZUNyeXB0by5TU0xfT1BfTk9fVExTdjFfMikgPT0gMCk7CiAKLSAgICAgICAgaW50IHMyID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgIGxvbmcgczIgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzICE9IHMyKTsKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9mcmVlKHMyKTsKIApAQCAtMjg1LDggKzMyMiw4IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICBpbnQgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfdXNlX2NlcnRpZmljYXRlKHMsIG51bGwpOwpAQCAtMzAwLDYgKzMzNyw0MSBAQAogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX3VzZV9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXQxX3Rsc19jaGFubmVsX2lkKE5VTEwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldDFfdGxzX2NoYW5uZWxfaWQocywgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgdGhlIGtleSB2aWEgdGhlIHdyYXBwZXIgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIFBLQ1MjOCBvciBuYXRpdmUgT3BlblNTTC4KKyAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXQxX3Rsc19jaGFubmVsX2lkKHMsIENIQU5ORUxfSURfUFJJVkFURV9LRVkpOworCisgICAgICAgIC8vIFVzZSB0aGUga2V5IHZpYSBpdHMgUEtDUyM4IHJlcHJlc2VudGF0aW9uLgorICAgICAgICBhc3NlcnRFcXVhbHMoIlBLQ1MjOCIsIENIQU5ORUxfSURfUFJJVkFURV9LRVkuZ2V0Rm9ybWF0KCkpOworICAgICAgICBieXRlW10gcGtjczhFbmNvZGVkS2V5Qnl0ZXMgPSBDSEFOTkVMX0lEX1BSSVZBVEVfS0VZLmdldEVuY29kZWQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwa2NzOEVuY29kZWRLZXlCeXRlcyk7CisgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfdXNlX1BLQ1M4X1ByaXZhdGVLZXlfZm9yX3Rsc19jaGFubmVsX2lkKHMsIHBrY3M4RW5jb2RlZEtleUJ5dGVzKTsKKworICAgICAgICAvLyBVc2UgdGhlIGtleSBuYXRpdmVseS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBpbml0Q2hhbm5lbElkS2V5IG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlCisgICAgICAgIC8vIGtleSBpcyBiYWNrZWQgYnkgT3BlblNTTC4KKyAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfT3BlblNTTF9Qcml2YXRlS2V5X2Zvcl90bHNfY2hhbm5lbF9pZCgKKyAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICgoT3BlblNTTEVDUHJpdmF0ZUtleSkgQ0hBTk5FTF9JRF9QUklWQVRFX0tFWSkuZ2V0T3BlblNTTEtleSgpLmdldFBrZXlDb250ZXh0KCkpOworCisgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfZnJlZShzKTsKKyAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9DVFhfZnJlZShjKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NTTF91c2VfUHJpdmF0ZUtleSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfUHJpdmF0ZUtleShOVUxMLCBudWxsKTsKQEAgLTMwNyw4ICszNzksOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3VzZV9Qcml2YXRlS2V5KHMsIG51bGwpOwpAQCAtMzMxLDggKzQwMyw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdF9TU0xfY2hlY2tfcHJpdmF0ZV9rZXlfbm9fa2V5X25vX2NlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgIC8vIG5laXRoZXIgcHJpdmF0ZSBvciBjZXJ0aWZpY2F0ZSBzZXQKICAgICAgICAgdHJ5IHsKQEAgLTM0Niw4ICs0MTgsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX2NoZWNrX3ByaXZhdGVfa2V5X2NlcnRfdGhlbl9rZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgIC8vIGZpcnN0IGNlcnRpZmljYXRlLCB0aGVuIHByaXZhdGUKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfY2VydGlmaWNhdGUocywgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpOwpAQCAtMzY1LDggKzQzNyw4IEBACiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfQ1RYX2ZyZWUoYyk7CiAgICAgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX2NoZWNrX3ByaXZhdGVfa2V5X2tleV90aGVuX2NlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgIC8vIGZpcnN0IHByaXZhdGUsIHRoZW4gY2VydGlmaWNhdGUKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfUHJpdmF0ZUtleShzLCBnZXRTZXJ2ZXJQcml2YXRlS2V5KCkpOwpAQCAtMzkxLDggKzQ2Myw4IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICBpbnQgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAgICAgICAgIGFzc2VydFRydWUoTmF0aXZlQ3J5cHRvLlNTTF9nZXRfbW9kZShzKSAhPSAwKTsKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9mcmVlKHMpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMpOwpAQCAtNDA1LDggKzQ3Nyw4IEBACiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICBpbnQgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAgICAgICAgIC8vIGNoZWNrIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIIG9mZiBieSBkZWZhdWx0CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBOYXRpdmVDcnlwdG8uU1NMX2dldF9tb2RlKHMpICYgU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0gpOwogICAgICAgICAvLyBzZXQgU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0ggb24KQEAgLTQyOSw4ICs1MDEsOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICBhc3NlcnRUcnVlKE5hdGl2ZUNyeXB0by5TU0xfZ2V0X29wdGlvbnMocykgIT0gMCk7CiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfZnJlZShzKTsKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9DVFhfZnJlZShjKTsKQEAgLTQ0Myw4ICs1MTUsOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICBhc3NlcnRUcnVlKChOYXRpdmVDcnlwdG8uU1NMX2dldF9vcHRpb25zKHMpICYgTmF0aXZlQ3J5cHRvLlNTTF9PUF9OT19TU0x2MykgPT0gMCk7CiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2V0X29wdGlvbnMocywgTmF0aXZlQ3J5cHRvLlNTTF9PUF9OT19TU0x2Myk7CiAgICAgICAgIGFzc2VydFRydWUoKE5hdGl2ZUNyeXB0by5TU0xfZ2V0X29wdGlvbnMocykgJiBOYXRpdmVDcnlwdG8uU1NMX09QX05PX1NTTHYzKSAhPSAwKTsKQEAgLTQ1OSw4ICs1MzEsOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICBhc3NlcnRUcnVlKChOYXRpdmVDcnlwdG8uU1NMX2dldF9vcHRpb25zKHMpICYgTmF0aXZlQ3J5cHRvLlNTTF9PUF9OT19TU0x2MykgPT0gMCk7CiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2V0X29wdGlvbnMocywgTmF0aXZlQ3J5cHRvLlNTTF9PUF9OT19TU0x2Myk7CiAgICAgICAgIGFzc2VydFRydWUoKE5hdGl2ZUNyeXB0by5TU0xfZ2V0X29wdGlvbnMocykgJiBOYXRpdmVDcnlwdG8uU1NMX09QX05PX1NTTHYzKSAhPSAwKTsKQEAgLTQ3Nyw4ICs1NDksOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9jaXBoZXJfbGlzdHMocywgbnVsbCk7CkBAIC01MjcsOCArNTk5LDggQEAKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogCi0gICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7Ci0gICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICBsb25nIHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXRfdmVyaWZ5KHMsIE5hdGl2ZUNyeXB0by5TU0xfVkVSSUZZX05PTkUpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF92ZXJpZnkocywgTmF0aXZlQ3J5cHRvLlNTTF9WRVJJRllfUEVFUik7CiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2V0X3ZlcmlmeShzLCBOYXRpdmVDcnlwdG8uU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCk7CkBAIC01NDEsMTkgKzYxMywyNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG9va3MgewotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRleHQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBFQ1ByaXZhdGVLZXkgY2hhbm5lbElkUHJpdmF0ZUtleTsKKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRDb250ZXh0KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICByZXR1cm4gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBiZWZvcmVIYW5kc2hha2UoaW50IGNvbnRleHQpIHRocm93cyBTU0xFeGNlcHRpb24gewotICAgICAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjb250ZXh0KTsKKyAgICAgICAgcHVibGljIGxvbmcgYmVmb3JlSGFuZHNoYWtlKGxvbmcgY29udGV4dCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjb250ZXh0KTsKICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyBTU0xfc2V0X2NpcGhlcl9saXN0cyBjYWxsIHRoZSB0ZXN0cyB3ZXJlCiAgICAgICAgICAgICAvLyBuZWdvdGlhdGluZyBESEUtUlNBLUFFUzI1Ni1TSEEgYnkgZGVmYXVsdCB3aGljaCBoYWQKICAgICAgICAgICAgIC8vIHZlcnkgc2xvdyBlcGhlbWVyYWwgUlNBIGtleSBnZW5lcmF0aW9uCiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9jaXBoZXJfbGlzdHMocywgbmV3IFN0cmluZ1tdIHsgIlJDNC1NRDUiIH0pOworCisgICAgICAgICAgICBpZiAoY2hhbm5lbElkUHJpdmF0ZUtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXQxX3Rsc19jaGFubmVsX2lkKHMsIGNoYW5uZWxJZFByaXZhdGVLZXkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgY2xpZW50Q2VydGlmaWNhdGVSZXF1ZXN0ZWQoaW50IHMpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgc3NsLCBpbnQgY29udGV4dCwKKyAgICAgICAgcHVibGljIHZvaWQgY2xpZW50Q2VydGlmaWNhdGVSZXF1ZXN0ZWQobG9uZyBzKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgc3NsLCBsb25nIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrZXQsIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01NzgsMTEgKzY1NiwxMSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGltcGxlbWVudHMgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTb2NrZXQgc29ja2V0OwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBzc2xOYXRpdmVQb2ludGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3NsTmF0aXZlUG9pbnRlcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBIb29rcyBob29rczsKIAogICAgICAgICBwdWJsaWMgVGVzdFNTTEhhbmRzaGFrZUNhbGxiYWNrcyhTb2NrZXQgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3NsTmF0aXZlUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzc2xOYXRpdmVQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rcyBob29rcykgewogICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CiAgICAgICAgICAgICB0aGlzLnNzbE5hdGl2ZVBvaW50ZXIgPSBzc2xOYXRpdmVQb2ludGVyOwpAQCAtNTk3LDcgKzY3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhNZXRob2QpCiAgICAgICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3NsPTB4IiArIEludGVnZXIudG9TdHJpbmcoc3NsTmF0aXZlUG9pbnRlciwgMTYpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzc2w9MHgiICsgTG9uZy50b1N0cmluZyhzc2xOYXRpdmVQb2ludGVyLCAxNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZlcmlmeUNlcnRpZmljYXRlQ2hhaW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhc24xRGVyRW5jb2RlZENlcnRpZmljYXRlQ2hhaW49IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzbjFEZXJFbmNvZGVkQ2VydGlmaWNhdGVDaGFpbgpAQCAtNjE0LDcgKzY5Miw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkKGJ5dGVbXSBrZXlUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdW10gYXNuMURlckVuY29kZWRYNTAwUHJpbmNpcGFscykgewogICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzc2w9MHgiICsgSW50ZWdlci50b1N0cmluZyhzc2xOYXRpdmVQb2ludGVyLCAxNikKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzbD0weCIgKyBMb25nLnRvU3RyaW5nKHNzbE5hdGl2ZVBvaW50ZXIsIDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2xpZW50Q2VydGlmaWNhdGVSZXF1ZXN0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXlUeXBlcz0iICsga2V5VHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzbjFEZXJFbmNvZGVkWDUwMFByaW5jaXBhbHM9IgpAQCAtNjMxLDcgKzcwOSw3IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRzaGFrZUNvbXBsZXRlZENhbGxlZDsKICAgICAgICAgcHVibGljIHZvaWQgaGFuZHNoYWtlQ29tcGxldGVkKCkgewogICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzc2w9MHgiICsgSW50ZWdlci50b1N0cmluZyhzc2xOYXRpdmVQb2ludGVyLCAxNikKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzbD0weCIgKyBMb25nLnRvU3RyaW5nKHNzbE5hdGl2ZVBvaW50ZXIsIDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFuZHNoYWtlQ29tcGxldGVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzLmhhbmRzaGFrZUNvbXBsZXRlZENhbGxlZCA9IHRydWU7CkBAIC02NDUsMjMgKzcyMyw0NiBAQAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVySG9va3MgZXh0ZW5kcyBIb29rcyB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHByaXZhdGVLZXk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdW10gY2VydGlmaWNhdGVzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hhbm5lbElkRW5hYmxlZDsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2U7CisgICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIGNoYW5uZWxJZEFmdGVySGFuZHNoYWtlRXhjZXB0aW9uOworCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJIb29rcyhieXRlW10gcHJpdmF0ZUtleSwgYnl0ZVtdW10gY2VydGlmaWNhdGVzKSB7CiAgICAgICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBwcml2YXRlS2V5OwogICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBjZXJ0aWZpY2F0ZXM7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBiZWZvcmVIYW5kc2hha2UoaW50IGMpIHRocm93cyBTU0xFeGNlcHRpb24gewotICAgICAgICAgICAgaW50IHMgPSBzdXBlci5iZWZvcmVIYW5kc2hha2UoYyk7CisgICAgICAgIHB1YmxpYyBsb25nIGJlZm9yZUhhbmRzaGFrZShsb25nIGMpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyBzID0gc3VwZXIuYmVmb3JlSGFuZHNoYWtlKGMpOwogICAgICAgICAgICAgaWYgKHByaXZhdGVLZXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfdXNlX1ByaXZhdGVLZXkocywgcHJpdmF0ZUtleSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2VydGlmaWNhdGVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3VzZV9jZXJ0aWZpY2F0ZShzLCBjZXJ0aWZpY2F0ZXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoYW5uZWxJZEVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2VuYWJsZV90bHNfY2hhbm5lbF9pZChzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkKGludCBzKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzc2wsIGxvbmcgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCwgRmlsZURlc2NyaXB0b3IgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKKyAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICBpZiAoY2hhbm5lbElkRW5hYmxlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2UgPSBOYXRpdmVDcnlwdG8uU1NMX2dldF90bHNfY2hhbm5lbF9pZChzc2wpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2VFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBzdXBlci5hZnRlckhhbmRzaGFrZShzZXNzaW9uLCBzc2wsIGNvbnRleHQsIHNvY2tldCwgZmQsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkKGxvbmcgcykgewogICAgICAgICAgICAgZmFpbCgiU2VydmVyIGFza2VkIGZvciBjbGllbnQgY2VydGlmaWNhdGVzIik7CiAgICAgICAgIH0KICAgICB9CkBAIC02ODAsMjcgKzc4MSwyNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3Moc29ja2V0LCAwLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBzb2NrZXQuZ2V0RmlsZURlc2NyaXB0b3IkKCk7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSBob29rcy5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHMgPSBob29rcy5iZWZvcmVIYW5kc2hha2UoYyk7CisgICAgICAgICAgICAgICAgbG9uZyBjID0gaG9va3MuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgIGxvbmcgcyA9IGhvb2tzLmJlZm9yZUhhbmRzaGFrZShjKTsKICAgICAgICAgICAgICAgICBUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzKHNvY2tldCwgcywgaG9va3MpOwogICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzbD0weCIgKyBJbnRlZ2VyLnRvU3RyaW5nKHMsIDE2KQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzbD0weCIgKyBMb25nLnRvU3RyaW5nKHMsIDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhbmRzaGFrZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZXh0PTB4IiArIEludGVnZXIudG9TdHJpbmcoYywgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29udGV4dD0weCIgKyBMb25nLnRvU3RyaW5nKGMsIDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNvY2tldD0iICsgc29ja2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmQ9IiArIGZkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZW91dD0iICsgdGltZW91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNsaWVudD0iICsgY2xpZW50KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSBOVUxMOworICAgICAgICAgICAgICAgIGxvbmcgc2Vzc2lvbiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IE5hdGl2ZUNyeXB0by5TU0xfZG9faGFuZHNoYWtlKHMsIGZkLCBjYWxsYmFjaywgdGltZW91dCwgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnBuUHJvdG9jb2xzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzbD0weCIgKyBJbnRlZ2VyLnRvU3RyaW5nKHMsIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzc2w9MHgiICsgTG9uZy50b1N0cmluZyhzLCAxNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFuZHNoYWtlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uPTB4IiArIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvbiwgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2Vzc2lvbj0weCIgKyBMb25nLnRvU3RyaW5nKHNlc3Npb24sIDE2KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgYWZ0ZXJIYW5kc2hha2UgaXMgY2FsbGVkIHRvIGZyZWUgcmVzb3VyY2VzCkBAIC03MjIsOCArODIzLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0X1NTTF9kb19oYW5kc2hha2VfbnVsbF9hcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7Ci0gICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICBsb25nIHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9kb19oYW5kc2hha2UocywgbnVsbCwgbnVsbCwgMCwgdHJ1ZSwgbnVsbCk7CkBAIC03NjcsNyArODY4LDcgQEAKIAogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkKGludCBzKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZChsb25nIHMpIHsKICAgICAgICAgICAgICAgICBzdXBlci5jbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZChzKTsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3VzZV9Qcml2YXRlS2V5KHMsIGdldENsaWVudFByaXZhdGVLZXkoKSk7CiAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF91c2VfY2VydGlmaWNhdGUocywgZ2V0Q2xpZW50Q2VydGlmaWNhdGVzKCkpOwpAQCAtNzc1LDggKzg3Niw4IEBACiAgICAgICAgIH07CiAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgYmVmb3JlSGFuZHNoYWtlKGludCBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpbnQgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjKTsKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGJlZm9yZUhhbmRzaGFrZShsb25nIGMpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvbmcgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjKTsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9jbGllbnRfQ0FfbGlzdChzLCBnZXRDYVByaW5jaXBhbHMoKSk7CiAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXRfdmVyaWZ5KHMsIE5hdGl2ZUNyeXB0by5TU0xfVkVSSUZZX1BFRVIpOwogICAgICAgICAgICAgICAgIHJldHVybiBzOwpAQCAtODE4LDggKzkxOSw4IEBACiAgICAgICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKTsKICAgICAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBiZWZvcmVIYW5kc2hha2UoaW50IGMpIHRocm93cyBTU0xFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBiZWZvcmVIYW5kc2hha2UobG9uZyBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzID0gc3VwZXIuYmVmb3JlSGFuZHNoYWtlKGMpOwogICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9jbGllbnRfQ0FfbGlzdChzLCBnZXRDYVByaW5jaXBhbHMoKSk7CiAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2V0X3ZlcmlmeShzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9WRVJJRllfUEVFUgpAQCAtODUxLDEzICs5NTIsMTMgQEAKIAogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgYmVmb3JlSGFuZHNoYWtlKGludCBjb250ZXh0KSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpbnQgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjb250ZXh0KTsKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGJlZm9yZUhhbmRzaGFrZShsb25nIGNvbnRleHQpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvbmcgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2NsZWFyX21vZGUocywgU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0gpOwogICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC04NjYsMTQgKzk2NywxNCBAQAogICAgICAgICAgICAgICAgIHN1cGVyLmFmdGVySGFuZHNoYWtlKHNlc3Npb24sIHMsIGMsIHNvY2ssIGZkLCBjYWxsYmFjayk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkKGludCBzKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZChsb25nIHMpIHsKICAgICAgICAgICAgICAgICBzdXBlci5jbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZChzKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgSG9va3Mgc0hvb2tzID0gbmV3IFNlcnZlckhvb2tzKGdldFNlcnZlclByaXZhdGVLZXkoKSwgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UoaW50IHNlc3Npb24sIGludCBzLCBpbnQgYywKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtOTQ1LDYgKzEwNDYsODQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX2RvX2hhbmRzaGFrZV93aXRoX2NoYW5uZWxfaWRfbm9ybWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRDaGFubmVsSWRLZXkoKTsKKworICAgICAgICAvLyBOb3JtYWwgaGFuZHNoYWtlIHdpdGggVExTIENoYW5uZWwgSUQuCisgICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBsaXN0ZW5lciA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7CisgICAgICAgIEhvb2tzIGNIb29rcyA9IG5ldyBIb29rcygpOworICAgICAgICBjSG9va3MuY2hhbm5lbElkUHJpdmF0ZUtleSA9IENIQU5ORUxfSURfUFJJVkFURV9LRVk7CisgICAgICAgIFNlcnZlckhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKTsKKyAgICAgICAgc0hvb2tzLmNoYW5uZWxJZEVuYWJsZWQgPSB0cnVlOworICAgICAgICBGdXR1cmU8VGVzdFNTTEhhbmRzaGFrZUNhbGxiYWNrcz4gY2xpZW50ID0gaGFuZHNoYWtlKGxpc3RlbmVyLCAwLCB0cnVlLCBjSG9va3MsIG51bGwpOworICAgICAgICBGdXR1cmU8VGVzdFNTTEhhbmRzaGFrZUNhbGxiYWNrcz4gc2VydmVyID0gaGFuZHNoYWtlKGxpc3RlbmVyLCAwLCBmYWxzZSwgc0hvb2tzLCBudWxsKTsKKyAgICAgICAgVGVzdFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5nZXQoVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgVGVzdFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBzZXJ2ZXJDYWxsYmFjayA9IHNlcnZlci5nZXQoVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnRDYWxsYmFjay52ZXJpZnlDZXJ0aWZpY2F0ZUNoYWluQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxDZXJ0aWZpY2F0ZUNoYWlucyhnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay5hc24xRGVyRW5jb2RlZENlcnRpZmljYXRlQ2hhaW4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJTQSIsIGNsaWVudENhbGxiYWNrLmF1dGhNZXRob2QpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2ZXJDYWxsYmFjay52ZXJpZnlDZXJ0aWZpY2F0ZUNoYWluQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Q2FsbGJhY2suY2xpZW50Q2VydGlmaWNhdGVSZXF1ZXN0ZWRDYWxsZWQpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2ZXJDYWxsYmFjay5jbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZENhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Q2FsbGJhY2suaGFuZHNoYWtlQ29tcGxldGVkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2ZXJDYWxsYmFjay5oYW5kc2hha2VDb21wbGV0ZWRDYWxsZWQpOworICAgICAgICBhc3NlcnROdWxsKHNIb29rcy5jaGFubmVsSWRBZnRlckhhbmRzaGFrZUV4Y2VwdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFsQnl0ZUFycmF5cyhDSEFOTkVMX0lELCBzSG9va3MuY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX2RvX2hhbmRzaGFrZV93aXRoX2NoYW5uZWxfaWRfbm90X3N1cHBvcnRlZF9ieV9zZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdENoYW5uZWxJZEtleSgpOworCisgICAgICAgIC8vIENsaWVudCB0cmllcyB0byB1c2UgVExTIENoYW5uZWwgSUQgYnV0IHRoZSBzZXJ2ZXIgZG9lcyBub3QgZW5hYmxlL29mZmVyIHRoZSBleHRlbnNpb24uCisgICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBsaXN0ZW5lciA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7CisgICAgICAgIEhvb2tzIGNIb29rcyA9IG5ldyBIb29rcygpOworICAgICAgICBjSG9va3MuY2hhbm5lbElkUHJpdmF0ZUtleSA9IENIQU5ORUxfSURfUFJJVkFURV9LRVk7CisgICAgICAgIFNlcnZlckhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKTsKKyAgICAgICAgc0hvb2tzLmNoYW5uZWxJZEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgRnV0dXJlPFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3M+IGNsaWVudCA9IGhhbmRzaGFrZShsaXN0ZW5lciwgMCwgdHJ1ZSwgY0hvb2tzLCBudWxsKTsKKyAgICAgICAgRnV0dXJlPFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3M+IHNlcnZlciA9IGhhbmRzaGFrZShsaXN0ZW5lciwgMCwgZmFsc2UsIHNIb29rcywgbnVsbCk7CisgICAgICAgIFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3MgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuZ2V0KFRJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIFRlc3RTU0xIYW5kc2hha2VDYWxsYmFja3Mgc2VydmVyQ2FsbGJhY2sgPSBzZXJ2ZXIuZ2V0KFRJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Q2FsbGJhY2sudmVyaWZ5Q2VydGlmaWNhdGVDaGFpbkNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFsQ2VydGlmaWNhdGVDaGFpbnMoZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2suYXNuMURlckVuY29kZWRDZXJ0aWZpY2F0ZUNoYWluKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSU0EiLCBjbGllbnRDYWxsYmFjay5hdXRoTWV0aG9kKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmVyQ2FsbGJhY2sudmVyaWZ5Q2VydGlmaWNhdGVDaGFpbkNhbGxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudENhbGxiYWNrLmNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmVyQ2FsbGJhY2suY2xpZW50Q2VydGlmaWNhdGVSZXF1ZXN0ZWRDYWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKGNsaWVudENhbGxiYWNrLmhhbmRzaGFrZUNvbXBsZXRlZENhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoc2VydmVyQ2FsbGJhY2suaGFuZHNoYWtlQ29tcGxldGVkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzSG9va3MuY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2VFeGNlcHRpb24pOworICAgICAgICBhc3NlcnROdWxsKHNIb29rcy5jaGFubmVsSWRBZnRlckhhbmRzaGFrZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9TU0xfZG9faGFuZHNoYWtlX3dpdGhfY2hhbm5lbF9pZF9ub3RfZW5hYmxlZF9ieV9jbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdENoYW5uZWxJZEtleSgpOworCisgICAgICAgIC8vIENsaWVudCBkb2VzIG5vdCB1c2UgVExTIENoYW5uZWwgSUQgd2hlbiB0aGUgc2VydmVyIGhhcyB0aGUgZXh0ZW5zaW9uIGVuYWJsZWQvb2ZmZXJlZC4KKyAgICAgICAgZmluYWwgU2VydmVyU29ja2V0IGxpc3RlbmVyID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCk7CisgICAgICAgIGNIb29rcy5jaGFubmVsSWRQcml2YXRlS2V5ID0gbnVsbDsKKyAgICAgICAgU2VydmVySG9va3Mgc0hvb2tzID0gbmV3IFNlcnZlckhvb2tzKGdldFNlcnZlclByaXZhdGVLZXkoKSwgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpOworICAgICAgICBzSG9va3MuY2hhbm5lbElkRW5hYmxlZCA9IHRydWU7CisgICAgICAgIEZ1dHVyZTxUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzPiBjbGllbnQgPSBoYW5kc2hha2UobGlzdGVuZXIsIDAsIHRydWUsIGNIb29rcywgbnVsbCk7CisgICAgICAgIEZ1dHVyZTxUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzPiBzZXJ2ZXIgPSBoYW5kc2hha2UobGlzdGVuZXIsIDAsIGZhbHNlLCBzSG9va3MsIG51bGwpOworICAgICAgICBUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNsaWVudENhbGxiYWNrID0gY2xpZW50LmdldChUSU1FT1VUX1NFQ09ORFMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBUZXN0U1NMSGFuZHNoYWtlQ2FsbGJhY2tzIHNlcnZlckNhbGxiYWNrID0gc2VydmVyLmdldChUSU1FT1VUX1NFQ09ORFMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnRUcnVlKGNsaWVudENhbGxiYWNrLnZlcmlmeUNlcnRpZmljYXRlQ2hhaW5DYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbENlcnRpZmljYXRlQ2hhaW5zKGdldFNlcnZlckNlcnRpZmljYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLmFzbjFEZXJFbmNvZGVkQ2VydGlmaWNhdGVDaGFpbik7CisgICAgICAgIGFzc2VydEVxdWFscygiUlNBIiwgY2xpZW50Q2FsbGJhY2suYXV0aE1ldGhvZCk7CisgICAgICAgIGFzc2VydEZhbHNlKHNlcnZlckNhbGxiYWNrLnZlcmlmeUNlcnRpZmljYXRlQ2hhaW5DYWxsZWQpOworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnRDYWxsYmFjay5jbGllbnRDZXJ0aWZpY2F0ZVJlcXVlc3RlZENhbGxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKHNlcnZlckNhbGxiYWNrLmNsaWVudENlcnRpZmljYXRlUmVxdWVzdGVkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnRDYWxsYmFjay5oYW5kc2hha2VDb21wbGV0ZWRDYWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZlckNhbGxiYWNrLmhhbmRzaGFrZUNvbXBsZXRlZENhbGxlZCk7CisgICAgICAgIGFzc2VydE51bGwoc0hvb2tzLmNoYW5uZWxJZEFmdGVySGFuZHNoYWtlRXhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzSG9va3MuY2hhbm5lbElkQWZ0ZXJIYW5kc2hha2UpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RfU1NMX3NldF9zZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9zZXNzaW9uKE5VTEwsIE5VTEwpOwpAQCAtOTUzLDI3ICsxMTMyLDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9zZXNzaW9uKHMsIE5VTEwpOwogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9mcmVlKHMpOwogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9DVFhfZnJlZShjKTsKICAgICAgICAgfQogCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjbGllbnRDb250ZXh0ID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2VydmVyQ29udGV4dCA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICAgICAgZmluYWwgbG9uZyBjbGllbnRDb250ZXh0ID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHNlcnZlckNvbnRleHQgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKICAgICAgICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBsaXN0ZW5lciA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSBjbGllbnRTZXNzaW9uID0gbmV3IGludFtdIHsgTlVMTCB9OwotICAgICAgICAgICAgZmluYWwgaW50W10gc2VydmVyU2Vzc2lvbiA9IG5ldyBpbnRbXSB7IE5VTEwgfTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmdbXSBjbGllbnRTZXNzaW9uID0gbmV3IGxvbmdbXSB7IE5VTEwgfTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmdbXSBzZXJ2ZXJTZXNzaW9uID0gbmV3IGxvbmdbXSB7IE5VTEwgfTsKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbnRleHQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29udGV4dCgpIHRocm93cyBTU0xFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudENvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtOTgzLDExICsxMTYyLDExIEBACiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBIb29rcyBzSG9va3MgPSBuZXcgU2VydmVySG9va3MoZ2V0U2VydmVyUHJpdmF0ZUtleSgpLCBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKSkgewogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRDb250ZXh0KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENvbnRleHQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJDb250ZXh0OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEwMDYsMTcgKzExODUsMTcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbnRleHQoKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29udGV4dCgpIHRocm93cyBTU0xFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudENvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgYmVmb3JlSGFuZHNoYWtlKGludCBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoY2xpZW50Q29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGJlZm9yZUhhbmRzaGFrZShsb25nIGMpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoY2xpZW50Q29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9zZXNzaW9uKHMsIGNsaWVudFNlc3Npb25bMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTAyNiwxMSArMTIwNSwxMSBAQAogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgSG9va3Mgc0hvb2tzID0gbmV3IFNlcnZlckhvb2tzKGdldFNlcnZlclByaXZhdGVLZXkoKSwgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udGV4dCgpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDb250ZXh0KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UoaW50IHNlc3Npb24sIGludCBzLCBpbnQgYywKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMDYwLDggKzEyMzksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKHMsIGZhbHNlKTsKICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2V0X3Nlc3Npb25fY3JlYXRpb25fZW5hYmxlZChzLCB0cnVlKTsKICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfZnJlZShzKTsKQEAgLTEwNzQsOCArMTI1Myw4IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBiZWZvcmVIYW5kc2hha2UoaW50IGMpIHRocm93cyBTU0xFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBiZWZvcmVIYW5kc2hha2UobG9uZyBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzID0gc3VwZXIuYmVmb3JlSGFuZHNoYWtlKGMpOwogICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3NldF9zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQocywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDk0LDggKzEyNzMsOCBAQAogICAgICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCk7CiAgICAgICAgICAgICBIb29rcyBzSG9va3MgPSBuZXcgU2VydmVySG9va3MoZ2V0U2VydmVyUHJpdmF0ZUtleSgpLCBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKSkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgYmVmb3JlSGFuZHNoYWtlKGludCBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBzdXBlci5iZWZvcmVIYW5kc2hha2UoYyk7CisgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgYmVmb3JlSGFuZHNoYWtlKGxvbmcgYykgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcyA9IHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjKTsKICAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKHMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTEyMCw4ICsxMjk5LDggQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGhvc3RuYW1lID0gInd3dy5hbmRyb2lkLmNvbSI7CiAKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogCiAgICAgICAgICAgICAvLyBudWxsIGhvc3RuYW1lCiAgICAgICAgICAgICB0cnkgewpAQCAtMTE1MiwxNSArMTMzMSwxNSBAQAogICAgICAgICAvLyBub3JtYWwKICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGJlZm9yZUhhbmRzaGFrZShpbnQgYykgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgaW50IHMgPSBzdXBlci5iZWZvcmVIYW5kc2hha2UoYyk7CisgICAgICAgICAgICBwdWJsaWMgbG9uZyBiZWZvcmVIYW5kc2hha2UobG9uZyBjKSB0aHJvd3MgU1NMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBsb25nIHMgPSBzdXBlci5iZWZvcmVIYW5kc2hha2UoYyk7CiAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzLCBob3N0bmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTExODcsMTEgKzEzNjYsMTEgQEAKICAgICAgICAgfTsKIAogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBiZWZvcmVIYW5kc2hha2UoaW50IGNvbnRleHQpIHRocm93cyBTU0xFeGNlcHRpb24geworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIGJlZm9yZUhhbmRzaGFrZShsb25nIGNvbnRleHQpIHRocm93cyBTU0xFeGNlcHRpb24gewogICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfQ1RYX2VuYWJsZV9ucG4oY29udGV4dCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmJlZm9yZUhhbmRzaGFrZShjb250ZXh0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHNzbCwgaW50IGNvbnRleHQsIFNvY2tldCBzb2NrZXQsCisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHNzbCwgbG9uZyBjb250ZXh0LCBTb2NrZXQgc29ja2V0LAogICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCwgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICBieXRlW10gbmVnb3RpYXRlZCA9IE5hdGl2ZUNyeXB0by5TU0xfZ2V0X25wbl9uZWdvdGlhdGVkX3Byb3RvY29sKHNzbCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcGR5LzIiLCBuZXcgU3RyaW5nKG5lZ290aWF0ZWQpKTsKQEAgLTEyMDEsMTEgKzEzODAsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgSG9va3Mgc0hvb2tzID0gbmV3IFNlcnZlckhvb2tzKGdldFNlcnZlclByaXZhdGVLZXkoKSwgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGJlZm9yZUhhbmRzaGFrZShpbnQgY29udGV4dCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmcgYmVmb3JlSGFuZHNoYWtlKGxvbmcgY29udGV4dCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9DVFhfZW5hYmxlX25wbihjb250ZXh0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuYmVmb3JlSGFuZHNoYWtlKGNvbnRleHQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgc3NsLCBpbnQgYywgU29ja2V0IHNvY2ssCisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHNzbCwgbG9uZyBjLCBTb2NrZXQgc29jaywKICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIG5lZ290aWF0ZWQgPSBOYXRpdmVDcnlwdG8uU1NMX2dldF9ucG5fbmVnb3RpYXRlZF9wcm90b2NvbChzc2wpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygic3BkeS8yIiwgbmV3IFN0cmluZyhuZWdvdGlhdGVkKSk7CkBAIC0xMjMyLDggKzE0MTEsOCBAQAogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKLSAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICBhc3NlcnROdWxsKE5hdGl2ZUNyeXB0by5TU0xfZ2V0X3NlcnZlcm5hbWUocykpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2ZyZWUocyk7CiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfQ1RYX2ZyZWUoYyk7CkBAIC0xMjUxLDcgKzE0MzAsNyBAQAogICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgbGlzdGVuZXIgPSBuZXcgU2VydmVyU29ja2V0KDApOwogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEyNjMsNyArMTQ0Miw3IEBACiAgICAgICAgIH07CiAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTI4OCw3ICsxNDY3LDcgQEAKICAgICAgICAgZmluYWwgU2VydmVyU29ja2V0IGxpc3RlbmVyID0gbmV3IFNlcnZlclNvY2tldCgwKTsKICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEyOTgsNyArMTQ3Nyw3IEBACiAgICAgICAgIH07CiAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEzMjUsNyArMTUwNCw3IEBACiAKICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMzU0LDggKzE1MzMsOCBAQAogCiAgICAgICAgIC8vIG51bGwgRmlsZURlc2NyaXB0b3IKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3JlYWQocywgbnVsbCwgRFVNTVlfQ0IsIG51bGwsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgIGZhaWwoKTsKQEAgLTEzNjcsOCArMTU0Niw4IEBACiAKICAgICAgICAgLy8gbnVsbCBTU0xIYW5kc2hha2VDYWxsYmFja3MKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3JlYWQocywgSU5WQUxJRF9GRCwgbnVsbCwgbnVsbCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgZmFpbCgpOwpAQCAtMTM4MCw4ICsxNTU5LDggQEAKIAogICAgICAgICAvLyBudWxsIGJ5dGUgYXJyYXkKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3JlYWQocywgSU5WQUxJRF9GRCwgRFVNTVlfQ0IsIG51bGwsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgIGZhaWwoKTsKQEAgLTEzOTMsOCArMTU3Miw4IEBACiAKICAgICAgICAgLy8gaGFuZHNoYWtpbmcgbm90IHlldCBwZXJmb3JtZWQKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3JlYWQocywgSU5WQUxJRF9GRCwgRFVNTVlfQ0IsIG5ldyBieXRlWzFdLCAwLCAxLCAwKTsKICAgICAgICAgICAgICAgICBmYWlsKCk7CkBAIC0xNDEwLDcgKzE1ODksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UoaW50IHNlc3Npb24sIGludCBzLCBpbnQgYywKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE0MzEsNyArMTYxMCw3IEBACiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgSG9va3Mgc0hvb2tzID0gbmV3IFNlcnZlckhvb2tzKGdldFNlcnZlclByaXZhdGVLZXkoKSwgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTQ0OSw3ICsxNjI4LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEhvb2tzIGNIb29rcyA9IG5ldyBIb29rcygpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTQ1OSw3ICsxNjM4LDcgQEAKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBIb29rcyBzSG9va3MgPSBuZXcgU2VydmVySG9va3MoZ2V0U2VydmVyUHJpdmF0ZUtleSgpLCBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKSkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNDg1LDggKzE2NjQsOCBAQAogCiAgICAgICAgIC8vIG51bGwgRmlsZURlc2NyaXB0b3IKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3dyaXRlKHMsIG51bGwsIERVTU1ZX0NCLCBudWxsLCAwLCAxLCAwKTsKICAgICAgICAgICAgICAgICBmYWlsKCk7CkBAIC0xNDk4LDggKzE2NzcsOCBAQAogCiAgICAgICAgIC8vIG51bGwgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7Ci0gICAgICAgICAgICBpbnQgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOworICAgICAgICAgICAgbG9uZyBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgICAgICBsb25nIHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF93cml0ZShzLCBJTlZBTElEX0ZELCBudWxsLCBudWxsLCAwLCAxLCAwKTsKICAgICAgICAgICAgICAgICBmYWlsKCk7CkBAIC0xNTExLDggKzE2OTAsOCBAQAogCiAgICAgICAgIC8vIG51bGwgYnl0ZSBhcnJheQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwotICAgICAgICAgICAgaW50IHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKKyAgICAgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICAgICAgbG9uZyBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfd3JpdGUocywgSU5WQUxJRF9GRCwgRFVNTVlfQ0IsIG51bGwsIDAsIDEsIDApOwogICAgICAgICAgICAgICAgIGZhaWwoKTsKQEAgLTE1MjQsOCArMTcwMyw4IEBACiAKICAgICAgICAgLy8gaGFuZHNoYWtpbmcgbm90IHlldCBwZXJmb3JtZWQKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX3dyaXRlKHMsIElOVkFMSURfRkQsIERVTU1ZX0NCLCBuZXcgYnl0ZVsxXSwgMCwgMSwgMCk7CiAgICAgICAgICAgICAgICAgZmFpbCgpOwpAQCAtMTU0NCw4ICsxNzIzLDggQEAKIAogICAgICAgICAvLyBhbHNvIHdvcmtzIHdpdGhvdXQgaGFuZHNoYWtpbmcKICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKLSAgICAgICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgICAgICBsb25nIGMgPSBOYXRpdmVDcnlwdG8uU1NMX0NUWF9uZXcoKTsKKyAgICAgICAgICAgIGxvbmcgcyA9IE5hdGl2ZUNyeXB0by5TU0xfbmV3KGMpOwogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlNTTF9pbnRlcnJ1cHQocyk7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2ZyZWUocyk7CiAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMpOwpAQCAtMTU1NSw3ICsxNzM0LDcgQEAKIAogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE1NjUsNyArMTc0NCw3IEBACiAgICAgICAgIH07CiAgICAgICAgIEhvb2tzIHNIb29rcyA9IG5ldyBTZXJ2ZXJIb29rcyhnZXRTZXJ2ZXJQcml2YXRlS2V5KCksIGdldFNlcnZlckNlcnRpZmljYXRlcygpKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBmaW5hbCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGZpbmFsIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE2MDYsOCArMTc4NSw4IEBACiAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2h1dGRvd24oTlVMTCwgSU5WQUxJRF9GRCwgRFVNTVlfQ0IpOwogCiAgICAgICAgIC8vIGhhbmRzaGFraW5nIG5vdCB5ZXQgcGVyZm9ybWVkCi0gICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7Ci0gICAgICAgIGludCBzID0gTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYyk7CisgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOworICAgICAgICBsb25nIHMgPSBOYXRpdmVDcnlwdG8uU1NMX25ldyhjKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5TU0xfc2h1dGRvd24ocywgSU5WQUxJRF9GRCwgRFVNTVlfQ0IpOwogICAgICAgICB9IGNhdGNoIChTU0xQcm90b2NvbEV4Y2VwdGlvbiBleHBlY3RlZCkgewpAQCAtMTYyNiw3ICsxODA1LDcgQEAKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogCi0gICAgICAgIGludCBjID0gTmF0aXZlQ3J5cHRvLlNTTF9DVFhfbmV3KCk7CisgICAgICAgIGxvbmcgYyA9IE5hdGl2ZUNyeXB0by5TU0xfQ1RYX25ldygpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX2ZyZWUoTmF0aXZlQ3J5cHRvLlNTTF9uZXcoYykpOwogICAgICAgICBOYXRpdmVDcnlwdG8uU1NMX0NUWF9mcmVlKGMpOwogCkBAIC0xNjQ1LDcgKzE4MjQsNyBAQAogCiAgICAgICAgIEhvb2tzIGNIb29rcyA9IG5ldyBIb29rcygpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UoaW50IHNlc3Npb24sIGludCBzLCBpbnQgYywKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTY3NCw3ICsxODUzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNzAzLDcgKzE4ODIsNyBAQAogCiAgICAgICAgIEhvb2tzIGNIb29rcyA9IG5ldyBIb29rcygpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UoaW50IHNlc3Npb24sIGludCBzLCBpbnQgYywKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGxvbmcgc2Vzc2lvbiwgbG9uZyBzLCBsb25nIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29jaywgRmlsZURlc2NyaXB0b3IgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xIYW5kc2hha2VDYWxsYmFja3MgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTczMCw3ICsxOTA5LDcgQEAKIAogICAgICAgICBIb29rcyBjSG9va3MgPSBuZXcgSG9va3MoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVySGFuZHNoYWtlKGludCBzZXNzaW9uLCBpbnQgcywgaW50IGMsCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShsb25nIHNlc3Npb24sIGxvbmcgcywgbG9uZyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2ssIEZpbGVEZXNjcmlwdG9yIGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMSGFuZHNoYWtlQ2FsbGJhY2tzIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNzY4LDEzICsxOTQ3LDEzIEBACiAKICAgICAgICAgSG9va3MgY0hvb2tzID0gbmV3IEhvb2tzKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckhhbmRzaGFrZShpbnQgc2Vzc2lvbiwgaW50IHMsIGludCBjLAorICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJIYW5kc2hha2UobG9uZyBzZXNzaW9uLCBsb25nIHMsIGxvbmcgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrLCBGaWxlRGVzY3JpcHRvciBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEhhbmRzaGFrZUNhbGxiYWNrcyBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBOYXRpdmVDcnlwdG8uaTJkX1NTTF9TRVNTSU9OKHNlc3Npb24pOwogICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYik7Ci0gICAgICAgICAgICAgICAgaW50IHNlc3Npb24yID0gTmF0aXZlQ3J5cHRvLmQyaV9TU0xfU0VTU0lPTihiKTsKKyAgICAgICAgICAgICAgICBsb25nIHNlc3Npb24yID0gTmF0aXZlQ3J5cHRvLmQyaV9TU0xfU0VTU0lPTihiKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb24yICE9IE5VTEwpOwogCiAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGQyaV9TU0xfU0VTU0lPTiByZXRvcmVzIFNTTF9TRVNTSU9OX2NpcGhlciB2YWx1ZSBodHRwOi8vYi83MDkxODQwCkBAIC0xODE4LDE2ICsxOTk3LDk5IEBACiAgICAgcHVibGljIHZvaWQgdGVzdF9FTkdJTkVfYnlfaWRfRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBOYXRpdmVDcnlwdG8uRU5HSU5FX2xvYWRfZHluYW1pYygpOwogCisgICAgICAgIGxvbmcgZW5naW5lID0gTmF0aXZlQ3J5cHRvLkVOR0lORV9ieV9pZCgibm9uLWV4aXN0ZW50Iik7CisgICAgICAgIGlmIChlbmdpbmUgIT0gMCkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVOR0lORV9maW5pc2goZW5naW5lKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgYWNxdWlyZSByZWZlcmVuY2UgdG8gbm9uLWV4aXN0ZW50IGVuZ2luZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIHRlc3QgT3BlblNTTCBFTkdJTkUuIElmIGl0J3MgYWxyZWFkeSBsb2FkZWQsIHJldHVybnMKKyAgICAgKiBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZFRlc3RFbmdpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyB0ZXN0RW5naW5lID0gTmF0aXZlQ3J5cHRvLkVOR0lORV9ieV9pZChURVNUX0VOR0lORV9JRCk7CisgICAgICAgIGlmICh0ZXN0RW5naW5lICE9IDApIHsKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FTkdJTkVfZmluaXNoKHRlc3RFbmdpbmUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVOR0lORV9sb2FkX2R5bmFtaWMoKTsKKyAgICAgICAgbG9uZyBkeW5FbmdpbmUgPSBOYXRpdmVDcnlwdG8uRU5HSU5FX2J5X2lkKCJkeW5hbWljIik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgZW5naW5lID0gTmF0aXZlQ3J5cHRvLkVOR0lORV9ieV9pZCgibm9uLWV4aXN0ZW50Iik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgbG9hZCBub24tZXhpc3RlbnQgZW5naW5lIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU3VjY2VzcworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gTmF0aXZlQ3J5cHRvVGVzdC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGlicmFyeVBhdGhzOworICAgICAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIEJhc2VEZXhDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgICAgIGxpYnJhcnlQYXRocyA9ICgoQmFzZURleENsYXNzTG9hZGVyKSBsb2FkZXIpLmdldExkTGlicmFyeVBhdGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGlicmFyeVBhdGhzID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmxpYnJhcnkucGF0aCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsaWJyYXJ5UGF0aHMpOworCisgICAgICAgICAgICBTdHJpbmdbXSBsaWJyYXJ5UGF0aEFycmF5ID0gbGlicmFyeVBhdGhzLnNwbGl0KCI6Iik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogbGlicmFyeVBhdGhBcnJheSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBOYXRpdmVDcnlwdG8uRU5HSU5FX2N0cmxfY21kX3N0cmluZyhkeW5FbmdpbmUsICJESVJfQUREIiwgcGF0aCwgMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBtdXN0IGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIEVOR0lORXMKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBOYXRpdmVDcnlwdG8uRU5HSU5FX2N0cmxfY21kX3N0cmluZyhkeW5FbmdpbmUsICJMSVNUX0FERCIsICIyIiwgMCkpOworCisgICAgICAgICAgICAvLyBEbyBhIGRpcmVjdCBsb2FkIG9mIHRoZSBFTkdJTkUuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwKKyAgICAgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZHluRW5naW5lLCAiSUQiLCBURVNUX0VOR0lORV9JRCwgMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIE5hdGl2ZUNyeXB0by5FTkdJTkVfY3RybF9jbWRfc3RyaW5nKGR5bkVuZ2luZSwgIkxPQUQiLCBudWxsLCAwKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRU5HSU5FX2ZpbmlzaChkeW5FbmdpbmUpOworICAgICAgICB9CisKKyAgICAgICAgdGVzdEVuZ2luZSA9IE5hdGl2ZUNyeXB0by5FTkdJTkVfYnlfaWQoVEVTVF9FTkdJTkVfSUQpOworICAgICAgICBpZiAodGVzdEVuZ2luZSA9PSAwKSB7CisgICAgICAgICAgICBmYWlsKCJjb3VsZCBub3QgbG9hZCB0ZXN0IGVuZ2luZSIpOworICAgICAgICB9CisgICAgICAgIE5hdGl2ZUNyeXB0by5FTkdJTkVfZmluaXNoKHRlc3RFbmdpbmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfRU5HSU5FX2J5X2lkX1Rlc3RFbmdpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9hZFRlc3RFbmdpbmUoKTsKKworICAgICAgICBsb25nIGVuZ2luZSA9IE5hdGl2ZUNyeXB0by5FTkdJTkVfYnlfaWQoVEVTVF9FTkdJTkVfSUQpOworICAgICAgICBhc3NlcnRUcnVlKGVuZ2luZSAhPSAwKTsKKyAgICAgICAgTmF0aXZlQ3J5cHRvLkVOR0lORV9hZGQoZW5naW5lKTsKKworICAgICAgICBsb25nIHBrZXkgPSBOVUxMOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJzYVBlbSA9CisgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJQ1hBSUJBQUtCZ1FDdnZzWXoxVktoVTlQVDBOSGxvdFgyMnRjQ2plYWlWRk5nMEpya2pvSzJYdU1iKzdhNlxuIgorICAgICAgICAgICAgICAgICAgICArICJSNWJ6Z0lyMjQrT25CQjBMcWdhS25Id3haVEE3M2xvL1d5L01zNUt2ZzR5WDlVTWtORStQdkg1dnpjUUJiRmRJXG4iCisgICAgICAgICAgICAgICAgICAgICsgImx3RVRGUHZGb2tITzVPeU9jRVkraVZXRzJmRGxvdGVIMkpzcktZTGg5U3gzQnI1cEhGQ0NtNXFUNXdJREFRQUJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQW9HQVdEeG9OczM3MXBQSDNxa1JPVUl3T3VoVTJ5dHppRHplUDlWOGJ4UTkvR0pYbEUwa3lSSDRiL2t4ekJOT1xuIgorICAgICAgICAgICAgICAgICAgICArICIwU1Aza1V1a1RTT1VGeGkreHRBMGIyclE3QmUydHh0anpXMVRHT0hTQ1diRnJKQWRUcWVCY21RSlNhWmF5OG4xXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkxPcGs0L3p2Qmw3VlNjQnRoMUlnWFA0NHY2bE96dGhzckRoTWxVWXMwN3ltd1lFQ1FRRG9uYUxPaGttVlRoUGFcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQ0lUaGRFNUNOL3dGNVVEekdPeitaQnozZHQ4RDhRUU11MGFaYVB6aWJxOUJDNDYyai9mV2VXUzVPRnpicTIrVFxuIgorICAgICAgICAgICAgICAgICAgICArICIrY29yM253UEFrRUF3V21UUWRyYTZHTVBFYzQwek5zTTVlaEYyRmpPcFg4YVU4MjY3ZUc1NnkwWStHYkh4MkJOXG4iCisgICAgICAgICAgICAgICAgICAgICsgInpBSGZQeEdCQkg4Y1owY0xoazRSU28vcG83VnYrY1J5cVFKQUFRejFOMG1UKzRDbXhrMVRqRkVpS1ZwbllQOXdcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRTZrQktRVDZ2SU5rN25lZ05RNkRleDNtUm4rSmV4bTZRMGpUTGJ6T242ZUpnOVI2WklpMFNRNXdNUUpBS1gyblxuIgorICAgICAgICAgICAgICAgICAgICArICJmR29ocWRhT1JnaVJaUnpjc0hsYWVtWGF0c0FFZXRQWWRPMkdmNy9sNm12S0VhaEVLQzZDb0xuMWpteGlRSG1LXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkxGNlU4UVRjWHlVdUIwdXdPUUpCQUl3V1dqUUdHYzJzQVExSFcwQzJ3d0NRYlduZWVCa2lSQmVkb25EQkh0aUJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiV3owelMyQ01DdEJQTmVIUW1tc1hIMkNhK0FEZGg1M3NLVHVwZXJMaXVpdz1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0iOworICAgICAgICAgICAgcGtleSA9IE5hdGl2ZUNyeXB0by5FTkdJTkVfbG9hZF9wcml2YXRlX2tleShlbmdpbmUsIHJzYVBlbSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBrZXkgIT0gMCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX2ZyZWUocGtleSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FTkdJTkVfZnJlZShlbmdpbmUpOworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVOR0lORV9maW5pc2goZW5naW5lKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RfUkFORF9ieXRlc19TdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVszMl07CisgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVsxMjhdOwogICAgICAgICBOYXRpdmVDcnlwdG8uUkFORF9ieXRlcyhvdXRwdXQpOwogCiAgICAgICAgIGJvb2xlYW4gaXNaZXJvID0gdHJ1ZTsKQEAgLTE4MzUsNyArMjA5Nyw3IEBACiAgICAgICAgICAgICBpc1plcm8gJj0gKG91dHB1dFtpXSA9PSAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydEZhbHNlKCJSYW5kb20gb3V0cHV0IHdhcyB6ZXJvLiBUaGlzIGlzIGEgdmVyeSBsb3cgcHJvYmFiaWxpdHkgZXZlbnQgIgorICAgICAgICBhc3NlcnRGYWxzZSgiUmFuZG9tIG91dHB1dCB3YXMgemVyby4gVGhpcyBpcyBhIHZlcnkgbG93IHByb2JhYmlsaXR5IGV2ZW50ICgxIGluIDJeMTI4KSAiCiAgICAgICAgICAgICAgICAgKyAiYW5kIHByb2JhYmx5IGluZGljYXRlcyBhbiBlcnJvci4iLCBpc1plcm8pOwogICAgIH0KIApAQCAtMTg0NCw2ICsyMTA2LDQ2OCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLlJBTkRfYnl0ZXMob3V0cHV0KTsKICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBiZSBhbiBlcnJvciBvbiBudWxsIGJ1ZmZlciBpbnB1dCIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0VWUF9nZXRfZGlnZXN0YnluYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKCJzaGEyNTYiKSAhPSBOVUxMKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9nZXRfZGlnZXN0YnluYW1lKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgiIik7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX2dldF9kaWdlc3RieW5hbWUoImZvb2JhciIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0VWUF9TaWduSW5pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGN0eCA9IE5hdGl2ZUNyeXB0by5FVlBfU2lnbkluaXQoIlJTQS1TSEEyNTYiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjdHggIT0gTlVMTCk7CisgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfTURfQ1RYX2Rlc3Ryb3koY3R4KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9TaWduSW5pdCgiZm9vYmFyIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0X1JTQV9wcml2YXRlX3BhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLmdldF9SU0FfcHJpdmF0ZV9wYXJhbXMoTlVMTCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLmdldF9SU0FfcHJpdmF0ZV9wYXJhbXMoTlVMTCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGdldHRpbmcgcGFyYW1zIGZvciB0aGUgd3Jvbmcga2luZCBvZiBrZXkuCisgICAgICAgIGZpbmFsIGJ5dGVbXSBzZWVkID0gbmV3IGJ5dGVbMjBdOworICAgICAgICBsb25nIGN0eCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHggPSBOYXRpdmVDcnlwdG8uRFNBX2dlbmVyYXRlX2tleSgyMDQ4LCBzZWVkLCBkc2EyMDQ4X2csIGRzYTIwNDhfcCwgZHNhMjA0OF9xKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY3R4ICE9IE5VTEwpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uZ2V0X1JTQV9wcml2YXRlX3BhcmFtcyhjdHgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjdHggIT0gMCkgeworICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9mcmVlKGN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldF9SU0FfcHVibGljX3BhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLmdldF9SU0FfcHVibGljX3BhcmFtcyhOVUxMKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uZ2V0X1JTQV9wdWJsaWNfcGFyYW1zKE5VTEwpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCBnZXR0aW5nIHBhcmFtcyBmb3IgdGhlIHdyb25nIGtpbmQgb2Yga2V5LgorICAgICAgICBmaW5hbCBieXRlW10gc2VlZCA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgbG9uZyBjdHggPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4ID0gTmF0aXZlQ3J5cHRvLkRTQV9nZW5lcmF0ZV9rZXkoMjA0OCwgc2VlZCwgZHNhMjA0OF9nLCBkc2EyMDQ4X3AsIGRzYTIwNDhfcSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGN0eCAhPSBOVUxMKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLmdldF9SU0FfcHVibGljX3BhcmFtcyhjdHgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjdHggIT0gMCkgeworICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9mcmVlKGN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBieXRlW10gZHNhMjA0OF9wID0geworICAgICAgICAgICAgKGJ5dGUpIDB4QzMsIChieXRlKSAweDE2LCAoYnl0ZSkgMHhENCwgKGJ5dGUpIDB4QkEsIChieXRlKSAweERDLCAoYnl0ZSkgMHgwRSwKKyAgICAgICAgICAgIChieXRlKSAweEI4LCAoYnl0ZSkgMHhGQywgKGJ5dGUpIDB4NDAsIChieXRlKSAweERCLCAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4NzYsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4QjgsIChieXRlKSAweDhELCAoYnl0ZSkgMHhDMSwgKGJ5dGUpIDB4RjEsIChieXRlKSAweEFCLAorICAgICAgICAgICAgKGJ5dGUpIDB4OUIsIChieXRlKSAweDgwLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4REMsIChieXRlKSAweDU1LCAoYnl0ZSkgMHgzMywKKyAgICAgICAgICAgIChieXRlKSAweEVDLCAoYnl0ZSkgMHhCNiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDhGLCAoYnl0ZSkgMHhCNywgKGJ5dGUpIDB4RDksCisgICAgICAgICAgICAoYnl0ZSkgMHhBNSwgKGJ5dGUpIDB4N0YsIChieXRlKSAweEMxLCAoYnl0ZSkgMHhFMywgKGJ5dGUpIDB4QUQsIChieXRlKSAweEUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4N0EsIChieXRlKSAweDU4LCAoYnl0ZSkgMHhGNCwgKGJ5dGUpIDB4MkQsIChieXRlKSAweEI5LCAoYnl0ZSkgMHg2MSwKKyAgICAgICAgICAgIChieXRlKSAweENGLCAoYnl0ZSkgMHg1QiwgKGJ5dGUpIDB4Q0EsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg5RiwgKGJ5dGUpIDB4NzMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4RCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDYyLCAoYnl0ZSkgMHhEMiwgKGJ5dGUpIDB4MTksIChieXRlKSAweDdELAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweERCLCAoYnl0ZSkgMHhCMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweEU3LCAoYnl0ZSkgMHhCMiwKKyAgICAgICAgICAgIChieXRlKSAweDI4LCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDczLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4RjEsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4QzcsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHhDQywgKGJ5dGUpIDB4RDEsIChieXRlKSAweDEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4OEUsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MkMsIChieXRlKSAweEQwLCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDU0LCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MkQsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg2QywgKGJ5dGUpIDB4NkIsCisgICAgICAgICAgICAoYnl0ZSkgMHg1QywgKGJ5dGUpIDB4MkQsIChieXRlKSAweDRELCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4NkEsIChieXRlKSAweDFELAorICAgICAgICAgICAgKGJ5dGUpIDB4ODksIChieXRlKSAweEIxLCAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4QTAsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgyQiwKKyAgICAgICAgICAgIChieXRlKSAweDNDLCAoYnl0ZSkgMHhEQiwgKGJ5dGUpIDB4MUYsIChieXRlKSAweDg5LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4NjMsIChieXRlKSAweEI2LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4QjIsIChieXRlKSAweDU0LCAoYnl0ZSkgMHhBMywgKGJ5dGUpIDB4RkUsIChieXRlKSAweDZDLCAoYnl0ZSkgMHgzNSwKKyAgICAgICAgICAgIChieXRlKSAweDE3LCAoYnl0ZSkgMHgyRiwgKGJ5dGUpIDB4N0YsIChieXRlKSAweDU0LCAoYnl0ZSkgMHhBNCwgKGJ5dGUpIDB4QUUsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4MUUsIChieXRlKSAweDMxLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4RjEsIChieXRlKSAweDNGLAorICAgICAgICAgICAgKGJ5dGUpIDB4OUUsIChieXRlKSAweEI5LCAoYnl0ZSkgMHg1RCwgKGJ5dGUpIDB4RDMsIChieXRlKSAweEE5LCAoYnl0ZSkgMHhDQiwKKyAgICAgICAgICAgIChieXRlKSAweEU1LCAoYnl0ZSkgMHgyRiwgKGJ5dGUpIDB4QkMsIChieXRlKSAweEE0LCAoYnl0ZSkgMHgxQSwgKGJ5dGUpIDB4MzEsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDJDLCAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4RjQsIChieXRlKSAweDgzLAorICAgICAgICAgICAgKGJ5dGUpIDB4QUMsIChieXRlKSAweEQ1LCAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4M0QsIChieXRlKSAweDE5LCAoYnl0ZSkgMHhFRCwKKyAgICAgICAgICAgIChieXRlKSAweEYxLCAoYnl0ZSkgMHg2QywgKGJ5dGUpIDB4RDksIChieXRlKSAweDNGLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4REEsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDU2LCAoYnl0ZSkgMHgzQSwgKGJ5dGUpIDB4OEMsIChieXRlKSAweDc0LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweEYyLCAoYnl0ZSkgMHhFRCwgKGJ5dGUpIDB4MUUsIChieXRlKSAweEUzLCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDk1LCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MkEsIChieXRlKSAweEM0LCAoYnl0ZSkgMHg1RiwgKGJ5dGUpIDB4QjIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDlELCAoYnl0ZSkgMHhBNiwgKGJ5dGUpIDB4QjgsIChieXRlKSAweEY1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4NEEsIChieXRlKSAweDdBLCAoYnl0ZSkgMHgxQSwKKyAgICAgICAgICAgIChieXRlKSAweEIwLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4QkEsIChieXRlKSAweEIxLCAoYnl0ZSkgMHhGNSwgKGJ5dGUpIDB4RDIsCisgICAgICAgICAgICAoYnl0ZSkgMHhFNywgKGJ5dGUpIDB4NjUsIChieXRlKSAweENFLCAoYnl0ZSkgMHhFRSwgKGJ5dGUpIDB4MkMsIChieXRlKSAweDdDLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjgsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHg2MCwKKyAgICAgICAgICAgIChieXRlKSAweDkyLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4QzAsIChieXRlKSAweDJDLCAoYnl0ZSkgMHgyQSwgKGJ5dGUpIDB4RUEsCisgICAgICAgICAgICAoYnl0ZSkgMHhFOSwgKGJ5dGUpIDB4QjMsIChieXRlKSAweDJBLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4REEsIChieXRlKSAweDBGLAorICAgICAgICAgICAgKGJ5dGUpIDB4QkIsIChieXRlKSAweEZBLCAoYnl0ZSkgMHg1QiwgKGJ5dGUpIDB4NDcsIChieXRlKSAweERBLCAoYnl0ZSkgMHg1NywKKyAgICAgICAgICAgIChieXRlKSAweDRFLCAoYnl0ZSkgMHhGQywgKGJ5dGUpIDB4MDUsIChieXRlKSAweDJDLCAoYnl0ZSkgMHg2QSwgKGJ5dGUpIDB4OTAsCisgICAgICAgICAgICAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4OTksIChieXRlKSAweDg4LCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4OEEsIChieXRlKSAweENDLAorICAgICAgICAgICAgKGJ5dGUpIDB4RDIsIChieXRlKSAweDk3LCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4QjEsIChieXRlKSAweENFLCAoYnl0ZSkgMHhGNywKKyAgICAgICAgICAgIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NTMsIChieXRlKSAweDY4LCAoYnl0ZSkgMHhFMSwgKGJ5dGUpIDB4MkEsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4RDUsIChieXRlKSAweDNELCAoYnl0ZSkgMHhERiwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MUYsIChieXRlKSAweEFBLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4MTUsCisgICAgfTsKKworICAgIGZpbmFsIGJ5dGVbXSBkc2EyMDQ4X3EgPSB7CisgICAgICAgICAgICAoYnl0ZSkgMHhBQSwgKGJ5dGUpIDB4REQsIChieXRlKSAweEUyLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4MDgsIChieXRlKSAweEMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MEUsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg4QywgKGJ5dGUpIDB4RDksIChieXRlKSAweEJDLCAoYnl0ZSkgMHgxRSwKKyAgICAgICAgICAgIChieXRlKSAweDA1LCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDNCLCAoYnl0ZSkgMHhCNSwgKGJ5dGUpIDB4QTksCisgICAgICAgICAgICAoYnl0ZSkgMHhCNSwgKGJ5dGUpIDB4OEIsIChieXRlKSAweDIxLCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4QTIsIChieXRlKSAweDc2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDFFLCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4MUIsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg4OCwKKyAgICAgICAgICAgIChieXRlKSAweDZELCAoYnl0ZSkgMHhDRiwKKyAgICB9OworCisgICAgZmluYWwgYnl0ZVtdIGRzYTIwNDhfZyA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDZCLCAoYnl0ZSkgMHg0RCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDkyLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4NzYsCisgICAgICAgICAgICAoYnl0ZSkgMHhFNSwgKGJ5dGUpIDB4QTIsIChieXRlKSAweENFLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDcwLCAoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4QjksIChieXRlKSAweEQ0LCAoYnl0ZSkgMHg1MSwKKyAgICAgICAgICAgIChieXRlKSAweEJBLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4OEIsIChieXRlKSAweDc1LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4RTMsCisgICAgICAgICAgICAoYnl0ZSkgMHhGMiwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhGNSwgKGJ5dGUpIDB4NkEsIChieXRlKSAweEQ5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweEEwLCAoYnl0ZSkgMHhDMCwgKGJ5dGUpIDB4M0IsIChieXRlKSAweDEyLCAoYnl0ZSkgMHgyRiwKKyAgICAgICAgICAgIChieXRlKSAweDRGLCAoYnl0ZSkgMHg5QSwgKGJ5dGUpIDB4RjgsIChieXRlKSAweDVELCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4QzUsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4NkMsIChieXRlKSAweDlCLCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4QkUsIChieXRlKSAweDhFLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDAsIChieXRlKSAweEY5LCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4RjAsIChieXRlKSAweDNELCAoYnl0ZSkgMHhENywKKyAgICAgICAgICAgIChieXRlKSAweDdDLCAoYnl0ZSkgMHhERSwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4Q0MsCisgICAgICAgICAgICAoYnl0ZSkgMHhBRSwgKGJ5dGUpIDB4OEEsIChieXRlKSAweEMwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4Q0QsIChieXRlKSAweERDLAorICAgICAgICAgICAgKGJ5dGUpIDB4MTAsIChieXRlKSAweDI5LCAoYnl0ZSkgMHg0RCwgKGJ5dGUpIDB4RkMsIChieXRlKSAweEVDLCAoYnl0ZSkgMHhFRiwKKyAgICAgICAgICAgIChieXRlKSAweDUxLCAoYnl0ZSkgMHg0QiwgKGJ5dGUpIDB4RjksIChieXRlKSAweENDLCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4ODQsCisgICAgICAgICAgICAoYnl0ZSkgMHgxQiwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHhFQywgKGJ5dGUpIDB4RjAsIChieXRlKSAweDVFLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDcsIChieXRlKSAweDEwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4QTksIChieXRlKSAweDJDLCAoYnl0ZSkgMHgwNCwKKyAgICAgICAgICAgIChieXRlKSAweEQwLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4QkYsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg5RSwgKGJ5dGUpIDB4QkIsCisgICAgICAgICAgICAoYnl0ZSkgMHhFMywgKGJ5dGUpIDB4M0YsIChieXRlKSAweERFLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4RTEsIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDcsIChieXRlKSAweDI4LCAoYnl0ZSkgMHhDMSwgKGJ5dGUpIDB4Q0EsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHhDMSwKKyAgICAgICAgICAgIChieXRlKSAweDFELCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4RTQsIChieXRlKSAweDM1LCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4REYsCisgICAgICAgICAgICAoYnl0ZSkgMHg1RSwgKGJ5dGUpIDB4NTAsIChieXRlKSAweEY5LCAoYnl0ZSkgMHhDMiwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDI1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MEQsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg4QywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgyMywKKyAgICAgICAgICAgIChieXRlKSAweEQ0LCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NDIsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHhFMSwgKGJ5dGUpIDB4OUUsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4OTEsIChieXRlKSAweEM4LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NDQsIChieXRlKSAweEUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDg2LCAoYnl0ZSkgMHgyRiwgKGJ5dGUpIDB4RDQsIChieXRlKSAweDkwLCAoYnl0ZSkgMHgxNiwKKyAgICAgICAgICAgIChieXRlKSAweDA5LCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4QjEsIChieXRlKSAweEM1LCAoYnl0ZSkgMHg3RCwgKGJ5dGUpIDB4QjIsCisgICAgICAgICAgICAoYnl0ZSkgMHg3QywgKGJ5dGUpIDB4MzYsIChieXRlKSAweDBELCAoYnl0ZSkgMHg5QywgKGJ5dGUpIDB4MUYsIChieXRlKSAweDgzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTcsIChieXRlKSAweDk0LCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDlDLCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDhFLCAoYnl0ZSkgMHhFNSwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDNBLCAoYnl0ZSkgMHhBOSwgKGJ5dGUpIDB4QUYsCisgICAgICAgICAgICAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg4RCwgKGJ5dGUpIDB4RTYsIChieXRlKSAweEMzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MEMsIChieXRlKSAweDc4LCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4NEIsIChieXRlKSAweEY1LCAoYnl0ZSkgMHg0MCwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4OTAsIChieXRlKSAweDVDLCAoYnl0ZSkgMHhBMSwgKGJ5dGUpIDB4MTksCisgICAgICAgICAgICAoYnl0ZSkgMHhFQiwgKGJ5dGUpIDB4OTUsIChieXRlKSAweDcwLCAoYnl0ZSkgMHgyQiwgKGJ5dGUpIDB4OTQsIChieXRlKSAweEEzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDMsIChieXRlKSAweERELCAoYnl0ZSkgMHhFQiwgKGJ5dGUpIDB4RDQsIChieXRlKSAweDBDLCAoYnl0ZSkgMHhCQywKKyAgICAgICAgICAgIChieXRlKSAweEJELCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4MkQsIChieXRlKSAweDc1LCAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4OEQsCisgICAgICAgICAgICAoYnl0ZSkgMHg4QiwgKGJ5dGUpIDB4NzAsIChieXRlKSAweEI5LCAoYnl0ZSkgMHhFNywgKGJ5dGUpIDB4QTMsIChieXRlKSAweENDLAorICAgICAgICAgICAgKGJ5dGUpIDB4OEMsIChieXRlKSAweEI0LCAoYnl0ZSkgMHhDRCwgKGJ5dGUpIDB4QkIsIChieXRlKSAweDRCLCAoYnl0ZSkgMHhCMSwKKyAgICAgICAgICAgIChieXRlKSAweDE1LCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4NzksIChieXRlKSAweERGLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4QTYsCisgICAgICAgICAgICAoYnl0ZSkgMHg1QywgKGJ5dGUpIDB4OTAsIChieXRlKSAweDdDLCAoYnl0ZSkgMHgxRiwgKGJ5dGUpIDB4RUEsIChieXRlKSAweDFCLAorICAgICAgICAgICAgKGJ5dGUpIDB4RjIsIChieXRlKSAweDg5LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4QjIsIChieXRlKSAweEVDLCAoYnl0ZSkgMHg1NywKKyAgICAgICAgICAgIChieXRlKSAweEZGLCAoYnl0ZSkgMHhCMiwgKGJ5dGUpIDB4REEsIChieXRlKSAweEY1LCAoYnl0ZSkgMHhBRCwgKGJ5dGUpIDB4NzMsCisgICAgICAgICAgICAoYnl0ZSkgMHhDMCwgKGJ5dGUpIDB4QTAsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg4QiwgKGJ5dGUpIDB4NzgsIChieXRlKSAweEExLAorICAgICAgICAgICAgKGJ5dGUpIDB4NUQsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MjksIChieXRlKSAweEUzLCAoYnl0ZSkgMHhENywKKyAgICAgICAgICAgIChieXRlKSAweDM3LCAoYnl0ZSkgMHhGNiwgKGJ5dGUpIDB4QTIsIChieXRlKSAweENBLAorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0RTQV9nZW5lcmF0ZV9rZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsyMF07CisKKyAgICAgICAgLy8gUmVhbCBrZXkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjdHggPSAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjdHggPSBOYXRpdmVDcnlwdG8uRFNBX2dlbmVyYXRlX2tleSgyMDQ4LCBzZWVkLCBkc2EyMDQ4X2csIGRzYTIwNDhfcCwgZHNhMjA0OF9xKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGN0eCAhPSBOVUxMKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfUEtFWV9mcmVlKGN0eCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhbCBrZXkgd2l0aCBtaW5pbXVtIGJpdCBzaXplIChzaG91bGQgYmUgNTEyIGJpdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgY3R4ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY3R4ID0gTmF0aXZlQ3J5cHRvLkRTQV9nZW5lcmF0ZV9rZXkoMCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHggIT0gTlVMTCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjdHggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfZnJlZShjdHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJhZCBEU0EgcGFyYW1zLgorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGN0eCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN0eCA9IE5hdGl2ZUNyeXB0by5EU0FfZ2VuZXJhdGVfa2V5KDAsIG51bGwsIG5ldyBieXRlW10ge30sIG5ldyBieXRlW10ge30sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjdHggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX1BLRVlfZnJlZShjdHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdCB2ZWN0b3IgZ2VuZXJhdGlvbjoKKyAgICAgKiBvcGVuc3NsIHJhbmQgLWhleCAxNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBBRVNfMTI4X0tFWSA9IG5ldyBieXRlW10geworICAgICAgICAgICAgKGJ5dGUpIDB4M2QsIChieXRlKSAweDRmLCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4NzAsIChieXRlKSAweGIxLCAoYnl0ZSkgMHhmMiwKKyAgICAgICAgICAgIChieXRlKSAweDc1LCAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4ZjQsIChieXRlKSAweDBhLCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4MjksCisgICAgICAgICAgICAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1ZiwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEFFU19JVl9aRVJPRVMgPSBuZXcgYnl0ZVtdIHsKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFQ19HUk9VUCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvKiBUZXN0IHVzaW5nIE5JU1QncyBQLTI1NiBjdXJ2ZSAqLworICAgICAgICBjaGVja19FQ19HUk9VUChOYXRpdmVDcnlwdG8uRUNfQ1VSVkVfR0ZQLCAicHJpbWUyNTZ2MSIsCisgICAgICAgICAgICAgICAgIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLAorICAgICAgICAgICAgICAgICJGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDIiwKKyAgICAgICAgICAgICAgICAiNWFjNjM1ZDhhYTNhOTNlN2IzZWJiZDU1NzY5ODg2YmM2NTFkMDZiMGNjNTNiMGY2M2JjZTNjM2UyN2QyNjA0YiIsCisgICAgICAgICAgICAgICAgIjZCMTdEMUYyRTEyQzQyNDdGOEJDRTZFNTYzQTQ0MEYyNzcwMzdEODEyREVCMzNBMEY0QTEzOTQ1RDg5OEMyOTYiLAorICAgICAgICAgICAgICAgICI0RkUzNDJFMkZFMUE3RjlCOEVFN0VCNEE3QzBGOUUxNjJCQ0UzMzU3NkIzMTVFQ0VDQkI2NDA2ODM3QkY1MUY1IiwKKyAgICAgICAgICAgICAgICAiRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MSIsCisgICAgICAgICAgICAgICAgMUwpOworCisgICAgICAgIGNoZWNrX0VDX0dST1VQKE5hdGl2ZUNyeXB0by5FQ19DVVJWRV9HRjJNLCAic2VjdDI4M3IxIiwKKyAgICAgICAgICAgICAgICAiMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMEExIiwKKyAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwKKyAgICAgICAgICAgICAgICAiMDI3QjY4MEFDOEI4NTk2REE1QTRBRjhBMTlBMDMwM0ZDQTk3RkQ3NjQ1MzA5RkEyQTU4MTQ4NUFGNjI2M0UzMTNCNzlBMkY1IiwKKyAgICAgICAgICAgICAgICAiMDVGOTM5MjU4REI3REQ5MEUxOTM0RjhDNzBCMERGRUMyRUVEMjVCODU1N0VBQzlDODBFMkUxOThGOENEQkVDRDg2QjEyMDUzIiwKKyAgICAgICAgICAgICAgICAiMDM2NzY4NTRGRTI0MTQxQ0I5OEZFNkQ0QjIwRDAyQjQ1MTZGRjcwMjM1MEVEREIwODI2Nzc5QzgxM0YwREY0NUJFODExMkY0IiwKKyAgICAgICAgICAgICAgICAiMDNGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUY5MDM5OTY2MEZDOTM4QTkwMTY1QjA0MkE3Q0VGQURCMzA3IiwKKyAgICAgICAgICAgICAgICAyTCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrX0VDX0dST1VQKGludCB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBTdHIsIFN0cmluZyBhU3RyLCBTdHJpbmcgYlN0ciwKKyAgICAgICAgICAgIFN0cmluZyB4U3RyLCBTdHJpbmcgeVN0ciwgU3RyaW5nIG5TdHIsIGxvbmcgaExvbmcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIGdyb3VwMSA9IE5VTEwsIGdyb3VwMiA9IE5VTEwsIHBvaW50MSA9IE5VTEwsIHBvaW50MiA9IE5VTEwsIGtleTEgPSBOVUxMOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ3JvdXAxID0gTmF0aXZlQ3J5cHRvLkVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5hbWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShncm91cDEgIT0gTlVMTCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTmF0aXZlQ3J5cHRvLk9CSl90eHQybmlkX2xvbmdOYW1lKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoZ3JvdXAxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHlwZSwgTmF0aXZlQ3J5cHRvLmdldF9FQ19HUk9VUF90eXBlKGdyb3VwMSkpOworCisgICAgICAgICAgICAvLyBwcmltZQorICAgICAgICAgICAgQmlnSW50ZWdlciBwID0gbmV3IEJpZ0ludGVnZXIocFN0ciwgMTYpOworICAgICAgICAgICAgLy8gZmlyc3QgY29lZmZpY2llbnQKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgYSA9IG5ldyBCaWdJbnRlZ2VyKGFTdHIsIDE2KTsKKyAgICAgICAgICAgIC8vIHNlY29uZCBjb2VmZmljaWVudAorICAgICAgICAgICAgQmlnSW50ZWdlciBiID0gbmV3IEJpZ0ludGVnZXIoYlN0ciwgMTYpOworICAgICAgICAgICAgLy8geCBhZmZpbmUgY29vcmRpbmF0ZSBvZiBnZW5lcmF0b3IKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgeCA9IG5ldyBCaWdJbnRlZ2VyKHhTdHIsIDE2KTsKKyAgICAgICAgICAgIC8vIHkgYWZmaW5lIGNvb3JkaW5hdGUgb2YgZ2VuZXJhdG9yCisgICAgICAgICAgICBCaWdJbnRlZ2VyIHkgPSBuZXcgQmlnSW50ZWdlcih5U3RyLCAxNik7CisgICAgICAgICAgICAvLyBvcmRlciBvZiB0aGUgZ2VuZXJhdG9yCisgICAgICAgICAgICBCaWdJbnRlZ2VyIG4gPSBuZXcgQmlnSW50ZWdlcihuU3RyLCAxNik7CisgICAgICAgICAgICAvLyBjb2ZhY3RvciBvZiBnZW5lcmF0b3IKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgaCA9IEJpZ0ludGVnZXIudmFsdWVPZihoTG9uZyk7CisKKyAgICAgICAgICAgIGdyb3VwMiA9IE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9uZXdfY3VydmUodHlwZSwgcC50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgICAgICBhLnRvQnl0ZUFycmF5KCksIGIudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHlwZSwgTmF0aXZlQ3J5cHRvLmdldF9FQ19HUk9VUF90eXBlKGdyb3VwMikpOworCisgICAgICAgICAgICBwb2ludDIgPSBOYXRpdmVDcnlwdG8uRUNfUE9JTlRfbmV3KGdyb3VwMik7CisKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwMiwgcG9pbnQyLCB4LnRvQnl0ZUFycmF5KCksCisgICAgICAgICAgICAgICAgICAgIHkudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGdyb3VwMiwgcG9pbnQyLCBuLnRvQnl0ZUFycmF5KCksIGgudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgICAgIHBvaW50MSA9IE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKGdyb3VwMik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE5hdGl2ZUNyeXB0by5FQ19QT0lOVF9jbXAoZ3JvdXAxLCBwb2ludDEsIHBvaW50MikpOworCisgICAgICAgICAgICBieXRlW11bXSBwYWIgPSBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfZ2V0X2N1cnZlKGdyb3VwMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcGFiLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgcDIgPSBuZXcgQmlnSW50ZWdlcihwYWJbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHAsIHAyKTsKKworICAgICAgICAgICAgQmlnSW50ZWdlciBhMiA9IG5ldyBCaWdJbnRlZ2VyKHBhYlsxXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYTIpOworCisgICAgICAgICAgICBCaWdJbnRlZ2VyIGIyID0gbmV3IEJpZ0ludGVnZXIocGFiWzJdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiLCBiMik7CisKKyAgICAgICAgICAgIGJ5dGVbXVtdIHh5ID0gTmF0aXZlQ3J5cHRvLkVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoZ3JvdXAyLCBwb2ludDIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHh5Lmxlbmd0aCk7CisKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgeDIgPSBuZXcgQmlnSW50ZWdlcih4eVswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoeCwgeDIpOworCisgICAgICAgICAgICBCaWdJbnRlZ2VyIHkyID0gbmV3IEJpZ0ludGVnZXIoeHlbMV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHksIHkyKTsKKworICAgICAgICAgICAgQmlnSW50ZWdlciBuMiA9IG5ldyBCaWdJbnRlZ2VyKE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiwgbjIpOworCisgICAgICAgICAgICBCaWdJbnRlZ2VyIGgyID0gbmV3IEJpZ0ludGVnZXIoTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2dldF9jb2ZhY3Rvcihncm91cDIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhoLCBoMik7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2NtcChncm91cDEsIGdyb3VwMikpOworCisgICAgICAgICAgICBrZXkxID0gTmF0aXZlQ3J5cHRvLkVDX0tFWV9nZW5lcmF0ZV9rZXkoZ3JvdXAxKTsKKyAgICAgICAgICAgIGxvbmcgZ3JvdXBUbXAgPSBOYXRpdmVDcnlwdG8uRUNfS0VZX2dldDBfZ3JvdXAoa2V5MSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwMSksCisgICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FQ19HUk9VUF9nZXRfY3VydmVfbmFtZShncm91cFRtcCkpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZ3JvdXAxICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfY2xlYXJfZnJlZShncm91cDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ3JvdXAyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfY2xlYXJfZnJlZShncm91cDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9pbnQxICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfUE9JTlRfY2xlYXJfZnJlZShwb2ludDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9pbnQyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRUNfUE9JTlRfY2xlYXJfZnJlZShwb2ludDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoa2V5MSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9QS0VZX2ZyZWUoa2V5MSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0VWUF9DaXBoZXJJbml0X2V4X051bGxfRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGN0eCA9IE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX0NUWF9uZXcoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZXZwQ2lwaGVyID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfY2lwaGVyYnluYW1lKCJhZXMtMTI4LWVjYiIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ2lwaGVySW5pdF9leChOVUxMLCBldnBDaXBoZXIsIG51bGwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgICAgIGZhaWwoIk51bGwgY29udGV4dCBzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZW5jcnlwdGluZy4gKi8KKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ2lwaGVySW5pdF9leChjdHgsIGV2cENpcGhlciwgbnVsbCwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlckluaXRfZXgoY3R4LCBOVUxMLCBudWxsLCBudWxsLCB0cnVlKTsKKworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBkZWNyeXB0aW5nLiAqLworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVWUF9DaXBoZXJJbml0X2V4KGN0eCwgZXZwQ2lwaGVyLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlckluaXRfZXgoY3R4LCBOVUxMLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjdHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9FVlBfQ2lwaGVySW5pdF9leF9TdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgY3R4ID0gTmF0aXZlQ3J5cHRvLkVWUF9DSVBIRVJfQ1RYX25ldygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBldnBDaXBoZXIgPSBOYXRpdmVDcnlwdG8uRVZQX2dldF9jaXBoZXJieW5hbWUoImFlcy0xMjgtZWNiIik7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uRVZQX0NpcGhlckluaXRfZXgoY3R4LCBldnBDaXBoZXIsIEFFU18xMjhfS0VZLCBudWxsLCB0cnVlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKGN0eCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0VWUF9DSVBIRVJfaXZfbGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgYWVzMTI4ZWNiID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfY2lwaGVyYnluYW1lKCJhZXMtMTI4LWVjYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgTmF0aXZlQ3J5cHRvLkVWUF9DSVBIRVJfaXZfbGVuZ3RoKGFlczEyOGVjYikpOworCisgICAgICAgIGxvbmcgYWVzMTI4Y2JjID0gTmF0aXZlQ3J5cHRvLkVWUF9nZXRfY2lwaGVyYnluYW1lKCJhZXMtMTI4LWNiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIE5hdGl2ZUNyeXB0by5FVlBfQ0lQSEVSX2l2X2xlbmd0aChhZXMxMjhjYmMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X09wZW5TU0xLZXlfdG9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wZW5TU0xLZXkga2V5MTsKKworICAgICAgICBCaWdJbnRlZ2VyIGUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoNjU1MzcpOworICAgICAgICBrZXkxID0gbmV3IE9wZW5TU0xLZXkoTmF0aXZlQ3J5cHRvLlJTQV9nZW5lcmF0ZV9rZXlfZXgoMTAyNCwgZS50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoa2V5MS5nZXRQdWJsaWNLZXkoKSBpbnN0YW5jZW9mIFJTQVB1YmxpY0tleSk7CisKKyAgICAgICAga2V5MSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5EU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrZXkxLmdldFB1YmxpY0tleSgpIGluc3RhbmNlb2YgRFNBUHVibGljS2V5KTsKKworICAgICAgICBsb25nIGdyb3VwMSA9IE5VTEw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBncm91cDEgPSBOYXRpdmVDcnlwdG8uRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoInByaW1lMjU2djEiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZ3JvdXAxICE9IE5VTEwpOworICAgICAgICAgICAga2V5MSA9IG5ldyBPcGVuU1NMS2V5KE5hdGl2ZUNyeXB0by5FQ19LRVlfZ2VuZXJhdGVfa2V5KGdyb3VwMSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGdyb3VwMSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkVDX0dST1VQX2NsZWFyX2ZyZWUoZ3JvdXAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGtleTEuZ2V0UHVibGljS2V5KCkgaW5zdGFuY2VvZiBFQ1B1YmxpY0tleSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVfQklPX0lucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBhY3R1YWwgPSAiVGVzdCIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYWN0dWFsKTsKKworICAgICAgICBsb25nIGN0eCA9IE5hdGl2ZUNyeXB0by5jcmVhdGVfQklPX0lucHV0U3RyZWFtKG5ldyBPcGVuU1NMQklPSW5wdXRTdHJlYW0oaXMpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgIGludCBudW1SZWFkID0gTmF0aXZlQ3J5cHRvLkJJT19yZWFkKGN0eCwgYnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWwubGVuZ3RoLCBudW1SZWFkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKEFycmF5cy5jb3B5T2ZSYW5nZShidWZmZXIsIDAsIG51bVJlYWQpKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uQklPX2ZyZWUoY3R4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVfQklPX091dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWN0dWFsID0gIlRlc3QiLmdldEJ5dGVzKCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBsb25nIGN0eCA9IE5hdGl2ZUNyeXB0by5jcmVhdGVfQklPX091dHB1dFN0cmVhbShvcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYXRpdmVDcnlwdG8uQklPX3dyaXRlKGN0eCwgYWN0dWFsLCAwLCBhY3R1YWwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWwubGVuZ3RoLCBvcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhhY3R1YWwpLCBBcnJheXMudG9TdHJpbmcob3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTmF0aXZlQ3J5cHRvLkJJT19mcmVlKGN0eCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvc3VuL21pc2MvVW5zYWZlVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3N1bi9taXNjL1Vuc2FmZVRlc3QuamF2YQppbmRleCA0NjJkMzlkLi40ODkzOWY1IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvc3VuL21pc2MvVW5zYWZlVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS9zdW4vbWlzYy9VbnNhZmVUZXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIApAQCAtNDgsNCArNDksMjUgQEAKICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQWxsb2NhdGVJbnN0YW5jZVRlc3RDbGFzcyB7CisgICAgICAgIHB1YmxpYyBpbnQgaSA9IDEyMzsKKyAgICAgICAgcHVibGljIFN0cmluZyBzID0gImhlbGxvIjsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUaGlzKCkgeyByZXR1cm4gQWxsb2NhdGVJbnN0YW5jZVRlc3RDbGFzcy50aGlzOyB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVW5zYWZlIGdldFVuc2FmZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiB1bnNhZmVDbGFzcyA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLlVuc2FmZSIpOworICAgICAgICBGaWVsZCBmID0gdW5zYWZlQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGhlVW5zYWZlIik7CisgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChVbnNhZmUpIGYuZ2V0KG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfYWxsb2NhdGVJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBbGxvY2F0ZUluc3RhbmNlVGVzdENsYXNzIGkgPSAoQWxsb2NhdGVJbnN0YW5jZVRlc3RDbGFzcykKKyAgICAgICAgICAgICAgICBnZXRVbnNhZmUoKS5hbGxvY2F0ZUluc3RhbmNlKEFsbG9jYXRlSW5zdGFuY2VUZXN0Q2xhc3MuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaS5pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGkucyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBpLmdldFRoaXMoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvUmVzb3VyY2VCdW5kbGVUZXN0LmphdmEgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQppbmRleCBmMWZkNDg0Li41ODdhNTQ5IDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQorKysgYi9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvYXBpL2phdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQpAQCAtMzMsNiArMzMsMTIgQEAKIAogcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbmRpZGF0ZUxvY2FsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUuQ29udHJvbCBjID0gUmVzb3VyY2VCdW5kbGUuQ29udHJvbC5nZXRDb250cm9sKFJlc291cmNlQnVuZGxlLkNvbnRyb2wuRk9STUFUX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltlbl9VUywgZW4sIF0iLCBjLmdldENhbmRpZGF0ZUxvY2FsZXMoImJhc2UiLCBMb2NhbGUuVVMpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltkZV9DSCwgZGUsIF0iLCBjLmdldENhbmRpZGF0ZUxvY2FsZXMoImJhc2UiLCBuZXcgTG9jYWxlKCJkZSIsICJDSCIpKS50b1N0cmluZygpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUjZ2V0QnVuZGxlKGphdmEubGFuZy5TdHJpbmcsCiAgICAgICogICAgICAgIGphdmEudXRpbC5Mb2NhbGUpCkBAIC02NCwxNSArNzAsMTkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBidW5kbGUgZGVfRlJfdmFyIDIiLCAicGFyZW50VmFsdWU0IiwgYnVuZGxlLmdldFN0cmluZygicGFyZW50NCIpCiAgICAgICAgICAgICAgICAgKTsKIAotICAgICAgICAvLyBUZXN0IHdpdGggYSBzZWN1cml0eSBtYW5hZ2VyCi0gICAgICAgIExvY2FsZS5zZXREZWZhdWx0KG5ldyBMb2NhbGUoImVuIiwgIlVTIikpOwotCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobnVsbCwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobnVsbCwgTG9jYWxlLlVTKTsKICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGVlKSB7CiAgICAgICAgICAgICAvL2V4cGVjdGVkCiAgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiYmxhaCIsIChMb2NhbGUpIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorCiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiIiwgbmV3IExvY2FsZSgieHgiLCAieXkiKSk7CkBAIC04MCw4ICs5MCw2IEBACiAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlZSkgewogICAgICAgICAgICAgLy9leHBlY3RlZAogICAgICAgICB9Ci0KLSAgICAgICAgTG9jYWxlLnNldERlZmF1bHQoZGVmTG9jYWxlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1NpbXBsZVRpbWVab25lVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU2ltcGxlVGltZVpvbmVUZXN0LmphdmEKaW5kZXggNjE4Y2JlNC4uZWViNWIzMCAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU2ltcGxlVGltZVpvbmVUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvU2ltcGxlVGltZVpvbmVUZXN0LmphdmEKQEAgLTQ0Miw4ICs0NDIsMTggQEAKICAgICAgICAgc3Quc2V0U3RhcnRSdWxlKDAsIDEsIDEsIDEpOwogICAgICAgICBzdC5zZXRFbmRSdWxlKDExLCAxLCAxLCAxKTsKICAgICAgICAgc3Quc2V0RFNUU2F2aW5ncygxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXlsaWdodCBzYXZpbmdzIGFtb3VudCBub3Qgc2V0IiwgMSwgc3QuZ2V0RFNUU2F2aW5ncygpKTsKLSAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdC5nZXREU1RTYXZpbmdzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3Quc2V0RFNUU2F2aW5ncygwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0LnNldERTVFNhdmluZ3MoLTEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS51dGlsLlNpbXBsZVRpbWVab25lI3NldEVuZFJ1bGUoaW50LCBpbnQsIGludCkKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9hcGkvamF2YS91dGlsL1RpbWVyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKaW5kZXggMjZkODhiYS4uYjA5ZmE0NSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL2FwaS9qYXZhL3V0aWwvVGltZXJUZXN0LmphdmEKQEAgLTkxLDYgKzkxLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYXdhaXRSdW4oVGltZXJUZXN0VGFzayB0YXNrKSB7CisgICAgICAgIHdoaWxlICh0YXNrLndhc1J1bigpID09IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDE1MCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBqYXZhLnV0aWwuVGltZXIjVGltZXIoYm9vbGVhbikKICAgICAgKi8KQEAgLTEwMSwxNCArMTEwLDcgQEAKICAgICAgICAgICAgIHQgPSBuZXcgVGltZXIodHJ1ZSk7CiAgICAgICAgICAgICBUaW1lclRlc3RUYXNrIHRlc3RUYXNrID0gbmV3IFRpbWVyVGVzdFRhc2soKTsKICAgICAgICAgICAgIHQuc2NoZWR1bGUodGVzdFRhc2ssIDIwMCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLndhaXQoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGltZXJUYXNrLnJ1bigpIG1ldGhvZCBub3QgY2FsbGVkIGFmdGVyIDIwMG1zIiwKLSAgICAgICAgICAgICAgICAgICAgMSwgdGVzdFRhc2sud2FzUnVuKCkpOworICAgICAgICAgICAgYXdhaXRSdW4odGVzdFRhc2spOwogICAgICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCkBAIC0xMjcsMTQgKzEyOSw3IEBACiAgICAgICAgICAgICB0ID0gbmV3IFRpbWVyKCk7CiAgICAgICAgICAgICBUaW1lclRlc3RUYXNrIHRlc3RUYXNrID0gbmV3IFRpbWVyVGVzdFRhc2soKTsKICAgICAgICAgICAgIHQuc2NoZWR1bGUodGVzdFRhc2ssIDIwMCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLndhaXQoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGltZXJUYXNrLnJ1bigpIG1ldGhvZCBub3QgY2FsbGVkIGFmdGVyIDIwMG1zIiwKLSAgICAgICAgICAgICAgICAgICAgMSwgdGVzdFRhc2sud2FzUnVuKCkpOworICAgICAgICAgICAgYXdhaXRSdW4odGVzdFRhc2spOwogICAgICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCkBAIC0xNTMsMTMgKzE0OCw3IEBACiAgICAgICAgICAgICB0ID0gbmV3IFRpbWVyKCJ0ZXN0X0NvbnN0cnVjdG9yU1pUaHJlYWQiLCB0cnVlKTsKICAgICAgICAgICAgIFRpbWVyVGVzdFRhc2sgdGVzdFRhc2sgPSBuZXcgVGltZXJUZXN0VGFzaygpOwogICAgICAgICAgICAgdC5zY2hlZHVsZSh0ZXN0VGFzaywgMjAwKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3luYykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmMud2FpdCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaW1lclRhc2sucnVuKCkgbWV0aG9kIG5vdCBjYWxsZWQgYWZ0ZXIgMjAwbXMiLCAxLAotICAgICAgICAgICAgICAgICAgICB0ZXN0VGFzay53YXNSdW4oKSk7CisgICAgICAgICAgICBhd2FpdFJ1bih0ZXN0VGFzayk7CiAgICAgICAgICAgICB0LmNhbmNlbCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKQEAgLTE5MSwxMyArMTgwLDcgQEAKICAgICAgICAgICAgIHQgPSBuZXcgVGltZXIoInRlc3RfQ29uc3RydWN0b3JTVGhyZWFkIik7CiAgICAgICAgICAgICBUaW1lclRlc3RUYXNrIHRlc3RUYXNrID0gbmV3IFRpbWVyVGVzdFRhc2soKTsKICAgICAgICAgICAgIHQuc2NoZWR1bGUodGVzdFRhc2ssIDIwMCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLndhaXQoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGltZXJUYXNrLnJ1bigpIG1ldGhvZCBub3QgY2FsbGVkIGFmdGVyIDIwMG1zIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgdGVzdFRhc2sud2FzUnVuKCkpOworICAgICAgICAgICAgYXdhaXRSdW4odGVzdFRhc2spOwogICAgICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCkBAIC0yMzYsMTQgKzIxOSw3IEBACiAgICAgICAgICAgICB0ID0gbmV3IFRpbWVyKCk7CiAgICAgICAgICAgICB0ZXN0VGFzayA9IG5ldyBUaW1lclRlc3RUYXNrKCk7CiAgICAgICAgICAgICB0LnNjaGVkdWxlKHRlc3RUYXNrLCAxMDAsIDUwMCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLndhaXQoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGltZXJUYXNrLnJ1bigpIG1ldGhvZCBub3QgY2FsbGVkIGFmdGVyIDIwMG1zIiwKLSAgICAgICAgICAgICAgICAgICAgMSwgdGVzdFRhc2sud2FzUnVuKCkpOworICAgICAgICAgICAgYXdhaXRSdW4odGVzdFRhc2spOwogICAgICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3luYykgewogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0yNTgsMTQgKzIzNCw3IEBACiAgICAgICAgICAgICB0ID0gbmV3IFRpbWVyKCk7CiAgICAgICAgICAgICB0ZXN0VGFzayA9IG5ldyBUaW1lclRlc3RUYXNrKCk7CiAgICAgICAgICAgICB0LnNjaGVkdWxlKHRlc3RUYXNrLCAxMDAsIDUwMCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jLndhaXQoNTAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaW1lclRhc2sucnVuKCkgbWV0aG9kIG5vdCBjYWxsZWQgYWZ0ZXIgMjAwbXMiLAotICAgICAgICAgICAgICAgICAgICAxLCB0ZXN0VGFzay53YXNSdW4oKSk7CisgICAgICAgICAgICBhd2FpdFJ1bih0ZXN0VGFzayk7CiAgICAgICAgICAgICB0LmNhbmNlbCgpOwogICAgICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgICAgIHQuY2FuY2VsKCk7CkBAIC00NDYsMTIgKzQxNSw3IEBACiAgICAgICAgICAgICB0ZXN0VGFzayA9IG5ldyBUaW1lclRlc3RUYXNrKCk7CiAgICAgICAgICAgICBkID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAyMDApOwogICAgICAgICAgICAgdC5zY2hlZHVsZSh0ZXN0VGFzaywgZCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg0MDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaW1lclRhc2sucnVuKCkgbWV0aG9kIG5vdCBjYWxsZWQgYWZ0ZXIgMjAwbXMiLAotICAgICAgICAgICAgICAgICAgICAxLCB0ZXN0VGFzay53YXNSdW4oKSk7CisgICAgICAgICAgICBhd2FpdFJ1bih0ZXN0VGFzayk7CiAgICAgICAgICAgICB0LmNhbmNlbCgpOwogCiAgICAgICAgICAgICAvLyBFbnN1cmUgbXVsdGlwbGUgdGFza3MgYXJlIHJ1bgpAQCAtNTY4LDEyICs1MzIsNyBAQAogICAgICAgICAgICAgdCA9IG5ldyBUaW1lcigpOwogICAgICAgICAgICAgdGVzdFRhc2sgPSBuZXcgVGltZXJUZXN0VGFzaygpOwogICAgICAgICAgICAgdC5zY2hlZHVsZSh0ZXN0VGFzaywgMjAwKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDQwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRpbWVyVGFzay5ydW4oKSBtZXRob2Qgbm90IGNhbGxlZCBhZnRlciAyMDBtcyIsCi0gICAgICAgICAgICAgICAgICAgIDEsIHRlc3RUYXNrLndhc1J1bigpKTsKKyAgICAgICAgICAgIGF3YWl0UnVuKHRlc3RUYXNrKTsKICAgICAgICAgICAgIHQuY2FuY2VsKCk7CiAKICAgICAgICAgICAgIC8vIEVuc3VyZSBtdWx0aXBsZSB0YXNrcyBhcmUgcnVuCmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q2VydFNlbGVjdG9yVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRTZWxlY3RvclRlc3QuamF2YQppbmRleCAxZmM2NDI2Li4wNDlmM2EwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q2VydFNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0U2VsZWN0b3JUZXN0LmphdmEKQEAgLTE3LDggKzE3LDYgQEAKIAogcGFja2FnZSB0ZXN0cy5zZWN1cml0eS5jZXJ0OwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtNTMsMTkgKzUxLDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5NeUNSTDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5jZXJ0LlRlc3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudGVzdHMuc3VwcG9ydC5UZXN0S2V5UGFpcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUJvb2xlYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUludGVnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPaWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LlRlc3RLZXlQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS50ZXN0cy5zdXBwb3J0LmNlcnQuTXlDUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnRlc3RzLnN1cHBvcnQuY2VydC5UZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZVBvbGljaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lOwpAQCAtMTQxLDcgKzEzNyw3IEBACiAgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKHR5cGVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGVbXSkgbnVsbCk7CiAgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gZm9yIHR5cGU6ICIgKyB0eXBlc1tpXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTY1LDcgKzE2MSw3IEBACiAgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lKHR5cGVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0weERGUkYiKTsKICAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleHBlY3RlZCBmb3IgdHlwZTogIiArIHR5cGVzW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xODgsNyArMTg0LDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKS5hZGRQYXRoVG9OYW1lKHR5cGVzW2ldLCAoYnl0ZVtdKSBudWxsKTsKICAgICAgICAgICAgICAgICBmYWlsKCJObyBleHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBmb3IgdHlwZTogIiArIHR5cGVzW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDEsOSArMTk3LDggQEAKICAgICAgICAgZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPD0gODsgdHlwZSsrKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG5ldyBYNTA5Q2VydFNlbGVjdG9yKCkuYWRkUGF0aFRvTmFtZSh0eXBlLCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiBleHBlY3RlZCEiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTQsMTIgKzIwOSw3IEBACiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjWDUwOUNlcnRTZWxlY3RvcigpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9YNTA5Q2VydFNlbGVjdG9yKCkgewotICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VsZWN0b3IuZ2V0QmFzaWNDb25zdHJhaW50cygpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3Rvci5nZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpKTsKICAgICB9CkBAIC0yMzEsNDkgKzIyMSwzNCBAQAogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvcjEgPSAoWDUwOUNlcnRTZWxlY3Rvcikgc2VsZWN0b3IuY2xvbmUoKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpLCBzZWxlY3RvcjEKLSAgICAgICAgICAgICAgICAuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldEJhc2ljQ29uc3RyYWludHMoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpLCBzZWxlY3RvcjEuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCksIHNlbGVjdG9yMS5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0QmFzaWNDb25zdHJhaW50cygpLCBzZWxlY3RvcjEuZ2V0QmFzaWNDb25zdHJhaW50cygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldENlcnRpZmljYXRlKCksIHNlbGVjdG9yMS5nZXRDZXJ0aWZpY2F0ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldENlcnRpZmljYXRlVmFsaWQoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldENlcnRpZmljYXRlVmFsaWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRFeHRlbmRlZEtleVVzYWdlKCksIHNlbGVjdG9yMQotICAgICAgICAgICAgICAgIC5nZXRFeHRlbmRlZEtleVVzYWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpLCBzZWxlY3RvcjEuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSwgc2VsZWN0b3IxLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXIoKSwgc2VsZWN0b3IxLmdldElzc3VlcigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldElzc3VlckFzQnl0ZXMoKSwgc2VsZWN0b3IxLmdldElzc3VlckFzQnl0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpLCBzZWxlY3RvcjEKLSAgICAgICAgICAgICAgICAuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpLCBzZWxlY3RvcjEuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRLZXlVc2FnZSgpLCBzZWxlY3RvcjEuZ2V0S2V5VXNhZ2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXROYW1lQ29uc3RyYWludHMoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldE5hbWVDb25zdHJhaW50cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldE5hbWVDb25zdHJhaW50cygpLCBzZWxlY3RvcjEuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0UGF0aFRvTmFtZXMoKSwgc2VsZWN0b3IxLmdldFBhdGhUb05hbWVzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0UG9saWN5KCksIHNlbGVjdG9yMS5nZXRQb2xpY3koKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRQcml2YXRlS2V5VmFsaWQoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldFByaXZhdGVLZXlWYWxpZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpLCBzZWxlY3RvcjEuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U2VyaWFsTnVtYmVyKCksIHNlbGVjdG9yMS5nZXRTZXJpYWxOdW1iZXIoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0KCksIHNlbGVjdG9yMS5nZXRTdWJqZWN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFzQnl0ZXMoKSwgc2VsZWN0b3IxCi0gICAgICAgICAgICAgICAgLmdldFN1YmplY3RBc0J5dGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCksIHNlbGVjdG9yMQotICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0QXNTdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpLCBzZWxlY3RvcjEKLSAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0UHVibGljS2V5KCksIHNlbGVjdG9yMQotICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0UHVibGljS2V5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCksIHNlbGVjdG9yMQotICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpLCBzZWxlY3RvcjEuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0QXNCeXRlcygpLCBzZWxlY3RvcjEuZ2V0U3ViamVjdEFzQnl0ZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0QXNTdHJpbmcoKSwgc2VsZWN0b3IxLmdldFN1YmplY3RBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCksIHNlbGVjdG9yMS5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXkoKSwgc2VsZWN0b3IxLmdldFN1YmplY3RQdWJsaWNLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSwgc2VsZWN0b3IxLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKTsKIAogICAgICAgICBzZWxlY3RvciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZWxlY3Rvci5jbG9uZSgpOwotICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjg1LDE1ICsyNjAsMTUgQEAKICAgICAgICAgYnl0ZVtdIGFraWQyID0gbmV3IGJ5dGVbXSB7IDQsIDUsIDUsIDQsIDMsIDIsIDEgfTsgLy8gcmFuZG9tIHZhbHVlCiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldEF1dGhvcml0eUtleUlkZW50aWZpZXIoKSk7CisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGFraWQxLCBzZWxlY3Rvci5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCkpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcihha2lkMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCi0gICAgICAgICAgICAgICAgLmVxdWFscyhha2lkMSwgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCi0gICAgICAgICAgICAgICAgLmVxdWFscyhha2lkMSwgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQga2V5SUQgc2hvdWxkIGRpZmZlciIsIEFycmF5cy5lcXVhbHMoYWtpZDIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGFraWQxLCBzZWxlY3Rvci5nZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgZGlmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhha2lkMiwgc2VsZWN0b3IuZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTEsMTYgKzI4NiwxNiBAQAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldENlcnRpZmljYXRlKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENlcnRpZmljYXRlKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENlcnRpZmljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKLSAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKLSAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgICAgICBjZXJ0RmFjdC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOwogCi0gICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0MiA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0Ci0gICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MSgpKSk7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0MiA9IChYNTA5Q2VydGlmaWNhdGUpCisgICAgICAgICAgICAgICAgY2VydEZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0WDUwOUNlcnRpZmljYXRlX3YxKCkpKTsKIAogICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0MSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjZXJ0MSwgc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGUoKSk7CkBAIC0zNDEsMTkgKzMxNiwxOSBAQAogICAgICAgICBEYXRlIGRhdGUzID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCk7CiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldENlcnRpZmljYXRlVmFsaWQoKSk7CisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGVWYWxpZChkYXRlMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBkYXRlMQotICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIGRhdGUxLmVxdWFscyhzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkpKTsKICAgICAgICAgc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpLnNldFRpbWUoMjAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGRhdGUgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIGRhdGUxCi0gICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBkaWZmZXIiLCBkYXRlMi5lcXVhbHMoc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIGRhdGUxLmVxdWFscyhzZWxlY3Rvci5nZXRDZXJ0aWZpY2F0ZVZhbGlkKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBkaWZmZXIiLAorICAgICAgICAgICAgICAgICAgICBkYXRlMi5lcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlVmFsaWQoZGF0ZTMpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgZGF0ZTMKLSAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldENlcnRpZmljYXRlVmFsaWQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBkYXRlMy5lcXVhbHMoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldENlcnRpZmljYXRlVmFsaWQobnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGVWYWxpZCgpKTsKICAgICB9CkBAIC0zNjEsMzAgKzMzNiwyOCBAQAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldEV4dGVuZGVkS2V5VXNhZ2UoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpIHsKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IGt1ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMKLSAgICAgICAgICAgICAgICAuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxLjMuNi4xLjUuNS43LjMuMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwgIjEuMy42LjEuNS41LjcuMy44IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLCAiMS4zLjYuMS41LjUuNy4zLjciIH0pKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEV4dGVuZGVkS2V5VXNhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGt1ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjEiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4yIiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMyIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjQiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy44IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjUiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy42IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNyIKKyAgICAgICAgfSkpOwogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKIAotICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5nZXRFeHRlbmRlZEtleVVzYWdlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0RXh0ZW5kZWRLZXlVc2FnZShrdSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICJUaGUgcmV0dXJuZWQgZXh0ZW5kZWRLZXlVc2FnZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICBrdS5lcXVhbHMoc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKSk7CisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSk7CisgICAgICAgIHNlbGVjdG9yLnNldEV4dGVuZGVkS2V5VXNhZ2Uoa3UpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZXh0ZW5kZWRLZXlVc2FnZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBrdS5lcXVhbHMoc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZWxlY3Rvci5nZXRFeHRlbmRlZEtleVVzYWdlKCkuYWRkKCJLUklCTEVHUkFCTEkiKTsKICAgICAgICAgICAgIGZhaWwoIlRoZSByZXR1cm5lZCBTZXQgc2hvdWxkIGJlIGltbXV0YWJsZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk4LDE2ICszNzEsMTYgQEAKIAogICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRJc3N1ZXIoKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlcihpc3MxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBpc3MxLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldElzc3VlcigpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsIGlzczIuZXF1YWxzKHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldElzc3VlcigpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGlzczEsIHNlbGVjdG9yLmdldElzc3VlcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsCisgICAgICAgICAgICAgICAgICAgIGlzczIuZXF1YWxzKHNlbGVjdG9yLmdldElzc3VlcigpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0SXNzdWVyQXNCeXRlcygpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRJc3N1ZXJBc0J5dGVzKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SXNzdWVyQXNCeXRlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gbmFtZTEgPSBuZXcgYnl0ZVtdCiAgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1GaXJzdCBPcmcuIiBpc3N1ZXIgbmFtZTsKICAgICAgICAgeyA0OCwgMjEsIDQ5LCAxOSwgNDgsIDE3LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMCwgNzAsIDEwNSwgMTE0LCAxMTUsCkBAIC00MjEsMjAgKzM5NCwxNCBAQAogICAgICAgICBYNTAwUHJpbmNpcGFsIGlzczIgPSBuZXcgWDUwMFByaW5jaXBhbChuYW1lMik7CiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAuZ2V0SXNzdWVyQXNCeXRlcygpKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlcihpc3MxKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMobmFtZTEsIHNlbGVjdG9yLmdldElzc3VlckFzQnl0ZXMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsIG5hbWUyCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0SXNzdWVyQXNCeXRlcygpKSk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoaXNzMik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG5hbWUyLCBzZWxlY3Rvci5nZXRJc3N1ZXJBc0J5dGVzKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldElzc3VlckFzQnl0ZXMoKSk7CisgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlcihpc3MxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGlzc3VlciBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG5hbWUxLCBzZWxlY3Rvci5nZXRJc3N1ZXJBc0J5dGVzKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsIG5hbWUyLmVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXJBc0J5dGVzKCkpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKGlzczIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMobmFtZTIsIHNlbGVjdG9yLmdldElzc3VlckFzQnl0ZXMoKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDUwLDEyICs0MTcsMTIgQEAKICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IuZ2V0SXNzdWVyQXNTdHJpbmcoKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlcihpc3MxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBuYW1lMSwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsIG5hbWUyLmVxdWFscyhzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5nZXRJc3N1ZXJBc1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUyLmVxdWFscyhzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldElzc3Vlcihpc3MyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBuYW1lMiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXRJc3N1ZXJBc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldElzc3VlckFzU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDY4LDEyICs0MzUsMTIgQEAKIAogICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRLZXlVc2FnZSgpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0S2V5VXNhZ2Uoa3UpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgQXJyYXlzCi0gICAgICAgICAgICAgICAgLmVxdWFscyhrdSwgc2VsZWN0b3IuZ2V0S2V5VXNhZ2UoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGt1LCBzZWxlY3Rvci5nZXRLZXlVc2FnZSgpKSk7CiAgICAgICAgIGJvb2xlYW5bXSByZXN1bHQgPSBzZWxlY3Rvci5nZXRLZXlVc2FnZSgpOwogICAgICAgICByZXN1bHRbMF0gPSAhcmVzdWx0WzBdOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQga2V5VXNhZ2Ugc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIEFycmF5cwotICAgICAgICAgICAgICAgIC5lcXVhbHMoa3UsIHNlbGVjdG9yLmdldEtleVVzYWdlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGtleVVzYWdlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoa3UsIHNlbGVjdG9yLmdldEtleVVzYWdlKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4MSwxMSArNDQ4LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpIHsKICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBtYXRjaEFsbE5hbWVzIGluaXRpYWxseSBzaG91bGQgYmUgdHJ1ZSIsIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgbWF0Y2hBbGxOYW1lcyBpbml0aWFsbHkgc2hvdWxkIGJlIHRydWUiLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldE1hdGNoQWxsU3ViamVjdEFsdE5hbWVzKCkpOwogICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyhmYWxzZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGUgdmFsdWUgc2hvdWxkIGJlIGZhbHNlIiwgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgdmFsdWUgc2hvdWxkIGJlIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXMoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MjMsNjcgKzQ5MCw2OCBAQAogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyYWludEJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBzZWxlY3Rvci5zZXROYW1lQ29uc3RyYWludHMoY29uc3RyYWludEJ5dGVzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb25zdHJhaW50Qnl0ZXNbaV0sIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgIC5nZXROYW1lQ29uc3RyYWludHMoKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnN0cmFpbnRCeXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXROYW1lQ29uc3RyYWludHMoKSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0UGF0aFRvTmFtZXMoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGF0aFRvTmFtZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4wID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPdGhlck5hbWUoIjEuMi4zLjQuNSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAxLCAyLCAwLCAxIH0pKTsKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjEgPSBuZXcgR2VuZXJhbE5hbWUoMSwgInJmY0A4MjIuTmFtZSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMiA9IG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TTmFtZSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMyA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT1JBZGRyZXNzKCkpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNCA9IG5ldyBHZW5lcmFsTmFtZShuZXcgTmFtZSgiTz1Pcmdhbml6YXRpb24iKSk7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW42ID0gbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNyA9IG5ldyBHZW5lcmFsTmFtZSg3LCAiMS4xLjEuMSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuOCA9IG5ldyBHZW5lcmFsTmFtZSg4LCAiMS4yLjMuNDQ0NC41NTU1NSIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGF0aFRvTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMCA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT3RoZXJOYW1lKCIxLjIuMy40LjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDAsIDEgfSkpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW4xID0gbmV3IEdlbmVyYWxOYW1lKDEsICJyZmNAODIyLk5hbWUiKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMiA9IG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TTmFtZSIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW4zID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPUkFkZHJlc3MoKSk7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjQgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE5hbWUoIk89T3JnYW5pemF0aW9uIikpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW42ID0gbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW43ID0gbmV3IEdlbmVyYWxOYW1lKDcsICIxLjEuMS4xIik7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjggPSBuZXcgR2VuZXJhbE5hbWUoOCwgIjEuMi4zLjQ0NDQuNTU1NTUiKTsKIAotICAgICAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMxID0gbmV3IEdlbmVyYWxOYW1lcygpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4wKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMSk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjIpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4zKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNCk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjYpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW43KTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuOCk7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczIgPSBuZXcgR2VuZXJhbE5hbWVzKCk7Ci0gICAgICAgICAgICBzYW5zMi5hZGROYW1lKHNhbjApOworICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczEgPSBuZXcgR2VuZXJhbE5hbWVzKCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMSk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMik7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMyk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNik7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNyk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuOCk7CisgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMiA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgc2FuczIuYWRkTmFtZShzYW4wKTsKIAotICAgICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOwotICAgICAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc2FuczIpOwotICAgICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChzYW5zMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKIAotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMobnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgotICAgICAgICAgICAgICAgICAgICArICJzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyBjcml0ZXJpYS4iLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFBhdGhUb05hbWVzKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICAgICsgInN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAKLSAgICAgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gc2FucyA9IHNhbnMxLmdldFBhaXJzTGlzdCgpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IHNhbnMgPSBzYW5zMS5nZXRQYWlyc0xpc3QoKTsKIAotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMoc2Fucyk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldFBhdGhUb05hbWVzKHNhbnMpOworICAgICAgICBzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI2dldFBvbGljeSgpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9nZXRQb2xpY3koKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBwb2xpY2llczEgPSBuZXcgU3RyaW5nW10geyAiMS4zLjYuMS41LjUuNy4zLjEiLAotICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMiIsICIxLjMuNi4xLjUuNS43LjMuMyIsICIxLjMuNi4xLjUuNS43LjMuNCIsCi0gICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy44IiwgIjEuMy42LjEuNS41LjcuMy45IiwgIjEuMy42LjEuNS41LjcuMy41IiwKLSAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLCAiMS4zLjYuMS41LjUuNy4zLjciIH07CisgICAgICAgIFN0cmluZ1tdIHBvbGljaWVzMSA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjEiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4yIiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMyIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjQiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy44IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjUiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy42IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNyIKKyAgICAgICAgfTsKIAogICAgICAgICBTdHJpbmdbXSBwb2xpY2llczIgPSBuZXcgU3RyaW5nW10geyAiMS4zLjYuNy4zLjEiIH07CiAKQEAgLTYxMiwxMyArNTgwLDEzIEBACiAKICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpOwogICAgICAgICBzZWxlY3Rvci5zZXRQcml2YXRlS2V5VmFsaWQoZGF0ZTEpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgZGF0ZTEKLSAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIGRhdGUxLmVxdWFscyhzZWxlY3Rvci5nZXRQcml2YXRlS2V5VmFsaWQoKSkpOwogICAgICAgICBzZWxlY3Rvci5nZXRQcml2YXRlS2V5VmFsaWQoKS5zZXRUaW1lKDIwMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLCBkYXRlMQotICAgICAgICAgICAgICAgIC5lcXVhbHMoc2VsZWN0b3IuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBkYXRlIHNob3VsZCBkaWZmZXIiLCBkYXRlMi5lcXVhbHMoc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAuZ2V0UHJpdmF0ZUtleVZhbGlkKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGRhdGUgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgZGF0ZTEuZXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgZGF0ZSBzaG91bGQgZGlmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0ZTIuZXF1YWxzKHNlbGVjdG9yLmdldFByaXZhdGVLZXlWYWxpZCgpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MzIsOSArNjAwLDkgQEAKICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IuZ2V0U2VyaWFsTnVtYmVyKCkpOwogICAgICAgICBzZWxlY3Rvci5zZXRTZXJpYWxOdW1iZXIoc2VyMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIHNlcmlhbCBudW1iZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgc2VyMSwgc2VsZWN0b3IuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHJldHVybmVkIHNlcmlhbCBudW1iZXIgc2hvdWxkIGRpZmZlciIsIHNlcjIKLSAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFNlcmlhbE51bWJlcigpKSk7CisgICAgICAgICAgICAgICAgICAgICBzZXIxLCBzZWxlY3Rvci5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgc2VyaWFsIG51bWJlciBzaG91bGQgZGlmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgc2VyMi5lcXVhbHMoc2VsZWN0b3IuZ2V0U2VyaWFsTnVtYmVyKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY0OCw3MyArNjE2LDY1IEBACiAgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yLmdldFN1YmplY3QoKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3Qoc3ViMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIHN1YmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIHN1YjEsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBzdWJqZWN0IHNob3VsZCBkaWZmZXIiLCBzdWIyLmVxdWFscyhzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldFN1YmplY3QoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgc3ViamVjdCBzaG91bGQgZGlmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgc3ViMi5lcXVhbHMoc2VsZWN0b3IuZ2V0U3ViamVjdCgpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4xID0gbmV3IEdlbmVyYWxOYW1lKDEsICJyZmNAODIyLk5hbWUiKTsKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjIgPSBuZXcgR2VuZXJhbE5hbWUoMiwgImROU05hbWUiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjEgPSBuZXcgR2VuZXJhbE5hbWUoMSwgInJmY0A4MjIuTmFtZSIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW4yID0gbmV3IEdlbmVyYWxOYW1lKDIsICJkTlNOYW1lIik7CiAKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zID0gbmV3IEdlbmVyYWxOYW1lcygpOwotICAgICAgICAgICAgc2Fucy5hZGROYW1lKHNhbjEpOwotICAgICAgICAgICAgc2Fucy5hZGROYW1lKHNhbjIpOworICAgICAgICBHZW5lcmFsTmFtZXMgc2FucyA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgc2Fucy5hZGROYW1lKHNhbjEpOworICAgICAgICBzYW5zLmFkZE5hbWUoc2FuMik7CiAKLSAgICAgICAgICAgIFRlc3RDZXJ0IGNlcnRfMSA9IG5ldyBUZXN0Q2VydChzYW5zKTsKLSAgICAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBUZXN0Q2VydCBjZXJ0XzEgPSBuZXcgVGVzdENlcnQoc2Fucyk7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSk7CisgICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSk7CiAKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKHNhbnMuZ2V0UGFpcnNMaXN0KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnRfMSkpOwotICAgICAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG1vZGlmaWNhdGlvbiBvZiBpbml0aWFsaXphdGlvbiBvYmplY3QgIgotICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IGFmZmVjdCB0aGUgbW9kaWZpY2F0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgKyAib2YgaW50ZXJuYWwgb2JqZWN0LiIsIHNlbGVjdG9yLm1hdGNoKGNlcnRfMSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKHNhbnMuZ2V0UGFpcnNMaXN0KCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0XzEpKTsKKyAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKS5jbGVhcigpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgbW9kaWZpY2F0aW9uIG9mIGluaXRpYWxpemF0aW9uIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBhZmZlY3QgdGhlIG1vZGlmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgKyAib2YgaW50ZXJuYWwgb2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydF8xKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0U3ViamVjdEFzQnl0ZXMoKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U3ViamVjdEFzQnl0ZXMoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdF9nZXRTdWJqZWN0QXNCeXRlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gbmFtZTEgPSBuZXcgYnl0ZVtdCiAgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1GaXJzdCBPcmcuIiBpc3N1ZXIgbmFtZTsKLSAgICAgICAgeyA0OCwgMjEsIDQ5LCAxOSwgNDgsIDE3LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMCwgNzAsIDEwNSwgMTE0LCAxMTUsCi0gICAgICAgICAgICAgICAgMTE2LCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OworICAgICAgICAgICAgICAgIHsgNDgsIDIxLCA0OSwgMTksIDQ4LCAxNywgNiwgMywgODUsIDQsIDEwLCAxOSwgMTAsIDcwLCAxMDUsIDExNCwgMTE1LAorICAgICAgICAgICAgICAgICAgMTE2LCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OwogICAgICAgICBieXRlW10gbmFtZTIgPSBuZXcgYnl0ZVtdCiAgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1TZWNvbmQgT3JnLiIgaXNzdWVyIG5hbWU7Ci0gICAgICAgIHsgNDgsIDIyLCA0OSwgMjAsIDQ4LCAxOCwgNiwgMywgODUsIDQsIDEwLCAxOSwgMTEsIDgzLCAxMDEsIDk5LCAxMTEsCi0gICAgICAgICAgICAgICAgMTEwLCAxMDAsIDMyLCA3OSwgMTE0LCAxMDMsIDQ2IH07CisgICAgICAgICAgICAgICAgeyA0OCwgMjIsIDQ5LCAyMCwgNDgsIDE4LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMSwgODMsIDEwMSwgOTksIDExMSwKKyAgICAgICAgICAgICAgICAgIDExMCwgMTAwLCAzMiwgNzksIDExNCwgMTAzLCA0NiB9OwogCiAgICAgICAgIFg1MDBQcmluY2lwYWwgc3ViMSA9IG5ldyBYNTAwUHJpbmNpcGFsKG5hbWUxKTsKICAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIyID0gbmV3IFg1MDBQcmluY2lwYWwobmFtZTIpOwogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLmdldFN1YmplY3RBc0J5dGVzKCkpOwotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChzdWIxKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMobmFtZTEsIHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBkaWZmZXIiLCBuYW1lMgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3Qoc3ViMik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG5hbWUyLCBzZWxlY3Rvci5nZXRTdWJqZWN0QXNCeXRlcygpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjEpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgaXNzdWVyIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMobmFtZTEsIHNlbGVjdG9yLmdldFN1YmplY3RBc0J5dGVzKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGRpZmZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUyLmVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0QXNCeXRlcygpKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3Qoc3ViMik7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBpc3N1ZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhuYW1lMiwgc2VsZWN0b3IuZ2V0U3ViamVjdEFzQnl0ZXMoKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzMwLDEyICs2OTAsMTIgQEAKICAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCkpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBzdWJqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgIG5hbWUxLCBzZWxlY3Rvci5nZXRTdWJqZWN0QXNTdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgc3ViamVjdCBzaG91bGQgZGlmZmVyIiwgbmFtZTIuZXF1YWxzKHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldFN1YmplY3RBc1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICBuYW1lMSwgc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHJldHVybmVkIHN1YmplY3Qgc2hvdWxkIGRpZmZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUyLmVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0QXNTdHJpbmcoKSkpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCBzdWJqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgIG5hbWUyLCBzZWxlY3Rvci5nZXRTdWJqZWN0QXNTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICBuYW1lMiwgc2VsZWN0b3IuZ2V0U3ViamVjdEFzU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzQ2LDE2ICs3MDYsMTUgQEAKICAgICAgICAgYnl0ZVtdIHNraWQyID0gbmV3IGJ5dGVbXSB7IDQsIDUsIDUsIDQsIDMsIDIsIDEgfTsgLy8gcmFuZG9tIHZhbHVlCiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIGFzc2VydE51bGwoIlNlbGVjdG9yIHNob3VsZCByZXR1cm4gbnVsbCIsIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpOworICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdEtleUlkZW50aWZpZXIoc2tpZDEpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQga2V5SUQgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIEFycmF5cwotICAgICAgICAgICAgICAgIC5lcXVhbHMoc2tpZDEsIHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIGtleUlEIHNob3VsZCBiZSBlcXVhbCB0byBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoc2tpZDEsIHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpKTsKICAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKVswXSsrOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQga2V5SUQgc2hvdWxkIGJlIGVxdWFsIHRvIHNwZWNpZmllZCIsIEFycmF5cwotICAgICAgICAgICAgICAgIC5lcXVhbHMoc2tpZDEsIHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgZGlmZmVyIiwgQXJyYXlzLmVxdWFscyhza2lkMiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpKSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBrZXlJRCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHNraWQxLCBzZWxlY3Rvci5nZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQga2V5SUQgc2hvdWxkIGRpZmZlciIsCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoc2tpZDIsIHNlbGVjdG9yLmdldFN1YmplY3RLZXlJZGVudGlmaWVyKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc5MywxNCArNzUyLDEyIEBACiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwotICAgICAgICBTdHJpbmdbXSB2YWxpZE9JRHMgPSB7ICIwLjAuMjAiLCAiMS4yNS4wIiwgIjIuMC4zOSIsICIwLjIuMTAiLCAiMS4zNS4xNSIsCi0gICAgICAgICAgICAgICAgIjIuMTcuODkiIH07CisgICAgICAgIFN0cmluZ1tdIHZhbGlkT0lEcyA9IHsgIjAuMC4yMCIsICIxLjI1LjAiLCAiMi4wLjM5IiwgIjAuMi4xMCIsICIxLjM1LjE1IiwgIjIuMTcuODkiIH07CiAKLSAgICAgICAgYXNzZXJ0TnVsbCgiU2VsZWN0b3Igc2hvdWxkIHJldHVybiBudWxsIiwgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkpOworICAgICAgICBhc3NlcnROdWxsKCJTZWxlY3RvciBzaG91bGQgcmV0dXJuIG51bGwiLCBzZWxlY3Rvci5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZE9JRHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC04MTUsMzMgKzc3MiwyOCBAQAogICAgICAgICBTdHJpbmcgcGthaWQxID0gIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjsgLy8gUlNBIGVuY3J5cHRpb24KICAgICAgICAgU3RyaW5nIHBrYWlkMiA9ICIxLjIuODQwLjExMzU0OS4xLjEuNCI7IC8vIE1ENSB3aXRoIFJTQSBlbmNyeXB0aW9uCiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXlBbGdJRChwa2FpZDEpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIG9pZCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwgcGthaWQxCi0gICAgICAgICAgICAgICAgLmVxdWFscyhzZWxlY3Rvci5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHJldHVybmVkIG9pZCBzaG91bGQgZGlmZmVyIiwgcGthaWQyLmVxdWFscyhzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5nZXRTdWJqZWN0UHVibGljS2V5QWxnSUQoKSkpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5QWxnSUQocGthaWQxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIG9pZCBzaG91bGQgYmUgZXF1YWwgdG8gc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICBwa2FpZDEuZXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgcmV0dXJuZWQgb2lkIHNob3VsZCBkaWZmZXIiLAorICAgICAgICAgICAgICAgICAgICBwa2FpZDIuZXF1YWxzKHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IjbWF0Y2goamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfbWF0Y2hMamF2YV9zZWN1cml0eV9jZXJ0X0NlcnRpZmljYXRlKCkKLSAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdF9tYXRjaExqYXZhX3NlY3VyaXR5X2NlcnRfQ2VydGlmaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKHNlbGVjdG9yLm1hdGNoKG51bGwpKTsKIAogICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKLSAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydEZhY3QKLSAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVGVzdFV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0WDUwOUNlcnRpZmljYXRlX3YzKCkpKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQxID0gKFg1MDlDZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgICAgICBjZXJ0RmFjdC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRYNTA5Q2VydGlmaWNhdGVfdjMoKSkpOwogCi0gICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0MiA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0Ci0gICAgICAgICAgICAgICAgLmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRlc3RVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFg1MDlDZXJ0aWZpY2F0ZV92MSgpKSk7CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0MiA9IChYNTA5Q2VydGlmaWNhdGUpCisgICAgICAgICAgICAgICAgY2VydEZhY3QuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0WDUwOUNlcnRpZmljYXRlX3YxKCkpKTsKIAogICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0MSk7CiAgICAgICAgIGFzc2VydFRydWUoc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKQEAgLTg1NSw3ICs4MDcsNyBAQAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldEF1dGhvcml0eUtleUlkZW50aWZpZXIoYnl0ZVtdKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllckxCJCgpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRBdXRob3JpdHlLZXlJZGVudGlmaWVyTEIkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCiAgICAgICAgIGJ5dGVbXSBha2lkMSA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH07IC8vIHJhbmRvbSB2YWx1ZQpAQCAtODk1LDkgKzg0Nyw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBzZWxlY3Rvci5zZXRCYXNpY0NvbnN0cmFpbnRzKC0zKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTkxMiw3ICs4NjIsNyBAQAogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldENlcnRpZmljYXRlKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENlcnRpZmljYXRlTGphdmFfc2VjdXJpdHlfY2VydF9YNTA5Q2VydGlmaWNhdGUoKQotICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KCJzYW1lIGNlcnRpZmljYXRlIik7CiAgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KCJvdGhlciBjZXJ0aWZpY2F0ZSIpOwpAQCAtOTIwLDE2ICs4NzAsMTYgQEAKIAogICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlcyBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCi0gICAgICAgICAgICAgICAgKyAiY2VydGlmaWNhdGVFcXVhbHMgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICArICJjZXJ0aWZpY2F0ZUVxdWFscyBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0MSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRDZXJ0aWZpY2F0ZShjZXJ0Mik7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUobnVsbCk7CiAgICAgICAgIGFzc2VydE51bGwoc2VsZWN0b3IuZ2V0Q2VydGlmaWNhdGUoKSk7CiAgICAgfQpAQCAtOTM4LDcgKzg4OCw3IEBACiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0Q2VydGlmaWNhdGVWYWxpZChqYXZhLnV0aWwuRGF0ZSkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENlcnRpZmljYXRlVmFsaWRMamF2YV91dGlsX0RhdGUoKQotICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKIAogICAgICAgICBEYXRlIGRhdGUxID0gbmV3IERhdGUoMTAwKTsKQEAgLTk2Miw1MCArOTEyLDQ4IEBACiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0RXh0ZW5kZWRLZXlVc2FnZShTZXQ8U3RyaW5nPikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEV4dGVuZGVkS2V5VXNhZ2VMamF2YV91dGlsX1NldCgpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICBIYXNoU2V0PFN0cmluZz4ga3UxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMKLSAgICAgICAgICAgICAgICAuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxLjMuNi4xLjUuNS43LjMuMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwgIjEuMy42LjEuNS41LjcuMy44IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLCAiMS4zLjYuMS41LjUuNy4zLjciIH0pKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEV4dGVuZGVkS2V5VXNhZ2VMamF2YV91dGlsX1NldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBIYXNoU2V0PFN0cmluZz4ga3UxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjEiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4yIiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMyIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjQiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy44IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOSIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjUiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy42IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNyIKKyAgICAgICAgfSkpOwogICAgICAgICBIYXNoU2V0PFN0cmluZz4ga3UyID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4xIiwgIjEuMy42LjEuNS41LjcuMy4yIiwgIjEuMy42LjEuNS41LjcuMy4zIiwKLSAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjQiLCAiMS4zLjYuMS41LjUuNy4zLjgiLCAiMS4zLjYuMS41LjUuNy4zLjkiLAotICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNSIsICIxLjMuNi4xLjUuNS43LjMuNiIgfSkpOworICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4xIiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMiIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjMiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy40IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOCIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjkiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy41IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNiIKKyAgICAgICAgfSkpOwogICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChrdTEpOwogICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChrdTIpOwogCiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRFeHRlbmRlZEtleVVzYWdlKG51bGwpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgc2VsZWN0b3Iuc2V0RXh0ZW5kZWRLZXlVc2FnZShudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKLSAgICAgICAgICAgICAgICArICJleHRlbmRlZEtleVVzYWdlIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQotICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRFeHRlbmRlZEtleVVzYWdlKGt1MSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICsgImV4dGVuZGVkS2V5VXNhZ2UgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRFeHRlbmRlZEtleVVzYWdlKGt1MSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhrdTEsIHNlbGVjdG9yLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldEV4dGVuZGVkS2V5VXNhZ2Uoa3UyKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldEV4dGVuZGVkS2V5VXNhZ2Uoa3UyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGt1Miwgc2VsZWN0b3IuZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRJc3N1ZXIoYnl0ZVtdKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SXNzdWVyTEIkKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElzc3VlckxCJCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gbmFtZTEgPSBuZXcgYnl0ZVtdCiAgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1GaXJzdCBPcmcuIiBpc3N1ZXIgbmFtZTsKICAgICAgICAgeyA0OCwgMjEsIDQ5LCAxOSwgNDgsIDE3LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMCwgNzAsIDEwNSwgMTE0LCAxMTUsCkBAIC0xMDIxLDM2ICs5NjksMjQgQEAKIAogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKChieXRlW10pIG51bGwpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKChieXRlW10pIG51bGwpOwogICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGVzIHNob3VsZCBtYXRjaCAiCi0gICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpc3N1ZXIgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcihuYW1lMSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgaXNzdWVyIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQorICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcihuYW1lMSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUyKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldElzc3VlcihuYW1lMik7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRJc3N1ZXIoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElzc3VlckxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElzc3VlckxqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU3RyaW5nIG5hbWUxID0gIk89Rmlyc3QgT3JnLiI7CiAgICAgICAgIFN0cmluZyBuYW1lMiA9ICJPPVNlY29uZCBPcmcuIjsKQEAgLTEwNjEsMzcgKzk5NywyNSBAQAogCiAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIoKFN0cmluZykgbnVsbCk7CiAgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKLSAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUxKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpc3N1ZXIgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUxKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOwogICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRJc3N1ZXIobmFtZTIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKG5hbWUyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldElzc3VlcihqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElzc3VlckxqYXZheF9zZWN1cml0eV9hdXRoX3g1MDBfWDUwMFByaW5jaXBhbCgpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzMSA9IG5ldyBYNTAwUHJpbmNpcGFsKCJPPUZpcnN0IE9yZy4iKTsKICAgICAgICAgWDUwMFByaW5jaXBhbCBpc3MyID0gbmV3IFg1MDBQcmluY2lwYWwoIk89U2Vjb25kIE9yZy4iKTsKICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoaXNzMSk7CkBAIC0xMTAwLDIyICsxMDI0LDIyIEBACiAKICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKChYNTAwUHJpbmNpcGFsKSBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlcyBzaG91bGQgbWF0Y2ggIgotICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgaXNzdWVyIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQotICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpc3N1ZXIgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKGlzczEpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0SXNzdWVyKGlzczIpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0S2V5VXNhZ2UoYm9vbGVhbikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtleVVzYWdlWigpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdF9zZXRLZXlVc2FnZVooKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYm9vbGVhbltdIGt1MSA9IG5ldyBib29sZWFuW10geyB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLAogICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUgfTsKICAgICAgICAgLy8gZGVjaXBoZXJPbmx5IGlzIGRpc2FsbG93ZWQKQEAgLTExMjgsMTcgKzEwNTIsMTYgQEAKICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CiAKICAgICAgICAgc2VsZWN0b3Iuc2V0S2V5VXNhZ2UobnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCi0gICAgICAgICAgICAgICAgKyAia2V5VXNhZ2UgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsIGtleVVzYWdlIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldEtleVVzYWdlKGt1MSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGtleVVzYWdlIGV4dGVuc2lvbiAiCi0gICAgICAgICAgICAgICAgKyAiaW1wbGljaXRseSBhbGxvd3MgYWxsIGtleVVzYWdlIHZhbHVlcy4iLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5tYXRjaChjZXJ0MykpOworICAgICAgICAgICAgICAgICAgICsgImltcGxpY2l0bHkgYWxsb3dzIGFsbCBrZXlVc2FnZSB2YWx1ZXMuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MykpOwogICAgICAgICBzZWxlY3Rvci5zZXRLZXlVc2FnZShrdTIpOwogICAgICAgICBrdTJbMF0gPSAha3UyWzBdOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKQEAgLTExODYsNjcgKzExMDksNjcgQEAKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cmFpbnRCeXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgc2VsZWN0b3Iuc2V0TmFtZUNvbnN0cmFpbnRzKGNvbnN0cmFpbnRCeXRlc1tpXSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY29uc3RyYWludEJ5dGVzW2ldLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZUNvbnN0cmFpbnRzKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb25zdHJhaW50Qnl0ZXNbaV0sIHNlbGVjdG9yLmdldE5hbWVDb25zdHJhaW50cygpKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRQYXRoVG9OYW1lcyhDb2xsZWN0aW9uPExpc3Q8Pz4+KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGF0aFRvTmFtZXNMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4wID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPdGhlck5hbWUoIjEuMi4zLjQuNSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAxLCAyLCAwLCAxIH0pKTsKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjEgPSBuZXcgR2VuZXJhbE5hbWUoMSwgInJmY0A4MjIuTmFtZSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMiA9IG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TTmFtZSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMyA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT1JBZGRyZXNzKCkpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNCA9IG5ldyBHZW5lcmFsTmFtZShuZXcgTmFtZSgiTz1Pcmdhbml6YXRpb24iKSk7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW42ID0gbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuNyA9IG5ldyBHZW5lcmFsTmFtZSg3LCAiMS4xLjEuMSIpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuOCA9IG5ldyBHZW5lcmFsTmFtZSg4LCAiMS4yLjMuNDQ0NC41NTU1NSIpOworICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGF0aFRvTmFtZXNMamF2YV91dGlsX0NvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMCA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT3RoZXJOYW1lKCIxLjIuMy40LjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDAsIDEgfSkpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW4xID0gbmV3IEdlbmVyYWxOYW1lKDEsICJyZmNAODIyLk5hbWUiKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMiA9IG5ldyBHZW5lcmFsTmFtZSgyLCAiZE5TTmFtZSIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW4zID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPUkFkZHJlc3MoKSk7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjQgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE5hbWUoIk89T3JnYW5pemF0aW9uIikpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW42ID0gbmV3IEdlbmVyYWxOYW1lKDYsICJodHRwOi8vdW5pZm9ybS5SZXNvdXJjZS5JZCIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW43ID0gbmV3IEdlbmVyYWxOYW1lKDcsICIxLjEuMS4xIik7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjggPSBuZXcgR2VuZXJhbE5hbWUoOCwgIjEuMi4zLjQ0NDQuNTU1NTUiKTsKIAotICAgICAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMxID0gbmV3IEdlbmVyYWxOYW1lcygpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4wKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMSk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjIpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4zKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNCk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjYpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW43KTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuOCk7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczIgPSBuZXcgR2VuZXJhbE5hbWVzKCk7Ci0gICAgICAgICAgICBzYW5zMi5hZGROYW1lKHNhbjApOworICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczEgPSBuZXcgR2VuZXJhbE5hbWVzKCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMSk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMik7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMyk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNCk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNik7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNyk7CisgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuOCk7CisgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMiA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKKyAgICAgICAgc2FuczIuYWRkTmFtZShzYW4wKTsKIAotICAgICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOwotICAgICAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc2FuczIpOwotICAgICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2FuczEpOworICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChzYW5zMik7CisgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcyh0cnVlKTsKIAotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMobnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgotICAgICAgICAgICAgICAgICAgICArICJzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyBjcml0ZXJpYS4iLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFBhdGhUb05hbWVzKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgorICAgICAgICAgICAgICAgICAgICsgInN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAKLSAgICAgICAgICAgIENvbGxlY3Rpb248TGlzdDw/Pj4gc2FucyA9IHNhbnMxLmdldFBhaXJzTGlzdCgpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IHNhbnMgPSBzYW5zMS5nZXRQYWlyc0xpc3QoKTsKIAotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0UGF0aFRvTmFtZXMoc2Fucyk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldFBhdGhUb05hbWVzKHNhbnMpOworICAgICAgICBzZWxlY3Rvci5nZXRQYXRoVG9OYW1lcygpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFBvbGljeShTZXQ8U3RyaW5nPikKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBvbGljeUxqYXZhX3V0aWxfU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gcG9saWNpZXMxID0gbmV3IFN0cmluZ1tdIHsgIjEuMy42LjEuNS41LjcuMy4xIiwKLSAgICAgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLCAiMS4zLjYuMS41LjUuNy4zLjMiLCAiMS4zLjYuMS41LjUuNy4zLjQiLAotICAgICAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuOCIsICIxLjMuNi4xLjUuNS43LjMuOSIsICIxLjMuNi4xLjUuNS43LjMuNSIsCi0gICAgICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy42IiwgIjEuMy42LjEuNS41LjcuMy43IiB9OworICAgICAgICBTdHJpbmdbXSBwb2xpY2llczEgPSBuZXcgU3RyaW5nW10geyAKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuMSIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjIiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy4zIiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNCIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjgiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy45IiwKKyAgICAgICAgICAgICIxLjMuNi4xLjUuNS43LjMuNSIsCisgICAgICAgICAgICAiMS4zLjYuMS41LjUuNy4zLjYiLAorICAgICAgICAgICAgIjEuMy42LjEuNS41LjcuMy43IgorICAgICAgICB9OwogCiAgICAgICAgIFN0cmluZ1tdIHBvbGljaWVzMiA9IG5ldyBTdHJpbmdbXSB7ICIxLjMuNi43LjMuMSIgfTsKIApAQCAtMTI2MCwyNyArMTE4MywyNyBAQAogCiAgICAgICAgIHNlbGVjdG9yLnNldFBvbGljeShudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKLSAgICAgICAgICAgICAgICArICJwcml2YXRlS2V5VmFsaWQgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICArICJwcml2YXRlS2V5VmFsaWQgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKIAogICAgICAgICBzZWxlY3Rvci5zZXRQb2xpY3kocDEpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKIAogICAgICAgICBzZWxlY3Rvci5zZXRQb2xpY3kocDIpOwogICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRQcml2YXRlS2V5VmFsaWQoamF2YS51dGlsLkRhdGUpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcml2YXRlS2V5VmFsaWRMamF2YV91dGlsX0RhdGUoKQotICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEYXRlIGRhdGUxID0gbmV3IERhdGUoMTAwMDAwMDAwKTsKICAgICAgICAgRGF0ZSBkYXRlMiA9IG5ldyBEYXRlKDIwMDAwMDAwMCk7CiAgICAgICAgIERhdGUgZGF0ZTMgPSBuZXcgRGF0ZSgzMDAwMDAwMDApOwpAQCAtMTI5MywyNCArMTIxNiwyNCBAQAogCiAgICAgICAgIHNlbGVjdG9yLnNldFByaXZhdGVLZXlWYWxpZChudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKLSAgICAgICAgICAgICAgICArICJwcml2YXRlS2V5VmFsaWQgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICArICJwcml2YXRlS2V5VmFsaWQgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0UHJpdmF0ZUtleVZhbGlkKGRhdGU0KTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOwogICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldFByaXZhdGVLZXlWYWxpZChkYXRlNSk7CiAgICAgICAgIGRhdGU1LnNldFRpbWUoZGF0ZTQuZ2V0VGltZSgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFNlcmlhbE51bWJlcihqYXZhLm1hdGguQmlnSW50ZWdlcikKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcmlhbE51bWJlckxqYXZhX21hdGhfQmlnSW50ZWdlcigpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEJpZ0ludGVnZXIgc2VyMSA9IG5ldyBCaWdJbnRlZ2VyKCIxMDAwMCIpOwogICAgICAgICBCaWdJbnRlZ2VyIHNlcjIgPSBuZXcgQmlnSW50ZWdlcigiMTAwMDEiKTsKICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2VyMSk7CkBAIC0xMzE5LDIyICsxMjQyLDIyIEBACiAKICAgICAgICAgc2VsZWN0b3Iuc2V0U2VyaWFsTnVtYmVyKG51bGwpOwogICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgotICAgICAgICAgICAgICAgICsgInNlcmlhbE51bWJlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICsgInNlcmlhbE51bWJlciBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTZXJpYWxOdW1iZXIoc2VyMSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTZXJpYWxOdW1iZXIoc2VyMik7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRTZWxlY3RvciNzZXRTdWJqZWN0KGJ5dGVbXSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RMQiQoKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdExCJCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gbmFtZTEgPSBuZXcgYnl0ZVtdCiAgICAgICAgIC8vIG1hbnVhbGx5IG9idGFpbmVkIERFUiBlbmNvZGluZyBvZiAiTz1GaXJzdCBPcmcuIiBpc3N1ZXIgbmFtZTsKICAgICAgICAgeyA0OCwgMjEsIDQ5LCAxOSwgNDgsIDE3LCA2LCAzLCA4NSwgNCwgMTAsIDE5LCAxMCwgNzAsIDEwNSwgMTE0LCAxMTUsCkBAIC0xMzUwLDM2ICsxMjczLDI0IEBACiAKICAgICAgICAgWDUwOUNlcnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBYNTA5Q2VydFNlbGVjdG9yKCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3QoKGJ5dGVbXSkgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KChieXRlW10pIG51bGwpOwogICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGVzIHNob3VsZCBtYXRjaCAiCi0gICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNhc2Ugb2YgbnVsbCBpc3N1ZXIgY3JpdGVyaWEuIiwgc2VsZWN0b3IubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3QobmFtZTEpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIGlzc3VlciBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KG5hbWUxKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOwogICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KG5hbWUyKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3QobmFtZTIpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0U3ViamVjdChqYXZhLmxhbmcuU3RyaW5nKQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdExqYXZhX2xhbmdfU3RyaW5nKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RMamF2YV9sYW5nX1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbmFtZTEgPSAiTz1GaXJzdCBPcmcuIjsKICAgICAgICAgU3RyaW5nIG5hbWUyID0gIk89U2Vjb25kIE9yZy4iOwogICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjEgPSBuZXcgWDUwMFByaW5jaXBhbChuYW1lMSk7CkBAIC0xMzg4LDM4ICsxMjk5LDI1IEBACiAgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHN1YjIpOwogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdCgoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3QoKFN0cmluZykgbnVsbCk7CiAgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZXMgc2hvdWxkIG1hdGNoICIKLSAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIHN1YmplY3QgY3JpdGVyaWEuIiwgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAubWF0Y2goY2VydDEpCi0gICAgICAgICAgICAgICAgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3QobmFtZTEpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgY2FzZSBvZiBudWxsIHN1YmplY3QgY3JpdGVyaWEuIiwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkgJiYgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChuYW1lMSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChuYW1lMik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KG5hbWUyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3QoamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdWJqZWN0TGphdmF4X3NlY3VyaXR5X2F1dGhfeDUwMF9YNTAwUHJpbmNpcGFsKCkKLSAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgWDUwMFByaW5jaXBhbCBzdWIxID0gbmV3IFg1MDBQcmluY2lwYWwoIk89Rmlyc3QgT3JnLiIpOwogICAgICAgICBYNTAwUHJpbmNpcGFsIHN1YjIgPSBuZXcgWDUwMFByaW5jaXBhbCgiTz1TZWNvbmQgT3JnLiIpOwogICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChzdWIxKTsKQEAgLTE0MjgsNzMgKzEzMjYsNjYgQEAKIAogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KChYNTAwUHJpbmNpcGFsKSBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlcyBzaG91bGQgbWF0Y2ggIgotICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc3ViamNldCBjcml0ZXJpYS4iLCBzZWxlY3RvcgotICAgICAgICAgICAgICAgIC5tYXRjaChjZXJ0MSkKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICsgImluIHRoZSBjYXNlIG9mIG51bGwgc3ViamNldCBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0KHN1YjEpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdChzdWIyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKENvbGxlY3Rpb248TGlzdDw/Pj4pCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lc0xqYXZhX3V0aWxfQ29sbGVjdGlvbigpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzTGphdmFfdXRpbF9Db2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjAgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE90aGVyTmFtZSgiMS4yLjMuNC41IiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDEsIDIsIDAsIDEgfSkpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWUgc2FuMSA9IG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIik7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4yID0gbmV3IEdlbmVyYWxOYW1lKDIsICJkTlNOYW1lIik7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW4zID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBPUkFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW40ID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBOYW1lKCJPPU9yZ2FuaXphdGlvbiIpKTsKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lIHNhbjYgPSBuZXcgR2VuZXJhbE5hbWUoNiwgImh0dHA6Ly91bmlmb3JtLlJlc291cmNlLklkIik7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW43ID0gbmV3IEdlbmVyYWxOYW1lKDcsICIxLjEuMS4xIik7Ci0gICAgICAgICAgICBHZW5lcmFsTmFtZSBzYW44ID0gbmV3IEdlbmVyYWxOYW1lKDgsICIxLjIuMy40NDQ0LjU1NTU1Iik7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjAgPSBuZXcgR2VuZXJhbE5hbWUobmV3IE90aGVyTmFtZSgiMS4yLjMuNC41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10geyAxLCAyLCAwLCAxIH0pKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMSA9IG5ldyBHZW5lcmFsTmFtZSgxLCAicmZjQDgyMi5OYW1lIik7CisgICAgICAgIEdlbmVyYWxOYW1lIHNhbjIgPSBuZXcgR2VuZXJhbE5hbWUoMiwgImROU05hbWUiKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuMyA9IG5ldyBHZW5lcmFsTmFtZShuZXcgT1JBZGRyZXNzKCkpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW40ID0gbmV3IEdlbmVyYWxOYW1lKG5ldyBOYW1lKCJPPU9yZ2FuaXphdGlvbiIpKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuNiA9IG5ldyBHZW5lcmFsTmFtZSg2LCAiaHR0cDovL3VuaWZvcm0uUmVzb3VyY2UuSWQiKTsKKyAgICAgICAgR2VuZXJhbE5hbWUgc2FuNyA9IG5ldyBHZW5lcmFsTmFtZSg3LCAiMS4xLjEuMSIpOworICAgICAgICBHZW5lcmFsTmFtZSBzYW44ID0gbmV3IEdlbmVyYWxOYW1lKDgsICIxLjIuMy40NDQ0LjU1NTU1Iik7CiAKLSAgICAgICAgICAgIEdlbmVyYWxOYW1lcyBzYW5zMSA9IG5ldyBHZW5lcmFsTmFtZXMoKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMCk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjEpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW4yKTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuMyk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjQpOwotICAgICAgICAgICAgc2FuczEuYWRkTmFtZShzYW42KTsKLSAgICAgICAgICAgIHNhbnMxLmFkZE5hbWUoc2FuNyk7Ci0gICAgICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjgpOwotICAgICAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMyID0gbmV3IEdlbmVyYWxOYW1lcygpOwotICAgICAgICAgICAgc2FuczIuYWRkTmFtZShzYW4wKTsKKyAgICAgICAgR2VuZXJhbE5hbWVzIHNhbnMxID0gbmV3IEdlbmVyYWxOYW1lcygpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjApOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjEpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjIpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjMpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjQpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjYpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjcpOworICAgICAgICBzYW5zMS5hZGROYW1lKHNhbjgpOworICAgICAgICBHZW5lcmFsTmFtZXMgc2FuczIgPSBuZXcgR2VuZXJhbE5hbWVzKCk7CisgICAgICAgIHNhbnMyLmFkZE5hbWUoc2FuMCk7CiAKLSAgICAgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHNhbnMxKTsKLSAgICAgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHNhbnMyKTsKLSAgICAgICAgICAgIFg1MDlDZXJ0U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXModHJ1ZSk7CisgICAgICAgIFRlc3RDZXJ0IGNlcnQxID0gbmV3IFRlc3RDZXJ0KHNhbnMxKTsKKyAgICAgICAgVGVzdENlcnQgY2VydDIgPSBuZXcgVGVzdENlcnQoc2FuczIpOworICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0TWF0Y2hBbGxTdWJqZWN0QWx0TmFtZXModHJ1ZSk7CiAKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKLSAgICAgICAgICAgICAgICAgICAgKyAic3ViamVjdEFsdGVybmF0aXZlTmFtZXMgY3JpdGVyaWEuIiwgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLm1hdGNoKGNlcnQxKQotICAgICAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKKyAgICAgICAgICAgICAgICAgICArICJzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogCi0gICAgICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IHNhbnMgPSBzYW5zMS5nZXRQYWlyc0xpc3QoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxMaXN0PD8+PiBzYW5zID0gc2FuczEuZ2V0UGFpcnNMaXN0KCk7CiAKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKHNhbnMpOworICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyhzYW5zKTsKIAotICAgICAgICAgICAgc2VsZWN0b3IuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICBzZWxlY3Rvci5nZXRTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcygpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RLZXlJZGVudGlmaWVyKGJ5dGVbXSkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RLZXlJZGVudGlmaWVyTEIkKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFN1YmplY3RLZXlJZGVudGlmaWVyTEIkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBza2lkMSA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH07IC8vIHJhbmRvbSB2YWx1ZQogICAgICAgICBieXRlW10gc2tpZDIgPSBuZXcgYnl0ZVtdIHsgNSwgNCwgMywgMiwgMSB9OyAvLyByYW5kb20gdmFsdWUKICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQoc2tpZDEpOwpAQCAtMTUwMywxNyArMTM5NCwxNyBAQAogCiAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RLZXlJZGVudGlmaWVyKG51bGwpOwogICAgICAgICBhc3NlcnRUcnVlKCJBbnkgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIGluIHRoZSBjYXNlIG9mIG51bGwgIgotICAgICAgICAgICAgICAgICsgInNlcmlhbE51bWJlciBjcml0ZXJpYS4iLCBzZWxlY3Rvci5tYXRjaChjZXJ0MSkKLSAgICAgICAgICAgICAgICAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICsgInNlcmlhbE51bWJlciBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0S2V5SWRlbnRpZmllcihza2lkMSk7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbm90IG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0S2V5SWRlbnRpZmllcihza2lkMik7CiAgICAgICAgIHNraWQyWzBdKys7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NDUsMTUgKzE0MzYsOSBAQAogICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydFNlbGVjdG9yI3NldFN1YmplY3RQdWJsaWNLZXkoamF2YS5zZWN1cml0eS5QdWJsaWNLZXkga2V5KQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdFB1YmxpY0tleUxqYXZhX3NlY3VyaXR5X1B1YmxpY0tleSgpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICBQdWJsaWNLZXkgcGtleTEgPSBudWxsOwotICAgICAgICBQdWJsaWNLZXkgcGtleTIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGtleTEgPSBuZXcgVGVzdEtleVBhaXIoIlJTQSIpLmdldFB1YmxpYygpOwotICAgICAgICAgICAgcGtleTIgPSBuZXcgVGVzdEtleVBhaXIoIkRTQSIpLmdldFB1YmxpYygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFB1YmxpY0tleSBwa2V5MSA9IG5ldyBUZXN0S2V5UGFpcigiUlNBIikuZ2V0UHVibGljKCk7CisgICAgICAgIFB1YmxpY0tleSBwa2V5MiA9IG5ldyBUZXN0S2V5UGFpcigiRFNBIikuZ2V0UHVibGljKCk7CiAKICAgICAgICAgVGVzdENlcnQgY2VydDEgPSBuZXcgVGVzdENlcnQocGtleTEpOwogICAgICAgICBUZXN0Q2VydCBjZXJ0MiA9IG5ldyBUZXN0Q2VydChwa2V5Mik7CkBAIC0xNTYxLDkwICsxNDQ2LDc1IEBACiAKICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleSgoUHVibGljS2V5KSBudWxsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQW55IGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCBpbiB0aGUgY2FzZSBvZiBudWxsICIKLSAgICAgICAgICAgICAgICArICJzdWJqZWN0UHVibGljS2V5IGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQotICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgKyAic3ViamVjdFB1YmxpY0tleSBjcml0ZXJpYS4iLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSAmJiBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOwogICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5KHBrZXkxKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpKTsKKyAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOwogICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNlcnRpZmljYXRlIHNob3VsZCBub3QgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXkocGtleTIpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MikpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3Ijc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTdWJqZWN0UHVibGljS2V5QWxnSURMamF2YV9sYW5nX1N0cmluZygpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lETGphdmFfbGFuZ19TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBYNTA5Q2VydFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFg1MDlDZXJ0U2VsZWN0b3IoKTsKICAgICAgICAgU3RyaW5nIHBrYWlkMSA9ICIxLjIuODQwLjExMzU0OS4xLjEuMSI7IC8vIFJTQSAoc291cmNlOgogICAgICAgICAvLyBodHRwOi8vYXNuMS5lbGliZWwudG0uZnIpCiAgICAgICAgIFN0cmluZyBwa2FpZDIgPSAiMS4yLjg0MC4xMDA0MC40LjEiOyAvLyBEU0EgKHNvdXJjZToKICAgICAgICAgLy8gaHR0cDovL2FzbjEuZWxpYmVsLnRtLmZyKQotICAgICAgICBQdWJsaWNLZXkgcGtleTE7Ci0gICAgICAgIFB1YmxpY0tleSBwa2V5MjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBrZXkxID0gbmV3IFRlc3RLZXlQYWlyKCJSU0EiKS5nZXRQdWJsaWMoKTsKLSAgICAgICAgICAgIHBrZXkyID0gbmV3IFRlc3RLZXlQYWlyKCJEU0EiKS5nZXRQdWJsaWMoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIFB1YmxpY0tleSBwa2V5MSA9IG5ldyBUZXN0S2V5UGFpcigiUlNBIikuZ2V0UHVibGljKCk7OworICAgICAgICBQdWJsaWNLZXkgcGtleTIgPSBuZXcgVGVzdEtleVBhaXIoIkRTQSIpLmdldFB1YmxpYygpOzsKKwogICAgICAgICBUZXN0Q2VydCBjZXJ0MSA9IG5ldyBUZXN0Q2VydChwa2V5MSk7CiAgICAgICAgIFRlc3RDZXJ0IGNlcnQyID0gbmV3IFRlc3RDZXJ0KHBrZXkyKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKG51bGwpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQorICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5QWxnSUQobnVsbCk7CiAgICAgICAgIGFzc2VydFRydWUoIkFueSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggaW4gdGhlIGNhc2Ugb2YgbnVsbCAiCi0gICAgICAgICAgICAgICAgKyAic3ViamVjdFB1YmxpY0tleUFsZ0lEIGNyaXRlcmlhLiIsIHNlbGVjdG9yLm1hdGNoKGNlcnQxKQotICAgICAgICAgICAgICAgICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgKyAic3ViamVjdFB1YmxpY0tleUFsZ0lEIGNyaXRlcmlhLiIsCisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDEpICYmIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CiAKLSAgICAgICAgU3RyaW5nW10gdmFsaWRPSURzID0geyAiMC4wLjIwIiwgIjEuMjUuMCIsICIyLjAuMzkiLCAiMC4yLjEwIiwgIjEuMzUuMTUiLAotICAgICAgICAgICAgICAgICIyLjE3Ljg5IiwgIjIuNS4yOS4xNiIsICIyLjUuMjkuMTciLCAiMi41LjI5LjMwIiwgIjIuNS4yOS4zMiIsCi0gICAgICAgICAgICAgICAgIjIuNS4yOS4zNyIgfTsKKyAgICAgICAgU3RyaW5nW10gdmFsaWRPSURzID0geworICAgICAgICAgICAgIjAuMC4yMCIsCisgICAgICAgICAgICAiMS4yNS4wIiwKKyAgICAgICAgICAgICIyLjAuMzkiLAorICAgICAgICAgICAgIjAuMi4xMCIsCisgICAgICAgICAgICAiMS4zNS4xNSIsCisgICAgICAgICAgICAiMi4xNy44OSIsCisgICAgICAgICAgICAiMi41LjI5LjE2IiwKKyAgICAgICAgICAgICIyLjUuMjkuMTciLAorICAgICAgICAgICAgIjIuNS4yOS4zMCIsCisgICAgICAgICAgICAiMi41LjI5LjMyIiwKKyAgICAgICAgICAgICIyLjUuMjkuMzciCisgICAgICAgIH07CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZE9JRHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKHZhbGlkT0lEc1tpXSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbGlkT0lEc1tpXSwgc2VsZWN0b3IuZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5QWxnSUQodmFsaWRPSURzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWxpZE9JRHNbaV0sIHNlbGVjdG9yLmdldFN1YmplY3RQdWJsaWNLZXlBbGdJRCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWRPSURzID0geyAiMC4yMCIsICIxLjI1IiwgIjIuMzkiLCAiMy4xMCJ9OworICAgICAgICBTdHJpbmdbXSBpbnZhbGlkT0lEcyA9IHsgIjAuMjAiLCAiMS4yNSIsICIyLjM5IiwgIjMuMTAiIH07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZE9JRHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKGludmFsaWRPSURzW2ldKTsKICAgICAgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbiB3YXNuJ3QgdGhyb3duIGZvciAiICsgaW52YWxpZE9JRHNbaV0pOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5zZXRTdWJqZWN0UHVibGljS2V5QWxnSUQocGthaWQxKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOwotICAgICAgICB9CisgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXlBbGdJRChwa2FpZDEpOwogICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG1hdGNoIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuIiwKLSAgICAgICAgICAgICAgICBzZWxlY3Rvci5tYXRjaChjZXJ0MSkpOworICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQxKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2VydGlmaWNhdGUgc2hvdWxkIG5vdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiIsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldFN1YmplY3RQdWJsaWNLZXlBbGdJRChwa2FpZDIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKKyAgICAgICAgc2VsZWN0b3Iuc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKHBrYWlkMik7CiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjZXJ0aWZpY2F0ZSBzaG91bGQgbWF0Y2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4iLAotICAgICAgICAgICAgICAgIHNlbGVjdG9yLm1hdGNoKGNlcnQyKSk7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IubWF0Y2goY2VydDIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3OTIsMTMgKzE2NjIsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuZGVkS2V5VXNhZ2UoU2V0PFN0cmluZz4gZXh0S2V5VXNhZ2UpIHsKLSAgICAgICAgICAgIHRoaXMuZXh0S2V5VXNhZ2UgPSAoZXh0S2V5VXNhZ2UgPT0gbnVsbCkgPyBudWxsIDogbmV3IEFycmF5TGlzdDxTdHJpbmc+KAotICAgICAgICAgICAgICAgICAgICBleHRLZXlVc2FnZSk7CisgICAgICAgICAgICB0aGlzLmV4dEtleVVzYWdlID0gKGV4dEtleVVzYWdlID09IG51bGwpID8gbnVsbCA6IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihleHRLZXlVc2FnZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRLZXlVc2FnZShib29sZWFuW10ga2V5VXNhZ2UpIHsKLSAgICAgICAgICAgIHRoaXMua2V5VXNhZ2UgPSAoa2V5VXNhZ2UgPT0gbnVsbCkgPyBudWxsIDogKGJvb2xlYW5bXSkga2V5VXNhZ2UKLSAgICAgICAgICAgICAgICAgICAgLmNsb25lKCk7CisgICAgICAgICAgICB0aGlzLmtleVVzYWdlID0gKGtleVVzYWdlID09IG51bGwpID8gbnVsbCA6IChib29sZWFuW10pIGtleVVzYWdlLmNsb25lKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWNLZXkoUHVibGljS2V5IGtleSkgewpAQCAtMjAwOSw4ICsxODc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMUludGVnZXIuZ2V0SW5zdGFuY2UoKSB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKG5ldyBPYmplY3RbXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ocGF0aExlbiAhPSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YocGF0aExlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0J5dGVBcnJheSgpIH0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YocGF0aExlbikudG9CeXRlQXJyYXkoKSB9KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIjIuNS4yOS4xNyIuZXF1YWxzKG9pZCkgJiYgKHNhbnMgIT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2Fucy5nZXROYW1lcygpID09IG51bGwpIHsKQEAgLTIwNzQsOCArMTk0MSw5IEBACiAgICAgICAgIEJpZ0ludGVnZXIgcmV2b2tlZFNlcmlhbE51bWJlciA9IEJpZ0ludGVnZXIudmFsdWVPZigxKTsKICAgICAgICAgY3JsID0gbmV3IE15Q1JMKCJYLjUwOSIpOwogLy8gICAgICAgIFg1MDlDUkwgcm9vdENSTCA9IFg1MDlDUkw7Ci0vLyAgICAgICAgWDUwOUNSTCBpbnRlckNSTCA9IFg1MDlDUkxFeGFtcGxlLmNyZWF0ZUNSTChpbnRlckNlcnQsIGludGVyUGFpcgotLy8gICAgICAgICAgICAgICAgLmdldFByaXZhdGUoKSwgcmV2b2tlZFNlcmlhbE51bWJlcik7CisvLyAgICAgICAgWDUwOUNSTCBpbnRlckNSTCA9IFg1MDlDUkxFeGFtcGxlLmNyZWF0ZUNSTChpbnRlckNlcnQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlclBhaXIuZ2V0UHJpdmF0ZSgpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2b2tlZFNlcmlhbE51bWJlcik7CiAKICAgICAgICAgLy8gY3JlYXRlIENlcnRTdG9yZSB0byBzdXBwb3J0IHBhdGggYnVpbGRpbmcKICAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKQEAgLTIwODMsMTYgKzE5NTEsMTQgQEAKICAgICAgICAgbGlzdC5hZGQocm9vdENlcnRpZmljYXRlKTsKICAgICAgICAgbGlzdC5hZGQoZW5kQ2VydGlmaWNhdGUpOwogCi0vLyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKAotLy8gICAgICAgICAgICAgICAgbGlzdCk7CisvLyAgICAgICAgQ29sbGVjdGlvbkNlcnRTdG9yZVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IENvbGxlY3Rpb25DZXJ0U3RvcmVQYXJhbWV0ZXJzKGxpc3QpOwogLy8gICAgICAgIENlcnRTdG9yZSBzdG9yZSA9IENlcnRTdG9yZS5nZXRJbnN0YW5jZSgiQ29sbGVjdGlvbiIsIHBhcmFtcyk7CiAvLwogICAgICAgICB0aGVDZXJ0U2VsZWN0b3IgPSBuZXcgWDUwOUNlcnRTZWxlY3RvcigpOwogICAgICAgICB0aGVDZXJ0U2VsZWN0b3Iuc2V0Q2VydGlmaWNhdGUoZW5kQ2VydGlmaWNhdGUpOwotICAgICAgICB0aGVDZXJ0U2VsZWN0b3Iuc2V0SXNzdWVyKGVuZENlcnRpZmljYXRlLmdldElzc3Vlclg1MDBQcmluY2lwYWwoKQotICAgICAgICAgICAgICAgIC5nZXRFbmNvZGVkKCkpOworICAgICAgICB0aGVDZXJ0U2VsZWN0b3Iuc2V0SXNzdWVyKGVuZENlcnRpZmljYXRlLmdldElzc3Vlclg1MDBQcmluY2lwYWwoKS5nZXRFbmNvZGVkKCkpOwogCi0gICAgIC8vIGJ1aWxkIHRoZSBwYXRoCisgICAgICAgIC8vIGJ1aWxkIHRoZSBwYXRoCiAgICAgICAgIGJ1aWxkZXIgPSBDZXJ0UGF0aEJ1aWxkZXIuZ2V0SW5zdGFuY2UoIlBLSVgiKTsKIAogICAgIH0KQEAgLTIxMDMsOCArMTk2OSw3IEBACiAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBUcnVzdEFuY2hvcihyb290Q2VydGlmaWNhdGUsIG51bGwpKSwKICAgICAgICAgICAgICAgICB0aGVDZXJ0U2VsZWN0b3IpOwogICAgICAgICB0cnkgewotICAgICAgICByZXN1bHQgPSAoUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCkgYnVpbGRlcgotICAgICAgICAuYnVpbGQoYnVpbGRQYXJhbXMpOworICAgICAgICByZXN1bHQgPSAoUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCkgYnVpbGRlci5idWlsZChidWlsZFBhcmFtcyk7CiAgICAgICAgIH0gY2F0Y2goQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUyVGVzdC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlMlRlc3QuamF2YQppbmRleCA1NTc4MjM0Li4yYzllMmZiIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGUyVGVzdC5qYXZhCisrKyBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZTJUZXN0LmphdmEKQEAgLTUxLDE1ICs1MSwxMyBAQAogCiAgICAgICAgIC8vIGV4dGVuc2lvbiB2YWx1ZSBpcyBlbXB0eSBzZXF1ZW5jZQogICAgICAgICBieXRlW10gZXh0blZhbHVlID0gcGVtQ2VydC5nZXRFeHRlbnNpb25WYWx1ZSgiMi41LjI5LjM1Iik7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzCi0gICAgICAgICAgICAgICAgLmVxdWFscyhuZXcgYnl0ZVtdIHsweDA0LCAweDAyLCAweDMwLCAweDAwfSwgZXh0blZhbHVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcobmV3IGJ5dGVbXSB7IDB4MDQsIDB4MDIsIDB4MzAsIDB4MDAgfSksCisgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGV4dG5WYWx1ZSkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHBlbUNlcnQudG9TdHJpbmcoKSk7CiAgICAgICAgIC8vIEVuZCByZWdyZXNzaW9uIGZvciBIQVJNT05ZLTMzODQKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI1g1MDlDZXJ0aWZpY2F0ZSgpCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdF9YNTA5Q2VydGlmaWNhdGUoKSB7CiAgICAgICAgIE15WDUwOUNlcnRpZmljYXRlIHMgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtOTksNyArOTcsNyBAQAogICAgIC8vIChzZWUgUkZDIDMyODAgYXQgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzI4MC50eHQpCiAgICAgLy8gKGdlbmVyYXRlZCBieSB1c2luZyBvZiBjbGFzc2VzIGZyb20KICAgICAvLyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOSBwYWNrYWdlKQotICAgIHN0YXRpYyBTdHJpbmcgYmFzZTY0Y2VydCA9CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENFUlQgPQogICAgICAgICAiTUlJQnl6Q0NBVGFnQXdJQkFnSUNBaXN3Q3dZSktvWklodmNOQVFFRk1CMHhHekFaQmdOVkJBb1QiCiAgICAgICAgICAgICArICJFa05sY25ScFptbGpZWFJsSUVsemMzVmxjakFlRncwd05qQTBNall3TmpJNE1qSmFGdzB6TXpBeiIKICAgICAgICAgICAgICsgIk1ERXhOalEwTURsYU1CMHhHekFaQmdOVkJBb1RFa05sY25ScFptbGpZWFJsSUVsemMzVmxjakNCIgpAQCAtMTEyLDcgKzExMCw3IEBACiAgICAgICAgICAgICArICJYRWE3T056Y0hRVFlURzEwcG9IZk9LL2EwQmFVTEYzR2xjdERFU2lsd1FZYlc1QmRmcEFsWnBiSCIKICAgICAgICAgICAgICsgIkFGTGNVRGg2RXE1MGtjMEEvYW5oL2ozbWdCTnV2YklNbzdoSE5uWkI2ay9wcnN3bTJCc3p5TEQiCiAgICAgICAgICAgICArICJ5dz09IjsKLSAgICBzdGF0aWMgU3RyaW5nIGJhc2U2NGNlcnRDb3JyZWN0ID0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0VSVF9DT1JSRUNUID0KICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgogICAgICAgICArICJNSUlDK2pDQ0FyYWdBd0lCQWdJQ0Fpc3dEQVlIS29aSXpqZ0VBd0VCQURBZE1Sc3dHUVlEVlFRS0V4SkRaWEowYSIKICAgICAgICAgKyAiV1pwWTJGMFpTQkpjM04xWlhJd0loZ1BNVGszTURBeE1USXhNelEyTkRCYUdBOHhPVGN3TURFeU5EQXpNek15TUYiCkBAIC0xMzIsOSArMTMwLDcgQEAKICAgICAgICAgKyAiN2pyajg0L0dabGhtMDlEc0NGUUNCS0dLQ0diclA2NFZ0VXQ0SlBtTGpXMVZ4UUE9PVxuIgogICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIjsKIAotICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnQ7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJhc2U2NGNlcnRUYW1wZXJlZCA9ICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0VSVF9UQU1QRVJFRCA9ICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKICAgICAgICAgKyAiTUlJQytqQ0NBcmFnQXdJQkFnSUNBaXN3REFZSEtvWkl6amdFQXdFQkFEQWRNUnN3R1FZRFZRUUtFeEpEWlhKMGEiCiAgICAgICAgICsgIldacFkyRjBaU0JKYzNOMVpYSXdJaGdQTVRrM01EQXhNVEl4TXpRMk5EQmFHQTh4T1Rjd01ERXlOREF6TXpNeU1GIgogICAgICAgICArICJvd0h6RWRNQnNHQTFVRUNoTVVVM1ZpYW1WamRDQlBjbWRoYm1sNllYUnBiMjR3R1RBTUJnY3Foa2pPT0FRREFRRSIKQEAgLTE1Nyw3ICsxNTMsNyBAQAogICAgIC8vIChzZWUgUkZDIDMyODAgYXQgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzI4MC50eHQpCiAgICAgLy8gKGdlbmVyYXRlZCBieSB1c2luZyBvZiBjbGFzc2VzIGZyb20KICAgICAvLyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOSBwYWNrYWdlKQotICAgIHN0YXRpYyBTdHJpbmcgYmFzZTY0Y3JsID0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ1JMID0KICAgICAgICAgIk1JSFhNSUdYQWdFQk1Ba0dCeXFHU000NEJBTXdGVEVUTUJFR0ExVUVDaE1LUTFKTUlFbHpjM1ZsIgogICAgICAgICAgICAgKyAiY2hjTk1EWXdOREkzTURZeE16UTFXaGNOTURZd05ESTNNRFl4TlRJMVdqQkJNRDhDQWdJckZ3MHciCiAgICAgICAgICAgICArICJOakEwTWpjd05qRXpORFphTUNvd0NnWURWUjBWQkFNS0FRRXdIQVlEVlIwWUJCVVlFekl3TURZdyIKQEAgLTI3MiwxNiArMjY4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldFR5cGUoKQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIlguNTA5IiwgbmV3IE15WDUwOUNlcnRpZmljYXRlKCkuZ2V0VHlwZSgpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldElzc3Vlclg1MDBQcmluY2lwYWwoKQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkgewogICAgICAgICAvLyByZXR1cm4gdmFsaWQgZW5jb2RpbmcKICAgICAgICAgTXlYNTA5Q2VydGlmaWNhdGUgY2VydCA9IG5ldyBNeVg1MDlDZXJ0aWZpY2F0ZSgpIHsKQEAgLTI5NSw5ICsyODUsNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFg1MDBQcmluY2lwYWwoIkNOPVoiKSwgY2VydC5nZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUjZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpIHsKICAgICAgICAgLy8gcmV0dXJuIHZhbGlkIGVuY29kaW5nCiAgICAgICAgIE15WDUwOUNlcnRpZmljYXRlIGNlcnQgPSBuZXcgTXlYNTA5Q2VydGlmaWNhdGUoKSB7CkBAIC0zMTEsMTIzICsyOTgsMjAyIEBACiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgWDUwMFByaW5jaXBhbCgiQ049WSIpLCBjZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24KLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldEV4dGVuZGVkS2V5VXNhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeHRlbmRlZEtleVVzYWdlKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXh0ZW5kZWRLZXlVc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnROdWxsKG5ldyBNeVg1MDlDZXJ0aWZpY2F0ZSgpLmdldEV4dGVuZGVkS2V5VXNhZ2UoKSk7Ci0KKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBnZW5lcmF0ZUNlcnQoQ0VSVF9DT1JSRUNUKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IGwgPSBjZXJ0LmdldEV4dGVuZGVkS2V5VXNhZ2UoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbC5jbGVhcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsLmFkZCgiVGVzdCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbC5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBvawotICAgICAgICB9Ci0KKyAgICAgICAgbC5jbGVhcigpOworICAgICAgICBsLmFkZCgiVGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5zaXplKCkpOworICAgICAgICBsLnJlbW92ZSgwKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKQotICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfV0lUSE9VVF9CQVNJQworICAgICAgICA9ICgiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisgICAgICAgICAgICsgIk1JSUc5VENDQmQyZ0F3SUJBZ0lQTFhSNEFXcHA5K082Sm40clpwa2dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FMHhcbiIKKyAgICAgICAgICAgKyAiQ3pBSkJnTlZCQVlUQWtOSU1SVXdFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SnpBbEJnTlZCQU1USGxOM1xuIgorICAgICAgICAgICArICJhWE56VTJsbmJpQkZWaUJIYjJ4a0lFTkJJREl3TURrZ0xTQkhNakFlRncweE1qQTNNall3T0RVNE1UTmFGdzB4XG4iCisgICAgICAgICAgICsgIk5EQTNNall3T0RVNE1UTmFNSUlCSVRFTE1Ba0dBMVVFQmhNQ1EwZ3hFREFPQmdOVkJBZ01CMXJEdkhKcFkyZ3hcbiIKKyAgICAgICAgICAgKyAiRXpBUkJnTlZCQWNUQ2tkc1lYUjBZbkoxWjJjeEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVXTUJRR1xuIgorICAgICAgICAgICArICJBMVVFQXhNTmMzZHBjM056YVdkdUxtTnZiVEVuTUNVR0NTcUdTSWIzRFFFSkFSWVliM0JsY21GMGFXOXVjMEJ6XG4iCisgICAgICAgICAgICsgImQybHpjM05wWjI0dVkyOXRNUnN3R1FZRFZRUUpEQkpUdzZSblpYSmxhWE4wY21GemMyVWdNalV4RFRBTEJnTlZcbiIKKyAgICAgICAgICAgKyAiQkJFVEJEZ3hOVEl4RXpBUkJnc3JCZ0VFQVlJM1BBSUJBeE1DUTBneEdEQVdCZ3NyQmdFRUFZSTNQQUlCQWd3SFxuIgorICAgICAgICAgICArICJXc084Y21samFERWJNQmtHQTFVRUJSTVNRMGd0TURJd0xqTXVNREkxTGpFeE1DMDNNUnN3R1FZRFZRUVBFeEpXXG4iCisgICAgICAgICAgICsgIk1TNHdMQ0JEYkdGMWMyVWdOUzRvWWlrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJcbiIKKyAgICAgICAgICAgKyAiQVFETGp6SGZFY0RlSXdkRWF0QzczSlJzL3hSYURMRG16d3dIU1pDakN2SUtlOC95WHhMUjNjVUlCRzhtS3JxbFxuIgorICAgICAgICAgICArICIxeUlDQU1FcE5NN0ovZndOMjQ4T1Y2WC9Vb3NKcEM0dm1icHpnQU44eTJxMURHbk95WDdFeWkzVURYTFRYdGZBXG4iCisgICAgICAgICAgICsgIjQyOTRCTXFDeW01enpkUzkzMmFRUFlCYXlGa3pjc1FTcDZESFJBdWoyWHhkOWJseS91ck5LVHVtTzhaRTBSRlJcbiIKKyAgICAgICAgICAgKyAid1ZnTlU3bzNPUWVwc0gzYmhlMDYwSmxyNkVCTEZhczBzY0g2bGw4ZlJFSThnK3hoczh5SEJPTC9tZUUzelZRQ1xuIgorICAgICAgICAgICArICIvM0tUeWhZODJSNHhKeTM4WUhDRlByd3J0ejVaSHBKcVExTGppRytjWCtGUmVvSHA1Vm9WN0xCTmorZUw4b1piXG4iCisgICAgICAgICAgICsgIkc2Wm41eGxzQlFnVGxPeEVJYlhMVlYxM0FnTUJBQUdqZ2dMNk1JSUM5akJMQmdOVkhSRUVSREJDZ2cxemQybHpcbiIKKyAgICAgICAgICAgKyAiYzNOcFoyNHVZMjl0Z2hGM2QzY3VjM2RwYzNOemFXZHVMbU52YllJTWMzZHBjM056YVdkdUxtTm9naEIzZDNjdVxuIgorICAgICAgICAgICArICJjM2RwYzNOemFXZHVMbU5vTUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEXG4iCisgICAgICAgICAgICsgIkFRWUlLd1lCQlFVSEF3SXdIUVlEVlIwT0JCWUVGUERMcUVpU1dSNUppd1BscW5ndjJuMldKd1ZSTUI4R0ExVWRcbiIKKyAgICAgICAgICAgKyAiSXdRWU1CYUFGSWgwUm0zSGZMWDZjbkVaM3I4blhnMW80UGNuTUlIL0JnTlZIUjhFZ2Zjd2dmUXdSNkJGb0VPR1xuIgorICAgICAgICAgICArICJRV2gwZEhBNkx5OWpjbXd1YzNkcGMzTnphV2R1TG01bGRDODRPRGMwTkRZMlJFTTNOME5DTlVaQk56STNNVEU1XG4iCisgICAgICAgICAgICsgIlJFVkNSakkzTlVVd1JEWTRSVEJHTnpJM01JR29vSUdsb0lHaWhvR2ZiR1JoY0RvdkwyUnBjbVZqZEc5eWVTNXpcbiIKKyAgICAgICAgICAgKyAiZDJsemMzTnBaMjR1Ym1WMEwwTk9QVGc0TnpRME5qWkVRemMzUTBJMVJrRTNNamN4TVRsRVJVSkdNamMxUlRCRVxuIgorICAgICAgICAgICArICJOamhGTUVZM01qY2xNa05QUFZOM2FYTnpVMmxuYmlVeVEwTTlRMGcvWTJWeWRHbG1hV05oZEdWU1pYWnZZMkYwXG4iCisgICAgICAgICAgICsgImFXOXVUR2x6ZEQ5aVlYTmxQMjlpYW1WamRFTnNZWE56UFdOU1RFUnBjM1J5YVdKMWRHbHZibEJ2YVc1ME1HSUdcbiIKKyAgICAgICAgICAgKyAiQTFVZElBUmJNRmt3VndZSllJVjBBVmtCQWdFQk1Fb3dTQVlJS3dZQkJRVUhBZ0VXUEdoMGRIQTZMeTl5WlhCdlxuIgorICAgICAgICAgICArICJjMmwwYjNKNUxuTjNhWE56YzJsbmJpNWpiMjB2VTNkcGMzTlRhV2R1TFVkdmJHUXRRMUF0UTFCVExWSTFMbkJrXG4iCisgICAgICAgICAgICsgIlpqQ0IwUVlJS3dZQkJRVUhBUUVFZ2NRd2djRXdaQVlJS3dZQkJRVUhNQUtHV0doMGRIQTZMeTl6ZDJsemMzTnBcbiIKKyAgICAgICAgICAgKyAiWjI0dWJtVjBMMk5uYVMxaWFXNHZZWFYwYUc5eWFYUjVMMlJ2ZDI1c2IyRmtMemc0TnpRME5qWkVRemMzUTBJMVxuIgorICAgICAgICAgICArICJSa0UzTWpjeE1UbEVSVUpHTWpjMVJUQkVOamhGTUVZM01qY3dXUVlJS3dZQkJRVUhNQUdHVFdoMGRIQTZMeTluXG4iCisgICAgICAgICAgICsgImIyeGtMV1YyTFdjeUxtOWpjM0F1YzNkcGMzTnphV2R1TG01bGRDODRPRGMwTkRZMlJFTTNOME5DTlVaQk56STNcbiIKKyAgICAgICAgICAgKyAiTVRFNVJFVkNSakkzTlVVd1JEWTRSVEJHTnpJM01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQThrZHhVWmRYYVxuIgorICAgICAgICAgICArICJxdTFFQVRaTTc3T2hBNGp3NHJtclZOQStpUURiMU5kbFBsZGJjNVB5UW9JV2RuN2RKZ3pacm11cGdPdXJSc29sXG4iCisgICAgICAgICAgICsgImtVb1hiMkdyWkRhaVNLKzJzVzdWUUFjUzNwNHlLMU1hd0dwY2VrVmNPaUZrQ2pGdnVxa3dkZ25PZVpwRklKelBcbiIKKyAgICAgICAgICAgKyAiTmg2VzB3a0F4YkFWd1AvY0FPRlNvQ0tUZFRmeExNVTJnOGcrN0o0OUJhZ1ltL2IzaDFVbXZMK0I0czdYekwrRFxuIgorICAgICAgICAgICArICJRRGlLeklVdmI0eHdtYkRZa3NnZmxrT0J3bGlHM3NDOEg2TEREKzJuM3VrRk9PS3lpWFFub3oyUUo1N1IvSmhqXG4iCisgICAgICAgICAgICsgImtnS3lYY3I3KzZSeGF0R003SzF1N1JsZmh1eFF4dnZyYjBOVFM4b2pMd3g2ZlpMMXFZcVJHakRXaFR2MzZhUnVcbiIKKyAgICAgICAgICAgKyAibmJaTUl1RTVRSlFzXG4iCisgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIpOwogCi0gICAgICAgIGFzc2VydE51bGwobmV3IE15WDUwOUNlcnRpZmljYXRlKCkuZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfV0lUSF9CQVNJQ19OT05fQ0EKKyAgICAgICAgPSAoIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICArICJNSUlHd0RDQ0JhaWdBd0lCQWdJUUJYQnBiWFU3bHlLVUJhUDJuK21xd2pBTkJna3Foa2lHOXcwQkFRVUZBRENCXG4iCisgICAgICAgICAgICsgInZqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxcbiIKKyAgICAgICAgICAgKyAiRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVHN3T1FZRFZRUUxFekpVWlhKdGN5QnZaaUIxYzJVZ1xuIgorICAgICAgICAgICArICJZWFFnYUhSMGNITTZMeTkzZDNjdWRtVnlhWE5wWjI0dVkyOXRMM0p3WVNBb1l5a3dOakU0TURZR0ExVUVBeE12XG4iCisgICAgICAgICAgICsgIlZtVnlhVk5wWjI0Z1EyeGhjM01nTXlCRmVIUmxibVJsWkNCV1lXeHBaR0YwYVc5dUlGTlRUQ0JUUjBNZ1EwRXdcbiIKKyAgICAgICAgICAgKyAiSGhjTk1USXhNREV3TURBd01EQXdXaGNOTVRReE1ERXdNak0xT1RVNVdqQ0NBU1V4RXpBUkJnc3JCZ0VFQVlJM1xuIgorICAgICAgICAgICArICJQQUlCQXhNQ1ZWTXhHVEFYQmdzckJnRUVBWUkzUEFJQkFoTUlSR1ZzWVhkaGNtVXhIVEFiQmdOVkJBOFRGRkJ5XG4iCisgICAgICAgICAgICsgImFYWmhkR1VnVDNKbllXNXBlbUYwYVc5dU1SQXdEZ1lEVlFRRkV3Y3lNVFU0TVRFek1Rc3dDUVlEVlFRR0V3SlZcbiIKKyAgICAgICAgICAgKyAiVXpFT01Bd0dBMVVFRVJRRk9UUXdORE14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVVxuIgorICAgICAgICAgICArICJEVTF2ZFc1MFlXbHVJRlpwWlhjeEdUQVhCZ05WQkFrVUVETTFNQ0JGYkd4cGN5QlRkSEpsWlhReEhUQWJCZ05WXG4iCisgICAgICAgICAgICsgIkJBb1VGRk41YldGdWRHVmpJRU52Y25CdmNtRjBhVzl1TVNNd0lRWURWUVFMRkJwSmJtWnlZWE4wY25WamRIVnlcbiIKKyAgICAgICAgICAgKyAiWlNBZ1QzQmxjbUYwYVc5dWN6RVpNQmNHQTFVRUF4UVFkM2QzTG5abGNtbHphV2R1TG1OdmJUQ0NBU0l3RFFZSlxuIgorICAgICAgICAgICArICJLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNMG9GenJZOEZhWW5YSlN6bWU5V0N3QjN3UEIrSFM4XG4iCisgICAgICAgICAgICsgImJsQnVXNkRiSTExdzdJbjBQNkJDVnd0L1dxSTFhK1Z3U2ZsaUt2N3BEMlA2ZUh2dTZlYjhpcFBHRjN4QlJtdHJcbiIKKyAgICAgICAgICAgKyAiVHRnOWFtNzd0YUhrQit3MXRyeDl4WGlvMHZpRk9QWWY5bXQyeU5oQ2F0aktlWG5QUkg4SW9Mb0k1YnFCaHY4VlxuIgorICAgICAgICAgICArICJ1L01nOXMxV3dlOG1XMXp4enREM0QwZlZrV3FNcFFSTEZMcnMzVXM1OFNibmF4YkZMRW1BUUhQZ3JEd2krSUM0XG4iCisgICAgICAgICAgICsgImFRV2NmNFViQ2tBNVAwYXQrc3ZzdS9HK0t3WUJyc1ZGTDZOYW9BVGN5cWltY2t5Q1Z4ZUtLNlFFUFJQTTM0YWVcbiIKKyAgICAgICAgICAgKyAiN0hwVDlPV21DdStyNEdoTTdBUVMybVkzd0YxRWh0aWdYeVVVdGVVL0gwNmtXeVZ5YnB5MlZ3Y0NBd0VBQWFPQ1xuIgorICAgICAgICAgICArICJBazR3Z2dKS01JSEVCZ05WSFJFRWdid3dnYm1DRUhkM2R5NTJaWEpwYzJsbmJpNWpiMjJDREhabGNtbHphV2R1XG4iCisgICAgICAgICAgICsgIkxtTnZiWUlRZDNkM0xuWmxjbWx6YVdkdUxtNWxkSUlNZG1WeWFYTnBaMjR1Ym1WMGdoRjNkM2N1ZG1WeWFYTnBcbiIKKyAgICAgICAgICAgKyAiWjI0dWJXOWlhWUlOZG1WeWFYTnBaMjR1Ylc5aWFZSVBkM2QzTG5abGNtbHphV2R1TG1WMWdndDJaWEpwYzJsblxuIgorICAgICAgICAgICArICJiaTVsZFlJVlptOXliWE11ZDNNdWMzbHRZVzUwWldNdVkyOXRnZzF6YzJ4eVpYWnBaWGN1WTI5dGdoRjNkM2N1XG4iCisgICAgICAgICAgICsgImMzTnNjbVYyYVdWM0xtTnZiVEFKQmdOVkhSTUVBakFBTUIwR0ExVWREZ1FXQkJTRm81SHloV2JDaTFORktuaU1cbiIKKyAgICAgICAgICAgKyAiNnhZSHVyb1VVREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdQZ1lEVlIwZkJEY3dOVEF6b0RHZ0w0WXRhSFIwY0RvdlxuIgorICAgICAgICAgICArICJMMFZXU1c1MGJDMWpjbXd1ZG1WeWFYTnBaMjR1WTI5dEwwVldTVzUwYkRJd01EWXVZM0pzTUVRR0ExVWRJQVE5XG4iCisgICAgICAgICAgICsgIk1Ec3dPUVlMWUlaSUFZYjRSUUVIRndZd0tqQW9CZ2dyQmdFRkJRY0NBUlljYUhSMGNITTZMeTkzZDNjdWRtVnlcbiIKKyAgICAgICAgICAgKyAiYVhOcFoyNHVZMjl0TDJOd2N6QW9CZ05WSFNVRUlUQWZCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0lHQ1dDR1xuIgorICAgICAgICAgICArICJTQUdHK0VJRUFUQWZCZ05WSFNNRUdEQVdnQlJPUThnZGR1ODNVM3BQOGxodmxQTTQ0dFc5M3pCMkJnZ3JCZ0VGXG4iCisgICAgICAgICAgICsgIkJRY0JBUVJxTUdnd0t3WUlLd1lCQlFVSE1BR0dIMmgwZEhBNkx5OUZWa2x1ZEd3dGIyTnpjQzUyWlhKcGMybG5cbiIKKyAgICAgICAgICAgKyAiYmk1amIyMHdPUVlJS3dZQkJRVUhNQUtHTFdoMGRIQTZMeTlGVmtsdWRHd3RZV2xoTG5abGNtbHphV2R1TG1OdlxuIgorICAgICAgICAgICArICJiUzlGVmtsdWRHd3lNREEyTG1ObGNqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFVaDQ4SVdzMWNzYUFVM2tLXG4iCisgICAgICAgICAgICsgImhPWlY0dmRlMkVDeGdWYzBnUk56NFY1ZlZkTHNGdjA0UzBWNHBTWlg3N3JRbjU2Q0ZOa2o2ZUltZEFhVEpWYmRcbiIKKyAgICAgICAgICAgKyAiV2s4YkIyRkl3aGpObldTY1BYdU54emlnVk9wZlJHdU5SSnltdmtxRzErd3E0QmxHNmFYYThhR3U3YWl1QkNxTlxuIgorICAgICAgICAgICArICJybVJTQ2o1V1pROTRLM05DQlVJaVFROUxsMU9HT1lPM0VNL3J5bEdxVWNuUGY1YVNFVDJrQ0lCZk4zc0c2dmVIXG4iCisgICAgICAgICAgICsgIndleCtvcDRHdUVUSjQ4K1BDb1AwZDFXckdHR3MrK25BZ0JZampHQ1pjaVlmSXhvcXlyVmFDNVl0NWlZcFhaQTBcbiIKKyAgICAgICAgICAgKyAiWnpxSk5iem1VRC9sMnJKZWFrZEFISzBYWVB3YlFxdk52STErZFVOUjlqbFJ4U0tSOFhYNm1QZTVaZ3pNcVl1K1xuIgorICAgICAgICAgICArICJDUVREaGc9PVxuIgorICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iKTsKIAotICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbGwgPSBjZXJ0LmdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCk7Ci0gICAgICAgIC8vZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9XSVRIX0JBU0lDX0NBX1pFUk9fUEFUSF9MRU5HVEgKKyAgICAgICAgPSAoIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICArICJNSUlHcVRDQ0JKR2dBd0lCQWdJSkFQZVN0OFNCakFSWU1BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WXG4iCisgICAgICAgICAgICsgIkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG5cbiIKKyAgICAgICAgICAgKyAiYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURrd05qRXdNRGt5T1RNNVdoY05NalF3TmpBMk1Ea3lPVE01V2pCTlxuIgorICAgICAgICAgICArICJNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNU2N3SlFZRFZRUURFeDVUXG4iCisgICAgICAgICAgICsgImQybHpjMU5wWjI0Z1JWWWdSMjlzWkNCRFFTQXlNREE1SUMwZ1J6SXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFcbiIKKyAgICAgICAgICAgKyAiQTRJQkR3QXdnZ0VLQW9JQkFRRFFuWXM4dVpaSkhIbG9NNXVjZjdxN1hjUk4xQmw4UU1vWmlydUM4b1BtZ2hvbVxuIgorICAgICAgICAgICArICJnWnliMXFGMG5BVS9xeDEzVWhjR1dyVjBnb0YvMlo4bk1VR0hqU2VIdVU2NUFTNnJ4bTgzWHZueUk3ckxLRWNnXG4iCisgICAgICAgICAgICsgIjRYWGdpYlczK2JLbGR3allmZ1B1akdyWlhDOGd3eDNqQSt1RjM1Vk1JWXBrV2F5QWJsNmttb0lzTjdzN1pPVndcbiIKKyAgICAgICAgICAgKyAiVDlnUkl5WitHVmhGR2dtZVlHbFVZRVkxZFE2Nm5NaHdRUXRUZlZjTUlpSlBiQm5wcHhVKzVEMExNN3ZPd1JYOFxuIgorICAgICAgICAgICArICJ0c0VPVlp5b2pQM2JEcXRIby9pV2tlTVBZU2F6T0VkcTRCQjBRU2MxbVhWbnU5VmgvTmpCbTAwZDBBZ2QvS3NRXG4iCisgICAgICAgICAgICsgIk5uL3BSK3RiZ1VZa2lCaG51M29KK1hGTkJzeUZyT3hHTEprZzlQNmZBZ01CQUFHamdnS1NNSUlDampBT0JnTlZcbiIKKyAgICAgICAgICAgKyAiSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQWRCZ05WSFE0RUZnUVVpSFJHYmNkOFxuIgorICAgICAgICAgICArICJ0ZnB5Y1JuZXZ5ZGVEV2pnOXljd0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3XG4iCisgICAgICAgICAgICsgImdmOEdBMVVkSHdTQjl6Q0I5REJIb0VXZ1E0WkJhSFIwY0RvdkwyTnliQzV6ZDJsemMzTnBaMjR1Ym1WMEx6VkNcbiIKKyAgICAgICAgICAgKyAiTWpVM1FqazJRVFEyTlRVeE4wVkNPRE01UmpORE1EYzROalkxUlVVNE0wRkZOMFl3UlVVd2dhaWdnYVdnZ2FLR1xuIgorICAgICAgICAgICArICJnWjlzWkdGd09pOHZaR2x5WldOMGIzSjVMbk4zYVhOemMybG5iaTV1WlhRdlEwNDlOVUl5TlRkQ09UWkJORFkxXG4iCisgICAgICAgICAgICsgIk5URTNSVUk0TXpsR00wTXdOemcyTmpWRlJUZ3pRVVUzUmpCRlJTVXlRMDg5VTNkcGMzTlRhV2R1SlRKRFF6MURcbiIKKyAgICAgICAgICAgKyAiU0Q5alpYSjBhV1pwWTJGMFpWSmxkbTlqWVhScGIyNU1hWE4wUDJKaGMyVS9iMkpxWldOMFEyeGhjM005WTFKTVxuIgorICAgICAgICAgICArICJSR2x6ZEhKcFluVjBhVzl1VUc5cGJuUXdYUVlEVlIwZ0JGWXdWREJTQmdSVkhTQUFNRW93U0FZSUt3WUJCUVVIXG4iCisgICAgICAgICAgICsgIkFnRVdQR2gwZEhBNkx5OXlaWEJ2YzJsMGIzSjVMbk4zYVhOemMybG5iaTVqYjIwdlUzZHBjM05UYVdkdUxVZHZcbiIKKyAgICAgICAgICAgKyAiYkdRdFExQXRRMUJUTFZJMExuQmtaakNCeGdZSUt3WUJCUVVIQVFFRWdia3dnYll3WkFZSUt3WUJCUVVITUFLR1xuIgorICAgICAgICAgICArICJXR2gwZEhBNkx5OXpkMmx6YzNOcFoyNHVibVYwTDJObmFTMWlhVzR2WVhWMGFHOXlhWFI1TDJSdmQyNXNiMkZrXG4iCisgICAgICAgICAgICsgIkx6VkNNalUzUWprMlFUUTJOVFV4TjBWQ09ETTVSak5ETURjNE5qWTFSVVU0TTBGRk4wWXdSVVV3VGdZSUt3WUJcbiIKKyAgICAgICAgICAgKyAiQlFVSE1BR0dRbWgwZEhBNkx5OXZZM053TG5OM2FYTnpjMmxuYmk1dVpYUXZOVUl5TlRkQ09UWkJORFkxTlRFM1xuIgorICAgICAgICAgICArICJSVUk0TXpsR00wTXdOemcyTmpWRlJUZ3pRVVUzUmpCRlJUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFSSkpvXG4iCisgICAgICAgICAgICsgIlNwVENGU2c1VStENFc4Q2RjN3Z4RXI4M01jT1pZK0QxZlg0OTBTQXYzc0RKN1hjYmRYT0RMNW00VWVLNHM0YmdcbiIKKyAgICAgICAgICAgKyAiVVIxWmdDRmlLOEE0R1JGcEl2RDRxc2U4RStaMjBQR2JRbXRsU1VJSnp0TDN5M3k0aExjTTJWdCttWno3TSthTlxuIgorICAgICAgICAgICArICJ4VmxGYklyamUrM1B3Z252RFRySU9MTnQrTHRWL3VvbkE0QTlTcEF4bFVDcm9GZlNwZkE3MWEzU0psbC9DNE9HXG4iCisgICAgICAgICAgICsgInV2UFpqSHVYMVJlc0Y5MStKSm95Q2lIY2RpOWg2dzB5RWYyOXpYZHpLa1VzYU9aMENpa1BUS2RDWlE0TWJJR1hcbiIKKyAgICAgICAgICAgKyAiRDVxTVk2NVBLMG1wVDd1QXQ5M1pJSVRYZlFzOTNSV0pXWnRGN0hySEdqSWVsb2VLa1hvZnN5bG1xUDNKZmdlVlxuIgorICAgICAgICAgICArICIvbWp1WXovOUhTNU1BeFZFNStXY2IwOHRNR2FvcVNSeFlobnYyVG14MnM4bVBIeUNYb2NneE1oWEp0Q04rK0JhXG4iCisgICAgICAgICAgICsgIm9PN0pRUlhlb2lVWnpJTWFjNjdkV2IzclNjT3RFZEY0bGtJV0IweXl0czZMVVBKdFhYYlJvZzNFSTNpNjVvZmNcbiIKKyAgICAgICAgICAgKyAiblczWmRRaWpiRTV0M0YwM3lZL3FSb0hPOEkvQmUzcWUxemsrN0ZDcGp4N0I4VkxCMStsYWpmdkxtbDBzZ3ZDWVxuIgorICAgICAgICAgICArICJPL085L1JSbXFGaGRoZkRuc1BqL3BXa002bkt1OEtqWFg2V1ptVzZGVHVDNTd5RzgxZEkyQVlxb08zcWx6RGR0XG4iCisgICAgICAgICAgICsgIklnVlhvdUJhcjNUQWdXUklrYTVGc3h1ZGFXT1VLK01qOVRpS1NRQllnbEhXaGtkbEVVcGpPWmZaaEhLa01odDRcbiIKKyAgICAgICAgICAgKyAiWTVtYmt2dTUrOXhjV0doS05CTEJxL2lzZEJQa3lmTFZlVld4eGtRPVxuIgorICAgICAgICAgICArICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29sbC5jbGVhcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUX1dJVEhfQkFTSUNfQ0FfTk9fUEFUSF9MRU5HVEgKKyAgICAgICAgPSAoIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICArICJNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WXG4iCisgICAgICAgICAgICsgIkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG5cbiIKKyAgICAgICAgICAgKyAiYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRlxuIgorICAgICAgICAgICArICJNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUXG4iCisgICAgICAgICAgICsgImQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNcbiIKKyAgICAgICAgICAgKyAiQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxdDIvOFxuIgorICAgICAgICAgICArICI3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrXG4iCisgICAgICAgICAgICsgImJicUJISDVDakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2NcbiIKKyAgICAgICAgICAgKyAiNmJNOEs4dnpBUk8vV3MvQnRRcGd2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRVxuIgorICAgICAgICAgICArICJlbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkXG4iCisgICAgICAgICAgICsgIk1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSQWlUeXN5YlVhOW9FVmVYQkNzZHRcbiIKKyAgICAgICAgICAgKyAiTURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmRqSWozbzAyeVxuIgorICAgICAgICAgICArICJNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5XG4iCisgICAgICAgICAgICsgIkZHa09wZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGlcbiIKKyAgICAgICAgICAgKyAiYUc1OWplODgzV1gwWGF4Ujd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TVxuIgorICAgICAgICAgICArICJnSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCXG4iCisgICAgICAgICAgICsgInFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjdcbiIKKyAgICAgICAgICAgKyAibHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NE9mUEFlR1plNkRyblxuIgorICAgICAgICAgICArICI4TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92XG4iCisgICAgICAgICAgICsgIkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTZcbiIKKyAgICAgICAgICAgKyAiNDVSODhhN0EzaGZtNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6T1xuIgorICAgICAgICAgICArICJVWXJIVURGdTRVcCtHQzlwV2JZOVpJRXI0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1XG4iCisgICAgICAgICAgICsgIk8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0NcbiIKKyAgICAgICAgICAgKyAiYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtR3U2dUxmdElkeGYrdSt5dlxuIgorICAgICAgICAgICArICJHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHBtby9hXG4iCisgICAgICAgICAgICsgIjc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0NcbiIKKyAgICAgICAgICAgKyAiaGRpRHl5Smt2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkM1xuIgorICAgICAgICAgICArICI5MnFnUW13TE9NN1hkVkF5a3NMZkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwXG4iCisgICAgICAgICAgICsgIkxkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3dcbiIKKyAgICAgICAgICAgKyAiWk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWp2aU92cnYxdkErQUNPekIyK2h0dFxuIgorICAgICAgICAgICArICJRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKXG4iCisgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiIpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY29sbC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29sbC5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBvawotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsLnNpemUoKSA8IDEwKTsKLQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCYXNpY0NvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBnZW5lcmF0ZUNlcnQoQ0VSVF9DT1JSRUNUKS5nZXRCYXNpY0NvbnN0cmFpbnRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGdlbmVyYXRlQ2VydChDRVJUX1dJVEhPVVRfQkFTSUMpLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZ2VuZXJhdGVDZXJ0KENFUlRfV0lUSF9CQVNJQ19OT05fQ0EpLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBnZW5lcmF0ZUNlcnQoQ0VSVF9XSVRIX0JBU0lDX0NBX1pFUk9fUEFUSF9MRU5HVEgpLmdldEJhc2ljQ29uc3RyYWludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgZ2VuZXJhdGVDZXJ0KENFUlRfV0lUSF9CQVNJQ19DQV9OT19QQVRIX0xFTkdUSCkuZ2V0QmFzaWNDb25zdHJhaW50cygpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlI2dldElzc3VlckFsdGVybmF0aXZlTmFtZXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKCkKLSAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwobmV3IE15WDUwOUNlcnRpZmljYXRlKCkuZ2V0SXNzdWVyQWx0ZXJuYXRpdmVOYW1lcygpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPExpc3Q8Pz4+IGNvbGwgPSBjZXJ0LmdldElzc3VlckFsdGVybmF0aXZlTmFtZXMoKTsKLSAgICAgICAgLy8gZ2V0SXNzdWVyQWx0ZXJuYXRpdmVOYW1lcyByZXR1cm5zIG51bGwuCi0gICAgICAgIGFzc2VydE5vdE51bGwoY29sbCk7Ci0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGVFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbGwuY2xlYXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG9rCisgICAgICAgICAgICBnZW5lcmF0ZUNlcnQoQ0VSVF9UQU1QRVJFRCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNvbGwuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGNvbGwucmVtb3ZlKDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoY29sbC5zaXplKCkgPCAxMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENlcmZpY2F0ZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIGJhc2U2NGNlcnRUYW1wZXJlZC5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIGNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGJhaXMpOwotICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBvawotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFzZTY0Y2VydAotICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBjZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2YuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShiYWlzKTsKLSAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgICAgIGdlbmVyYXRlQ2VydChDRVJUKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZSBnZW5lcmF0ZUNlcnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYXNlNjRjZXJ0Q29ycmVjdAotICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpKTsKLSAgICAgICAgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoYmFpcyk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyaW5nLmdldEJ5dGVzKCkpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoYmFpcyk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoY2VydCk7CisgICAgICAgIHJldHVybiBjZXJ0OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy90YXJnZXRzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyVGVzdFBLSVguamF2YSBiL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy90YXJnZXRzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyVGVzdFBLSVguamF2YQppbmRleCBmYzY3MjYxLi5kYzQ5ZGUwIDEwMDY0NAotLS0gYS9sdW5pL3NyYy90ZXN0L2phdmEvdGVzdHMvdGFyZ2V0cy9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlclRlc3RQS0lYLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3RhcmdldHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJUZXN0UEtJWC5qYXZhCkBAIC00NCw4ICs0NCw3IEBACiAKICAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKIAotICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydGlmaWNhdGVGYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKAotICAgICAgICAgICAgICAgICJYNTA5Iik7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0aWZpY2F0ZUZhY3RvcnkgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKIAogICAgICAgICBYNTA5Q2VydGlmaWNhdGUgc2VsZlNpZ25lZGNlcnRpZmljYXRlID0KICAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0aWZpY2F0ZUZhY3RvcnkuZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvamF2YS90ZXN0cy90YXJnZXRzL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JUZXN0UEtJWC5qYXZhIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3RhcmdldHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclRlc3RQS0lYLmphdmEKaW5kZXggYWY0MDM3Zi4uNjJiNWY0YSAxMDA2NDQKLS0tIGEvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3RhcmdldHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclRlc3RQS0lYLmphdmEKKysrIGIvbHVuaS9zcmMvdGVzdC9qYXZhL3Rlc3RzL3RhcmdldHMvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvclRlc3RQS0lYLmphdmEKQEAgLTU2LDggKzU2LDcgQEAKICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKICAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKIAotICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydGlmaWNhdGVGYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKAotICAgICAgICAgICAgICAgICJYNTA5Iik7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0aWZpY2F0ZUZhY3RvcnkgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlg1MDkiKTsKIAogICAgICAgICBYNTA5Q2VydGlmaWNhdGUgc2VsZlNpZ25lZGNlcnRpZmljYXRlID0KICAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0aWZpY2F0ZUZhY3RvcnkuZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKZGlmZiAtLWdpdCBhL2x1bmkvc3JjL3Rlc3QvbmF0aXZlL3N1Yi5tayBiL2x1bmkvc3JjL3Rlc3QvbmF0aXZlL3N1Yi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRjNTJjCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvdGVzdC9uYXRpdmUvc3ViLm1rCkBAIC0wLDAgKzEsMjIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgdGVzdF9vcGVuc3NsX2VuZ2luZS5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorICAgIGxpYmNyeXB0bwpkaWZmIC0tZ2l0IGEvbHVuaS9zcmMvdGVzdC9uYXRpdmUvdGVzdF9vcGVuc3NsX2VuZ2luZS5jcHAgYi9sdW5pL3NyYy90ZXN0L25hdGl2ZS90ZXN0X29wZW5zc2xfZW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTBmM2IzCi0tLSAvZGV2L251bGwKKysrIGIvbHVuaS9zcmMvdGVzdC9uYXRpdmUvdGVzdF9vcGVuc3NsX2VuZ2luZS5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVW5pcXVlUHRyLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjZGVmaW5lIERZTkFNSUNfRU5HSU5FCisjZGVmaW5lIFRFU1RfRU5HSU5FX0lEICAgImphdmFjb3JldGVzdHMiCisjZGVmaW5lIFRFU1RfRU5HSU5FX05BTUUgImxpYmNvcmUgdGVzdCBlbmdpbmUiCisKK3N0cnVjdCBSU0FfRGVsZXRlIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoUlNBKiBwKSBjb25zdCB7CisgICAgICAgIFJTQV9mcmVlKHApOworICAgIH0KK307Cit0eXBlZGVmIFVuaXF1ZVB0cjxSU0EsIFJTQV9EZWxldGU+IFVuaXF1ZV9SU0E7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBITUFDX1RBRyA9ICItSE1BQy0iOworc3RhdGljIGNvbnN0IHNpemVfdCBITUFDX1RBR19MRU4gPSBzdHJsZW4oSE1BQ19UQUcpOworCitzdGF0aWMgRVZQX1BLRVkgKnRlc3RfbG9hZF9rZXkoRU5HSU5FKiBlLCBjb25zdCBjaGFyICprZXlfaWQsCisgICAgICAgIEVWUF9QS0VZKiAoKnJlYWRfZnVuYykoQklPKiwgRVZQX1BLRVkqKiwgcGVtX3Bhc3N3b3JkX2NiKiwgdm9pZCopKSB7CisgICAgdm9pZCogZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPihjb25zdF9jYXN0PGNoYXIqPihrZXlfaWQpKTsKKworICAgIEVWUF9QS0VZICprZXkgPSBOVUxMOworCisgICAgY29uc3Qgc2l6ZV90IGtleV9sZW4gPSBzdHJsZW4oa2V5X2lkKTsKKyAgICBpZiAoa2V5X2xlbiA+IEhNQUNfVEFHX0xFTiAmJiAhc3RybmNtcChrZXlfaWQsIEhNQUNfVEFHLCBITUFDX1RBR19MRU4pKSB7CisgICAgICAgIGtleSA9IEVWUF9QS0VZX25ld19tYWNfa2V5KEVWUF9QS0VZX0hNQUMsIGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGtleV9pZCksCisgICAgICAgICAgICAgICAga2V5X2xlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQklPKiBpbiA9IEJJT19uZXdfbWVtX2J1ZihkYXRhLCBzdHJsZW4oa2V5X2lkKSk7CisgICAgICAgIGlmICghaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtleSA9IHJlYWRfZnVuYyhpbiwgTlVMTCwgMCwgTlVMTCk7CisgICAgICAgIEJJT19mcmVlKGluKTsKKworICAgICAgICBpZiAoa2V5ICE9IE5VTEwgJiYgRVZQX1BLRVlfdHlwZShrZXktPnR5cGUpID09IEVWUF9QS0VZX1JTQSkgeworICAgICAgICAgICAgRU5HSU5FX2luaXQoZSk7CisKKyAgICAgICAgICAgIFVuaXF1ZV9SU0EgcnNhKEVWUF9QS0VZX2dldDFfUlNBKGtleSkpOworICAgICAgICAgICAgcnNhLT5lbmdpbmUgPSBlOworICAgICAgICAgICAgcnNhLT5mbGFncyB8PSBSU0FfRkxBR19FWFRfUEtFWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBrZXk7Cit9CisKK3N0YXRpYyBFVlBfUEtFWSogdGVzdF9sb2FkX3ByaXZrZXkoRU5HSU5FKiBlLCBjb25zdCBjaGFyKiBrZXlfaWQsIFVJX01FVEhPRCosIHZvaWQqKSB7CisgICAgcmV0dXJuIHRlc3RfbG9hZF9rZXkoZSwga2V5X2lkLCBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleSk7Cit9CisKK3N0YXRpYyBFVlBfUEtFWSogdGVzdF9sb2FkX3B1YmtleShFTkdJTkUqIGUsIGNvbnN0IGNoYXIqIGtleV9pZCwgVUlfTUVUSE9EKiwgdm9pZCopIHsKKyAgICByZXR1cm4gdGVzdF9sb2FkX2tleShlLCBrZXlfaWQsIFBFTV9yZWFkX2Jpb19QVUJLRVkpOworfQorCitzdGF0aWMgY29uc3QgaW50IG1ldGhzW10gPSB7CisgICAgICAgIEVWUF9QS0VZX0hNQUMsCit9OworCitzdGF0aWMgaW50IHBrZXlfbWV0aHMoRU5HSU5FKiwgRVZQX1BLRVlfTUVUSE9EKiogbWV0aCwgY29uc3QgaW50KiogbmlkcywgaW50IG5pZCkgeworICAgIGlmIChuaWQgPT0gRVZQX1BLRVlfSE1BQykgeworICAgICAgICAqbWV0aCA9IGNvbnN0X2Nhc3Q8RVZQX1BLRVlfTUVUSE9EKj4oRVZQX1BLRVlfbWV0aF9maW5kKG5pZCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKG5pZCAhPSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChuaWRzICE9IE5VTEwpIHsKKyAgICAgICAgKm5pZHMgPSBtZXRoczsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9lbmdpbmVfc2V0dXAoRU5HSU5FKiBlKSB7CisgICAgaWYgKCFFTkdJTkVfc2V0X2lkKGUsIFRFU1RfRU5HSU5FX0lEKQorICAgICAgICAgICAgfHwgIUVOR0lORV9zZXRfbmFtZShlLCBURVNUX0VOR0lORV9OQU1FKQorICAgICAgICAgICAgfHwgIUVOR0lORV9zZXRfZmxhZ3MoZSwgMCkKKyAgICAgICAgICAgIHx8ICFFTkdJTkVfc2V0X1JTQShlLCBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkpCisgICAgICAgICAgICB8fCAhRU5HSU5FX3NldF9sb2FkX3ByaXZrZXlfZnVuY3Rpb24oZSwgdGVzdF9sb2FkX3ByaXZrZXkpCisgICAgICAgICAgICB8fCAhRU5HSU5FX3NldF9sb2FkX3B1YmtleV9mdW5jdGlvbihlLCB0ZXN0X2xvYWRfcHVia2V5KQorICAgICAgICAgICAgfHwgIUVOR0lORV9zZXRfcGtleV9tZXRocyhlLCBwa2V5X21ldGhzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZXN0X2VuZ2luZV9iaW5kX2ZuKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQpIHsKKyAgICBpZiAoaWQgJiYgKHN0cmNtcChpZCwgVEVTVF9FTkdJTkVfSUQpICE9IDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghdGVzdF9lbmdpbmVfc2V0dXAoZSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK2V4dGVybiAiQyIgeworI3VuZGVmIE9QRU5TU0xfRVhQT1JUCisjZGVmaW5lIE9QRU5TU0xfRVhQT1JUIGV4dGVybiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCisKK0lNUExFTUVOVF9EWU5BTUlDX0NIRUNLX0ZOKCkKK0lNUExFTUVOVF9EWU5BTUlDX0JJTkRfRk4odGVzdF9lbmdpbmVfYmluZF9mbikKK307CmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L1N0YW5kYXJkTmFtZXMuamF2YSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvU3RhbmRhcmROYW1lcy5qYXZhCmluZGV4IGJlODgwZDMuLjhkNTRiM2UgMTAwNjQ0Ci0tLSBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvU3RhbmRhcmROYW1lcy5qYXZhCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvU3RhbmRhcmROYW1lcy5qYXZhCkBAIC02OSw4ICs2OSw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNTRV9QUk9WSURFUl9OQU1FID0gKElTX1JJKSA/ICJTdW5KU1NFIiA6ICJBbmRyb2lkT3BlblNTTCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVVJJVFlfUFJPVklERVJfTkFNRSA9IChJU19SSSkgPyAiU1VOIiA6ICJCQyI7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFOQUdFUl9GQUNUT1JZX0RFRkFVTFQgPSAoSVNfUkkpID8gIlN1blg1MDkiIDogIlg1MDkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX01BTkFHRVJfRkFDVE9SWV9ERUZBVUxUID0gKElTX1JJKSA/ICJQS0lYIiA6ICJYNTA5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFOQUdFUl9GQUNUT1JZX0RFRkFVTFQgPSAoSVNfUkkpID8gIlN1blg1MDkiIDogIlBLSVgiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX01BTkFHRVJfRkFDVE9SWV9ERUZBVUxUID0gIlBLSVgiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUT1JFX0FMR09SSVRITSA9IChJU19SSSkgPyAiSktTIiA6ICJCS1MiOwogCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgcHJvdmlkZSgiS2V5R2VuZXJhdG9yIiwgIkhtYWNTSEE1MTIiKTsKICAgICAgICAgcHJvdmlkZSgiS2V5R2VuZXJhdG9yIiwgIlJDMiIpOwogICAgICAgICBwcm92aWRlKCJLZXlJbmZvRmFjdG9yeSIsICJET00iKTsKLSAgICAgICAgcHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiU3VuWDUwOSIpOworICAgICAgICBwcm92aWRlKCJLZXlNYW5hZ2VyRmFjdG9yeSIsICJQS0lYIik7CiAgICAgICAgIHByb3ZpZGUoIktleVBhaXJHZW5lcmF0b3IiLCAiRFNBIik7CiAgICAgICAgIHByb3ZpZGUoIktleVBhaXJHZW5lcmF0b3IiLCAiRGlmZmllSGVsbG1hbiIpOwogICAgICAgICBwcm92aWRlKCJLZXlQYWlyR2VuZXJhdG9yIiwgIlJTQSIpOwpAQCAtMTkwLDYgKzE5MCw3IEBACiAgICAgICAgIHByb3ZpZGUoIk1hYyIsICJIbWFjU0hBMjU2Iik7CiAgICAgICAgIHByb3ZpZGUoIk1hYyIsICJIbWFjU0hBMzg0Iik7CiAgICAgICAgIHByb3ZpZGUoIk1hYyIsICJIbWFjU0hBNTEyIik7CisgICAgICAgIC8vIElmIGFkZGluZyBhIG5ldyBNZXNzYWdlRGlnZXN0LCBjb25zaWRlciBhZGRpbmcgaXQgdG8gSmFyVmVyaWZpZXIKICAgICAgICAgcHJvdmlkZSgiTWVzc2FnZURpZ2VzdCIsICJNRDIiKTsKICAgICAgICAgcHJvdmlkZSgiTWVzc2FnZURpZ2VzdCIsICJNRDUiKTsKICAgICAgICAgcHJvdmlkZSgiTWVzc2FnZURpZ2VzdCIsICJTSEEtMjU2Iik7CkBAIC0yNjIsNyArMjYzLDYgQEAKICAgICAgICAgICAgIHByb3ZpZGUoIktleUdlbmVyYXRvciIsICJTdW5UbHNNYXN0ZXJTZWNyZXQiKTsKICAgICAgICAgICAgIHByb3ZpZGUoIktleUdlbmVyYXRvciIsICJTdW5UbHNQcmYiKTsKICAgICAgICAgICAgIHByb3ZpZGUoIktleUdlbmVyYXRvciIsICJTdW5UbHNSc2FQcmVtYXN0ZXJTZWNyZXQiKTsKLSAgICAgICAgICAgIHByb3ZpZGUoIktleU1hbmFnZXJGYWN0b3J5IiwgIk5ld1N1blg1MDkiKTsKICAgICAgICAgICAgIHByb3ZpZGUoIktleVN0b3JlIiwgIkNhc2VFeGFjdEpLUyIpOwogICAgICAgICAgICAgcHJvdmlkZSgiTWFjIiwgIkhtYWNQQkVTSEExIik7CiAgICAgICAgICAgICBwcm92aWRlKCJNYWMiLCAiU3NsTWFjTUQ1Iik7CkBAIC0zMDYsNiArMzA2LDE0IEBACiAgICAgICAgICAgICB1bnByb3ZpZGUoIlNTTENvbnRleHQiLCAiVExTdjEuMiIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gRml4dXBzIGZvciB0aGUgUkkKKyAgICAgICAgaWYgKElTX1JJKSB7CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgbmFtZXM6IFN0YW5kYXJkIE5hbWVzIHNheXMgUEtJWCwgSlNTRSBSZWZlcmVuY2UgR3VpZGUgc2F5cyBTdW5YNTA5IG9yIE5ld1N1blg1MDkKKyAgICAgICAgICAgIHVucHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiUEtJWCIpOworICAgICAgICAgICAgcHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiU3VuWDUwOSIpOworICAgICAgICAgICAgcHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiTmV3U3VuWDUwOSIpOworICAgICAgICB9CisKICAgICAgICAgLy8gRml4dXBzIGZvciBkYWx2aWsKICAgICAgICAgaWYgKCFJU19SSSkgewogCkBAIC0zNDAsMTAgKzM0OCw2IEBACiAgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiUEJFV2l0aFNIQUFuZDMtS0VZVHJpcGxlREVTLUNCQyIpOwogICAgICAgICAgICAgcHJvdmlkZSgiU2VjcmV0S2V5RmFjdG9yeSIsICJQQkVXaXRoU0hBQW5kMy1LRVlUcmlwbGVERVMtQ0JDIik7CiAKLSAgICAgICAgICAgIC8vIGRpZmZlcmVudCBuYW1lczogZHJvcHBlZCBTdW4KLSAgICAgICAgICAgIHVucHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiU3VuWDUwOSIpOwotICAgICAgICAgICAgcHJvdmlkZSgiS2V5TWFuYWdlckZhY3RvcnkiLCAiWDUwOSIpOwotCiAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgbmFtZXM6IEJvdW5jeUNhc3RsZSBhY3R1YWxseSB1c2VzIHRoZSBTdGFuZGFyZCBuYW1lIG9mIFNIQS0xIHZzIFNIQQogICAgICAgICAgICAgdW5wcm92aWRlKCJNZXNzYWdlRGlnZXN0IiwgIlNIQSIpOwogICAgICAgICAgICAgcHJvdmlkZSgiTWVzc2FnZURpZ2VzdCIsICJTSEEtMSIpOwpAQCAtMzUzLDEwICszNTcsNiBAQAogICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIlJTQS9FQ0IvTk9QQURESU5HIik7CiAgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiUlNBL0VDQi9QS0NTMVBBRERJTkciKTsKIAotICAgICAgICAgICAgLy8gZGlmZmVyZW50IG5hbWVzOiBKU1NFIFJlZmVyZW5jZSBHdWlkZSBzYXlzIFBLSVggYWthIFg1MDkKLSAgICAgICAgICAgIHVucHJvdmlkZSgiVHJ1c3RNYW5hZ2VyRmFjdG9yeSIsICJQS0lYIik7Ci0gICAgICAgICAgICBwcm92aWRlKCJUcnVzdE1hbmFnZXJGYWN0b3J5IiwgIlg1MDkiKTsKLQogICAgICAgICAgICAgLy8gZGlmZmVyZW50IG5hbWVzOiBBUkNGT1VSIHZzIEFSQzQKICAgICAgICAgICAgIHVucHJvdmlkZSgiQ2lwaGVyIiwgIkFSQ0ZPVVIiKTsKICAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJBUkM0Iik7CkBAIC00MjIsNiArNDIyLDI2IEBACiAgICAgICAgICAgICBwcm92aWRlKCJTZWNyZXRLZXlGYWN0b3J5IiwgIlBCRVdJVEhTSEFBTkQ0MEJJVFJDNCIpOwogICAgICAgICAgICAgcHJvdmlkZSgiU2VjcmV0S2V5RmFjdG9yeSIsICJQQkVXSVRIU0hBQU5EVFdPRklTSC1DQkMiKTsKIAorICAgICAgICAgICAgLy8gTmVlZGVkIGJ5IG91ciBPcGVuU1NMIHByb3ZpZGVyCisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiQUVTL0NCQy9OT1BBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJBRVMvQ0JDL1BLQ1M1UEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkFFUy9DRkIvTk9QQURESU5HIik7CisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiQUVTL0NGQi9QS0NTNVBBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJBRVMvQ1RSL05PUEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkFFUy9DVFIvUEtDUzVQQURESU5HIik7CisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiQUVTL0VDQi9OT1BBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJBRVMvRUNCL1BLQ1M1UEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkFFUy9PRkIvTk9QQURESU5HIik7CisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiQUVTL09GQi9QS0NTNVBBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJERVNFREUvQ0JDL05PUEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkRFU0VERS9DQkMvUEtDUzVQQURESU5HIik7CisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiREVTRURFL0NGQi9OT1BBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJERVNFREUvQ0ZCL1BLQ1M1UEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkRFU0VERS9FQ0IvTk9QQURESU5HIik7CisgICAgICAgICAgICBwcm92aWRlKCJDaXBoZXIiLCAiREVTRURFL0VDQi9QS0NTNVBBRERJTkciKTsKKyAgICAgICAgICAgIHByb3ZpZGUoIkNpcGhlciIsICJERVNFREUvT0ZCL05PUEFERElORyIpOworICAgICAgICAgICAgcHJvdmlkZSgiQ2lwaGVyIiwgIkRFU0VERS9PRkIvUEtDUzVQQURESU5HIik7CisKICAgICAgICAgICAgIC8vIHJlbW92ZWQgTERBUAogICAgICAgICAgICAgdW5wcm92aWRlKCJDZXJ0U3RvcmUiLCAiTERBUCIpOwogCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L1Rlc3RLZXlTdG9yZS5qYXZhIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL2xpYmNvcmUvamF2YS9zZWN1cml0eS9UZXN0S2V5U3RvcmUuamF2YQppbmRleCBlMjRlZTc4Li43NGMyODQwIDEwMDY0NAotLS0gYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvbGliY29yZS9qYXZhL3NlY3VyaXR5L1Rlc3RLZXlTdG9yZS5qYXZhCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS9saWJjb3JlL2phdmEvc2VjdXJpdHkvVGVzdEtleVN0b3JlLmphdmEKQEAgLTUyOCw4ICs1MjgsMTIgQEAKICAgICAgICAgaWYgKCFwZXJtaXR0ZWROYW1lQ29uc3RyYWludHMuaXNFbXB0eSgpIHx8ICFleGNsdWRlZE5hbWVDb25zdHJhaW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHg1MDljZy5hZGRFeHRlbnNpb24oWDUwOUV4dGVuc2lvbnMuTmFtZUNvbnN0cmFpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZUNvbnN0cmFpbnRzKHBlcm1pdHRlZE5hbWVDb25zdHJhaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZE5hbWVDb25zdHJhaW50cykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZUNvbnN0cmFpbnRzKHBlcm1pdHRlZE5hbWVDb25zdHJhaW50cy50b0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJhbFN1YnRyZWVbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWROYW1lQ29uc3RyYWludHMuc2l6ZSgpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWROYW1lQ29uc3RyYWludHMudG9BcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyYWxTdWJ0cmVlWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWROYW1lQ29uc3RyYWludHMuc2l6ZSgpXSkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgRUNQcml2YXRlS2V5KSB7CmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL2h5dHNfc2lnbmVkX3NoYTI1NmRpZ2VzdF9zaGEyNTZ3aXRocnNhLmphciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMvaHl0c19zaWduZWRfc2hhMjU2ZGlnZXN0X3NoYTI1NndpdGhyc2EuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTQ5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL2h5dHNfc2lnbmVkX3NoYTI1NmRpZ2VzdF9zaGEyNTZ3aXRocnNhLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL2h5dHNfc2lnbmVkX3NoYTI1NndpdGhyc2EuamFyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy9oeXRzX3NpZ25lZF9zaGEyNTZ3aXRocnNhLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZmZDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy9oeXRzX3NpZ25lZF9zaGEyNTZ3aXRocnNhLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL2h5dHNfc2lnbmVkX3NoYTUxMmRpZ2VzdF9zaGE1MTJ3aXRoZWNkc2EuamFyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy9oeXRzX3NpZ25lZF9zaGE1MTJkaWdlc3Rfc2hhNTEyd2l0aGVjZHNhLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc5MWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy9oeXRzX3NpZ25lZF9zaGE1MTJkaWdlc3Rfc2hhNTEyd2l0aGVjZHNhLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtZGlybmFtZS5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtZGlybmFtZS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNDAzMwotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWFsdC1kaXJuYW1lLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtZG5zLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWFsdC1kbnMuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjFlODcKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtZG5zLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtZW1haWwuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtYWx0LWVtYWlsLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTBiYzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtYWx0LWVtYWlsLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtbm9uZS5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtbm9uZS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNTQzYQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWFsdC1ub25lLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtb3RoZXIuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtYWx0LW90aGVyLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA2ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtYWx0LW90aGVyLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtcmlkLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWFsdC1yaWQuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmE0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtcmlkLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtdXJpLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWFsdC11cmkuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWI4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1hbHQtdXJpLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1jYS5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1jYS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ODdlYQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWNhLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1jYVdpdGhQYXRoTGVuLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWNhV2l0aFBhdGhMZW4uZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODYwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1jYVdpdGhQYXRoTGVuLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1kc2EuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtZHNhLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdjNGNlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtZHNhLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1lYy5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1lYy5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZGY3YQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWVjLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1leHRlbmRlZEtleVVzYWdlLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWV4dGVuZGVkS2V5VXNhZ2UuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzYwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1leHRlbmRlZEtleVVzYWdlLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1pbnZhbGlkaXAuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtaW52YWxpZGlwLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VkN2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtaW52YWxpZGlwLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1pcHY2LmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LWlwdjYuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1pcHY2LmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1rZXlVc2FnZS1leHRyYUxvbmcuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQta2V5VXNhZ2UtZXh0cmFMb25nLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjVlMGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQta2V5VXNhZ2UtZXh0cmFMb25nLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1yc2EtZGF0ZXMudHh0IGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLWRhdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjYxNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLWRhdGVzLnR4dApAQCAtMCwwICsxLDIgQEAKK25vdEJlZm9yZT1KYW4gIDIgMDA6MDM6MTIgMjAxMyBHTVQKK25vdEFmdGVyPURlYyAzMSAwMDowMzoxMiAyMDIyIEdNVApkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXB1YmtleS5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1yc2EtcHVia2V5LmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjlmM2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXB1YmtleS5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXNlcmlhbC50eHQgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1yc2Etc2VyaWFsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNjZWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXNlcmlhbC50eHQKQEAgLTAsMCArMSBAQAorc2VyaWFsPUI5NjE0M0UxRDZGMzFFNkYKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXJzYS1zaWcuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXNpZy5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5NzllZQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXJzYS1zaWcuZGVyCkBAIC0wLDAgKzEgQEAKK6jRtMWvS9wVpMiBv6TPjw6xBJ/YzSgFG6Wo9pgih5osL5WKSfYfTC6RMenlCQeV4uP4LL940rsFVJVLJH2HmHgH9nkWi8Tey2mp6GmBjC5Pik/wC8LETS4XbT7Xy7tWYkpRf/Y/1KWHvxtAt/LXKD6E618ReNFHTcX2haOaegUlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXRicy5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC1yc2EtdGJzLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWMyODU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLXRicy5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtcnNhLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXJzYS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkN2NjOAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXJzYS5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtdW5zdXBwb3J0ZWQuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtdW5zdXBwb3J0ZWQuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzliNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydC11bnN1cHBvcnRlZC5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnQtdXNlcldpdGhQYXRoTGVuLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXVzZXJXaXRoUGF0aExlbi5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5YzkzMwotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0LXVzZXJXaXRoUGF0aExlbi5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLXBrNy5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydHMtcGs3LmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjdkMDcyCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLXBrNy5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLXBrNy5wZW0gYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY2VydHMtcGs3LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RiZWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLXBrNy5wZW0KQEAgLTAsMCArMSw0NSBAQAorLS0tLS1CRUdJTiBQS0NTNy0tLS0tCitNSUlJQmdZSktvWklodmNOQVFjQ29JSUg5ekNDQi9NQ0FRRXhBREFMQmdrcWhraUc5dzBCQndHZ2dnZlpNSUlFCit2RENDQkNXZ0F3SUJBZ0lKQUxsaFErSFc4eDV2TUEwR0NTcUdTSWIzRFFFQkJRVUFNR0F4Q3pBSkJnTlZCQVlUCitBbFZUTVJNd0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saE1SSXdFQVlEVlFRSEV3bFRZVzRnVFdGMFpXOHhGekFWCitCZ05WQkFvVERrZGxibWwxY3k1amIyMGdTVzVqTVE4d0RRWURWUVFMRXdaT1pYUlBjSE13SGhjTk1UTXdNVEF5CitNREF3TXpFeVdoY05Nakl4TWpNeE1EQXdNekV5V2pCZ01Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LCitRMkZzYVdadmNtNXBZVEVTTUJBR0ExVUVCeE1KVTJGdUlFMWhkR1Z2TVJjd0ZRWURWUVFLRXc1SFpXNXBkWE11CitZMjl0SUVsdVl6RVBNQTBHQTFVRUN4TUdUbVYwVDNCek1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCCitpUUtCZ1FDNXoxa2ovOWljcFZ5TUc5WVlFazFpVmVVNklrNCt4cFFtWkNpUWFBMjB3aVpCdzNpdDg1VmRndkNxCitiQjBDSFo1VEtuZnhwa0FkZmJYcEdxd3lud0dLR25LR2l0SDFvbDllK3ZQNTYwVXdlMXkxbStkMXZHOVM1b0hnCitQSVRrN0xPZFpEUGZ6eFJwZFJidEcrQW90aVRqd1hjSVJpbGI0MXpBUWRsTCtWNlhGUUlEQVFBQm80SUNmRENDCitBbmd3Q1FZRFZSMFRCQUl3QURBTEJnTlZIUThFQkFNQ0JlQXdIUVlEVlIwT0JCWUVGUFpYT0U1OEFQanpiTlkzCitoWWpQZGdVV2xhdWhNSUdTQmdOVkhTTUVnWW93Z1llQUZQWlhPRTU4QVBqemJOWTNoWWpQZGdVV2xhdWhvV1NrCitZakJnTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVTTUJBR0ExVUVCeE1KCitVMkZ1SUUxaGRHVnZNUmN3RlFZRFZRUUtFdzVIWlc1cGRYTXVZMjl0SUVsdVl6RVBNQTBHQTFVRUN4TUdUbVYwCitUM0J6Z2drQXVXRkQ0ZGJ6SG04d0hnWUpZSVpJQVliNFFnRU5CQkVXRDFndU5UQTVJRlZ1YVhRZ1ZHVnpkRENCCit3d1lEVlIwUkJJRzdNSUc0b0E0R0F5b0RCS0FIREFWMFpYTjBNWUVRZURVd09VQmxlR0Z0Y0d4bExtTnZiWUlRCitlRFV3T1M1bGVHRnRjR3hsTG1OdmJhUlFNRTR4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUJkMlZ6CitiMjFsSUVSMVpHVnpNUmN3RlFZRFZRUUxGQTdEbkdKbGNpQkdjc091Wlc1a2N6RU9NQXdHQTFVRUF4UUY0b2lHCit4cEtHSldoMGRIQTZMeTkzZDNjdVpYaGhiWEJzWlM1amIyMHZQM0U5WVhkbGMyOXRaVzVsYzNPSEJNQ29BQUdJCitBeW9EQkRDQnd3WURWUjBTQklHN01JRzRvQTRHQXlvREJLQUhEQVYwWlhOME1ZRVFlRFV3T1VCbGVHRnRjR3hsCitMbU52YllJUWVEVXdPUzVsZUdGdGNHeGxMbU52YmFSUU1FNHhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLCitFdzFCZDJWemIyMWxJRVIxWkdWek1SY3dGUVlEVlFRTEZBN0RuR0psY2lCR2NzT3VaVzVrY3pFT01Bd0dBMVVFCitBeFFGNG9pR3hwS0dKV2gwZEhBNkx5OTNkM2N1WlhoaGJYQnNaUzVqYjIwdlAzRTlZWGRsYzI5dFpXNWxjM09ICitCTUNvQUFHSUF5b0RCREFOQmdrcWhraUc5dzBCQVFVRkFBT0JnUUNvMGJURnIwdmNGYVRJZ2Ira3o0OE9zUVNmCisyTTBvQlJ1bHFQYVlJb2VhTEMrVmlrbjJIMHd1a1RIcDVRa0hsZUxqK0N5L2VOSzdCVlNWU3lSOWg1aDRCL1o1CitGb3ZFM3N0cHFlaHBnWXd1VDRwUDhBdkN4RTB1RjIwKzE4dTdWbUpLVVgvMlA5U2xoNzhiUUxmeTF5ZytoT3RmCitFWGpSUjAzRjlvV2ptbm9GSlRDQ0F4VXdnZ0xWb0FNQ0FRSUNDUUNmQzVMZm5WbDBPakFKQmdjcWhrak9PQVFECitNR0F4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSUV3cERZV3hwWm05eWJtbGhNUkl3RUFZRFZRUUhFd2xUCitZVzRnVFdGMFpXOHhGekFWQmdOVkJBb1REa2RsYm1sMWN5NWpiMjBnU1c1ak1ROHdEUVlEVlFRTEV3Wk9aWFJQCitjSE13SGhjTk1UTXdNVEF5TURBd016RXpXaGNOTVRNd01qQXhNREF3TXpFeldqQmdNUXN3Q1FZRFZRUUdFd0pWCitVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFU01CQUdBMVVFQnhNSlUyRnVJRTFoZEdWdk1SY3dGUVlECitWUVFLRXc1SFpXNXBkWE11WTI5dElFbHVZekVQTUEwR0ExVUVDeE1HVG1WMFQzQnpNSUlCdGpDQ0FTc0dCeXFHCitTTTQ0QkFFd2dnRWVBb0dCQUltWXB4OHV6bzhCK1EzaHhaTjQ2K0E4ME1ScmJBMThrbE1QZE9WQm9NSW5FZTJ3CitjeFphdFVPenF6eHFiNVYzUWQ3bGM5d1luVFZ5M0J2REdiVnhaMjJKOEdkdGJKMDQ2WmVvWmthSWF2b2hla3IwCis4N1ZHY3p4SWpPNWp4Q2NUUnBGVmpCNVRQUjhtNlVsb2p4Um81eTRLMHlRMmNpVjlsV3hYcHlCVUFIeUZBaFVBCis3aEZCOUN3T1g2Y25WMEVobjZuOW1ad3NmNHNDZ1lCY1gydDU3MmZodTNvV2FzWFZia0E5MEdjTjRSc05FSGJMCitpRlZrOTVyMExWaUZ5ckt2dVlUQ0V0NkoxU1ZCWCtQWit3VTVoMFNrSS9ZYTJSVG8wS1drSkJrRkFjRXkzNmU4CitsSkNKTU9sQlFad2ZXdDJGMXZUZ25GUFdwQkxIMkd1WXdJQjJxRUJOOWVoTHZ5UEdJYm96bVN1UTVyRSsraksxCit5VXpjTzllZzZBT0JoQUFDZ1lBZDdCSmR2aGlOc0xLdzhSY2xvQlVZWUI1alplUVl6T2xSOHhPTm9wUld6Y1FYCitubVJ1ZzBZL1prNmdDa0dDblpvV1lWaUIyeDVUYmtRWTNsOXpUNldUOHNmUlZvaWRVVVV5TlJwZ1hHNHB5ZFNqCitYT0NFcUQxV1MvWE14OVZzWXNqcmtxLzZ6QnhEemNwdXRyWWRrUzQ1WWl1YStydXl5TndYYWdoUHlLUXNzcU1hCitNQmd3Q1FZRFZSMFRCQUl3QURBTEJnTlZIUThFQkFNQ0FEY3dDUVlIS29aSXpqZ0VBd012QURBc0FoUkc2Z252CitNQXZXWWxValhkQk9YVklxVWJJZWxRSVVCN1Q5YWgwbURVYk9takp2c0RxWDJpb0pzcW1oQURFQQorLS0tLS1FTkQgUEtDUzctLS0tLQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0cy5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ODVhNgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0cy5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NlcnRzLnBlbSBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0cy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1ZmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jZXJ0cy5wZW0KQEAgLTAsMCArMSw0NyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFdkRDQ0JDV2dBd0lCQWdJSkFMbGhRK0hXOHg1dk1BMEdDU3FHU0liM0RRRUJCUVVBTUdBeEN6QUpCZ05WCitCQVlUQWxWVE1STXdFUVlEVlFRSUV3cERZV3hwWm05eWJtbGhNUkl3RUFZRFZRUUhFd2xUWVc0Z1RXRjBaVzh4CitGekFWQmdOVkJBb1REa2RsYm1sMWN5NWpiMjBnU1c1ak1ROHdEUVlEVlFRTEV3Wk9aWFJQY0hNd0hoY05NVE13CitNVEF5TURBd016RXlXaGNOTWpJeE1qTXhNREF3TXpFeVdqQmdNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFCitDQk1LUTJGc2FXWnZjbTVwWVRFU01CQUdBMVVFQnhNSlUyRnVJRTFoZEdWdk1SY3dGUVlEVlFRS0V3NUhaVzVwCitkWE11WTI5dElFbHVZekVQTUEwR0ExVUVDeE1HVG1WMFQzQnpNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOCitBRENCaVFLQmdRQzV6MWtqLzlpY3BWeU1HOVlZRWsxaVZlVTZJazQreHBRbVpDaVFhQTIwd2laQnczaXQ4NVZkCitndkNxYkIwQ0haNVRLbmZ4cGtBZGZiWHBHcXd5bndHS0duS0dpdEgxb2w5ZSt2UDU2MFV3ZTF5MW0rZDF2RzlTCis1b0hnUElUazdMT2RaRFBmenhScGRSYnRHK0FvdGlUandYY0lSaWxiNDF6QVFkbEwrVjZYRlFJREFRQUJvNElDCitmRENDQW5nd0NRWURWUjBUQkFJd0FEQUxCZ05WSFE4RUJBTUNCZUF3SFFZRFZSME9CQllFRlBaWE9FNThBUGp6CitiTlkzaFlqUGRnVVdsYXVoTUlHU0JnTlZIU01FZ1lvd2dZZUFGUFpYT0U1OEFQanpiTlkzaFlqUGRnVVdsYXVoCitvV1NrWWpCZ01Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFU01CQUdBMVVFCitCeE1KVTJGdUlFMWhkR1Z2TVJjd0ZRWURWUVFLRXc1SFpXNXBkWE11WTI5dElFbHVZekVQTUEwR0ExVUVDeE1HCitUbVYwVDNCemdna0F1V0ZENGRiekhtOHdIZ1lKWUlaSUFZYjRRZ0VOQkJFV0QxZ3VOVEE1SUZWdWFYUWdWR1Z6CitkRENCd3dZRFZSMFJCSUc3TUlHNG9BNEdBeW9EQktBSERBVjBaWE4wTVlFUWVEVXdPVUJsZUdGdGNHeGxMbU52CitiWUlRZURVd09TNWxlR0Z0Y0d4bExtTnZiYVJRTUU0eEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFCCitkMlZ6YjIxbElFUjFaR1Z6TVJjd0ZRWURWUVFMRkE3RG5HSmxjaUJHY3NPdVpXNWtjekVPTUF3R0ExVUVBeFFGCis0b2lHeHBLR0pXaDBkSEE2THk5M2QzY3VaWGhoYlhCc1pTNWpiMjB2UDNFOVlYZGxjMjl0Wlc1bGMzT0hCTUNvCitBQUdJQXlvREJEQ0J3d1lEVlIwU0JJRzdNSUc0b0E0R0F5b0RCS0FIREFWMFpYTjBNWUVRZURVd09VQmxlR0Z0CitjR3hsTG1OdmJZSVFlRFV3T1M1bGVHRnRjR3hsTG1OdmJhUlFNRTR4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlECitWUVFLRXcxQmQyVnpiMjFsSUVSMVpHVnpNUmN3RlFZRFZRUUxGQTdEbkdKbGNpQkdjc091Wlc1a2N6RU9NQXdHCitBMVVFQXhRRjRvaUd4cEtHSldoMGRIQTZMeTkzZDNjdVpYaGhiWEJzWlM1amIyMHZQM0U5WVhkbGMyOXRaVzVsCitjM09IQk1Db0FBR0lBeW9EQkRBTkJna3Foa2lHOXcwQkFRVUZBQU9CZ1FDbzBiVEZyMHZjRmFUSWdiK2t6NDhPCitzUVNmMk0wb0JSdWxxUGFZSW9lYUxDK1Zpa24ySDB3dWtUSHA1UWtIbGVMaitDeS9lTks3QlZTVlN5UjloNWg0CitCL1o1Rm92RTNzdHBxZWhwZ1l3dVQ0cFA4QXZDeEUwdUYyMCsxOHU3Vm1KS1VYLzJQOVNsaDc4YlFMZnkxeWcrCitoT3RmRVhqUlIwM0Y5b1dqbW5vRkpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREZUQ0NBdFdnQXdJQkFnSUpBSjhMa3QrZFdYUTZNQWtHQnlxR1NNNDRCQU13WURFTE1Ba0dBMVVFQmhNQworVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhFakFRQmdOVkJBY1RDVk5oYmlCTllYUmxiekVYTUJVRworQTFVRUNoTU9SMlZ1YVhWekxtTnZiU0JKYm1NeER6QU5CZ05WQkFzVEJrNWxkRTl3Y3pBZUZ3MHhNekF4TURJdworTURBek1UTmFGdzB4TXpBeU1ERXdNREF6TVROYU1HQXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJRXdwRAorWVd4cFptOXlibWxoTVJJd0VBWURWUVFIRXdsVFlXNGdUV0YwWlc4eEZ6QVZCZ05WQkFvVERrZGxibWwxY3k1agorYjIwZ1NXNWpNUTh3RFFZRFZRUUxFd1pPWlhSUGNITXdnZ0cyTUlJQkt3WUhLb1pJempnRUFUQ0NBUjRDZ1lFQQoraVppbkh5N09qd0g1RGVIRmszanI0RHpReEd0c0RYeVNVdzkwNVVHZ3dpY1I3YkJ6RmxxMVE3T3JQR3B2bFhkQgorM3VWejNCaWROWExjRzhNWnRYRm5iWW53WjIxc25UanBsNmhtUm9ocStpRjZTdlR6dFVaelBFaU03bVBFSnhORwora1ZXTUhsTTlIeWJwU1dpUEZHam5MZ3JUSkRaeUpYMlZiRmVuSUZRQWZJVUNGUUR1RVVIMExBNWZweWRYUVNHZgorcWYyWm5DeC9pd0tCZ0Z4ZmEzbnZaK0c3ZWhacXhkVnVRRDNRWnczaEd3MFFkc3VJVldUM212UXRXSVhLc3ErNQoraE1JUzNvblZKVUZmNDluN0JUbUhSS1FqOWhyWkZPalFwYVFrR1FVQndUTGZwN3lVa0lrdzZVRkJuQjlhM1lYVworOU9DY1U5YWtFc2ZZYTVqQWdIYW9RRTMxNkV1L0k4WWh1ak9aSzVEbXNUNzZNclhKVE53NzE2RG9BNEdFQUFLQgorZ0Izc0VsMitHSTJ3c3JEeEZ5V2dGUmhnSG1ObDVCak02Vkh6RTQyaWxGYk54QmVlWkc2RFJqOW1UcUFLUVlLZAorbWhaaFdJSGJIbE51UkJqZVgzTlBwWlB5eDlGV2lKMVJSVEkxR21CY2JpbkoxS05jNElTb1BWWkw5Y3pIMVd4aQoreU91U3Ivck1IRVBOeW02MnRoMlJMamxpSzVyNnU3TEkzQmRxQ0UvSXBDeXlveG93R0RBSkJnTlZIUk1FQWpBQQorTUFzR0ExVWREd1FFQXdJQU56QUpCZ2NxaGtqT09BUURBeThBTUN3Q0ZFYnFDZTh3QzlaaVZTTmQwRTVkVWlwUgorc2g2VkFoUUh0UDFxSFNZTlJzNmFNbSt3T3BmYUtnbXlxUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JlYXRlLnNoIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NyZWF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZmFiNDJlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NyZWF0ZS5zaApAQCAtMCwwICsxLDExNSBAQAorIyEvYmluL2Jhc2ggLQorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC1vIG5vdW5zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRyZWF0IHVuc2V0IHZhcmlhYmxlcyBhcyBhbiBlcnJvcgorc2V0IC1lCisKK0RJUj0kKGRpcm5hbWUgJDApCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCA+IGNlcnQtcnNhLXJlcS5wZW0KK29wZW5zc2wgcmVxIC1pbiBjZXJ0LXJzYS1yZXEucGVtIC1wdWJrZXkgLW5vb3V0IHwgb3BlbnNzbCByc2EgLXB1YmluIC1wdWJvdXQgLW91dGZvcm0gZGVyID4gY2VydC1yc2EtcHVia2V5LmRlcgorb3BlbnNzbCB4NTA5IC1leHRmaWxlICR7RElSfS9kZWZhdWx0LmNuZiAtZGF5cyAzNjUwIC1leHRlbnNpb25zIHVzcl9jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA8IGNlcnQtcnNhLXJlcS5wZW0gPiBjZXJ0LXJzYS5kZXIKK3JtIC1mIGNlcnQtcnNhLXJlcS5wZW0KKworb3BlbnNzbCBhc24xcGFyc2UgLWluIGNlcnQtcnNhLmRlciAtaW5mb3JtIGQgLW91dCBjZXJ0LXJzYS10YnMuZGVyIC1ub291dCAtc3RycGFyc2UgNAorU0lHX09GRlNFVD0kKG9wZW5zc2wgYXNuMXBhcnNlIC1pbiBjZXJ0LXJzYS5kZXIgLWluZm9ybSBkIHwgdGFpbCAtMSB8IGN1dCAtZjEgLWQ6KQorb3BlbnNzbCBhc24xcGFyc2UgLWluIGNlcnQtcnNhLmRlciAtaW5mb3JtIGQgLXN0cnBhcnNlICR7U0lHX09GRlNFVH0gLW5vb3V0IC1vdXQgY2VydC1yc2Etc2lnLmRlcgorCisjIGV4dHJhY3Qgc3RhcnRkYXRlIGFuZCBlbmRkYXRlCitvcGVuc3NsIHg1MDkgLWluIGNlcnQtcnNhLmRlciAtaW5mb3JtIGQgLW5vb3V0IC1zdGFydGRhdGUgLWVuZGRhdGUgPiBjZXJ0LXJzYS1kYXRlcy50eHQKKworIyBleHRyYWN0IHNlcmlhbAorb3BlbnNzbCB4NTA5IC1pbiBjZXJ0LXJzYS5kZXIgLWluZm9ybSBkIC1ub291dCAtc2VyaWFsID4gY2VydC1yc2Etc2VyaWFsLnR4dAorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIGtleVVzYWdlX2V4dHJhTG9uZ19jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA+IGNlcnQta2V5VXNhZ2UtZXh0cmFMb25nLmRlcgorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIGV4dGVuZGVkS2V5VXNhZ2VfY2VydCAtcmVxIC1zaWdua2V5IHByaXZrZXkucGVtIC1vdXRmb3JtIGQgPiBjZXJ0LWV4dGVuZGVkS2V5VXNhZ2UuZGVyCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMgY2FfY2VydCAtcmVxIC1zaWdua2V5IHByaXZrZXkucGVtIC1vdXRmb3JtIGQgPiBjZXJ0LWNhLmRlcgorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIHVzZXJXaXRoUGF0aExlbl9jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA+IGNlcnQtdXNlcldpdGhQYXRoTGVuLmRlcgorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIGNhV2l0aFBhdGhMZW5fY2VydCAtcmVxIC1zaWdua2V5IHByaXZrZXkucGVtIC1vdXRmb3JtIGQgPiBjZXJ0LWNhV2l0aFBhdGhMZW4uZGVyCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMgYWx0X290aGVyX2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC1hbHQtb3RoZXIuZGVyCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMgYWx0X2VtYWlsX2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC1hbHQtZW1haWwuZGVyCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMgYWx0X2Ruc19jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA+IGNlcnQtYWx0LWRucy5kZXIKKworb3BlbnNzbCByZXEgLWNvbmZpZyAke0RJUn0vZGVmYXVsdC5jbmYgLW5ldyAtbm9kZXMgLWJhdGNoIHwgb3BlbnNzbCB4NTA5IC1leHRmaWxlICR7RElSfS9kZWZhdWx0LmNuZiAtZXh0ZW5zaW9ucyBhbHRfZGlybmFtZV9jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA+IGNlcnQtYWx0LWRpcm5hbWUuZGVyCisKK29wZW5zc2wgcmVxIC1jb25maWcgJHtESVJ9L2RlZmF1bHQuY25mIC1uZXcgLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMgYWx0X3VyaV9jZXJ0IC1yZXEgLXNpZ25rZXkgcHJpdmtleS5wZW0gLW91dGZvcm0gZCA+IGNlcnQtYWx0LXVyaS5kZXIKKworb3BlbnNzbCByZXEgLWNvbmZpZyAke0RJUn0vZGVmYXVsdC5jbmYgLW5ldyAtbm9kZXMgLWJhdGNoIHwgb3BlbnNzbCB4NTA5IC1leHRmaWxlICR7RElSfS9kZWZhdWx0LmNuZiAtZXh0ZW5zaW9ucyBhbHRfcmlkX2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC1hbHQtcmlkLmRlcgorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIGFsdF9ub25lX2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC1hbHQtbm9uZS5kZXIKKworb3BlbnNzbCByZXEgLWNvbmZpZyAke0RJUn0vZGVmYXVsdC5jbmYgLW5ldyAtbm9kZXMgLWJhdGNoIHwgb3BlbnNzbCB4NTA5IC1leHRmaWxlICR7RElSfS9kZWZhdWx0LmNuZiAtZXh0ZW5zaW9ucyBpcHY2X2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC1pcHY2LmRlcgorCitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3IC1ub2RlcyAtYmF0Y2ggfCBvcGVuc3NsIHg1MDkgLWV4dGZpbGUgJHtESVJ9L2RlZmF1bHQuY25mIC1leHRlbnNpb25zIHVuc3VwcG9ydGVkX2NlcnQgLXJlcSAtc2lnbmtleSBwcml2a2V5LnBlbSAtb3V0Zm9ybSBkID4gY2VydC11bnN1cHBvcnRlZC5kZXIKKworb3BlbnNzbCBkc2FwYXJhbSAtb3V0IGRzYXBhcmFtLnBlbSAxMDI0CitvcGVuc3NsIHJlcSAtY29uZmlnICR7RElSfS9kZWZhdWx0LmNuZiAtbmV3a2V5IGRzYTpkc2FwYXJhbS5wZW0gLWtleW91dCBkc2Fwcml2LnBlbSAtbm9kZXMgLWJhdGNoIHwgb3BlbnNzbCB4NTA5IC1leHRmaWxlICR7RElSfS9kZWZhdWx0LmNuZiAtZXh0ZW5zaW9ucyBrZXlVc2FnZV9jZXJ0IC1yZXEgLXNpZ25rZXkgZHNhcHJpdi5wZW0gLW91dGZvcm0gZCA+IGNlcnQtZHNhLmRlcgorcm0gLWYgZHNhcGFyYW0ucGVtCisKK29wZW5zc2wgZWNwYXJhbSAtbmFtZSBzZWN0MjgzazEgLW91dCBlY3BhcmFtLnBlbQorb3BlbnNzbCByZXEgLWNvbmZpZyAke0RJUn0vZGVmYXVsdC5jbmYgLW5ld2tleSBlYzplY3BhcmFtLnBlbSAta2V5b3V0IGVjcHJpdi5wZW0gLW5vZGVzIC1iYXRjaCB8IG9wZW5zc2wgeDUwOSAtZXh0ZmlsZSAke0RJUn0vZGVmYXVsdC5jbmYgLWV4dGVuc2lvbnMga2V5VXNhZ2VfY3JpdGljYWxfY2VydCAtcmVxIC1zaWdua2V5IGVjcHJpdi5wZW0gLW91dGZvcm0gZCA+IGNlcnQtZWMuZGVyCitybSAtZiBlY3BhcmFtLnBlbQorCisjIENyZWF0ZSB0ZW1wb3JhcnkgQ0EgZm9yIENSTCBnZW5lcmF0aW9uCitybSAtcmYgL3RtcC9jYQorbWtkaXIgLXAgL3RtcC9jYQordG91Y2ggL3RtcC9jYS9pbmRleC50eHQKK3RvdWNoIC90bXAvY2EvaW5kZXgudHh0LmF0dHIKK2VjaG8gIjAxIiA+IC90bXAvY2Evc2VyaWFsCitvcGVuc3NsIHJlcSAtbmV3IC1ub2RlcyAtYmF0Y2ggLXg1MDkgLWV4dGVuc2lvbnMgdjNfY2EgLWtleW91dCBjYWtleS5wZW0gLW91dCBjYWNlcnQucGVtIC1kYXlzIDM2NTAgLWNvbmZpZyBkZWZhdWx0LmNuZgorCitvcGVuc3NsIHg1MDkgLWluZm9ybSBkIC1pbiBjZXJ0LXJzYS5kZXIgLW91dCBjZXJ0LXJzYS5wZW0KK29wZW5zc2wgY2EgLXJldm9rZSBjZXJ0LXJzYS5wZW0gLWtleWZpbGUgY2FrZXkucGVtIC1jZXJ0IGNhY2VydC5wZW0gLWNvbmZpZyBkZWZhdWx0LmNuZgorb3BlbnNzbCBjYSAtZ2VuY3JsIC1jcmxob3VycyA3MCAta2V5ZmlsZSBjYWtleS5wZW0gLWNlcnQgY2FjZXJ0LnBlbSAtb3V0IGNybC1yc2EucGVtIC1jb25maWcgZGVmYXVsdC5jbmYKK29wZW5zc2wgY3JsIC1pbiBjcmwtcnNhLnBlbSAtb3V0Zm9ybSBkIC1vdXQgY3JsLXJzYS5kZXIKKworb3BlbnNzbCBhc24xcGFyc2UgLWluIGNybC1yc2EuZGVyIC1pbmZvcm0gZCAtb3V0IGNybC1yc2EtdGJzLmRlciAtbm9vdXQgLXN0cnBhcnNlIDQKK1NJR19PRkZTRVQ9JChvcGVuc3NsIGFzbjFwYXJzZSAtaW4gY3JsLXJzYS5kZXIgLWluZm9ybSBkIHwgdGFpbCAtMSB8IGN1dCAtZjEgLWQ6KQorb3BlbnNzbCBhc24xcGFyc2UgLWluIGNybC1yc2EuZGVyIC1pbmZvcm0gZCAtc3RycGFyc2UgJHtTSUdfT0ZGU0VUfSAtbm9vdXQgLW91dCBjcmwtcnNhLXNpZy5kZXIKKworb3BlbnNzbCB4NTA5IC1pbmZvcm0gZCAtaW4gY2VydC1kc2EuZGVyIC1vdXQgY2VydC1kc2EucGVtCitvcGVuc3NsIGNhIC1yZXZva2UgY2VydC1kc2EucGVtIC1rZXlmaWxlIGNha2V5LnBlbSAtY2VydCBjYWNlcnQucGVtIC1jcmxfcmVhc29uIGNlc3NhdGlvbk9mT3BlcmF0aW9uIC1leHRlbnNpb25zIHVuc3VwcG9ydGVkX2NlcnQgLWNvbmZpZyBkZWZhdWx0LmNuZgorb3BlbnNzbCBjYSAtZ2VuY3JsIC1jcmxkYXlzIDMwIC1rZXlmaWxlIGNha2V5LnBlbSAtY2VydCBjYWNlcnQucGVtIC1vdXQgY3JsLXJzYS1kc2EucGVtIC1jb25maWcgZGVmYXVsdC5jbmYKK29wZW5zc2wgY3JsIC1pbiBjcmwtcnNhLWRzYS5wZW0gLW91dGZvcm0gZCAtb3V0IGNybC1yc2EtZHNhLmRlcgorCisjIFVuc3VwcG9ydGVkIGV4dGVuc2lvbnMKK29wZW5zc2wgY2EgLWdlbmNybCAtY3JsZXh0cyB1bnN1cHBvcnRlZF9jZXJ0IC1rZXlmaWxlIGNha2V5LnBlbSAtY2VydCBjYWNlcnQucGVtIC1vdXQgY3JsLXVuc3VwcG9ydGVkLnBlbSAtY29uZmlnIGRlZmF1bHQuY25mCitvcGVuc3NsIGNybCAtaW4gY3JsLXVuc3VwcG9ydGVkLnBlbSAtb3V0Zm9ybSBkIC1vdXQgY3JsLXVuc3VwcG9ydGVkLmRlcgorCitvcGVuc3NsIGNybCAtaW5mb3JtIGQgLWluIGNybC1yc2EuZGVyIC1ub291dCAtbGFzdHVwZGF0ZSAtbmV4dHVwZGF0ZSA+IGNybC1yc2EtZGF0ZXMudHh0CitvcGVuc3NsIGNybCAtaW5mb3JtIGQgLWluIGNybC1yc2EtZHNhLmRlciAtbm9vdXQgLWxhc3R1cGRhdGUgLW5leHR1cGRhdGUgPiBjcmwtcnNhLWRzYS1kYXRlcy50eHQKKworcm0gLWYgY2VydC1yc2EucGVtIGNlcnQtZHNhLnBlbSBjYWNlcnQucGVtIGNha2V5LnBlbSBjcmwtcnNhLnBlbSBjcmwtcnNhLWRzYS5wZW0gY3JsLXVuc3VwcG9ydGVkLnBlbQorcm0gLXJmIC90bXAvY2EKKworcm0gLWYgcHJpdmtleS5wZW0KK3JtIC1mIGRzYXByaXYucGVtCitybSAtZiBlY3ByaXYucGVtCisKK3JtIC1mIGNlcnRzLnBlbQorCitjYXQgY2VydC1yc2EuZGVyIGNlcnQtZHNhLmRlciA+IGNlcnRzLmRlcgorb3BlbnNzbCB4NTA5IC1pbmZvcm0gZCAtaW4gY2VydC1yc2EuZGVyID4gY2VydHMucGVtCitvcGVuc3NsIHg1MDkgLWluZm9ybSBkIC1pbiBjZXJ0LWRzYS5kZXIgPj4gY2VydHMucGVtCisKK29wZW5zc2wgY3JsMnBrY3M3IC1jZXJ0ZmlsZSBjZXJ0cy5wZW0gLW5vY3JsID4gY2VydHMtcGs3LnBlbQorb3BlbnNzbCBjcmwycGtjczcgLWNlcnRmaWxlIGNlcnRzLnBlbSAtbm9jcmwgLW91dGZvcm0gZCA+IGNlcnRzLXBrNy5kZXIKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLWRhdGVzLnR4dCBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLWRhdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGU0OGYyCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtZGF0ZXMudHh0CkBAIC0wLDAgKzEsMiBAQAorbGFzdFVwZGF0ZT1KYW4gIDIgMDA6MDM6MTMgMjAxMyBHTVQKK25leHRVcGRhdGU9SmFuICA0IDIyOjAzOjEzIDIwMTMgR01UCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXJzYS1kc2EtZGF0ZXMudHh0IGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtZHNhLWRhdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc2MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtZHNhLWRhdGVzLnR4dApAQCAtMCwwICsxLDIgQEAKK2xhc3RVcGRhdGU9SmFuICAyIDAwOjAzOjEzIDIwMTMgR01UCituZXh0VXBkYXRlPUZlYiAgMSAwMDowMzoxMyAyMDEzIEdNVApkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtZHNhLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLWRzYS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MmIzMAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLWRzYS5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2Etc2lnLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLXNpZy5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlYmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLXNpZy5kZXIKQEAgLTAsMCArMSBAQAorOuKCgKxmfxXWojquRogVjxzkF0dkC/L0ZhcFFCG2sPU1OTHOfIlxiImJgPzCcklZ9DGraC2sDKQkPJDjxyGTYSy9y6sCG4F5HQ89iB/8cbhN2imZJTo4tAOFFi2K4JyaWRr6/J0MdvZ30tqKzUv+e2Pc/XDAXyIqGOfzNp51ImAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXJzYS10YnMuZGVyIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtdGJzLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzk0MjdkCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zcmMvdGVzdC9qYXZhL3Rlc3RzL3Jlc291cmNlcy94NTA5L2NybC1yc2EtdGJzLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXJzYS5kZXIgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXJzYS5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0ZjFhOAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtcnNhLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXVuc3VwcG9ydGVkLmRlciBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9jcmwtdW5zdXBwb3J0ZWQuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZWVmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvY3JsLXVuc3VwcG9ydGVkLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvZGVmYXVsdC5jbmYgYi9zdXBwb3J0L3NyYy90ZXN0L2phdmEvdGVzdHMvcmVzb3VyY2VzL3g1MDkvZGVmYXVsdC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMmRlYwotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvc3JjL3Rlc3QvamF2YS90ZXN0cy9yZXNvdXJjZXMveDUwOS9kZWZhdWx0LmNuZgpAQCAtMCwwICsxLDI5NCBAQAorIyBUaGlzIGlzIGJhc2VkIG9uIHRoZSBkZWZhdWx0IE9wZW5TU0wgY29uZmlndXJhdGlvbiBmaWxlIHdoaWNoIGlzCisjIGxpY2Vuc2VkIHdpdGggdGhlIGZvbGxvd2luZyBsaWNlbnNlOgorCisjIENvcHlyaWdodCAoYykgMTk5OC0yMDExIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMKKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisjICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgICAgZGlzdHJpYnV0aW9uLgorIworIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyMgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisjICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyMgICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorIworIyA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyMgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyMgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorIyAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisjCisjIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorIyAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisjICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyMKKyMgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworIyAgICBhY2tub3dsZWRnbWVudDoKKyMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorIyAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisjIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisjIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisjIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworIyAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisjIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorIworCitIT01FICAgICAgICAgICAgPSAuCitSQU5ERklMRSAgICAgICAgPSAkRU5WOjpIT01FLy5ybmQKKworIyBFeHRyYSBPQkpFQ1QgSURFTlRJRklFUiBpbmZvOgorI29pZF9maWxlICAgICAgICA9ICRFTlY6OkhPTUUvLm9pZAorb2lkX3NlY3Rpb24gICAgICAgID0gbmV3X29pZHMKKworIyBUbyB1c2UgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgIi1leHRmaWxlIiBvcHRpb24gb2YgdGhlCisjICJvcGVuc3NsIHg1MDkiIHV0aWxpdHksIG5hbWUgaGVyZSB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZQorIyBYLjUwOXYzIGV4dGVuc2lvbnMgdG8gdXNlOgorIyBleHRlbnNpb25zICAgICAgICA9CisjIChBbHRlcm5hdGl2ZWx5LCB1c2UgYSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBoYXMgb25seQorIyBYLjUwOXYzIGV4dGVuc2lvbnMgaW4gaXRzIG1haW4gWz0gZGVmYXVsdF0gc2VjdGlvbi4pCisKK1sgbmV3X29pZHMgXQorCisjIFdlIGNhbiBhZGQgbmV3IE9JRHMgaW4gaGVyZSBmb3IgdXNlIGJ5ICdjYScgYW5kICdyZXEnLgorIyBBZGQgYSBzaW1wbGUgT0lEIGxpa2UgdGhpczoKKyMgdGVzdG9pZDE9MS4yLjMuNAorIyBPciB1c2UgY29uZmlnIGZpbGUgc3Vic3RpdHV0aW9uIGxpa2UgdGhpczoKKyMgdGVzdG9pZDI9JHt0ZXN0b2lkMX0uNS42CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIGNhIF0KK2RlZmF1bHRfY2EgICAgPSBDQV9kZWZhdWx0ICAgICAgICAjIFRoZSBkZWZhdWx0IGNhIHNlY3Rpb24KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1sgQ0FfZGVmYXVsdCBdCisKK2RpciAgICAgICAgPSAvdG1wL2NhICAgICAgICAjIFdoZXJlIGV2ZXJ5dGhpbmcgaXMga2VwdAorY2VydHMgICAgICAgID0gJGRpci9jZXJ0cyAgICAgICAgIyBXaGVyZSB0aGUgaXNzdWVkIGNlcnRzIGFyZSBrZXB0CitjcmxfZGlyICAgICAgICA9ICRkaXIvY3JsICAgICAgICAjIFdoZXJlIHRoZSBpc3N1ZWQgY3JsIGFyZSBrZXB0CitkYXRhYmFzZSAgICA9ICRkaXIvaW5kZXgudHh0ICAgICMgZGF0YWJhc2UgaW5kZXggZmlsZS4KK25ld19jZXJ0c19kaXIgICAgPSAkZGlyL25ld2NlcnRzICAgICAgICAjIGRlZmF1bHQgcGxhY2UgZm9yIG5ldyBjZXJ0cy4KKworY2VydGlmaWNhdGUgICAgPSAkZGlyL2NhY2VydC5wZW0gICAgICMgVGhlIENBIGNlcnRpZmljYXRlCitzZXJpYWwgICAgICAgID0gJGRpci9zZXJpYWwgICAgICAgICAjIFRoZSBjdXJyZW50IHNlcmlhbCBudW1iZXIKK2NybCAgICAgICAgPSAkZGlyL2NybC5wZW0gICAgICAgICAjIFRoZSBjdXJyZW50IENSTAorcHJpdmF0ZV9rZXkgICAgPSAkZGlyL3ByaXZhdGUvY2FrZXkucGVtIyBUaGUgcHJpdmF0ZSBrZXkKK1JBTkRGSUxFICAgID0gJGRpci9wcml2YXRlLy5yYW5kICAgICMgcHJpdmF0ZSByYW5kb20gbnVtYmVyIGZpbGUKKworeDUwOV9leHRlbnNpb25zICAgID0gdXNyX2NlcnQgICAgICAgICMgVGhlIGV4dGVudGlvbnMgdG8gYWRkIHRvIHRoZSBjZXJ0CisKKyMgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyB0d28gbGluZXMgZm9yIHRoZSAidHJhZGl0aW9uYWwiCisjIChhbmQgaGlnaGx5IGJyb2tlbikgZm9ybWF0LgorbmFtZV9vcHQgICAgID0gY2FfZGVmYXVsdCAgICAgICAgIyBTdWJqZWN0IE5hbWUgb3B0aW9ucworY2VydF9vcHQgICAgID0gY2FfZGVmYXVsdCAgICAgICAgIyBDZXJ0aWZpY2F0ZSBmaWVsZCBvcHRpb25zCisKKyMgRXh0ZW5zaW9uIGNvcHlpbmcgb3B0aW9uOiB1c2Ugd2l0aCBjYXV0aW9uLgorIyBjb3B5X2V4dGVuc2lvbnMgPSBjb3B5CisKKyMgRXh0ZW5zaW9ucyB0byBhZGQgdG8gYSBDUkwuIE5vdGU6IE5ldHNjYXBlIGNvbW11bmljYXRvciBjaG9rZXMgb24gVjIgQ1JMcworIyBzbyB0aGlzIGlzIGNvbW1lbnRlZCBvdXQgYnkgZGVmYXVsdCB0byBsZWF2ZSBhIFYxIENSTC4KKyMgY3JsX2V4dGVuc2lvbnMgICAgPSBjcmxfZXh0CisKK2RlZmF1bHRfZGF5cyAgICA9IDM2NSAgICAgICAgICAgICMgaG93IGxvbmcgdG8gY2VydGlmeSBmb3IKK2RlZmF1bHRfY3JsX2RheXM9IDMwICAgICAgICAgICAgIyBob3cgbG9uZyBiZWZvcmUgbmV4dCBDUkwKK2RlZmF1bHRfbWQgICAgPSBzaGExICAgICAgICAgICAgIyB3aGljaCBtZCB0byB1c2UuCitwcmVzZXJ2ZSAgICA9IG5vICAgICAgICAgICAgIyBrZWVwIHBhc3NlZCBETiBvcmRlcmluZworCitwb2xpY3kgICAgICAgID0gcG9saWN5X2FueXRoaW5nCisKK1sgcG9saWN5X21hdGNoIF0KK2NvdW50cnlOYW1lICAgICAgICA9IG1hdGNoCitzdGF0ZU9yUHJvdmluY2VOYW1lICAgID0gbWF0Y2gKK29yZ2FuaXphdGlvbk5hbWUgICAgPSBtYXRjaAorb3JnYW5pemF0aW9uYWxVbml0TmFtZSAgICA9IG9wdGlvbmFsCitjb21tb25OYW1lICAgICAgICA9IHN1cHBsaWVkCitlbWFpbEFkZHJlc3MgICAgICAgID0gb3B0aW9uYWwKKworWyBwb2xpY3lfYW55dGhpbmcgXQorY291bnRyeU5hbWUgICAgICAgID0gb3B0aW9uYWwKK3N0YXRlT3JQcm92aW5jZU5hbWUgICAgPSBvcHRpb25hbAorbG9jYWxpdHlOYW1lICAgICAgICA9IG9wdGlvbmFsCitvcmdhbml6YXRpb25OYW1lICAgID0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUgICAgPSBvcHRpb25hbAorY29tbW9uTmFtZSAgICAgICAgPSBzdXBwbGllZAorZW1haWxBZGRyZXNzICAgICAgICA9IG9wdGlvbmFsCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIHJlcSBdCitkZWZhdWx0X2JpdHMgICAgICAgID0gMTAyNAorZGVmYXVsdF9rZXlmaWxlICAgICA9IHByaXZrZXkucGVtCitkaXN0aW5ndWlzaGVkX25hbWUgICAgPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lCithdHRyaWJ1dGVzICAgICAgICA9IHJlcV9hdHRyaWJ1dGVzCit4NTA5X2V4dGVuc2lvbnMgICAgPSB2M19jYSAgICAjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgc2VsZiBzaWduZWQgY2VydAorc3RyaW5nX21hc2sgPSBub21ic3RyCityZXFfZXh0ZW5zaW9ucyA9IHYzX3JlcSAjIFRoZSBleHRlbnNpb25zIHRvIGFkZCB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKworWyByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lIF0KK2NvdW50cnlOYW1lICAgICAgICAgICAgPSBDb3VudHJ5IE5hbWUgKDIgbGV0dGVyIGNvZGUpCitjb3VudHJ5TmFtZV9kZWZhdWx0ICAgICAgICA9IFVTCitjb3VudHJ5TmFtZV9taW4gICAgICAgICAgICA9IDIKK2NvdW50cnlOYW1lX21heCAgICAgICAgICAgID0gMgorCitzdGF0ZU9yUHJvdmluY2VOYW1lICAgICAgICA9IFN0YXRlIG9yIFByb3ZpbmNlIE5hbWUgKGZ1bGwgbmFtZSkKK3N0YXRlT3JQcm92aW5jZU5hbWVfZGVmYXVsdCAgICA9IENhbGlmb3JuaWEKKworbG9jYWxpdHlOYW1lICAgICAgICAgICAgPSBMb2NhbGl0eSBOYW1lIChlZywgY2l0eSkKK2xvY2FsaXR5TmFtZV9kZWZhdWx0ICAgICAgICA9IFNhbiBNYXRlbworCiswLm9yZ2FuaXphdGlvbk5hbWUgICAgICAgID0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorMC5vcmdhbml6YXRpb25OYW1lX2RlZmF1bHQgICAgPSBHZW5pdXMuY29tIEluYworCitvcmdhbml6YXRpb25hbFVuaXROYW1lICAgICAgICA9IE9yZ2FuaXphdGlvbmFsIFVuaXQgTmFtZSAoZWcsIHNlY3Rpb24pCitvcmdhbml6YXRpb25hbFVuaXROYW1lX2RlZmF1bHQgICAgPSBOZXRPcHMKKworY29tbW9uTmFtZSAgICAgICAgICAgID0gQ29tbW9uIE5hbWUgKGVnLCB5b3VyIG5hbWUgb3IgeW91ciBzZXJ2ZXJcJ3MgaG9zdG5hbWUpCitjb21tb25OYW1lX21heCAgICAgICAgICAgID0gNjQKKworZW1haWxBZGRyZXNzICAgICAgICAgICAgPSBFbWFpbCBBZGRyZXNzCitlbWFpbEFkZHJlc3NfbWF4ICAgICAgICA9IDY0CisKK1sgcmVxX2F0dHJpYnV0ZXMgXQorY2hhbGxlbmdlUGFzc3dvcmQgICAgICAgID0gQSBjaGFsbGVuZ2UgcGFzc3dvcmQKK2NoYWxsZW5nZVBhc3N3b3JkX21pbiAgICAgICAgPSA0CitjaGFsbGVuZ2VQYXNzd29yZF9tYXggICAgICAgID0gMjAKK3Vuc3RydWN0dXJlZE5hbWUgICAgICAgID0gQW4gb3B0aW9uYWwgY29tcGFueSBuYW1lCisKK1sgdW5zdXBwb3J0ZWRfY2VydCBdCisjIEp1c3QgYSBtYWRlLXVwIE9JRAorMS4yLjMuNC45OTk5OS4xLjIuMy40ID0gY3JpdGljYWwsQVNOMTpGT1JNQVQ6QklUTElTVCxCSVRTVFJJTkc6MCwxLDIKKworWyBrZXlVc2FnZV9jcml0aWNhbF9jZXJ0IF0KK2Jhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKK2tleVVzYWdlID0gY3JpdGljYWwsIGRlY2lwaGVyT25seSwga2V5QWdyZWVtZW50CisKK1sga2V5VXNhZ2VfZXh0cmFMb25nX2NlcnQgXQora2V5VXNhZ2U9QVNOMTpGT1JNQVQ6QklUTElTVCxCSVRTVFJJTkc6MCwxLDIsMyw0LDUsNiw3LDgsOSwxMAorCitbIGtleVVzYWdlX2NlcnQgXQorYmFzaWNDb25zdHJhaW50cz1DQTpGQUxTRQora2V5VXNhZ2UgPSBlbmNpcGhlck9ubHksIGtleUVuY2lwaGVybWVudCwgZGF0YUVuY2lwaGVybWVudCwga2V5Q2VydFNpZ24sIGNSTFNpZ24sIGNSTFNpZ24sIGtleUVuY2lwaGVybWVudCwgZGF0YUVuY2lwaGVybWVudCwga2V5Q2VydFNpZ24sIGNSTFNpZ24KKworWyBleHRlbmRlZEtleVVzYWdlX2NlcnQgXQorZXh0ZW5kZWRLZXlVc2FnZT0xLjIuMy40CisKK1sgdXNlcldpdGhQYXRoTGVuX2NlcnQgXQorYmFzaWNDb25zdHJhaW50cz1DQTpmYWxzZSxwYXRobGVuOjEwCisKK1sgY2FfY2VydCBdCitiYXNpY0NvbnN0cmFpbnRzPUNBOnRydWUKKworWyBjYVdpdGhQYXRoTGVuX2NlcnQgXQorYmFzaWNDb25zdHJhaW50cz1DQTp0cnVlLHBhdGhsZW46MTAKKworWyBpbnZhbGlkX2lwX2NlcnQgXQorc3ViamVjdEFsdE5hbWUgPSBBU04xOlNFUVVFTkNFOmludmFsaWRfaXBfU0VRCitpc3N1ZXJBbHROYW1lID0gQVNOMTpTRVFVRU5DRTppbnZhbGlkX2lwX1NFUQorCitbIGludmFsaWRfaXBfU0VRIF0KK0lQLjEgPSBJTVBMSUNJVDo3LEZPUk1BVDpIRVgsT0NURVRTVFJJTkc6MEEKKworWyBpcHY2X2NlcnQgXQorc3ViamVjdEFsdE5hbWUgPSBBU04xOlNFUVVFTkNFOmlwdjZfU0VRCitpc3N1ZXJBbHROYW1lID0gQVNOMTpTRVFVRU5DRTppcHY2X1NFUQorCitbIGlwdjZfU0VRIF0KK0lQLjEgPSBJTVBMSUNJVDo3LEZPUk1BVDpIRVgsT0NURVRTVFJJTkc6MjAwMTBEQjgwMDAwMDAwMDAwMDBGRjAwMDA0MjgzMjkKKworWyB1c3JfY2VydCBdCitiYXNpY0NvbnN0cmFpbnRzPUNBOkZBTFNFCitrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyOmFsd2F5cworbnNDb21tZW50ICAgICAgICAgICAgPSAiWC41MDkgVW5pdCBUZXN0IgorCitzdWJqZWN0QWx0TmFtZSA9IEBhbHRfbmFtZXMKK2lzc3VlckFsdE5hbWUgPSBAYWx0X25hbWVzCisjc3ViamVjdEFsdE5hbWUgPSBBU04xOlNFUVVFTkNFOnJhd19hbHRfbmFtZXMKKworWyBhbHRfbm9uZV9jZXJ0IF0KKworWyBhbHRfbmFtZXMgXQorb3RoZXJOYW1lLjAgPSAxLjIuMy40O1VURjg6dGVzdDEKK2VtYWlsLjAgPSB4NTA5QGV4YW1wbGUuY29tCitETlMuMCA9IHg1MDkuZXhhbXBsZS5jb20KK2Rpck5hbWUuMCA9IGRpcl9leGFtcGxlCitVUkkuMCA9IGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP3E9YXdlc29tZW5lc3MKK0lQLjAgPSAxOTIuMTY4LjAuMQorUklELjAgPSAxLjIuMy40CisKK1sgYWx0X290aGVyX2NlcnQgXQorc3ViamVjdEFsdE5hbWUgPSBvdGhlck5hbWU6MS4yLjMuNDtVVEY4OnRlc3QxCisKK1sgYWx0X2VtYWlsX2NlcnQgXQorc3ViamVjdEFsdE5hbWUgPSBlbWFpbDp4NTA5QGV4YW1wbGUuY29tCisKK1sgYWx0X2Ruc19jZXJ0IF0KK3N1YmplY3RBbHROYW1lID0gRE5TOng1MDkuZXhhbXBsZS5jb20KKworWyBhbHRfZGlybmFtZV9jZXJ0IF0KK3N1YmplY3RBbHROYW1lID0gZGlyTmFtZTpkaXJfZXhhbXBsZQorCitbIGFsdF91cmlfY2VydCBdCitzdWJqZWN0QWx0TmFtZSA9IFVSSTpodHRwOi8vd3d3LmV4YW1wbGUuY29tLz9xPWF3ZXNvbWVuZXNzCisKK1sgYWx0X3JpZF9jZXJ0IF0KK3N1YmplY3RBbHROYW1lID0gUklEOjEuMi4zLjQKKworWyByYXdfYWx0X25hbWVzIF0KK2VkaVBhcnR5TmFtZSA9IElNUExJQ0lUOjUsU0VRVUVOQ0U6ZWRpUGFydHlOYW1lX1NFUQoreDQwMCA9IElNUExJQ0lUOjMsU0VRVUVOQ0U6eDQwMF9TRVEKKworWyB4NDAwX1NFUSBdCitCdWlsdEluU3RhbmRhcmRBdHRyaWJ1dGVzID0gU0VRVUVOQ0U6eDQwMF9CdWlsdEluU3RhbmRhcmRBZGR0cmlidXRlc19TRVEKKworWyB4NDAwX0J1aWx0SW5TdGFuZGFyZEFkZHRyaWJ1dGVzX1NFUSBdCitQZXJzb25hbE5hbWU9SU1QTElDSVQ6NSxTRVQ6eDQwMF9QZXJzb25hbE5hbWVfU0VUCisKK1sgeDQwMF9QZXJzb25hbE5hbWVfU0VUIF0KK1N1cm5hbWU9SU1QTElDSVQ6MCxQUklOVEFCTEVTVFJJTkc6Um9vdAorR2l2ZW5OYW1lPUlNUExJQ0lUOjEsUFJJTlRBQkxFU1RSSU5HOktlbm55CisKK1sgZWRpUGFydHlOYW1lX1NFUSBdCitwYXJ0eU5hbWUgPSBJTVBMSUNJVDoxLFBSSU5UQUJMRVNUUklORzpKb2UKKworWyBkaXJfZXhhbXBsZSBdCitDPVVTCitPPUF3ZXNvbWUgRHVkZXMKK09VPcOcYmVyIEZyw65lbmRzCitDTj1leGFtcGxlIFguNTA5CitDTj3iiIbGkgorCitbIHYzX3JlcSBdCitiYXNpY0NvbnN0cmFpbnRzID0gQ0E6RkFMU0UKK2tleVVzYWdlID0gbm9uUmVwdWRpYXRpb24sIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorc3ViamVjdEFsdE5hbWUgPSBAYWx0X25hbWVzCitpc3N1ZXJBbHROYW1lID0gQGFsdF9uYW1lcworYmFzaWNDb25zdHJhaW50cz1DQTpGQUxTRQorbnNDb21tZW50ICAgICAgICAgICAgPSAiWC41MDkgVW5pdCBUZXN0IgorCitbIHYzX2NhIF0KK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQ6YWx3YXlzLGlzc3VlcjphbHdheXMKK2Jhc2ljQ29uc3RyYWludHMgPSBDQTp0cnVlCisKK1sgY3JsX2V4dCBdCithdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkOmFsd2F5cyxpc3N1ZXI6YWx3YXlzCmRpZmYgLS1naXQgYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFBhcnNlci5qYXZhIGIveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2lvL0tYbWxQYXJzZXIuamF2YQppbmRleCAyYmU4ZDM2Li44MGZkOGNhIDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFBhcnNlci5qYXZhCisrKyBiL3htbC9zcmMvbWFpbi9qYXZhL29yZy9reG1sMi9pby9LWG1sUGFyc2VyLmphdmEKQEAgLTE2MTIsNyArMTYxMiw3IEBACiAgICAgICAgIGJvb2xlYW4gZGV0ZWN0Q2hhcnNldCA9IChjaGFyc2V0ID09IG51bGwpOwogCiAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpcyA9PSBudWxsIik7CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEveG1sL3NyYy9tYWluL2phdmEvb3JnL2t4bWwyL2lvL0tYbWxTZXJpYWxpemVyLmphdmEgYi94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFNlcmlhbGl6ZXIuamF2YQppbmRleCBkMTk2NWQ2Li44ZmEyNzU2IDEwMDY0NAotLS0gYS94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFNlcmlhbGl6ZXIuamF2YQorKysgYi94bWwvc3JjL21haW4vamF2YS9vcmcva3htbDIvaW8vS1htbFNlcmlhbGl6ZXIuamF2YQpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGVuY29kaW5nKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAob3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9zID09IG51bGwiKTsKICAgICAgICAgc2V0T3V0cHV0KAogICAgICAgICAgICAgZW5jb2RpbmcgPT0gbnVsbAogICAgICAgICAgICAgICAgID8gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcykK