ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzYwLzYwZDY4YzgyMGY0ZjRmYWJjMjIwNDNhNWYzZTBiODNlYTBjZmUzN2Muc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS82MC82MGQ2OGM4MjBmNGY0ZmFiYzIyMDQzYTVmM2UwYjgzZWEwY2ZlMzdjLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGRmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS82MC82MGQ2OGM4MjBmNGY0ZmFiYzIyMDQzYTVmM2UwYjgzZWEwY2ZlMzdjLnN2bi1iYXNlCkBAIC0wLDAgKzEsMzY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQworKiogICA+IFNvZnR3YXJlIFJlbGVhc2UgMi4xICgyMDA4LTA2KQorKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKyoqCisqKiAgIKkgMjAwNCBQb2x5Y29tLCBJbmMuCisqKgorKioJIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZpbGVuYW1lOiBkY3RfdHlwZV9pdl9hLmMKKyoKKyogUHVycG9zZTogIERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0sIFR5cGUgSVYgdXNlZCBmb3IgTUxUCisqCisqIFRoZSBiYXNpcyBmdW5jdGlvbnMgYXJlCisqCisqCSBjb3MoUEkqKHQrMC41KSooayswLjUpL2Jsb2NrX2xlbmd0aCkKKyoKKyogZm9yIHRpbWUgdCBhbmQgYmFzaXMgZnVuY3Rpb24gbnVtYmVyIGsuICBEdWUgdG8gdGhlIHN5bW1ldHJ5IG9mIHRoZSBleHByZXNzaW9uCisqIGluIHQgYW5kIGssIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGZvcndhcmQgYW5kIGludmVyc2UgdHJhbnNmb3JtcyBhcmUgdGhlIHNhbWUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiY291bnQuaCIKKyNpbmNsdWRlICJkY3Q0X2EuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEV4dGVybmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIFdvcmQxNiAgICAgICBhbmFsX2JpYXNbRENUX0xFTkdUSF07CitleHRlcm4gV29yZDE2ICAgICAgIGRjdF9jb3JlX2FbRENUX0xFTkdUSF9ESVZfMzJdW0RDVF9MRU5HVEhfRElWXzMyXTsKK2V4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl8yIFtEQ1RfTEVOR1RIX0RJVl8zMl07CitleHRlcm4gY29zX21zaW5fdCAgIGFfY29zX21zaW5fNCBbRENUX0xFTkdUSF9ESVZfMTZdOworZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzggW0RDVF9MRU5HVEhfRElWXzhdOworZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzE2W0RDVF9MRU5HVEhfRElWXzRdOworZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzMyW0RDVF9MRU5HVEhfRElWXzJdOworZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzY0W0RDVF9MRU5HVEhdOworZXh0ZXJuIGNvc19tc2luX3QgICAqYV9jb3NfbXNpbl90YWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGRjdF90eXBlX2l2X2EKKworIFN5bnRheDogICAgICB2b2lkIGRjdF90eXBlX2l2X2EgKGlucHV0LCBvdXRwdXQsIGRjdF9sZW5ndGgpIAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgaW5wdXRbXSwgb3V0cHV0W10sIGRjdF9sZW5ndGg7ICAgICAgICAgICAgICAKKworIERlc2NyaXB0aW9uOiBEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtLCBUeXBlIElWIHVzZWQgZm9yIE1MVAorCisgRGVzaWduIE5vdGVzOgorICAgICAgICAgICAgICAgIAorIFdNT1BTOiAgICAgICAgICB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAxLjE0ICAgICAgfCAgICAgMS4xNAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMS4xNCAgICAgIHwgICAgIDEuMTQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAyLjU3ICAgICAgfCAgICAgMi41NyAgICAgICB8ICAgICAyLjU3CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAyLjU3ICAgICAgfCAgICAgMi41NyAgICAgICB8ICAgICAyLjU3CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGRjdF90eXBlX2l2X2EgKFdvcmQxNiAqaW5wdXQsV29yZDE2ICpvdXRwdXQsV29yZDE2IGRjdF9sZW5ndGgpCit7CisgICAgV29yZDE2ICAgYnVmZmVyX2FbTUFYX0RDVF9MRU5HVEhdLCBidWZmZXJfYltNQVhfRENUX0xFTkdUSF0sIGJ1ZmZlcl9jW01BWF9EQ1RfTEVOR1RIXTsKKyAgICBXb3JkMTYgICAqaW5fcHRyLCAqaW5fcHRyX2xvdywgKmluX3B0cl9oaWdoLCAqbmV4dF9pbl9iYXNlOworICAgIFdvcmQxNiAgICpvdXRfcHRyX2xvdywgKm91dF9wdHJfaGlnaCwgKm5leHRfb3V0X2Jhc2U7CisgICAgV29yZDE2ICAgKm91dF9idWZmZXIsICppbl9idWZmZXIsICpidWZmZXJfc3dhcDsKKyAgICBXb3JkMTYgICBpbl92YWxfbG93LCBpbl92YWxfaGlnaDsKKyAgICBXb3JkMTYgICBvdXRfdmFsX2xvdywgb3V0X3ZhbF9oaWdoOworICAgIFdvcmQxNiAgIGluX2xvd19ldmVuLCBpbl9sb3dfb2RkOworICAgIFdvcmQxNiAgIGluX2hpZ2hfZXZlbiwgaW5faGlnaF9vZGQ7CisgICAgV29yZDE2ICAgb3V0X2xvd19ldmVuLCBvdXRfbG93X29kZDsKKyAgICBXb3JkMTYgICBvdXRfaGlnaF9ldmVuLCBvdXRfaGlnaF9vZGQ7CisgICAgV29yZDE2ICAgKnBhaXJfcHRyOworICAgIFdvcmQxNiAgIGNvc19ldmVuLCBjb3Nfb2RkLCBtc2luX2V2ZW4sIG1zaW5fb2RkOworICAgIFdvcmQxNiAgIG5lZ19jb3Nfb2RkOworICAgIFdvcmQxNiAgIG5lZ19tc2luX2V2ZW47CisgICAgV29yZDMyICAgc3VtOworICAgIFdvcmQxNiAgIHNldF9zcGFuLCBzZXRfY291bnQsIHNldF9jb3VudF9sb2csIHBhaXJzX2xlZnQsIHNldHNfbGVmdDsKKyAgICBXb3JkMTYgICBpLGs7CisgICAgV29yZDE2ICAgaW5kZXg7CisgICAgY29zX21zaW5fdCAgKip0YWJsZV9wdHJfcHRyLCAqY29zX21zaW5fcHRyOworICAgIAorICAgIFdvcmQxNiAgIHRlbXA7CisgICAgV29yZDMyICAgYWNjYTsKKworICAgIFdvcmQxNiAgIGRjdF9sZW5ndGhfbG9nOworCisKKyAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCisgICAgLyogRG8gdGhlIHN1bS9kaWZmZXJlbmNlIGJ1dHRlcmZsaWVzLCB0aGUgZmlyc3QgcGFydCBvZiAqLworICAgIC8qIGNvbnZlcnRpbmcgb25lIE4tcG9pbnQgdHJhbnNmb3JtIGludG8gTi8yIHR3by1wb2ludCAgKi8KKyAgICAvKiB0cmFuc2Zvcm1zLCB3aGVyZSBOID0gMSA8PCBEQ1RfTEVOR1RIX0xPRy4gPSA2NC8xMjggICovCisgICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLworICAgIHRlc3QoKTsKKyAgICBpZiAoZGN0X2xlbmd0aD09RENUX0xFTkdUSCkKKyAgICB7CisgICAgICAgIGRjdF9sZW5ndGhfbG9nID0gRENUX0xFTkdUSF9MT0c7CisKKyAgICAgICAgLyogQWRkIGJpYXMgb2Zmc2V0cyAqLworICAgICAgICBmb3IgKGk9MDtpPGRjdF9sZW5ndGg7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnB1dFtpXSA9IGFkZChpbnB1dFtpXSxhbmFsX2JpYXNbaV0pOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBkY3RfbGVuZ3RoX2xvZyA9IE1BWF9EQ1RfTEVOR1RIX0xPRzsKKworICAgIGluZGV4ID0gMEw7CisgICAgbW92ZTE2KCk7CisKKyAgICBpbl9idWZmZXIgID0gaW5wdXQ7CisgICAgbW92ZTE2KCk7CisKKyAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2E7CisgICAgbW92ZTE2KCk7CisKKyAgICB0ZW1wID0gc3ViKGRjdF9sZW5ndGhfbG9nLDIpOworICAgIGZvciAoc2V0X2NvdW50X2xvZz0wO3NldF9jb3VudF9sb2c8PXRlbXA7c2V0X2NvdW50X2xvZysrKQorICAgIHsKKworICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgICAgIC8qICAgIHNldF9zcGFuICAgICAgPSAxIDw8IChEQ1RfTEVOR1RIX0xPRyAtIHNldF9jb3VudF9sb2cpOyAqLworICAgICAgICBzZXRfc3BhbiA9IHNocl9ub2NoZWNrKGRjdF9sZW5ndGgsc2V0X2NvdW50X2xvZyk7CisKKyAgICAgICAgc2V0X2NvdW50ICAgICA9IHNobF9ub2NoZWNrKDEsc2V0X2NvdW50X2xvZyk7CisKKyAgICAgICAgaW5fcHRyICAgICAgICA9IGluX2J1ZmZlcjsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dF9idWZmZXI7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIHNldHMgb2YgdGhpcyBzaXplICovCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICAgICAgZm9yIChzZXRzX2xlZnQ9c2V0X2NvdW50O3NldHNfbGVmdD4wO3NldHNfbGVmdC0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLworICAgICAgICAgICAgLyogU2V0IHVwIG91dHB1dCBwb2ludGVycyBmb3IgdGhlIGN1cnJlbnQgc2V0ICovCisgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KKworICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOworICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSAgPSBuZXh0X291dF9iYXNlICsgc2V0X3NwYW47CisgICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CisKKyAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLworICAgICAgICAgICAgLyogTG9vcCBvdmVyIGFsbCB0aGUgYnV0dGVyZmxpZXMgaW4gdGhlIGN1cnJlbnQgc2V0ICovCisgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KKworICAgICAgICAgICAgZG8gCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5fdmFsX2xvdyAgICAgID0gKmluX3B0cisrOworICAgICAgICAgICAgICAgIGluX3ZhbF9oaWdoICAgICA9ICppbl9wdHIrKzsKKwkJLy8gYmxwOiBhZGRpdGlvbiBvZiB0d28gMTZiaXRzIHZhcnMsIHRoZXJlJ3Mgbm8gd2F5CisJCS8vICAgICAgdGhleSdsbCBvdmVyZmxvdyBhIDMyYml0IHZhcgorICAgICAgICAgICAgICAgIC8vYWNjYSAgICAgICAgICAgID0gTF9hZGQoaW5fdmFsX2xvdyxpbl92YWxfaGlnaCk7CisJCWFjY2EgPSAoaW5fdmFsX2xvdyArIGluX3ZhbF9oaWdoKTsKKwkJYWNjYSAgICAgICAgICAgID0gTF9zaHJfbm9jaGVjayhhY2NhLDEpOworICAgICAgICAgICAgICAgIG91dF92YWxfbG93ICAgICA9IGV4dHJhY3RfbChhY2NhKTsKKworICAgICAgICAgICAgICAgIGFjY2EgICAgICAgICAgICA9IExfc3ViKGluX3ZhbF9sb3csaW5fdmFsX2hpZ2gpOworICAgICAgICAgICAgICAgIGFjY2EgICAgICAgICAgICA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKKyAgICAgICAgICAgICAgICBvdXRfdmFsX2hpZ2ggICAgPSBleHRyYWN0X2woYWNjYSk7CisKKyAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfdmFsX2xvdzsKKyAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfdmFsX2hpZ2g7CisKKyAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICB9IHdoaWxlIChvdXRfcHRyX2xvdyA8IG91dF9wdHJfaGlnaCk7CisKKyAgICAgICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldHMgb2YgdGhlIGN1cnJlbnQgc2l6ZSAqLworCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAgICAgLyogRGVjaWRlIHdoaWNoIGJ1ZmZlcnMgdG8gdXNlIGFzIGlucHV0IGFuZCBvdXRwdXQgbmV4dCB0aW1lLiAqLworICAgICAgICAvKiBFeGNlcHQgZm9yIHRoZSBmaXJzdCB0aW1lICh3aGVuIHRoZSBpbnB1dCBidWZmZXIgaXMgdGhlICAgICovCisgICAgICAgIC8qIHN1YnJvdXRpbmUgaW5wdXQpIHdlIGp1c3QgYWx0ZXJuYXRlIHRoZSBsb2NhbCBidWZmZXJzLiAgICAgKi8KKyAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgICAgIGluX2J1ZmZlciA9IG91dF9idWZmZXI7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBpZiAob3V0X2J1ZmZlciA9PSBidWZmZXJfYSkKKyAgICAgICAgICAgIG91dF9idWZmZXIgPSBidWZmZXJfYjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0X2J1ZmZlciA9IGJ1ZmZlcl9hOworICAgICAgICBpbmRleCA9IGFkZChpbmRleCwxKTsKKworICAgIH0gLyogRW5kIG9mIGxvb3Agb3ZlciBzZXQgc2l6ZXMgKi8KKworCisgICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCisgICAgLyogRG8gTi8yIHR3by1wb2ludCB0cmFuc2Zvcm1zLCAgICovCisgICAgLyogd2hlcmUgTiA9ICAxIDw8IERDVF9MRU5HVEhfTE9HICovCisgICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCisKKyAgICBwYWlyX3B0ciA9IGluX2J1ZmZlcjsKKyAgICBtb3ZlMTYoKTsKKworICAgIGJ1ZmZlcl9zd2FwID0gYnVmZmVyX2M7CisgICAgbW92ZTE2KCk7CisKKyAgICB0ZW1wID0gc3ViKGRjdF9sZW5ndGhfbG9nLDEpOworICAgIHRlbXAgPSBzaGxfbm9jaGVjaygxLHRlbXApOworCisgICAgZm9yIChwYWlyc19sZWZ0PXRlbXA7IHBhaXJzX2xlZnQgPiAwOyBwYWlyc19sZWZ0LS0pCisgICAgeworICAgICAgICBmb3IgKCBrPTA7IGs8Q09SRV9TSVpFOyBrKysgKQorICAgICAgICB7CisjaWYgUEpfSEFTX0lOVDY0CisJICAgIC8qIGJscDogZGFuZ2VyIGRhbmdlciEgbm90IHJlYWxseSBjb21wYXRpYmxlIGJ1dCBmYXN0ZXIgKi8KKwkgICAgcGpfaW50NjRfdCBzdW02ND0wOworICAgICAgICAgICAgbW92ZTMyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGk9MDsgaTxDT1JFX1NJWkU7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VtNjQgKz0gTF9tdWx0KHBhaXJfcHRyW2ldLCBkY3RfY29yZV9hW2ldW2tdKTsKKyAgICAgICAgICAgIH0KKwkgICAgc3VtID0gTF9zYXR1cmF0ZShzdW02NCk7CisjZWxzZQorICAgICAgICAgICAgc3VtPTBMOworICAgICAgICAgICAgbW92ZTMyKCk7CisgICAgICAgICAgICBmb3IgKCBpPTA7IGk8Q09SRV9TSVpFOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSwgcGFpcl9wdHJbaV0sZGN0X2NvcmVfYVtpXVtrXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGJ1ZmZlcl9zd2FwW2tdID0gaXR1X3JvdW5kKHN1bSk7CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCisgICAgICAgIHBhaXJfcHRyICAgKz0gQ09SRV9TSVpFOworICAgICAgICBidWZmZXJfc3dhcCArPSBDT1JFX1NJWkU7CisgICAgfQorCisgICAgZm9yIChpPTA7aTxkY3RfbGVuZ3RoO2krKykKKyAgICB7CisgICAgICAgIGluX2J1ZmZlcltpXSA9IGJ1ZmZlcl9jW2ldOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisgICAgCisgICAgdGFibGVfcHRyX3B0ciA9IGFfY29zX21zaW5fdGFibGU7CisKKyAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCisgICAgLyogUGVyZm9ybSByb3RhdGlvbiBidXR0ZXJmbGllcyAqLworICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KKyAgICB0ZW1wID0gc3ViKGRjdF9sZW5ndGhfbG9nLDIpOworICAgIGZvciAoc2V0X2NvdW50X2xvZyA9IHRlbXA7IHNldF9jb3VudF9sb2cgPj0gMDsgICAgc2V0X2NvdW50X2xvZy0tKQorICAgIHsKKyAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgICAgIC8qIEluaXRpYWxpemF0aW9uIGZvciB0aGUgbG9vcCBvdmVyIHNldHMgYXQgdGhlIGN1cnJlbnQgc2l6ZSAqLworICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAgICAgLyogICAgc2V0X3NwYW4gICAgICA9IDEgPDwgKERDVF9MRU5HVEhfTE9HIC0gc2V0X2NvdW50X2xvZyk7ICovCisgICAgICAgIHNldF9zcGFuID0gc2hyX25vY2hlY2soZGN0X2xlbmd0aCxzZXRfY291bnRfbG9nKTsKKworICAgICAgICBzZXRfY291bnQgICAgID0gc2hsX25vY2hlY2soMSxzZXRfY291bnRfbG9nKTsKKyAgICAgICAgbmV4dF9pbl9iYXNlICA9IGluX2J1ZmZlcjsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAoc2V0X2NvdW50X2xvZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0X291dF9iYXNlID0gb3V0cHV0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dF9idWZmZXI7CisgICAgICAgIH0KKworCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIHNldHMgb2YgdGhpcyBzaXplICovCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgICAgIGZvciAoc2V0c19sZWZ0ID0gc2V0X2NvdW50OyBzZXRzX2xlZnQgPiAwO3NldHNfbGVmdC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KKyAgICAgICAgICAgIC8qIFNldCB1cCB0aGUgcG9pbnRlcnMgZm9yIHRoZSBjdXJyZW50IHNldCAqLworICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCisgICAgICAgICAgICBpbl9wdHJfbG93ICAgICA9IG5leHRfaW5fYmFzZTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgdGVtcCAgICAgICAgICAgPSBzaHJfbm9jaGVjayhzZXRfc3BhbiwxKTsKKworICAgICAgICAgICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCisgICAgICAgICAgICBpbl9wdHJfaGlnaCAgICA9IGluX3B0cl9sb3cgKyB0ZW1wOworICAgICAgICAgICAgbmV4dF9pbl9iYXNlICArPSBzZXRfc3BhbjsKKyAgICAgICAgICAgIG91dF9wdHJfbG93ICAgID0gbmV4dF9vdXRfYmFzZTsKKyAgICAgICAgICAgIG5leHRfb3V0X2Jhc2UgKz0gc2V0X3NwYW47CisgICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CisgICAgICAgICAgICBjb3NfbXNpbl9wdHIgICA9ICp0YWJsZV9wdHJfcHRyOworCisgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCisgICAgICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBidXR0ZXJmbHkgcGFpcnMgaW4gdGhlIGN1cnJlbnQgc2V0ICovCisgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCisKKyAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLworICAgICAgICAgICAgICAgIGluX2xvd19ldmVuICAgICA9ICppbl9wdHJfbG93Kys7CisgICAgICAgICAgICAgICAgaW5fbG93X29kZCAgICAgID0gKmluX3B0cl9sb3crKzsKKyAgICAgICAgICAgICAgICBpbl9oaWdoX2V2ZW4gICAgPSAqaW5fcHRyX2hpZ2grKzsKKyAgICAgICAgICAgICAgICBpbl9oaWdoX29kZCAgICAgPSAqaW5fcHRyX2hpZ2grKzsKKyAgICAgICAgICAgICAgICBjb3NfZXZlbiAgICAgICAgPSBjb3NfbXNpbl9wdHJbMF0uY29zaW5lOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIG1zaW5fZXZlbiAgICAgICA9IGNvc19tc2luX3B0clswXS5taW51c19zaW5lOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIGNvc19vZGQgICAgICAgICA9IGNvc19tc2luX3B0clsxXS5jb3NpbmU7CisgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgbXNpbl9vZGQgICAgICAgID0gY29zX21zaW5fcHRyWzFdLm1pbnVzX3NpbmU7CisgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgY29zX21zaW5fcHRyICAgKz0gMjsKKworICAgICAgICAgICAgICAgIHN1bSA9IDBMOworICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sY29zX2V2ZW4saW5fbG93X2V2ZW4pOworICAgICAgICAgICAgICAgIG5lZ19tc2luX2V2ZW4gPSBuZWdhdGUobXNpbl9ldmVuKTsKKyAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG5lZ19tc2luX2V2ZW4saW5faGlnaF9ldmVuKTsKKyAgICAgICAgICAgICAgICBvdXRfbG93X2V2ZW4gPSBpdHVfcm91bmQoc3VtKTsKKworICAgICAgICAgICAgICAgIHN1bSA9IDBMOworICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sbXNpbl9ldmVuLGluX2xvd19ldmVuKTsKKyAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLGNvc19ldmVuLGluX2hpZ2hfZXZlbik7CisgICAgICAgICAgICAgICAgb3V0X2hpZ2hfZXZlbj0gaXR1X3JvdW5kKHN1bSk7CisKKyAgICAgICAgICAgICAgICBzdW0gPSAwTDsKKyAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLGNvc19vZGQsaW5fbG93X29kZCk7CisgICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxtc2luX29kZCxpbl9oaWdoX29kZCk7CisgICAgICAgICAgICAgICAgb3V0X2xvd19vZGQ9IGl0dV9yb3VuZChzdW0pOworCisgICAgICAgICAgICAgICAgc3VtID0gMEw7CisgICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxtc2luX29kZCxpbl9sb3dfb2RkKTsKKyAgICAgICAgICAgICAgICBuZWdfY29zX29kZCA9IG5lZ2F0ZShjb3Nfb2RkKTsKKyAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG5lZ19jb3Nfb2RkLGluX2hpZ2hfb2RkKTsKKyAgICAgICAgICAgICAgICBvdXRfaGlnaF9vZGQ9IGl0dV9yb3VuZChzdW0pOworCisgICAgICAgICAgICAgICAgKm91dF9wdHJfbG93KysgID0gb3V0X2xvd19ldmVuOworICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF9oaWdoX2V2ZW47CisgICAgICAgICAgICAgICAgKm91dF9wdHJfbG93KysgID0gb3V0X2xvd19vZGQ7CisgICAgICAgICAgICAgICAgKi0tb3V0X3B0cl9oaWdoID0gb3V0X2hpZ2hfb2RkOworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKKworICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCisKKyAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgICAgICAvKiBTd2FwIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IgbmV4dCB0aW1lICovCisgICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgICAgICBidWZmZXJfc3dhcCA9IGluX2J1ZmZlcjsKKyAgICAgICAgaW5fYnVmZmVyICAgPSBvdXRfYnVmZmVyOworICAgICAgICBvdXRfYnVmZmVyICA9IGJ1ZmZlcl9zd2FwOworICAgICAgICB0YWJsZV9wdHJfcHRyKys7CisgICAgfQorfQorCg==