ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDVlNGQ4MWQuLjc5M2NiZjQgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTc4LDYgKzc4LDkgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC9saWJidW5kbGV3cmFwcGVyLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYmF1ZGlvcHJlcHJvY2Vzc2luZy5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlibWVkaWFjb2RlY3NlcnZpY2Uuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay9saWJzdGFnZWZyaWdodF9zb2Z0XyopCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDA1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9PV05FUlMKQEAgLTAsMCArMSw0IEBACitlbGF1cmVudEBnb29nbGUuY29tCitldGFsdmFsYUBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcCBiL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcAppbmRleCA3ZTYyOTdjLi44NjIwZjM2IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKKysrIGIvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCkBAIC0xOTIsMTIgKzE5MiwxNCBAQAogICAgICAgICAgICAgdGltZXN0YW1wcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEucmVhZEludDY0KCZ0aW1lc3RhbXBzW2ldKTsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHQ7CisgICAgICAgICAgICAgICAgcmVzID0gZGF0YS5yZWFkSW50NjQoJnQpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXBbJWRdOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2hfYmFjayh0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKaW5kZXggYzk1NDI0MS4uNjZmYWY4ZiAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwCkBAIC0xNDYsMTIgKzE0NiwxNCBAQAogICAgICAgICAgICAgdGltZXN0YW1wcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEucmVhZEludDY0KCZ0aW1lc3RhbXBzW2ldKTsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHQ7CisgICAgICAgICAgICAgICAgcmVzID0gZGF0YS5yZWFkSW50NjQoJnQpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXBbJWRdOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2hfYmFjayh0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhY2ZlZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjeWNoZW5AZ29vZ2xlLmNvbQorZXBlZXZAZ29vZ2xlLmNvbQorZXRhbHZhbGFAZ29vZ2xlLmNvbQorc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoreWluY2hpYXllaEBnb29nbGUuY29tCit6aGlqdW5oZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbAppbmRleCA4MzA4MDk1Li4yODI1MmMwIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTQyLDcgKzQyLDkgQEAKICAgICAgKiBSZXBlYXRpbmcgcmVxdWVzdCBlbmNvdW50ZXJlZCBhbiBlcnJvciBhbmQgd2FzIHN0b3BwZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbGFzdEZyYW1lTnVtYmVyIEZyYW1lIG51bWJlciBvZiB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgc3RyZWFtaW5nIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlcGVhdGluZ1JlcXVlc3RJZCB0aGUgSUQgb2YgdGhlIHJlcGVhdGluZyByZXF1ZXN0IGJlaW5nIHN0b3BwZWQKICAgICAgKi8KLSAgICBvbmV3YXkgdm9pZCBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbiBsb25nIGxhc3RGcmFtZU51bWJlcik7CisgICAgb25ld2F5IHZvaWQgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW4gbG9uZyBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IHJlcGVhdGluZ1JlcXVlc3RJZCk7CiAgICAgb25ld2F5IHZvaWQgb25SZXF1ZXN0UXVldWVFbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDIyOWIxNTkuLjNhZTIwOGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTEzNTMsNyArMTM1Myw4IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzCi1DYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIHsKK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKIAogICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CkBAIC0xMzY0LDcgKzEzNjUsOSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKIAogICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZDsKLSAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIGlmIChzdG9wcGVkU2VxdWVuY2VJZCA9PSByZXBlYXRpbmdTZXF1ZW5jZUlkKSB7CisgICAgICAgIGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisgICAgfQogCiAgICAgZGV2LT5jaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggYzU2NmNkMi4uODU1ZWZlMSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC03NSw3ICs3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblByZXBhcmVkKGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUmVxdWVzdFF1ZXVlRW1wdHkoKSBvdmVycmlkZTsKLSAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIG92ZXJyaWRlOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSBvdmVycmlkZTsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKICAgICB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKaW5kZXggOTQ2ZTNiOC4uNTFkOTIxNCAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0yMTcsOCArMjE3LDEwIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLCBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSB7CiAgICAgICAgICh2b2lkKSBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgICh2b2lkKSBzdG9wcGVkU2VxdWVuY2VJZDsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgICAgICBtTGFzdFN0YXR1cyA9IFJFUEVBVElOR19SRVFVRVNUX0VSUk9SOwogICAgICAgICBtU3RhdHVzZXNIaXQucHVzaF9iYWNrKG1MYXN0U3RhdHVzKTsKZGlmZiAtLWdpdCBhL2NtZHMvT1dORVJTIGIvY21kcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzMmFhYwotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBkZTAxNjdhLi5iYzMyYmJlIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTc4LDcgKzc4LDcgQEAKIHN0YXRpYyBib29sIGdXYW50RnJhbWVUaW1lID0gZmFsc2U7ICAgICAvLyBkbyB3ZSB3YW50IHRpbWVzIG9uIGVhY2ggZnJhbWU/CiBzdGF0aWMgdWludDMyX3QgZ1ZpZGVvV2lkdGggPSAwOyAgICAgICAgLy8gZGVmYXVsdCB3aWR0aCtoZWlnaHQKIHN0YXRpYyB1aW50MzJfdCBnVmlkZW9IZWlnaHQgPSAwOwotc3RhdGljIHVpbnQzMl90IGdCaXRSYXRlID0gNDAwMDAwMDsgICAgIC8vIDRNYnBzCitzdGF0aWMgdWludDMyX3QgZ0JpdFJhdGUgPSAyMDAwMDAwMDsgICAgIC8vIDIwTWJwcwogc3RhdGljIHVpbnQzMl90IGdUaW1lTGltaXRTZWMgPSBrTWF4VGltZUxpbWl0U2VjOwogCiAvLyBTZXQgYnkgc2lnbmFsIGhhbmRsZXIgdG8gc3RvcCByZWNvcmRpbmcuCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGQ3YzJlODcuLmQ3MDI4MmIgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC04NzAsNyArODcwLDkgQEAKIAogICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0KICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyptZXRhT25seSovKTsKIAogICAgICAgICAgICAgaWYgKG1lbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcm0vT1dORVJTIGIvZHJtL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg4NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL09XTkVSUwpAQCAtMCwwICsxIEBACitqdGlua2VyQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggNjZmNWZjMi4uZjkwNjU2NCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTUsMzYgKzUsMzEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFkcm0iLAogCi0gICAgYWlkbDogewotICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiYWlkbCJdLAotICAgICAgICBleHBvcnRfYWlkbF9oZWFkZXJzOiB0cnVlLAotICAgIH0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUNhc1NlcnZpY2UuYWlkbCIsCi0KLSAgICAgICAgIkNhc0ltcGwuY3BwIiwKLSAgICAgICAgIkRlc2NyYW1ibGVySW1wbC5jcHAiLAogICAgICAgICAiRHJtUGx1Z2luUGF0aC5jcHAiLAogICAgICAgICAiRHJtU2Vzc2lvbk1hbmFnZXIuY3BwIiwKICAgICAgICAgIklDcnlwdG8uY3BwIiwKICAgICAgICAgIklEcm0uY3BwIiwKICAgICAgICAgIklEcm1DbGllbnQuY3BwIiwKICAgICAgICAgIklNZWRpYURybVNlcnZpY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhQ2FzRGVmcy5jcHAiLAorICAgICAgICAiUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAiLAogICAgICAgICAiU2hhcmVkTGlicmFyeS5jcHAiLAogICAgICAgICAiRHJtSGFsLmNwcCIsCiAgICAgICAgICJDcnlwdG9IYWwuY3BwIiwKKyAgICAgICAgInByb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90byIsCiAgICAgXSwKIAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMzYmIwLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDYXNJbXBsIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQ2FzSW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RydWN0IENhc0ltcGw6OlBsdWdpbkhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBQbHVnaW5Ib2xkZXIoQ2FzUGx1Z2luICpwbHVnaW4pIDogbVBsdWdpbihwbHVnaW4pIHt9Ci0gICAgflBsdWdpbkhvbGRlcigpIHsgaWYgKG1QbHVnaW4gIT0gTlVMTCkgZGVsZXRlIG1QbHVnaW47IH0KLSAgICBDYXNQbHVnaW4qIGdldCgpIHsgcmV0dXJuIG1QbHVnaW47IH0KLQotcHJpdmF0ZToKLSAgICBDYXNQbHVnaW4gKm1QbHVnaW47Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGx1Z2luSG9sZGVyKTsKLX07Ci0KLUNhc0ltcGw6OkNhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpCi0gICAgOiBtUGx1Z2luSG9sZGVyKE5VTEwpLCBtTGlzdGVuZXIobGlzdGVuZXIpIHsKLSAgICBBTE9HVigiQ1RPUiIpOwotfQotCi1DYXNJbXBsOjp+Q2FzSW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUiIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ2FzSW1wbDo6T25FdmVudCgKLSAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKGFwcERhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhcHBEYXRhISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENhc0ltcGwgKmNhc0ltcGwgPSBzdGF0aWNfY2FzdDxDYXNJbXBsICo+KGFwcERhdGEpOwotICAgIGNhc0ltcGwtPm9uRXZlbnQoZXZlbnQsIGFyZywgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2FzSW1wbDo6aW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pIHsKLSAgICBtTGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgbVBsdWdpbkhvbGRlciA9IG5ldyBQbHVnaW5Ib2xkZXIocGx1Z2luKTsKLX0KLQotdm9pZCBDYXNJbXBsOjpvbkV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUxpc3RlbmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiBldmVudERhdGE7Ci0gICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBzaXplID4gMCkgewotICAgICAgICBldmVudERhdGEucmVzZXQobmV3IENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpKTsKLSAgICB9Ci0KLSAgICBtTGlzdGVuZXItPm9uRXZlbnQoZXZlbnQsIGFyZywgZXZlbnREYXRhKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0UHJpdmF0ZURhdGEiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnNldFByaXZhdGVEYXRhKHB2dERhdGEpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6Om9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoIm9wZW5TZXNzaW9uIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gaG9sZGVyLT5nZXQoKS0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEFMT0dWKCJvcGVuU2Vzc2lvbjogc2Vzc2lvbiBvcGVuZWQsIHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZygqc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSB7Ci0gICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgcHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6Y2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoImNsb3NlU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VjbShjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRWNtOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFY20oc2Vzc2lvbklkLCBlY20pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRW1tIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFbW0oZW1tKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZW5kRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSB7Ci0gICAgQUxPR1YoInNlbmRFdmVudCIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChldmVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgQ2FzRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgKmV2ZW50RGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSB7Ci0gICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgU3RyaW5nOChwcm92aXNpb25TdHJpbmcpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvdmlzaW9uKFN0cmluZzgocHJvdmlzaW9uU3RyaW5nKSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSB7Ci0gICAgQUxPR1YoInJlZnJlc2hFbnRpdGxlbWVudHMiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAocmVmcmVzaERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5yZWZyZXNoRW50aXRsZW1lbnRzKHJlZnJlc2hUeXBlLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsICpyZWZyZXNoRGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoInJlbGVhc2U6IHBsdWdpbj0lcCIsCi0gICAgICAgICAgICBtUGx1Z2luSG9sZGVyID09IE5VTEwgPyBtUGx1Z2luSG9sZGVyLT5nZXQoKSA6IE5VTEwpOwotICAgIG1QbHVnaW5Ib2xkZXIuY2xlYXIoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTA5ZTIuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGVzY3JhbWJsZXJJbXBsIgotCi0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGVzY3JhbWJsZXJJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6RGVzY3JhbWJsZXJJbXBsKAotICAgICAgICBjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbikgOgotICAgICAgICBtTGlicmFyeShsaWJyYXJ5KSwgbVBsdWdpbihwbHVnaW4pIHsKLSAgICBBTE9HVigiQ1RPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotfQotCi1EZXNjcmFtYmxlckltcGw6On5EZXNjcmFtYmxlckltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1I6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnNldE1lZGlhQ2FzU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhc1Nlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMobVBsdWdpbi0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIHsKLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZzgobWltZSkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhPSyk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OmRlc2NyYW1ibGUoCi0gICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBpbmZvLCBpbnQzMl90ICpyZXN1bHQpIHsKLSAgICBBTE9HVigiZGVzY3JhbWJsZSIpOwotCi0gICAgKnJlc3VsdCA9IG1QbHVnaW4tPmRlc2NyYW1ibGUoCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgIT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsCi0gICAgICAgICAgICBpbmZvLnNjcmFtYmxpbmdDb250cm9sLAotICAgICAgICAgICAgaW5mby5udW1TdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0LAotICAgICAgICAgICAgaW5mby5kc3RUeXBlID09IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyID8KLSAgICAgICAgICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSA6IGluZm8uZHN0UHRyLAotICAgICAgICAgICAgaW5mby5kc3RPZmZzZXQsCi0gICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoKnJlc3VsdCA+PSAwID8gT0sgOiAqcmVzdWx0KTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVBsdWdpbjsKLSAgICAgICAgbVBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCAwNzQ0ODlhLi5iYzM3NTU3IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0RybUhhbC5oPgogI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTE5NCw3ICsxOTUsMTggQEAKICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpIHsKIH0KIAordm9pZCBEcm1IYWw6OmNsb3NlT3BlblNlc3Npb25zKCkgeworICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3BlblNlc3Npb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUGx1Z2luLT5jbG9zZVNlc3Npb24odG9IaWRsVmVjKG1PcGVuU2Vzc2lvbnNbaV0pKTsKKyAgICAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKG1PcGVuU2Vzc2lvbnNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKK30KKwogRHJtSGFsOjp+RHJtSGFsKCkgeworICAgIGNsb3NlT3BlblNlc3Npb25zKCk7CiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZURybShtRHJtU2Vzc2lvbkNsaWVudCk7CiB9CiAKQEAgLTQxMywxMSArNDI1LDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6ZGVzdHJveVBsdWdpbigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKyAgICByZXBvcnRNZXRyaWNzKCk7CiAgICAgc2V0TGlzdGVuZXIoTlVMTCk7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAKQEAgLTQ3MSw2ICs0ODQsNyBAQAogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIG1Ecm1TZXNzaW9uQ2xpZW50LCBzZXNzaW9uSWQpOworICAgICAgICBtT3BlblNlc3Npb25zLnB1c2goc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTQ4Niw3ICs1MDAsMTQgQEAKICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobU9wZW5TZXNzaW9uc1tpXSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9wZW5TZXNzaW9ucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJlcG9ydE1ldHJpY3MoKTsKICAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CkBAIC03NDAsNiArNzYxLDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCiAKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKQEAgLTc2MSw2ICs3ODgsMTIgQEAKIAogc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwobmFtZSwgdmFsdWUpOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CkBAIC05NzUsNyArMTAwOCw3IEBACiB2b2lkIERybUhhbDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogCkBAIC05OTcsNCArMTAzMCwyMCBAQAogICAgIH0KIH0KIAordm9pZCBEcm1IYWw6OnJlcG9ydE1ldHJpY3MoKSBjb25zdAoreworICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzOworICAgIFN0cmluZzggdmVuZG9yOworICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgPT0gT0sgJiYKKyAgICAgICAgICAgIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pID09IE9LICYmCisgICAgICAgICAgICBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzgoIm1ldHJpY3MiKSwgbWV0cmljcykgPT0gT0spIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYW5kcm9pZDo6cmVwb3J0RHJtUGx1Z2luTWV0cmljcygKKyAgICAgICAgICAgICAgICBtZXRyaWNzLCB2ZW5kb3IsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWkiLCByZXMpOworICAgICAgICB9CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYmEzOC4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDYXMiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNhc0RlZnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzRGF0YTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICByZXR1cm4gcGFyY2VsLT5yZWFkQnl0ZVZlY3Rvcih0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0ICB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVCeXRlVmVjdG9yKCp0aGlzKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiAvKnBhcmNlbCovKSB7Ci0gICAgQUxPR0UoIkNBUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoKSBzaG91bGRuJ3QgYmUgY2FsbGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ0FTeXN0ZW1JZCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1OYW1lKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFDYXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotCi1EZXNjcmFtYmxlSW5mbzo6RGVzY3JhbWJsZUluZm8oKSB7fQotCi1EZXNjcmFtYmxlSW5mbzo6fkRlc2NyYW1ibGVJbmZvKCkge30KLQotc3RhdHVzX3QgRGVzY3JhbWJsZUluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoKGludDMyX3QqKSZkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90Kikmc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoKHVpbnQzMl90KikmbnVtU3ViU2FtcGxlcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAobnVtU3ViU2FtcGxlcyA+IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN1YlNhbXBsZXMgPSBuZXcgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKLSAgICBpZiAoc3ViU2FtcGxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoJnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNyY01lbSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBpZiAoc3JjTWVtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3JjT2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV90ICpuYXRpdmVIYW5kbGUgPSBOVUxMOwotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgbmF0aXZlSGFuZGxlID0gcGFyY2VsLT5yZWFkTmF0aXZlSGFuZGxlKCk7Ci0gICAgICAgIGRzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4obmF0aXZlSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RQdHIgPSBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZQotICAgICAgICAgICAgJiYgZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KWRzdFR5cGUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKG51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGVVaW50MzIoc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzcmNNZW0pKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZU5hdGl2ZUhhbmRsZShzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oZHN0UHRyKSk7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKGRzdE9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcgotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZjViOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUGx1Z2luTWV0cmljc1JlcG9ydGluZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorCisjaW5jbHVkZSAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnBiLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgYW5kcm9pZDo6ZHJtX21ldHJpY3M6Ok1ldHJpY3NHcm91cDsKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljOwordXNpbmcgYW5kcm9pZDo6ZHJtX21ldHJpY3M6Ok1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWU7CisKK2NvbnN0IGNoYXIqIGNvbnN0IGtQYXJlbnRBdHRyaWJ1dGUgPSAiL3BhcmVudC9leHRlcm5hbCI7CisKK3N0YXR1c190IHJlcG9ydE1ldHJpY3NHcm91cChjb25zdCBNZXRyaWNzR3JvdXAmIG1ldHJpY3NHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBiYXRjaE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCogcGFyZW50SWQpIHsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShiYXRjaE5hbWUuY19zdHIoKSk7CisgICAgYW5hbHl0aWNzSXRlbS5nZW5lcmF0ZVNlc3Npb25JRCgpOworICAgIGludDY0X3Qgc2Vzc2lvbklkID0gYW5hbHl0aWNzSXRlbS5nZXRTZXNzaW9uSUQoKTsKKyAgICBpZiAocGFyZW50SWQgIT0gTlVMTCkgeworICAgICAgICBhbmFseXRpY3NJdGVtLnNldEludDY0KGtQYXJlbnRBdHRyaWJ1dGUsICpwYXJlbnRJZCk7CisgICAgfQorCisgICAgLy8gUmVwb3J0IHRoZSBwYWNrYWdlIG5hbWUuCisgICAgaWYgKG1ldHJpY3NHcm91cC5oYXNfYXBwX3BhY2thZ2VfbmFtZSgpKSB7CisgICAgICBBU3RyaW5nIGFwcF9wYWNrYWdlX25hbWUobWV0cmljc0dyb3VwLmFwcF9wYWNrYWdlX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NHcm91cC5hcHBfcGFja2FnZV9uYW1lKCkuc2l6ZSgpKTsKKyAgICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldHJpY3NHcm91cC5tZXRyaWNfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwX01ldHJpYyYgbWV0cmljID0gbWV0cmljc0dyb3VwLm1ldHJpYyhpKTsKKyAgICAgICAgaWYgKCFtZXRyaWMuaGFzX25hbWUoKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIG5hbWUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtZXRyaWMuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWMgd2l0aCBubyB2YWx1ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlJiB2YWx1ZSA9IG1ldHJpYy52YWx1ZSgpOworICAgICAgICBpZiAodmFsdWUuaGFzX2ludF92YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldEludDY0KG1ldHJpYy5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaW50X3ZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXREb3VibGUobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZG91YmxlX3ZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgICAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRDU3RyaW5nKG1ldHJpYy5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdHJpbmdfdmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWMgVmFsdWUgd2l0aCBubyBhY3R1YWwgdmFsdWUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgYW5hbHl0aWNzSXRlbS5zZXRGaW5hbGl6ZWQodHJ1ZSk7CisgICAgaWYgKCFhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKSkgeworICAgICAgLy8gTm90ZSB0aGUgY2FzdCB0byBpbnQgaXMgYmVjYXVzZSB3ZSBidWlsZCBvbiAzMiBhbmQgNjQgYml0LgorICAgICAgLy8gVGhlIGNhc3QgcHJldmVudHMgYSBwZWN1bGlhciBwcmludGYgcHJvYmxlbSB3aGVyZSBvbmUgZm9ybWF0IGNhbm5vdAorICAgICAgLy8gc2F0aXNmeSBib3RoLgorICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJWQiLCAoaW50KSBzZXNzaW9uSWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXBfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwJiBzdWJHcm91cCA9IG1ldHJpY3NHcm91cC5tZXRyaWNfc3ViX2dyb3VwKGkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBvcnRNZXRyaWNzR3JvdXAoc3ViR3JvdXAsIGJhdGNoTmFtZSwgJnNlc3Npb25JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmluZzggc2FuaXRpemUoY29uc3QgU3RyaW5nOCYgaW5wdXQpIHsKKyAgICAvLyBGaWx0ZXJzIHRoZSBpbnB1dCBzdHJpbmcgZG93biB0byBqdXN0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgorICAgIFN0cmluZzggb3V0cHV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjYW5kaWRhdGUgPSBpbnB1dFtpXTsKKyAgICAgICAgaWYgKChjYW5kaWRhdGUgPj0gJ2EnICYmIGNhbmRpZGF0ZSA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZSA+PSAnQScgJiYgY2FuZGlkYXRlIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoY2FuZGlkYXRlID49ICcwJyAmJiBjYW5kaWRhdGUgPD0gJzknKSkgeworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgmY2FuZGlkYXRlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiB2ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKSB7CisgICAgTWV0cmljc0dyb3VwIHJvb3RfbWV0cmljc19ncm91cDsKKyAgICBpZiAoIXJvb3RfbWV0cmljc19ncm91cC5QYXJzZUZyb21BcnJheShzZXJpYWxpemVkTWV0cmljcy5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWx1cmUgdG8gcGFyc2UuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJkcm0udmVuZG9yLiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUodmVuZG9yKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZShkZXNjcmlwdGlvbikuY19zdHIoKSk7CisKKyAgICByZXR1cm4gcmVwb3J0TWV0cmljc0dyb3VwKHJvb3RfbWV0cmljc19ncm91cCwgbmFtZSwgTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWFiYy4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUNhc0xpc3RlbmVyIHsKLSAgICB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY4MjUuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JRGVzY3JhbWJsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JQ2FzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhc0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElNZWRpYUNhc1NlcnZpY2UgewotICAgIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yW10gZW51bWVyYXRlUGx1Z2lucygpOwotICAgIGJvb2xlYW4gaXNTeXN0ZW1JZFN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJQ2FzIGNyZWF0ZVBsdWdpbihpbnQgQ0Ffc3lzdGVtX2lkLCBJQ2FzTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNEZXNjcmFtYmxlclN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJRGVzY3JhbWJsZXIgY3JlYXRlRGVzY3JhbWJsZXIoaW50IENBX3N5c3RlbV9pZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZDBjNi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8gYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2JjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBhbmRyb2lkLmRybV9tZXRyaWNzOworCisvLyBuZWVkIHRoaXMgaWYgd2UgYXJlIHVzaW5nIGxpYnByb3RvYnVmLWNwcC0yLjMuMC1saXRlCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCisvLyBUaGUgTWV0cmljc0dyb3VwIGlzIGEgY29sbGVjdGlvbiBvZiBtZXRyaWMgbmFtZS92YWx1ZSBwYWlyIGluc3RhbmNlcworLy8gdGhhdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgcHJvdmlkZWQgdG8gYSBjYWxsZXIuCittZXNzYWdlIE1ldHJpY3NHcm91cCB7CisgIG1lc3NhZ2UgTWV0cmljIHsKKyAgICBtZXNzYWdlIE1ldHJpY1ZhbHVlIHsKKyAgICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgYmUgc2V0LgorICAgICAgb3B0aW9uYWwgaW50NjQgaW50X3ZhbHVlID0gMTsKKyAgICAgIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSAyOworICAgICAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgICAgfQorCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG1ldHJpYy4gTXVzdCBiZSB2YWxpZCBVVEYtOC4gUmVxdWlyZWQuCisgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBtZXRyaWMuIFJlcXVpcmVkLgorICAgIG9wdGlvbmFsIE1ldHJpY1ZhbHVlIHZhbHVlID0gMjsKKyAgfQorCisgIC8vIFRoZSBsaXN0IG9mIG5hbWUvdmFsdWUgcGFpcnMgb2YgbWV0cmljcy4KKyAgcmVwZWF0ZWQgTWV0cmljIG1ldHJpYyA9IDE7CisKKyAgLy8gQWxsb3cgbXVsdGlwbGUgc3ViIGdyb3VwcyBvZiBtZXRyaWNzLgorICByZXBlYXRlZCBNZXRyaWNzR3JvdXAgbWV0cmljX3N1Yl9ncm91cCA9IDI7CisKKyAgLy8gTmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldHJpY3MuCisgIG9wdGlvbmFsIHN0cmluZyBhcHBfcGFja2FnZV9uYW1lID0gMzsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCmluZGV4IDhmZDg2NmMuLjRiMTM5YTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMjgsOCArMjgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KIAotI1RPRE86IG1vdmUgdGhpcyBiYWNrIHRvIC92ZW5kb3IvbGliIGFmdGVyIGNvbnZlcnNpb24gdG8gdHJlYmxlCi0jTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWNhcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTM5LDYgKzM4LDkgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIG1lZGlhX3BsdWdpbl9oZWFkZXJzCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmpzbW4gXAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggNGVkNWZjZS4uZTI3NjMxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSWQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogc3RhdHVzX3QgQ2xlYXJLZXlDYXNTZXNzaW9uOjp1cGRhdGVFQ00oCiAgICAgICAgIEtleUZldGNoZXIgKmtleUZldGNoZXIsIHZvaWQgKmVjbSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoa2V5RmV0Y2hlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRDsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGtFY21IZWFkZXJMZW5ndGgpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgY29uc3QgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RQdHIsIEFTdHJpbmcgKiAvKiBlcnJvckRldGFpbE1zZyAqLykgewogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUVTX0tFWSBjb250ZW50S2V5OwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGludDMyX3Qga2V5SW5kZXggPSAoc2NyYW1ibGluZ0NvbnRyb2wgJiAxKTsKICAgICAgICAgaWYgKCFtS2V5SW5mb1trZXlJbmRleF0udmFsaWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJkZWNyeXB0OiBrZXkgJWQgaXMgaW52YWxpZCIsIGtleUluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVDsKICAgICAgICAgfQogICAgICAgICBjb250ZW50S2V5ID0gbUtleUluZm9ba2V5SW5kZXhdLmNvbnRlbnRLZXk7CiAgICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luOiBzZXNzaW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgbUNBU1Nlc3Npb24gPSBzZXNzaW9uOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKICAgICBpZiAobUNBU1Nlc3Npb24gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5pbml0aWFsaXplZCBDQVMgc2Vzc2lvbiEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIG1DQVNTZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li5lMTU0NWFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCiAKIExPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQogIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCiAjIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCiBMT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKKyAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYTk3ZmFjNi4uYTFkNjFkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAKaW5kZXggZWQwNTBmNy4uMDI1OWE0MiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCkBAIC0yMSwxMiArMjEsMTkgQEAKIG5hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKIGJvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgewotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDb21tb25Qc3NoQm94VVVJRFsxNl0gPSB7CiAgICAgICAgIDB4MTAsMHg3NywweEVGLDB4RUMsMHhDMCwweEIyLDB4NEQsMHgwMiwKICAgICAgICAgMHhBQywweEUzLDB4M0MsMHgxRSwweDUyLDB4RTIsMHhGQiwweDRCCiAgICAgfTsKIAotICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDbGVhcktleVVVSUQsIHNpemVvZihrQ2xlYXJLZXlVVUlEKSk7CisgICAgLy8gVG8gYmUgdXNlZCBpbiBtcGQgdG8gc3BlY2lmeSBkcm0gc2NoZW1lIGZvciBwbGF5ZXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFsxNl0gPSB7CisgICAgICAgIDB4RTIsMHg3MSwweDlELDB4NTgsMHhBOSwweDg1LDB4QjMsMHhDOSwKKyAgICAgICAgMHg3OCwweDFBLDB4QjAsMHgzMCwweEFGLDB4NzgsMHhEMywweDBFCisgICAgfTsKKworICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDb21tb25Qc3NoQm94VVVJRCwgc2l6ZW9mKGtDb21tb25Qc3NoQm94VVVJRCkpIHx8CisgICAgICAgICAgICFtZW1jbXAodXVpZCwga0NsZWFyS2V5VVVJRCwgc2l6ZW9mKGtDbGVhcktleVVVSUQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCmluZGV4IDVmZGFjNWMuLmVjMDdkODcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcApAQCAtMjUsMTAgKzI1LDI4IEBACiAKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrT2ZmbGluZSgiT2ZmbGluZSIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleUxpY2Vuc2VUeXBlKCJMaWNlbnNlVHlwZSIpOworICAgIC8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1F1ZXJ5S2V5UGxheUFsbG93ZWQoIlBsYXlBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVJlbmV3QWxsb3dlZCgiUmVuZXdBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCit9OworCiBuYW1lc3BhY2UgY2xlYXJrZXlkcm0gewogCiB1c2luZyBhbmRyb2lkOjpzcDsKIAorRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CiAgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CkBAIC02MCwxOCArNzgsMjggQEAKICAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgICB9CisKICAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KKwogICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CiAgICAgZGVmYXVsdFVybC5jbGVhcigpOwogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCiAgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCAmcmVxdWVzdCk7CiB9CiAKK3ZvaWQgRHJtUGx1Z2luOjpzZXRQbGF5UG9saWN5KCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleUxpY2Vuc2VUeXBlLCBrU3RyZWFtaW5nKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UGxheUFsbG93ZWQsIGtUcnVlKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UmVuZXdBbGxvd2VkLCBrVHJ1ZSk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtODMsNiArMTExLDggQEAKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOwogICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgewogICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KQEAgLTExMSw0ICsxNDEsMTggQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKK3N0YXR1c190IERybVBsdWdpbjo6cXVlcnlLZXlTdGF0dXMoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgeworCisgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGluZm9NYXAuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7CisgICAgICAgIGluZm9NYXAuYWRkKG1QbGF5UG9saWN5LmtleUF0KGkpLCBtUGxheVBvbGljeS52YWx1ZUF0KGkpKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCmluZGV4IDU4NDIxYjkuLmYzN2E3MDYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCkBAIC0zOSw4ICszOSw4IEBACiAKIGNsYXNzIERybVBsdWdpbiA6IHB1YmxpYyBhbmRyb2lkOjpEcm1QbHVnaW4gewogcHVibGljOgotICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCi0gICAgICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkge30KKyAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKKwogICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKQEAgLTgxLDEzICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFVOVVNFRChpbmZvTWFwKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKQEAgLTI0OCw5ICsyNDIsMTIgQEAKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKyAgICB2b2lkIHNldFBsYXlQb2xpY3koKTsKIAorICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1QbGF5UG9saWN5OwogICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcAppbmRleCA2YTRmOGQ1Li5jYWZmMzkzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBBU3RyaW5nIGVuY29kZWRJZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgewogICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKLSAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NFVybChrZXlJZHNbaV0sIGtLZXlJZFNpemUsICZlbmNvZGVkSWQpOwogICAgICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLCIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCBhYzU3ZDY1Li4wZmNmYzY0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM0LDQgKzM0LDUgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibWVkaWFfcGx1Z2luX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKaW5kZXggODRlZDI0Mi4uOGM0OTY1NiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7Ci0gICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0VXJsKGV4cGVjdGVkS2V5c1tpXSwga0tleUlkU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZElkQVN0cmluZyk7CiAgICAgICAgICAgICBTdHJpbmc4IGVuY29kZWRJZChlbmNvZGVkSWRBU3RyaW5nLmNfc3RyKCkpOwogICAgICAgICAgICAgZW5jb2RlZElkLnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CkBAIC0yMzEsNSArMjMxLDQgQEAKIAogICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jTWltZVR5cGUpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCmluZGV4IGMzYjBkODQuLmQ5ZjNlYTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcApAQCAtMjg0LDE0ICsyODQsMTQgQEAKICAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgogICAgICAgICAgICAgICAgICAgICAiW3siCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCiAgICAgICAgICAgICAgICAgICAgICJ9IgogICAgICAgICAgICAgICAgICAgICAieyIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lDRV9cIiIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKICAgICAgICAgICAgICAgICAgICAgIn0iCiAgICAgICAgICAgICAgICAgICAgICJ7IgpAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICJ7IgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAifV0iCiAgICAgICAgICAgICAifSIpOwpAQCAtMzEzLDggKzMxMyw4IEBACiAgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMyk7CiAKICAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KLSAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISEiKSwgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLAotICAgICAgICAgICAgICBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQgIT4/IiksIFN0cmluZzgoIkhlbGxvIEZyaWVuZCAhPyIpLAorICAgICAgICAgICAgICBTdHJpbmc4KCJIZWxsbyA/Pj4gRnJpZW5kID8+IikgfTsKICAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icAppbmRleCA3ZjQ0ODE5Li5hYmQxODg0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKIAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvT1dORVJTCkBAIC0wLDAgKzEsNiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQorZ2thc3RlbkBhbmRyb2lkLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQoranRpbmtlckBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTA1MzBlNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBkcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCmNvcHkgdG8gaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmluZGV4IGZkZjk5ZWIuLjllZmQ3NmQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCkBAIC0xNCwxNCArMTQsMjUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmFtYmxlcjsKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19DTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0NMSUVOVF9ICiAKLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElEZXNjcmFtYmxlciB7Ci0gICAgdm9pZCBzZXRNZWRpYUNhc1Nlc3Npb24oaW4gYnl0ZVtdIHNlc3Npb25JZCk7Ci0gICAgYm9vbGVhbiByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoU3RyaW5nIG1pbWUpOwotICAgIGludCBkZXNjcmFtYmxlKGluIE1lZGlhRGVzY3JhbWJsZXIuRGVzY3JhbWJsZUluZm8gZGVzY3JhbWJsZUluZm8pOwotICAgIHZvaWQgcmVsZWFzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvQ2xpZW50IHsKKyBwdWJsaWM6CisgICAgQXVkaW9DbGllbnQoKSA6CisgICAgICAgIGNsaWVudFVpZCgtMSksIGNsaWVudFBpZCgtMSksIHBhY2thZ2VOYW1lKCIiKSB7fQorCisgICAgdWlkX3QgY2xpZW50VWlkOworICAgIHBpZF90IGNsaWVudFBpZDsKKyAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDUwZTEyZjQuLjc3MWYxYjggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDMwOWMyM2QuLmNlMzBhNzggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmggYi9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ZjFjZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENBU19JTVBMX0hfCi0jZGVmaW5lIENBU19JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkNhcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhc0xpc3RlbmVyOwotfQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhQ2FzOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzUGx1Z2luOwotY2xhc3MgU2hhcmVkTGlicmFyeTsKLQotY2xhc3MgQ2FzSW1wbCA6IHB1YmxpYyBCbkNhcyB7Ci1wdWJsaWM6Ci0gICAgQ2FzSW1wbChjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lcik7Ci0gICAgdmlydHVhbCB+Q2FzSW1wbCgpOwotCi0gICAgc3RhdGljIHZvaWQgT25FdmVudCgKLSAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBpbml0KGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBDYXNQbHVnaW4gKnBsdWdpbik7Ci0gICAgdm9pZCBvbkV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplKTsKLQotICAgIC8vIElDYXMgaW5oZXJpdHMKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldFByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBvcGVuU2Vzc2lvbihDYXNTZXNzaW9uSWQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBjbG9zZVNlc3Npb24oY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0U2Vzc2lvblByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb2Nlc3NFY20oCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm9jZXNzRW1tKGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlbW0pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2VuZEV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZldmVudERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzE2JiBwcm92aXNpb25TdHJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgICAgIGludDMyX3QgcmVmcmVzaFR5cGUsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFBsdWdpbkhvbGRlcjsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IG1QbHVnaW5Ib2xkZXI7Ci0gICAgc3A8SUNhc0xpc3RlbmVyPiBtTGlzdGVuZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXNJbXBsKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIENBU19JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oIGIvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMTJhYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREVTQ1JBTUJMRVJfSU1QTF9IXwotI2RlZmluZSBERVNDUkFNQkxFUl9JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkRlc2NyYW1ibGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgRGVzY3JhbWJsZXJQbHVnaW47Ci1jbGFzcyBTaGFyZWRMaWJyYXJ5OwotCi1jbGFzcyBEZXNjcmFtYmxlckltcGwgOiBwdWJsaWMgQm5EZXNjcmFtYmxlciB7Ci1wdWJsaWM6Ci0gICAgRGVzY3JhbWJsZXJJbXBsKGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlckltcGwoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldE1lZGlhQ2FzU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgZGVzY3JhbWJsZSgKLSAgICAgICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBkZXNjcmFtYmxlSW5mbywgaW50MzJfdCAqcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbiAqbVBsdWdpbjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVySW1wbCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBERVNDUkFNQkxFUl9JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YTk2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX0RFRlNfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX0RFRlNfSF8KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1jbGFzcyBJTWVtb3J5OwotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLWNsYXNzIFBhcmNlbGFibGVDYXNEYXRhIDogcHVibGljIENhc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBQYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgUGFyY2VsYWJsZUNhc0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIDoKLSAgICAgICAgQ2FzRGF0YShkYXRhLCBkYXRhICsgc2l6ZSkge30KLSAgICB2aXJ0dWFsIH5QYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcmNlbGFibGVDYXNEYXRhKTsKLX07Ci0KLWNsYXNzIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIDogcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBjb25zdCBjaGFyICpuYW1lKQotICAgICAgICA6IG1DQVN5c3RlbUlkKENBX3N5c3RlbV9pZCksIG1OYW1lKG5hbWUpIHt9Ci0KLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigpIDogbUNBU3lzdGVtSWQoMCkge30KLQotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yJiYgZGVzYykgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB+UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoKSB7fQotCi0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgU3RyaW5nMTYgbU5hbWU7Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IpOwotfTsKLX0KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotY2xhc3MgRGVzY3JhbWJsZUluZm8gOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBEZXN0aW5hdGlvblR5cGUgewotICAgICAgICBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyLCAgICAvLyBub24tc2VjdXJlCi0gICAgICAgIGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUgIC8vIHNlY3VyZQotICAgIH07Ci0KLSAgICBEZXN0aW5hdGlvblR5cGUgZHN0VHlwZTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wgc2NyYW1ibGluZ0NvbnRyb2w7Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXM7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlczsKLSAgICBzcDxJTWVtb3J5PiBzcmNNZW07Ci0gICAgaW50MzJfdCBzcmNPZmZzZXQ7Ci0gICAgdm9pZCAqZHN0UHRyOwotICAgIGludDMyX3QgZHN0T2Zmc2V0OwotCi0gICAgRGVzY3JhbWJsZUluZm8oKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlSW5mbygpOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVJbmZvKTsKLX07Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG1lZGlhCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vIE1FRElBX0NBU19ERUZTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdkOWE3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwgYi9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCmluZGV4IDM3ZTJjMzkuLmY0MDA1ODIgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKKysrIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpbyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8KZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDY3ZDBiYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU1ODQxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjViY2M3NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDNiZmFjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44YTEzYjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjc1MGZkZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRlYTQzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzBmNDI2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mZjZhMTUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmMzNTQwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43YWNmYzkwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE0YmJiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjRiMjFjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43NGEzYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oIGIvaW5jbHVkZS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNGNkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ09ERUNTX1hNTF9QQVJTRVJfSF8KLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfWE1MX1BBUlNFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIFF1aXJrIHN0aWxsIHN1cHBvcnRlZCwgZXZlbiB0aG91Z2ggZGVwcmVjYXRlZAotZW51bSBRdWlya3MgewotICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzICAgPSAxLAotICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyAgPSAyLAotCi0gICAga1F1aXJrc01hc2sgPSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cwotICAgICAgICAgICAgICAgIHwga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzLAotfTsKLQotLy8gTGlnaHR3ZWlnaHQgc3RydWN0IGZvciBxdWVyeWluZyBjb21wb25lbnRzLgotc3RydWN0IFR5cGVJbmZvIHsKLSAgICBBU3RyaW5nIG1OYW1lOwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+IG1TdHJpbmdGZWF0dXJlczsKLSAgICBzdGQ6Om1hcDxBU3RyaW5nLCBib29sPiBtQm9vbEZlYXR1cmVzOwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+IG1EZXRhaWxzOwotfTsKLQotc3RydWN0IFByb2ZpbGVMZXZlbCB7Ci0gICAgdWludDMyX3QgbVByb2ZpbGU7Ci0gICAgdWludDMyX3QgbUxldmVsOwotfTsKLQotc3RydWN0IENvZGVjSW5mbyB7Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZUluZm8+IG1UeXBlczsKLSAgICBzdGQ6OnZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzOwotICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1Jc0VuY29kZXI7Ci19OwotCi1jbGFzcyBNZWRpYUNvZGVjc1htbFBhcnNlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKLSAgICB+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKLQotICAgIHZvaWQgZ2V0R2xvYmFsU2V0dGluZ3Moc3RkOjptYXA8QVN0cmluZywgQVN0cmluZz4gKnNldHRpbmdzKSBjb25zdDsKLQotICAgIHN0YXR1c190IGdldENvZGVjSW5mbyhjb25zdCBjaGFyICpuYW1lLCBDb2RlY0luZm8gKmluZm8pIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZ2V0UXVpcmtzKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6dmVjdG9yPEFTdHJpbmc+ICpxdWlya3MpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGVudW0gU2VjdGlvbiB7Ci0gICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCi0gICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUiwKLSAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fSU5DTFVERSwKLSAgICB9OwotCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7Ci0gICAgaW50MzJfdCBtRGVwdGg7Ci0gICAgQVN0cmluZyBtSHJlZkJhc2U7Ci0KLSAgICBzdGQ6Om1hcDxBU3RyaW5nLCBBU3RyaW5nPiBtR2xvYmFsU2V0dGluZ3M7Ci0KLSAgICAvLyBuYW1lIC0+IENvZGVjSW5mbwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIENvZGVjSW5mbz4gbUNvZGVjSW5mb3M7Ci0gICAgc3RkOjptYXA8QVN0cmluZywgc3RkOjp2ZWN0b3I8QVN0cmluZz4+IG1RdWlya3M7Ci0gICAgQVN0cmluZyBtQ3VycmVudE5hbWU7Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZUluZm8+OjppdGVyYXRvciBtQ3VycmVudFR5cGU7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgaWdub3JlX2Vycm9ycyA9IGZhbHNlKTsKLQotICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0gICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLQotICAgIHN0YXRpYyB2b2lkIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKLQotICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKTsKLSAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjc1htbFBhcnNlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0NPREVDU19YTUxfUEFSU0VSX0hfCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDlkYTVlZjMuLmZmNDQwYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTY4LDYgKzU2OCw5IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKwogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZAogICAgIC8vIHRvIGJlIGNhbGxlZCBmcm9tIGF0IG1vc3Qgb25lIHRocmVhZCBvZiBzZXJ2ZXIsIGFuZCBvbmUgdGhyZWFkIG9mIGNsaWVudC4KQEAgLTYyMCw2ICs2MjMsNyBAQAogCiBwdWJsaWM6CiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBmcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCmluZGV4IDUxMDUwY2QuLmE5ZDRkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaApAQCAtMzAsMTQgKzMwLDQxIEBACiBjbGFzcyBWaWRlb0ZyYW1lCiB7CiBwdWJsaWM6Ci0gICAgVmlkZW9GcmFtZSgpOiBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1EaXNwbGF5V2lkdGgoMCksIG1EaXNwbGF5SGVpZ2h0KDApLCBtU2l6ZSgwKSwKLSAgICAgICAgICAgIG1Sb3RhdGlvbkFuZ2xlKDApLCBtRGF0YSgwKSB7fQorICAgIC8vIENvbnN0cnVjdCBhIFZpZGVvRnJhbWUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLAorICAgIC8vIHdpbGwgYWxsb2NhdGUgZnJhbWUgYnVmZmVyIGlmIHxhbGxvY2F0ZXwgaXMgc2V0IHRvIHRydWUsIHdpbGwKKyAgICAvLyBhbGxvY2F0ZSBidWZmZXIgdG8gaG9sZCBJQ0MgZGF0YSBpZiB8aWNjRGF0YXwgYW5kIHxpY2NTaXplfAorICAgIC8vIGluZGljYXRlIGl0cyBwcmVzZW5jZS4KKyAgICBWaWRlb0ZyYW1lKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBkaXNwbGF5V2lkdGgsIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCBib29sIGFsbG9jYXRlLAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqaWNjRGF0YSwgc2l6ZV90IGljY1NpemUpOgorICAgICAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgIG1EaXNwbGF5V2lkdGgoZGlzcGxheVdpZHRoKSwgbURpc3BsYXlIZWlnaHQoZGlzcGxheUhlaWdodCksCisgICAgICAgIG1Sb3RhdGlvbkFuZ2xlKGFuZ2xlKSwgbUJ5dGVzUGVyUGl4ZWwoYnBwKSwgbVJvd0J5dGVzKGJwcCAqIHdpZHRoKSwKKyAgICAgICAgbVNpemUoMCksIG1JY2NTaXplKDApLCBtUmVzZXJ2ZWQoMCksIG1EYXRhKDApLCBtSWNjRGF0YSgwKSB7CisgICAgICAgIGlmIChhbGxvY2F0ZSkgeworICAgICAgICAgICAgbVNpemUgPSBtUm93Qnl0ZXMgKiBtSGVpZ2h0OworICAgICAgICAgICAgbURhdGEgPSBuZXcgdWludDhfdFttU2l6ZV07CisgICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCisgICAgICAgIGlmIChpY2NEYXRhICE9IE5VTEwgJiYgaWNjU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1JY2NTaXplID0gaWNjU2l6ZTsKKyAgICAgICAgICAgIG1JY2NEYXRhID0gbmV3IHVpbnQ4X3RbaWNjU2l6ZV07CisgICAgICAgICAgICBpZiAobUljY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtSWNjRGF0YSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERlZXAgY29weSBvZiBib3RoIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMgYW5kIHRoZSBmcmFtZSBkYXRhCiAgICAgVmlkZW9GcmFtZShjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7Ci0gICAgICAgIG1XaWR0aCA9IGNvcHkubVdpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gY29weS5tSGVpZ2h0OwotICAgICAgICBtRGlzcGxheVdpZHRoID0gY29weS5tRGlzcGxheVdpZHRoOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IGNvcHkubURpc3BsYXlIZWlnaHQ7CisgICAgICAgIGNvcHlJbmZvT25seShjb3B5KTsKKwogICAgICAgICBtU2l6ZSA9IGNvcHkubVNpemU7CiAgICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKICAgICAgICAgaWYgKG1TaXplID4gMCAmJiBjb3B5Lm1EYXRhICE9IE5VTEwpIHsKQEAgLTQ4LDI2ICs3NSw5OSBAQAogICAgICAgICAgICAgICAgIG1TaXplID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7CisKKyAgICAgICAgbUljY1NpemUgPSBjb3B5Lm1JY2NTaXplOworICAgICAgICBtSWNjRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChtSWNjU2l6ZSA+IDAgJiYgY29weS5tSWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtSWNjRGF0YSA9IG5ldyB1aW50OF90W21JY2NTaXplXTsKKyAgICAgICAgICAgIGlmIChtSWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1JY2NEYXRhLCBjb3B5Lm1JY2NEYXRhLCBtSWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIH5WaWRlb0ZyYW1lKCkgewogICAgICAgICBpZiAobURhdGEgIT0gMCkgewogICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY2NEYXRhICE9IDApIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JY2NEYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSB8Y29weXwgdG8gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5LCAndGhpcycgbXVzdCBwb2ludCB0bworICAgIC8vIGEgY2h1bmsgb2YgbWVtb3J5IGJhY2sgYnkgSU1lbW9yeSBvZiBzaXplIGF0IGxlYXN0IGdldEZsYXR0ZW5lZFNpemUoKQorICAgIC8vIG9mIHxjb3B5fC4KKyAgICB2b2lkIGNvcHlGbGF0dGVuZWQoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgeworICAgICAgICBjb3B5SW5mb09ubHkoY29weSk7CisKKyAgICAgICAgbVNpemUgPSBjb3B5Lm1TaXplOworICAgICAgICBtRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChjb3B5Lm1TaXplID4gMCAmJiBjb3B5Lm1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShnZXRGbGF0dGVuZWREYXRhKCksIGNvcHkubURhdGEsIGNvcHkubVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgbUljY1NpemUgPSBjb3B5Lm1JY2NTaXplOworICAgICAgICBtSWNjRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChjb3B5Lm1JY2NTaXplID4gMCAmJiBjb3B5Lm1JY2NEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShnZXRGbGF0dGVuZWRJY2NEYXRhKCksIGNvcHkubUljY0RhdGEsIGNvcHkubUljY1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBmbGF0dGVuZWQgc2l6ZSB0byBwdXQgaXQgaW4gSU1lbW9yeQorICAgIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZW9mKFZpZGVvRnJhbWUpICsgbVNpemUgKyBtSWNjU2l6ZTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGZyYW1lIGRhdGEgaW4gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5CisgICAgdWludDhfdCogZ2V0RmxhdHRlbmVkRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKFZpZGVvRnJhbWUpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgcG9pbnRlciB0byB0aGUgSUNDIGRhdGEgaW4gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5CisgICAgdWludDhfdCogZ2V0RmxhdHRlbmVkSWNjRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKFZpZGVvRnJhbWUpICsgbVNpemU7CiAgICAgfQogCiAgICAgLy8gSW50ZW50aW9uYWwgcHVibGljIGFjY2VzcyBtb2RpZmllcjoKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLSAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOwotICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OworICAgIHVpbnQzMl90IG1XaWR0aDsgICAgICAgICAgIC8vIERlY29kZWQgaW1hZ2Ugd2lkdGggYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbUhlaWdodDsgICAgICAgICAgLy8gRGVjb2RlZCBpbWFnZSBoZWlnaHQgYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbURpc3BsYXlXaWR0aDsgICAgLy8gRGlzcGxheSB3aWR0aCBiZWZvcmUgcm90YXRpb24KKyAgICB1aW50MzJfdCBtRGlzcGxheUhlaWdodDsgICAvLyBEaXNwbGF5IGhlaWdodCBiZWZvcmUgcm90YXRpb24KKyAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKKyAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisgICAgdWludDMyX3QgbVJvd0J5dGVzOyAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgYmVmb3JlIHJvdGF0aW9uCiAgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgLy8gcm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCi0gICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0IGJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCisgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgdWludDMyX3QgbVJlc2VydmVkOyAgICAgICAgLy8gKHBhZGRpbmcgdG8gbWFrZSBtRGF0YSA2NC1iaXQgYWxpZ25lZCkKKworICAgIC8vIG1EYXRhIHNob3VsZCBiZSA2NC1iaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZwogICAgIHVpbnQ4X3QqIG1EYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQotICAgIC8vIHBhZCBzdHJ1Y3R1cmUgc28gaXQncyB0aGUgc2FtZSBzaXplIG9uIDY0IGJpdCBhbmQgMzIgYml0CisgICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQtYml0IGFuZCAzMi1iaXQKICAgICBjaGFyICAgICBtUGFkZGluZ1s4IC0gc2l6ZW9mKG1EYXRhKV07CisKKyAgICAvLyBtSWNjRGF0YSBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKKyAgICB1aW50OF90KiBtSWNjRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NC1iaXQgYW5kIDMyLWJpdAorICAgIGNoYXIgICAgIG1JY2NQYWRkaW5nWzggLSBzaXplb2YobUljY0RhdGEpXTsKKworcHJpdmF0ZToKKyAgICAvLworICAgIC8vIFV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgd2l0aGluIFZpZGVvRnJhbWUgc3RydWN0CisgICAgLy8KKworICAgIC8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBvbmx5CisgICAgdm9pZCBjb3B5SW5mb09ubHkoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgeworICAgICAgICBtV2lkdGggPSBjb3B5Lm1XaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGNvcHkubUhlaWdodDsKKyAgICAgICAgbURpc3BsYXlXaWR0aCA9IGNvcHkubURpc3BsYXlXaWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBjb3B5Lm1EaXNwbGF5SGVpZ2h0OworICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7CisgICAgICAgIG1CeXRlc1BlclBpeGVsID0gY29weS5tQnl0ZXNQZXJQaXhlbDsKKyAgICAgICAgbVJvd0J5dGVzID0gY29weS5tUm93Qnl0ZXM7CisgICAgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc3ZjhmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpbzogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyYWQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb0NsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NmRkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW87Ci1jbGFzcyBJUmFkaW9DbGllbnQ7Ci0KLWNsYXNzIElSYWRpb1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCByYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpby5oIGIvaW5jbHVkZS9yYWRpby9SYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRkZDJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHJhZGlvL1JhZGlvQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5RGVhbGVyOwotCi1jbGFzcyBSYWRpbyA6IHB1YmxpYyBCblJhZGlvQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5SYWRpbygpOwotCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLSAgICBzdGF0aWMgIHNwPFJhZGlvPiBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjayk7Ci0KLQotICAgICAgICAgICAgdm9pZCBkZXRhY2goKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICAgICAgIC8vIEJwUmFkaW9DbGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7Ci0KLSAgICAgICAgICAgIC8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi1wcml2YXRlOgotICAgICAgICAgICAgUmFkaW8ocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+Jik7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gZ2V0UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgc3A8SVJhZGlvPiAgICAgICAgICAgICAgbUlSYWRpbzsKLSAgICAgICAgICAgIHNwPFJhZGlvQ2FsbGJhY2s+ICAgICAgIG1DYWxsYmFjazsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZjFhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0NhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLQotICAgICAgICAgICAgUmFkaW9DYWxsYmFjaygpIHt9Ci0gICAgdmlydHVhbCB+UmFkaW9DYWxsYmFjaygpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50KSA9IDA7Ci0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDVlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9PV05FUlMKQEAgLTAsMCArMSwxOCBAQAorY2h6QGdvb2dsZS5jb20KK2R3a2FuZ0Bnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQorcGhpbGJ1cmtAZ29vZ2xlLmNvbQorcG1jbGVhbkBnb29nbGUuY29tCityYWNoYWRAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCityb2JlcnRzaGloQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IGFmZDExODkuLjNlZTc0OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNiBAQAogCWxpYmxvZyBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCi0JbGlicmFkaW9zZXJ2aWNlIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscyBcCiAJbGliaHdiaW5kZXIKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggYmE0N2ZkNC4uNDc0ZWY5NyAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTMyLDExICszMiwxMiBAQAogI2luY2x1ZGUgPGh3YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKKyNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvVGVzdGluZy5oIgogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTEzMiw5ICsxMzMsMTYgQEAKICAgICAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKICAgICAgICAgQXVkaW9GbGluZ2VyOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7Ci0gICAgICAgIC8vIEFBdWRpb1NlcnZpY2UgZGlzYWJsZWQgYmVjYXVzZSB3ZSBkbyBub3Qgc3VwcG9ydCBNTUFQIG1vZGUgaW4gT0Mgb3IgT0MtRFIxLgotICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICAgICAgLy8gQUF1ZGlvU2VydmljZSBzaG91bGQgb25seSBiZSB1c2VkIGluIE9DLU1SMSBhbmQgbGF0ZXIuCisgICAgICAgIC8vIEFuZCBvbmx5IGVuYWJsZSB0aGUgQUF1ZGlvU2VydmljZSBpZiB0aGUgc3lzdGVtIE1NQVAgcG9saWN5IGV4cGxpY2l0bHkgYWxsb3dzIGl0LgorICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgY2xpZW50IGZyb20gbWlzdXNpbmcgQUF1ZGlvU2VydmljZSB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUE9MSUNZX05FVkVSKTsKKyAgICAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BVVRPIHx8IG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BTFdBWVMpIHsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIH0KKwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAppbmRleCBmNTM5YmE5Li42ZTYwZjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icApAQCAtMTYsMTIgKzE2LDE0IEBACiAgICAgbmFtZTogImxpYkFBdWRpb19oZWFkZXJzIiwKICAgICBmcm9tOiAiaW5jbHVkZSIsCiAgICAgdG86ICIiLAotICAgIHNyY3M6IFsiaW5jbHVkZS9hYXVkaW8vKi5oIl0sCisgICAgLy8gb21pdCBBQXVkaW9UZXN0aW5nLmg7IHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gdGhvc2Ugd2hvIG5lZWQgaXQKKyAgICBzcmNzOiBbImluY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIl0sCiAgICAgbGljZW5zZTogImluY2x1ZGUvYWF1ZGlvL05PVElDRSIsCiB9CiAKIG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWF1ZGlvIiwKKyAgICAvLyBkZWxpYmVyYXRlbHkgaW5jbHVkZXMgc3ltYm9scyBmcm9tIEFBdWRpb1Rlc3RpbmcuaAogICAgIHN5bWJvbF9maWxlOiAibGliYWF1ZGlvLm1hcC50eHQiLAogICAgIGZpcnN0X3ZlcnNpb246ICIyNiIsCiAgICAgdW52ZXJzaW9uZWRfdW50aWw6ICJjdXJyZW50IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZSBiL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZQppbmRleCBlMmM0OTYwLi43Mjk4ZDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vRG94eWZpbGUKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlCkBAIC03NDQsMTIgKzc0NCwxMiBAQAogIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCiAKIElOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9sZWdhY3kvQUF1ZGlvTGVnYWN5LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29yZS9BdWRpb1N0cmVhbS5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL09XTkVSUyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDkxMGIxMGMuLjlmZWIxMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTI3LDkgKzI3LDExIEBACiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKIAogLy8gVE9ETyBzdXBwb3J0IEZMT0FUCi0jZGVmaW5lIFJFUVVJUkVEX0ZPUk1BVCAgQUFVRElPX0ZPUk1BVF9QQ01fSTE2CisjZGVmaW5lIFJFUVVJUkVEX0ZPUk1BVCAgICBBQVVESU9fRk9STUFUX1BDTV9JMTYKICNkZWZpbmUgTUlOX0ZSQU1FU19UT19SRUFEIDQ4ICAvKiBhcmJpdHJhcnksIDEgbXNlYyBhdCA0ODAwMCBIeiAqLwogCitzdGF0aWMgY29uc3QgaW50IEZSQU1FU19QRVJfTElORSA9IDIwMDAwOworCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7CiAgICAgQUF1ZGlvQXJnc1BhcnNlciAgIGFyZ1BhcnNlcjsKQEAgLTQ2LDcgKzQ4LDEwIEBACiAgICAgaW50MzJfdCBmcmFtZXNQZXJSZWFkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSAwOworICAgIGludDMyX3QgbmV4dEZyYW1lQ291bnQgPSAwOworICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCB4UnVuQ291bnQgPSAwOworICAgIGludDY0X3QgcHJldmlvdXNGcmFtZVBvc2l0aW9uID0gLTE7CiAgICAgaW50MTZfdCAqZGF0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgcGVha0xldmVsID0gMC4wOwogICAgIGludCBsb29wQ291bnRlciA9IDA7CkBAIC01Niw3ICs2MSw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBNb25pdG9yIGlucHV0IGxldmVsIHVzaW5nIEFBdWRpb1xuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIE1vbml0b3IgaW5wdXQgbGV2ZWwgdXNpbmcgQUF1ZGlvIHJlYWQsIFYwLjEuMlxuIiwgYXJndlswXSk7CiAKICAgICBhcmdQYXJzZXIuc2V0Rm9ybWF0KFJFUVVJUkVEX0ZPUk1BVCk7CiAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKQEAgLTc0LDcgKzc5LDcgQEAKICAgICBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiZGV2aWNlSWQgPSAlZFxuIiwgZGV2aWNlSWQpOwogCi0gICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoIlNhbXBsZXNQZXJGcmFtZSA9ICVkXG4iLCBhY3R1YWxTYW1wbGVzUGVyRnJhbWUpOwogICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZVJhdGUpOwpAQCAtMTMzLDYgKzEzOCw3IEBACiAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgfQogICAgICAgICBmcmFtZXNMZWZ0IC09IGFjdHVhbDsKKyAgICAgICAgZnJhbWVDb3VudCArPSBhY3R1YWw7CiAKICAgICAgICAgLy8gUGVhayBmaW5kZXIuCiAgICAgICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgYWN0dWFsOyBmcmFtZUluZGV4KyspIHsKQEAgLTE0Myw5ICsxNDksMzYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIERpc3BsYXkgbGV2ZWwgYXMgc3RhcnMsIGVnLiAiKioqKioqIi4KLSAgICAgICAgaWYgKChsb29wQ291bnRlcisrICUgMTApID09IDApIHsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiBuZXh0RnJhbWVDb3VudCkgewogICAgICAgICAgICAgZGlzcGxheVBlYWtMZXZlbChwZWFrTGV2ZWwpOwogICAgICAgICAgICAgcGVha0xldmVsID0gMC4wOworICAgICAgICAgICAgbmV4dEZyYW1lQ291bnQgKz0gRlJBTUVTX1BFUl9MSU5FOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJpbnQgdGltZXN0YW1wcy4KKyAgICAgICAgaW50NjRfdCBmcmFtZVBvc2l0aW9uID0gMDsKKyAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUgPSAwOworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGltZVJlc3VsdDsKKyAgICAgICAgdGltZVJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLCBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVBvc2l0aW9uLCAmZnJhbWVUaW1lKTsKKworICAgICAgICBpZiAodGltZVJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGlmIChmcmFtZVBvc2l0aW9uID4gKHByZXZpb3VzRnJhbWVQb3NpdGlvbiArIEZSQU1FU19QRVJfTElORSkpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChhYXVkaW9TdHJlYW0pOworCisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNaWxsaXMgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKGZyYW1lc1JlYWQsIHJlYWxUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVBvc2l0aW9uLCBmcmFtZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCItLS0gdGltZXN0YW1wOiByZXN1bHQgPSAlNGQsIHBvc2l0aW9uID0gJWxsZCwgYXQgJWxsZCBuYW5vcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBsYXRlbmN5ID0gJTcuMmYgbXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TWlsbGlzKTsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0ZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKaW5kZXggOWRlMmViMC4uODkzNzk1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwotICAgIHByaW50ZigiJXMgLSBEaXNwbGF5IGF1ZGlvIGlucHV0IHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFja1xuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIERpc3BsYXkgYXVkaW8gaW5wdXQgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrLCBWMC4xLjJcbiIsIGFyZ3ZbMF0pOwogCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbigyLCA0ODAwMCwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LAogICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVSZWNvcmRlckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVJlY29yZGVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCAxNDRjOTQxLi5kZjBkZjA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtNDE3LDExICs0MTcsMTggQEAKICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICAgICAgcHJpbnRmKCIlNGQ6ICIsIGkpOwogICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5wcmludFN0YXR1cygpOwotICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4obG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBwcmludGYoIiBpbnB1dCB3cml0dGVuID0gJWxsZCwgcmVhZCAlbGxkLCB4cnVucyA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVzUmVhZCwKKworICAgICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRGcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICBwcmludGYoIiBJTlBVVDogd3IgJWxsZCByZCAlbGxkIHN0YXRlICVzLCBPVVRQVVQ6IHdyICVsbGQgcmQgJWxsZCBzdGF0ZSAlcywgeHJ1bnMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgaW5wdXRGcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGlucHV0RnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pKSwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvdXRwdXRGcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG91dHB1dEZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChBQXVkaW9TdHJlYW1fZ2V0U3RhdGUob3V0cHV0U3RyZWFtKSksCiAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pCiAgICAgICAgICAgICApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAppbmRleCA0NmJjOTllLi5hZGEzN2UyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDggQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgotI2luY2x1ZGUgPEFBdWRpb0V4YW1wbGVVdGlscy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKIC8vIFRPRE8gdXNlIHRoaXMgYXMgYSBiYXNlIGNsYXNzIHdpdGhpbiBBQXVkaW8KIGNsYXNzIEFBdWRpb1BhcmFtZXRlcnMgewpAQCAtMTQ5LDYgKzE1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNldENoYW5uZWxDb3VudChhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgIHNldERldmljZUlkKGF0b2koJmFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uU2Vjb25kcyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ20nOiB7CkBAIC0yMDEsNyArMjA1LDggQEAKICAgICAgICAgcHJpbnRmKCIgICAgICBEZWZhdWx0IHZhbHVlcyBhcmUgVU5TUEVDSUZJRUQgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtYntidWZmZXJDYXBhY2l0eX0gZnJhbWVzXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtY3tjaGFubmVsc30gZm9yIGV4YW1wbGUgMiBmb3Igc3RlcmVvXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkZXZpY2VJZH0gZGVmYXVsdCBpcyAlZFxuIiwgQUFVRElPX1VOU1BFQ0lGSUVEKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtc3tkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtbXswfDF8MnwzfSBzZXQgTU1BUCBwb2xpY3lcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAwID0gX1VOU1BFQ0lGSUVELCBkZWZhdWx0XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUlxuIik7CkBAIC0yMzksNyArMjQ0LDcgQEAKICAgICAgKiBQcmludCBzdHJlYW0gcGFyYW1ldGVycyBpbiBjb21wYXJpc29uIHdpdGggcmVxdWVzdGVkIHZhbHVlcy4KICAgICAgKiBAcGFyYW0gc3RyZWFtCiAgICAgICovCi0gICAgdm9pZCBjb21wYXJlV2l0aFN0cmVhbShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgeworICAgIHZvaWQgY29tcGFyZVdpdGhTdHJlYW0oQUF1ZGlvU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKIAogICAgICAgICBwcmludGYoIiAgRGV2aWNlSWQ6ICAgICByZXF1ZXN0ZWQgPSAlZCwgYWN0dWFsID0gJWRcbiIsCiAgICAgICAgICAgICAgICBnZXREZXZpY2VJZCgpLCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoc3RyZWFtKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKaW5kZXggNjZkZTI1Zi4uYzE3OWNlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaApAQCAtMTcsMjcgKzE3LDcxIEBACiAjaWZuZGVmIEFBVURJT19FWEFNUExFX1VUSUxTX0gKICNkZWZpbmUgQUFVRElPX0VYQU1QTEVfVVRJTFNfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCiAjZGVmaW5lIE5BTk9TX1BFUl9NSUNST1NFQ09ORCAoKGludDY0X3QpMTAwMCkKICNkZWZpbmUgTkFOT1NfUEVSX01JTExJU0VDT05EIChOQU5PU19QRVJfTUlDUk9TRUNPTkQgKiAxMDAwKQogI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgICAgKE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAqIDEwMDApCiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKLSAgICBjb25zdCBjaGFyICptb2RlVGV4dCA9ICJ1bmtub3duIjsKK2NvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgeworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAidW5rbm93biI7CiAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKLSAgICAgICAgbW9kZVRleHQgPSAiRVhDTFVTSVZFIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKLSAgICAgICAgbW9kZVRleHQgPSAiU0hBUkVEIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CisgICAgICAgICAgICB0ZXh0ID0gIkVYQ0xVU0lWRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKKyAgICAgICAgICAgIHRleHQgPSAiU0hBUkVEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBtb2RlVGV4dDsKKyAgICByZXR1cm4gdGV4dDsKK30KKworY29uc3QgY2hhciAqZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CisgICAgICAgICAgICB0ZXh0ID0gIk5PTkUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CisgICAgICAgICAgICB0ZXh0ID0gIkxPV19MQVRFTkNZIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKKyAgICAgICAgICAgIHRleHQgPSAiUE9XRVJfU0FWSU5HIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworfQorCitjb25zdCBjaGFyICpnZXREaXJlY3Rpb25UZXh0KGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKKyAgICAgICAgICAgIHRleHQgPSAiSU5QVVQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICB0ZXh0ID0gIk9VVFBVVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworc3RhdGljIHZvaWQgY29udmVydE5hbm9zZWNvbmRzVG9UaW1lc3BlYyhpbnQ2NF90IG5hbm9zZWNvbmRzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKKyAgICB0aW1lLT50dl9zZWMgPSBuYW5vc2Vjb25kcyAvIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgLy8gQ2FsY3VsYXRlIHRoZSBmcmFjdGlvbmFsIG5hbm9zZWNvbmRzLiBBdm9pZHMgZXhwZW5zaXZlICUgb3BlcmF0aW9uLgorICAgIHRpbWUtPnR2X25zZWMgPSBuYW5vc2Vjb25kcyAtICh0aW1lLT50dl9zZWMgKiBOQU5PU19QRVJfU0VDT05EKTsKIH0KIAogc3RhdGljIGludDY0X3QgZ2V0TmFub3NlY29uZHMoY2xvY2tpZF90IGNsb2NrSWQgPSBDTE9DS19NT05PVE9OSUMpIHsKQEAgLTQ5LDcgKzkzLDcgQEAKICAgICByZXR1cm4gKHRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCkgKyB0aW1lLnR2X25zZWM7CiB9CiAKLXZvaWQgZGlzcGxheVBlYWtMZXZlbChmbG9hdCBwZWFrTGV2ZWwpIHsKK3N0YXRpYyB2b2lkIGRpc3BsYXlQZWFrTGV2ZWwoZmxvYXQgcGVha0xldmVsKSB7CiAgICAgcHJpbnRmKCIlNS4zZiAiLCBwZWFrTGV2ZWwpOwogICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDUwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKICAgICBpbnQgbnVtU3RhcnMgPSAoaW50KSAocGVha0xldmVsICogbWF4U3RhcnMpOwpAQCAtNTksNCArMTAzLDk3IEBACiAgICAgcHJpbnRmKCJcbiIpOwogfQogCisvKioKKyAqIEBwYXJhbSBwb3NpdGlvbjEgcG9zaXRpb24gb2YgaGFyZHdhcmUgZnJhbWUKKyAqIEBwYXJhbSBuYW5vc2Vjb25kczEKKyAqIEBwYXJhbSBwb3NpdGlvbjIgcG9zaXRpb24gb2YgY2xpZW50IHJlYWQvd3JpdGUKKyAqIEBwYXJhbSBuYW5vc2Vjb25kczIKKyAqIEBwYXJhbSBzYW1wbGVSYXRlCisgKiBAcmV0dXJuIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzCisgKi8KK3N0YXRpYyBkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uMiwgaW50NjRfdCBuYW5vc2Vjb25kczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZVJhdGUpIHsKKyAgICBpbnQ2NF90IGRlbHRhRnJhbWVzID0gcG9zaXRpb24yIC0gcG9zaXRpb24xOworICAgIGludDY0X3QgZGVsdGFUaW1lID0KKyAgICAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogZGVsdGFGcmFtZXMgLyBzYW1wbGVSYXRlKTsKKyAgICBpbnQ2NF90IHRpbWVDdXJyZW50RnJhbWVQbGF5ZWQgPSBuYW5vc2Vjb25kczEgKyBkZWx0YVRpbWU7CisgICAgaW50NjRfdCBsYXRlbmN5TmFub3MgPSB0aW1lQ3VycmVudEZyYW1lUGxheWVkIC0gbmFub3NlY29uZHMyOworICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0gbGF0ZW5jeU5hbm9zIC8gMTAwMDAwMC4wOworICAgIHJldHVybiBsYXRlbmN5TWlsbGlzOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhlc2UgRnV0ZXggY2FsbHMgYXJlIGNvbW1vbiBvbmxpbmUgZXhhbXBsZXMuCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3Qgc3lzX2Z1dGV4KHZvaWQgKmFkZHIxLCBpbnQgb3AsIGludCB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCwgdm9pZCAqYWRkcjIsIGludCB2YWwzKSB7CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gKGFuZHJvaWQ6OnN0YXR1c190KSBzeXNjYWxsKFNZU19mdXRleCwgYWRkcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLCB2YWwxLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyMiwgdmFsMyk7CisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCkgPyAwIDogLWVycm5vOworfQorCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FrZSh2b2lkICphZGRyLCBpbnQgbnVtV2FrZSkgeworICAgIC8vIFVzZSBfUFJJVkFURSBiZWNhdXNlIHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBmdXRleCBpbiBvbmUgcHJvY2Vzcy4KKyAgICByZXR1cm4gc3lzX2Z1dGV4KGFkZHIsIEZVVEVYX1dBS0VfUFJJVkFURSwgbnVtV2FrZSwgTlVMTCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWl0KHZvaWQgKmFkZHIsIGludCBjdXJyZW50LCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKKyAgICAvLyBVc2UgX1BSSVZBVEUgYmVjYXVzZSB3ZSBhcmUganVzdCB1c2luZyB0aGUgZnV0ZXggaW4gb25lIHByb2Nlc3MuCisgICAgcmV0dXJuIHN5c19mdXRleChhZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIGN1cnJlbnQsIHRpbWUsIE5VTEwsIDApOworfQorCisvLyBUT0RPIGJldHRlciBuYW1lPworLyoqCisgKiBUaGUgV2FrZVVwIGNsYXNzIGlzIHVzZWQgdG8gc2VuZCBhIHdha2V1cCBzaWduYWwgdG8gb25lIG9yIG1vcmUgc2xlZXBpbmcgdGhyZWFkcy4KKyAqLworY2xhc3MgV2FrZVVwIHsKK3B1YmxpYzoKKyAgICBXYWtlVXAoKSA6IG1WYWx1ZSgwKSB7fQorICAgIGV4cGxpY2l0IFdha2VVcChpbnQzMl90IHZhbHVlKSA6IG1WYWx1ZSh2YWx1ZSkge30KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwgdGhlIGludGVybmFsIHZhbHVlIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHVzZXMgYSBmdXRleCwgd2hpY2ggaXMgc3ViamVjdCB0byBzcHVyaW91cyB3YWtlLXVwcy4KKyAgICAgKiBTbyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGVzaXJlZCBjb25kaXRpb24gaGFzIGJlZW4gbWV0LgorICAgICAqCisgICAgICogQHJldHVybiB6ZXJvIGlmIHRoZSB2YWx1ZSBjaGFuZ2VzIG9yIHZhcmlvdXMgbmVnYXRpdmUgZXJyb3JzIGluY2x1ZGluZworICAgICAqICAgIC1FVElNRURPVVQgaWYgYSB0aW1lb3V0IG9jY3VycywKKyAgICAgKiAgICBvciAtRUlOVFIgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwsCisgICAgICogICAgb3IgLUVBR0FJTiBvciAtRVdPVUxEQkxPQ0sgaWYgdGhlIGludGVybmFsIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgKi8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCB3YWl0KGludDMyX3QgdmFsdWUsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOworICAgICAgICBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKHRpbWVvdXROYW5vc2Vjb25kcywgJnRpbWUpOworICAgICAgICByZXR1cm4gZnV0ZXhfd2FpdCgmbVZhbHVlLCB2YWx1ZSwgJnRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB2YWx1ZSBhbmQgd2FrZSB1cCBhbnkgdGhyZWFkcyB0aGF0IG5lZWQgdG8gYmUgd29rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiB3YWl0ZXJzIHdva2VuIHVwCisgICAgICovCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgd2FrZSgpIHsKKyAgICAgICAgKyttVmFsdWU7CisgICAgICAgIHJldHVybiBmdXRleF93YWtlKCZtVmFsdWUsIElOVF9NQVgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB2YWx1ZSBhbmQgd2FrZSB1cCBhbnkgdGhyZWFkcyB0aGF0IG5lZWQgdG8gYmUgd29rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiB3YWl0ZXJzIHdva2VuIHVwCisgICAgICovCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgd2FrZShpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIG1WYWx1ZS5zdG9yZSh2YWx1ZSk7CisgICAgICAgIHJldHVybiBmdXRleF93YWtlKCZtVmFsdWUsIElOVF9NQVgpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0KCkgeworICAgICAgICByZXR1cm4gbVZhbHVlLmxvYWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICBtVmFsdWU7Cit9OworCiAjZW5kaWYgLy8gQUFVRElPX0VYQU1QTEVfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCmluZGV4IGNjMGNiMzQuLjYwNmM0YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxzY2hlZC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAjaW5jbHVkZSAiU2luZUdlbmVyYXRvci5oIgogCkBAIC0zNSw2ICszNiwxMyBAQAogLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCisjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wIHsKKyAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgIGludDY0X3QgbmFub3NlY29uZHM7Cit9IFRpbWVzdGFtcDsKKwogLyoqCiAgKiBTaW1wbGUgd3JhcHBlciBmb3IgQUF1ZGlvIHRoYXQgb3BlbnMgYW4gb3V0cHV0IHN0cmVhbSBlaXRoZXIgaW4gY2FsbGJhY2sgb3IgYmxvY2tpbmcgd3JpdGUgbW9kZS4KICAqLwpAQCAtMjE5LDE4ICsyMjcsMjggQEAKICAgICBBQXVkaW9TdHJlYW0gICAgICAgICAgICAgKm1TdHJlYW0gPSBudWxscHRyOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgbVJlcXVlc3RlZFNoYXJpbmdNb2RlID0gU0hBUklOR19NT0RFOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgbVJlcXVlc3RlZFBlcmZvcm1hbmNlTW9kZSA9IFBFUkZPUk1BTkNFX01PREU7CisKIH07CiAKIHR5cGVkZWYgc3RydWN0IFNpbmVUaHJlYWRlZERhdGFfcyB7CisKICAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMTsKICAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMjsKKyAgICBUaW1lc3RhbXAgICAgICB0aW1lc3RhbXBzW01BWF9USU1FU1RBTVBTXTsKICAgICBpbnQ2NF90ICAgICAgICBmcmFtZXNUb3RhbCA9IDA7CiAgICAgaW50NjRfdCAgICAgICAgbmV4dEZyYW1lVG9HbGl0Y2ggPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKICAgICBpbnQzMl90ICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CiAgICAgaW50MzJfdCAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKLSAgICBpbnQgICAgICAgICAgICBzY2hlZHVsZXI7CisgICAgaW50MzJfdCAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCisKKyAgICBpbnQgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwogICAgIGJvb2wgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBib29sICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworCisgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CisgICAgV2FrZVVwICAgICAgICAgICAgIHdha2Vye0FBVURJT19PS307CisKIH0gU2luZVRocmVhZGVkRGF0YV90OwogCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgpAQCAtMjQ3LDYgKzI2NSw3IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogICAgIFNpbmVUaHJlYWRlZERhdGFfdCAqc2luZURhdGEgPSAoU2luZVRocmVhZGVkRGF0YV90ICopIHVzZXJEYXRhOworICAgIHNpbmVEYXRhLT5jYWxsYmFja0NvdW50Kys7CiAKICAgICBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOwogCkBAIC0yNjMsNiArMjgyLDE3IEBACiAgICAgICAgIHNpbmVEYXRhLT5zY2hlZHVsZXJDaGVja2VkID0gdHJ1ZTsKICAgICB9CiAKKyAgICBpZiAoc2luZURhdGEtPnRpbWVzdGFtcENvdW50IDwgTUFYX1RJTUVTVEFNUFMpIHsKKyAgICAgICAgVGltZXN0YW1wICp0aW1lc3RhbXAgPSAmc2luZURhdGEtPnRpbWVzdGFtcHNbc2luZURhdGEtPnRpbWVzdGFtcENvdW50XTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoc3RyZWFtLAorICAgICAgICAgICAgQ0xPQ0tfTU9OT1RPTklDLCAmdGltZXN0YW1wLT5wb3NpdGlvbiwgJnRpbWVzdGFtcC0+bmFub3NlY29uZHMpOworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiAvLyB2YWxpZD8KKyAgICAgICAgICAgICAgICAoc2luZURhdGEtPnRpbWVzdGFtcENvdW50ID09IDAgfHwgLy8gZmlyc3Qgb25lPworICAgICAgICAgICAgICAgICh0aW1lc3RhbXAtPnBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+cG9zaXRpb24pKSkgeyAvLyBhZHZhbmNlZCBwb3NpdGlvbj8KKyAgICAgICAgICAgIHNpbmVEYXRhLT50aW1lc3RhbXBDb3VudCsrOyAvLyBrZWVwIHRoaXMgb25lCisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobnVtRnJhbWVzID4gc2luZURhdGEtPm1heE51bUZyYW1lcykgewogICAgICAgICBzaW5lRGF0YS0+bWF4TnVtRnJhbWVzID0gbnVtRnJhbWVzOwogICAgIH0KQEAgLTMwNCw5ICszMzQsMTYgQEAKIHZvaWQgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAogICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKQotewotICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgIGlmICh1c2VyRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBNeVBsYXllckVycm9yQ2FsbGJhY2tQcm9jIG5lZWRzIHVzZXJEYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBzaW5lRGF0YS0+d2FrZXIud2FrZShlcnJvcik7CisgICAgcHJpbnRmKCJFcnJvciBDYWxsYmFjaywgZXJyb3I6ICVkLCBmdXRleCB3YWtlIHJldHVybnMgJWRcbiIsIGVycm9yLCByZXQpOwogfQogCisKICNlbmRpZiAvL0FBVURJT19TSU1QTEVfUExBWUVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggNWVjYWMwNC4uMTM0NDI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOworICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTs7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODcsNyArMTg3LDcgQEAKIAogICAgIC8vIFdyaXRlIHplcm8gZGF0YSB0byBmaWxsIHVwIHRoZSBidWZmZXIgYW5kIHByZXZlbnQgdW5kZXJydW5zLgogICAgIGFhdWRpb19yZXN1bHRfdCBwcmltZSgpIHsKLSAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW0pOworICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7CiAgICAgICAgIGNvbnN0IGludCBudW1GcmFtZXMgPSAzMjsgLy8gYXJiaXRyYXJ5CiAgICAgICAgIGZsb2F0IHplcm9zW251bUZyYW1lcyAqIHNhbXBsZXNQZXJGcmFtZV07CiAgICAgICAgIG1lbXNldCh6ZXJvcywgMCwgc2l6ZW9mKHplcm9zKSk7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB9CiAgICAgUGVha1RyYWNrZXJEYXRhX3QgKmRhdGEgPSAoUGVha1RyYWNrZXJEYXRhX3QgKikgdXNlckRhdGE7CiAgICAgLy8gcHJpbnRmKCJNeUNhbGxiYWNrUHJvYygpOiBmcmFtZUNvdW50ID0gJWRcbiIsIG51bUZyYW1lcyk7Ci0gICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKHN0cmVhbSk7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7CiAgICAgZmxvYXQgc2FtcGxlOwogICAgIC8vIFRoaXMgY29kZSBhc3N1bWUgbW9ubyBvciBzdGVyZW8uCiAgICAgc3dpdGNoIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCmluZGV4IDY0Yjc3MmQuLmE3NTU1ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaApAQCAtNTgsNiArNTgsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgc2V0QW1wbGl0dWRlKGRvdWJsZSBhbXBsaXR1ZGUpIHsKKyAgICAgICAgbUFtcGxpdHVkZSA9IGFtcGxpdHVkZTsKKyAgICB9CisgICAgZG91YmxlIGdldEFtcGxpdHVkZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbXBsaXR1ZGU7CisgICAgfQorCiBwcml2YXRlOgogICAgIHZvaWQgYWR2YW5jZVBoYXNlKCkgewogICAgICAgICBtUGhhc2UgKz0gbVBoYXNlSW5jcmVtZW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCmluZGV4IDg3ZmI0MGIuLjY3N2ZiNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuMVxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuMlxuIiwgYXJndlswXSk7CiAKICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IGI1NjAyZTkuLjRmOWNkZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAvLyBQbGF5IHNpbmUgd2F2ZXMgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrLgorLy8gSWYgYSBkaXNjb25uZWN0aW9uIG9jY3VycyB0aGVuIHJlb3BlbiB0aGUgc3RyZWFtIG9uIHRoZSBuZXcgZGV2aWNlLgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0yMiwzMyArMjMsMzIgQEAKICNpbmNsdWRlIDxzY2hlZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAKLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKKy8qKgorICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIGFyZ1BhcnNlcgorICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlcikKIHsKLSAgICBBQXVkaW9BcmdzUGFyc2VyICAgYXJnUGFyc2VyOwotICAgIEFBdWRpb1NpbXBsZVBsYXllciBwbGF5ZXI7CiAgICAgU2luZVRocmVhZGVkRGF0YV90IG15RGF0YTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwotICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZTsKKyAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgJnBsYXllciA9IG15RGF0YS5zaW1wbGVQbGF5ZXI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCAgICAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zOwogCi0gICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawotICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCi0gICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7Ci0KLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYwLjEuMlxuIiwgYXJndlswXSk7Ci0KKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJ1biBjb21wbGV0ZSB0ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOworICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKICAgICBteURhdGEuZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsgLy8gc2V0IHRydWUgdG8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKIAotICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLCAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNTgsMTMgKzU4LDE5IEBACiAKICAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ocGxheWVyLmdldFN0cmVhbSgpKTsKIAotICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOwotICAgIG15RGF0YS5zaW5lT3NjMS5zZXR1cCg0NDAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgbXlEYXRhLnNpbmVPc2MxLnNldFN3ZWVwKDMwMC4wLCA2MDAuMCwgNS4wKTsKLSAgICBteURhdGEuc2luZU9zYzIuc2V0dXAoNjYwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgIG15RGF0YS5zaW5lT3NjMi5zZXRTd2VlcCgzNTAuMCwgOTAwLjAsIDcuMCk7CisgICAgLy8gU2V0dXAgc2luZSB3YXZlIGdlbmVyYXRvcnMuCisgICAgeworICAgICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0dXAoNDQwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0U3dlZXAoMzAwLjAsIDYwMC4wLCA1LjApOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0QW1wbGl0dWRlKDAuMik7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXR1cCg2NjAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRTd2VlcCgzNTAuMCwgOTAwLjAsIDcuMCk7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRBbXBsaXR1ZGUoMC4yKTsKKyAgICB9CiAKICNpZiAwCisgICAgLy8gIHdyaXRlcyBub3QgYWxsb3dlZCBmb3IgY2FsbGJhY2sgc3RyZWFtcwogICAgIHJlc3VsdCA9IHBsYXllci5wcmltZSgpOyAvLyBGSVhNRSBjcmFzaGVzIEF1ZGlvVHJhY2suY3BwCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIHBsYXllci5wcmltZSgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwpAQCAtNzgsMzQgKzg0LDMyIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCisgICAgLy8gUGxheSBhIHNpbmUgd2F2ZSBpbiB0aGUgYmFja2dyb3VuZC4KICAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHBsYXlzIGluIGEgY2FsbGJhY2sgdGhyZWFkLlxuIiwKICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpKTsKKyAgICBzdGFydGVkQXROYW5vcyA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CiAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOyBzZWNvbmQrKykKICAgICB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXF1ZXN0ID0geyAudHZfc2VjID0gMSwgLnR2X25zZWMgPSAwIH07Ci0gICAgICAgICh2b2lkKSBjbG9ja19uYW5vc2xlZXAoQ0xPQ0tfTU9OT1RPTklDLCAwIC8qZmxhZ3MqLywgJnJlcXVlc3QsIE5VTEwgLypyZW1haW4qLyk7Ci0KLSAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlOwotICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKHBsYXllci5nZXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUuIFdha2UgdXAgZWFybHkgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIGEgRElTQ09OTkVDVC4KKyAgICAgICAgbG9uZyByZXQgPSBteURhdGEud2FrZXIud2FpdChBQVVESU9fT0ssIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICBpbnQ2NF90IG1pbGxpcyA9IChnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRlZEF0TmFub3MpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7CisgICAgICAgIHByaW50Zigid2FpdCgpIHJldHVybnMgJWxkLCBhYXVkaW9fcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCisgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlZCwgZnJhbWVzV3JpdHRlbiA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICByZXQsIHJlc3VsdCwgKGludCkgbWlsbGlzLAorICAgICAgICAgICAgICAgc2Vjb25kLAorICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKKyAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyAmJiBzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKLSAgICAgICAgICAgIHByaW50ZigiU3RyZWFtIHN0YXRlIGlzICVkICVzIVxuIiwgc3RhdGUsIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwcmludGYoImZyYW1lc1dyaXR0ZW4gPSAlZCwgdW5kZXJydW5zID0gJWRcbiIsCi0gICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpCi0gICAgICAgICk7CiAgICAgfQotICAgIHByaW50ZigiV29rZSB1cCBub3cuXG4iKTsKKyAgICBwcmludGYoIkFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogCi0gICAgcHJpbnRmKCJjYWxsIHN0b3AoKVxuIik7CisgICAgcHJpbnRmKCJjYWxsIHN0b3AoKSBjYWxsYmFjayAjID0gJWRcbiIsIG15RGF0YS5jYWxsYmFja0NvdW50KTsKICAgICByZXN1bHQgPSBwbGF5ZXIuc3RvcCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xMTYsNiArMTIwLDE4IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteURhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgeworICAgICAgICBUaW1lc3RhbXAgKnRpbWVzdGFtcCA9ICZteURhdGEudGltZXN0YW1wc1tpXTsKKyAgICAgICAgYm9vbCByZXRybyA9IChpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICgodGltZXN0YW1wLT5wb3NpdGlvbiA8ICh0aW1lc3RhbXAgLSAxKS0+cG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgodGltZXN0YW1wLT5uYW5vc2Vjb25kcyA8ICh0aW1lc3RhbXAgLSAxKS0+bmFub3NlY29uZHMpKSkpOworICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlID0gcmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIjsKKyAgICAgICAgcHJpbnRmKCJUaW1lc3RhbXAgJTNkIDogJThsbGQsICU4bGxkICVzXG4iLCBpLAorICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+bmFub3NlY29uZHMsCisgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICB9CisKICAgICBpZiAobXlEYXRhLnNjaGVkdWxlckNoZWNrZWQpIHsKICAgICAgICAgcHJpbnRmKCJzY2hlZHVsZXIgPSAweCUwOHgsIFNDSEVEX0ZJRk8gPSAweCUwOFhcbiIsCiAgICAgICAgICAgICAgICBteURhdGEuc2NoZWR1bGVyLApAQCAtMTI2LDEwICsxNDIsMjggQEAKICAgICBwcmludGYoIm1heCBudW1GcmFtZXMgPSAlOGRcbiIsIChpbnQpIG15RGF0YS5tYXhOdW1GcmFtZXMpOwogCiAgICAgcHJpbnRmKCJTVUNDRVNTXG4iKTsKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogZXJyb3I6CiAgICAgcGxheWVyLmNsb3NlKCk7Ci0gICAgcHJpbnRmKCJleGl0aW5nIC0gQUF1ZGlvIHJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICByZXR1cm4gZGlzY29ubmVjdGVkID8gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCA6IHJlc3VsdDsKIH0KIAoraW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgIEFBdWRpb0FyZ3NQYXJzZXIgICBhcmdQYXJzZXI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdDsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjJcbiIsIGFyZ3ZbMF0pOworCisgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KKyAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyKSkgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICByZXR1cm4gKHJlc3VsdCkgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggZTE4ODZhYy4uM2MyMzczNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjM0LDEwICsyMzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogLyoqCisgKiBJZGVudGljYWwgdG8gQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKS4KICAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKQorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBmcmFtZS4KICAqLwotLy8gVE9ETyByZW1vdmUgYXMgc29vbiBhcyB0aGUgTkRLIGFuZCBPUyBhcmUgaW4gc3luYywgYmVmb3JlIFJDMQogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpOwogCkBAIC03MjksMTEgKzczMCwxMCBAQAogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCiAvKioKLSAqIFRoZSBzYW1wbGVzUGVyRnJhbWUgaXMgYWxzbyBrbm93biBhcyBjaGFubmVsQ291bnQuCisgKiBJZGVudGljYWwgdG8gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudCgpLgogICoKLSAqIEBkZXByZWNhdGVkIHVzZSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGFjdHVhbCBzYW1wbGVzIHBlciBmcmFtZQorICogQHJldHVybiBhY3R1YWwgbnVtYmVyIG9mIHNhbXBsZXMgZnJhbWUKICAqLwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCkBAIC04MTAsNyArODEwLDcgQEAKICAqIFRoZSBwb3NpdGlvbiBhbmQgdGltZSBwYXNzZWQgYmFjayBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcGFyYW0gY2xvY2tpZCBBQVVESU9fQ0xPQ0tfTU9OT1RPTklDIG9yIEFBVURJT19DTE9DS19CT09UVElNRQorICogQHBhcmFtIGNsb2NraWQgQ0xPQ0tfTU9OT1RPTklDIG9yIENMT0NLX0JPT1RUSU1FCiAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgcG9zaXRpb24KICAqIEBwYXJhbSB0aW1lTmFub3NlY29uZHMgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHRpbWUKICAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tawppbmRleCBjZmNmMjdhLi42ODYxMjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLm1rCkBAIC0zNiw3ICszNiw2IEBACiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBcCiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBcCiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIFwKLSAgICB1dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwIFwKICAgICB1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgXAogICAgIHV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIFwKICAgICB1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIFwKQEAgLTk1LDcgKzk0LDYgQEAKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIFwKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIFwKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgXAotICAgIHV0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAgXAogICAgIHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBcCiAgICAgdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAgXAogICAgIHV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCBhMjY4ZTQ5Li4wN2VlMmRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtNDUsNiArNDUsNyBAQAogdXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7CiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OndwOwogCkBAIC01MiwxNSArNTMsMTkgQEAKIAogQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKEFBdWRpb0JpbmRlckNsaWVudCk7CiAKKy8vIElmIHdlIGRvbid0IGtlZXAgYSBzdHJvbmcgcG9pbnRlciBoZXJlIHRoZW4gdGhpcyBzaW5nbGV0b24gY2FuIGdldCBkZWxldGVkIQorYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBnS2VlcEJpbmRlckNsaWVudDsKKwogQUF1ZGlvQmluZGVyQ2xpZW50OjpBQXVkaW9CaW5kZXJDbGllbnQoKQogICAgICAgICA6IEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKQogICAgICAgICAsIFNpbmdsZXRvbjxBQXVkaW9CaW5kZXJDbGllbnQ+KCkgewotCisgICAgZ0tlZXBCaW5kZXJDbGllbnQgPSB0aGlzOyAvLyBzbyB0aGlzIHNpbmdsZXRvbiB3b24ndCBnZXQgZGVsZXRlZAogICAgIG1BQXVkaW9DbGllbnQgPSBuZXcgQUF1ZGlvQ2xpZW50KHRoaXMpOwotICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKSBjcmVhdGVkIG1BQXVkaW9DbGllbnQgPSAlcCIsIG1BQXVkaW9DbGllbnQuZ2V0KCkpOworICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKSB0aGlzID0gJXAsIGNyZWF0ZWQgbUFBdWRpb0NsaWVudCA9ICVwIiwgdGhpcywgbUFBdWRpb0NsaWVudC5nZXQoKSk7CiB9CiAKIEFBdWRpb0JpbmRlckNsaWVudDo6fkFBdWRpb0JpbmRlckNsaWVudCgpIHsKKyAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCk6On5BQXVkaW9CaW5kZXJDbGllbnQoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7CiAgICAgaWYgKG1BQXVkaW9TZXJ2aWNlICE9IDApIHsKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUFBdWRpb1NlcnZpY2UpLT51bmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOwpAQCAtNzUsMTkgKzgwLDE5IEBACiAgICAgYm9vbCBuZWVkVG9SZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGlmIChtQUF1ZGlvU2VydmljZSA9PSAwKSB7CisgICAgICAgIGlmIChtQUF1ZGlvU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCB0aW1lcyB0byBnZXQgdGhlIHNlcnZpY2UuCiAgICAgICAgICAgICBpbnQgcmV0cmllcyA9IDQ7CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoQUFVRElPX1NFUlZJQ0VfTkFNRSkpOyAvLyBUaGlzIHdpbGwgd2FpdCBhIHdoaWxlLgotICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChiaW5kZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChyZXRyaWVzLS0gPiAwKTsKIAotICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYmluZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIG5vdGlmaWNhdGlvbiBpZiB0aGUgc2VydmljZSBkaWVzLgogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGJpbmRlci0+bGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7CiAgICAgICAgICAgICAgICAgLy8gVE9ETyByZXZpZXcgd2hhdCB3ZSBzaG91bGQgZG8gaWYgdGhpcyBmYWlscwpAQCAtOTgsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICBtQUF1ZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBQXVkaW9TZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICAgICAgICAgIG5lZWRUb1JlZ2lzdGVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FsbGJhY2tzIGNhbiBiZSByZWNlaXZlZCBieSBtQUF1ZGlvQ2xpZW50Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0JpbmRlckNsaWVudCBjb3VsZCBub3QgY29ubmVjdCB0byAlcyIsIEFBVURJT19TRVJWSUNFX05BTUUpOwogICAgICAgICAgICAgfQpAQCAtMTA2LDcgKzExMSw3IEBACiAgICAgICAgIGFhdWRpb1NlcnZpY2UgPSBtQUF1ZGlvU2VydmljZTsKICAgICB9CiAgICAgLy8gRG8gdGhpcyBvdXRzaWRlIHRoZSBtdXRleCBsb2NrLgotICAgIGlmIChuZWVkVG9SZWdpc3RlciAmJiBhYXVkaW9TZXJ2aWNlICE9IDApIHsgLy8gbmV3IGNsaWVudD8KKyAgICBpZiAobmVlZFRvUmVnaXN0ZXIgJiYgYWF1ZGlvU2VydmljZS5nZXQoKSAhPSBudWxscHRyKSB7IC8vIG5ldyBjbGllbnQ/CiAgICAgICAgIGFhdWRpb1NlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1BQXVkaW9DbGllbnQpOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvU2VydmljZTsKQEAgLTExNyw3ICsxMjIsNiBAQAogICAgIG1BQXVkaW9TZXJ2aWNlLmNsZWFyKCk7IC8vIGZvcmNlIGEgcmVjb25uZWN0CiB9CiAKLQogLyoqCiAqIEBwYXJhbSByZXF1ZXN0IGluZm8gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtCiAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjcmVhdGVkIHN0cmVhbQpAQCAtMTI4LDE0ICsxMzIsMTIgQEAKICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwotICAgICAgICB9CisgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKIAogICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9CaW5kZXJDbGllbnQ6IGxvc3QgY29ubmVjdGlvbiB0byBBQXVkaW9TZXJ2aWNlLiIpOworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0JpbmRlckNsaWVudDo6b3BlblN0cmVhbSBsb3N0IGNvbm5lY3Rpb24gdG8gQUF1ZGlvU2VydmljZS4iKTsKICAgICAgICAgICAgIGRyb3BBQXVkaW9TZXJ2aWNlKCk7IC8vIGZvcmNlIGEgcmVjb25uZWN0CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0NSw4ICsxNDcsOCBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpjbG9zZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmNsb3NlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTE1NSwzMiArMTU3LDMyIEBACiAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwgcGFyY2VsYWJsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnN0YXJ0U3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+c3RhcnRTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5wYXVzZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+c3RvcFN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmZsdXNoU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTE5MCw4ICsxOTIsOCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2ROYW5vc2Vjb25kcyk7CkBAIC0xOTksOCArMjAxLDggQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZElkKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaAppbmRleCA4OWFlODVjLi5mOWRhOGI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCkBAIC0xMTgsMTMgKzExOCwxMyBAQAogICAgIHsKICAgICBwdWJsaWM6CiAgICAgICAgIEFBdWRpb0NsaWVudChhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IGFhdWRpb0JpbmRlckNsaWVudCkKLSAgICAgICAgICAgIDogbUJpbmRlckNsaWVudChhYXVkaW9CaW5kZXJDbGllbnQpIHsKKyAgICAgICAgICAgICAgICA6IG1CaW5kZXJDbGllbnQoYWF1ZGlvQmluZGVyQ2xpZW50KSB7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpbXBsZW1lbnQgRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3QgYW5kcm9pZDo6d3A8YW5kcm9pZDo6SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgICAgICAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5kcm9wQUF1ZGlvU2VydmljZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1coIkFBdWRpbyBzZXJ2aWNlIGJpbmRlckRpZWQoKSEiKTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAvLyBpbXBsZW1lbnQgQm5BQXVkaW9DbGllbnQKICAgICAgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgewogICAgICAgICAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5vblN0cmVhbUNoYW5nZShoYW5kbGUsIG9wY29kZSwgdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDEsMTAgKzE0MSwxMSBAQAogICAgICAgICBhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IG1CaW5kZXJDbGllbnQ7CiAgICAgfTsKIAorcHJpdmF0ZToKIAotICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlPiAgbUFBdWRpb1NlcnZpY2U7Ci0gICAgYW5kcm9pZDo6c3A8QUF1ZGlvQ2xpZW50PiAgICBtQUF1ZGlvQ2xpZW50OworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gICAgICAgbUFBdWRpb0NsaWVudDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmgKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9Db21tb24uaAppbmRleCBlNzg5MjQ0Li5lM2U5ZTgyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JhbWJsZXIuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmgKQEAgLTE0LDcgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaWZuZGVmIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICiAKLS8qKiBAaGlkZSAqLwotcGFyY2VsYWJsZSBNZWRpYURlc2NyYW1ibGVyLkRlc2NyYW1ibGVJbmZvIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBJbnRlcm5hbCBoZWFkZXIgdGhhdCBpcyBjb21tb24gdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlci4KKyAqCisgKi8KK25hbWVzcGFjZSBhYXVkaW8geworCit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2hhbmRsZV90OworCit9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KKworI2VuZGlmIC8vIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCmluZGV4IGI0Mzc3ZmIuLjU0ZTgwMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCkBAIC0yOCw3ICsyOCw2IEBACiAvLyBVc2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEhBTCB0byB0aGUgY2xpZW50Lgogc3RydWN0IEFBdWRpb01lc3NhZ2VUaW1lc3RhbXAgewogICAgIGludDY0X3QgcG9zaXRpb247ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRyYW5zZmVycmVkIHNvIGZhcgotICAgIGludDY0X3QgZGV2aWNlT2Zmc2V0OyAvLyBhZGQgdG8gY2xpZW50IHBvc2l0aW9uIHRvIGdldCBkZXZpY2UgcG9zaXRpb24KICAgICBpbnQ2NF90IHRpbWVzdGFtcDsgICAgLy8gdGltZSB3aGVuIHRoYXQgcG9zaXRpb24gd2FzIHJlYWNoZWQKIH07CiAKQEAgLTUxLDcgKzUwLDggQEAKIHR5cGVkZWYgc3RydWN0IEFBdWRpb1NlcnZpY2VNZXNzYWdlX3MgewogICAgIGVudW0gY2xhc3MgY29kZSA6IHVpbnQzMl90IHsKICAgICAgICAgTk9USElORywKLSAgICAgICAgVElNRVNUQU1QLAorICAgICAgICBUSU1FU1RBTVBfU0VSVklDRSwgLy8gd2hlbiBmcmFtZSBpcyByZWFkIG9yIHdyaXR0ZW4gYnkgdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudAorICAgICAgICBUSU1FU1RBTVBfSEFSRFdBUkUsIC8vIHdoZW4gZnJhbWUgaXMgYXQgREFDIG9yIEFEQwogICAgICAgICBFVkVOVCwKICAgICB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggZTc2MzkzNC4uMTUzZmNlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtNDYsNiArNDYsOCBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldERpcmVjdGlvbigpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTczLDkgKzc1LDEyIEBACiAgICAgc2V0Rm9ybWF0KHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0QnVmZmVyQ2FwYWNpdHkodmFsdWUpOwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgogICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCmluZGV4IGFiZGNmNWIuLjEyMDBhYjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKQEAgLTQ2LDkgKzQ2LDYgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1Vc2VySWQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1EaXJlY3Rpb24pOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogCkBAIC03MSwxMCArNjgsNiBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgbVVzZXJJZCA9ICh1aWRfdCkgdGVtcDsKIAotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0ZW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIG1EaXJlY3Rpb24gPSAoYWF1ZGlvX2RpcmVjdGlvbl90KSB0ZW1wOwotCiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKIApAQCAtOTgsNyArOTEsNiBAQAogdm9pZCBBQXVkaW9TdHJlYW1SZXF1ZXN0OjpkdW1wKCkgY29uc3QgewogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1Vc2VySWQgICAgPSAlZCIsIG1Vc2VySWQpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1Qcm9jZXNzSWQgPSAlZCIsIG1Qcm9jZXNzSWQpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1EaXJlY3Rpb24gPSAlZCIsIG1EaXJlY3Rpb24pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSAlZCIsIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1JblNlcnZpY2UgPSAlZCIsIG1JblNlcnZpY2UpOwogICAgIG1Db25maWd1cmF0aW9uLmR1bXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oCmluZGV4IGIwZmE5NmEuLjQ5MmY2OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaApAQCAtNTIsMTQgKzUyLDYgQEAKICAgICAgICAgbVByb2Nlc3NJZCA9IHByb2Nlc3NJZDsKICAgICB9CiAKLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERpcmVjdGlvbihhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7Ci0gICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0gICAgfQotCiAgICAgYm9vbCBpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQ7CiAgICAgfQpAQCAtOTQsOSArODYsOCBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAgbUNvbmZpZ3VyYXRpb247Ci0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgbVVzZXJJZDsKLSAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc0lkOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb247CisgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgbVVzZXJJZCA9ICh1aWRfdCkgLTE7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NJZCA9IChwaWRfdCkgLTE7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsgLy8gU3RyZWFtIG9wZW5lZCBieSBBQXVkaW9zZXJ2aWNlCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgKaW5kZXggMjFjYzMzYi4uZjIxZmQ5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKLSNpbmNsdWRlICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvQ2xpZW50KTsKIAotICAgIHZpcnR1YWwgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGludDMyX3Qgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKaW5kZXggMzBiM2VhZC4uNmJkYjgyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKQEAgLTI0LDEyICsyNCwxMiBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCi0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTEsNyArNTEsNyBAQAogICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjcmVhdGVkIHN0cmVhbQogICAgICAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSBzdHJlYW0gb3IgYSBuZWdhdGl2ZSBlcnJvcgogICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgIHZpcnR1YWwgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSA9IDA7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpID0gMDsKQEAgLTg5LDExICs4OSwxMSBAQAogICAgIC8qKgogICAgICAqIE1hbmFnZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBhcyBhIGxvdyBsYXRlbmN5IGF1ZGlvIHRocmVhZC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IDZlYzI4NWYuLjYwNGVlZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0zMiwxNCArMzIsMTcgQEAKICNkZWZpbmUgUklESUNVTE9VU0xZX0xBUkdFX0ZSQU1FX1NJWkUgICAgICAgIDQwOTYKIAogQXVkaW9FbmRwb2ludDo6QXVkaW9FbmRwb2ludCgpCi0gICAgOiBtRnJlZVJ1bm5pbmcoZmFsc2UpCisgICAgOiBtVXBDb21tYW5kUXVldWUobnVsbHB0cikKKyAgICAsIG1EYXRhUXVldWUobnVsbHB0cikKKyAgICAsIG1GcmVlUnVubmluZyhmYWxzZSkKICAgICAsIG1EYXRhUmVhZENvdW50ZXIoMCkKICAgICAsIG1EYXRhV3JpdGVDb3VudGVyKDApCiB7CiB9CiAKLUF1ZGlvRW5kcG9pbnQ6On5BdWRpb0VuZHBvaW50KCkKLXsKK0F1ZGlvRW5kcG9pbnQ6On5BdWRpb0VuZHBvaW50KCkgeworICAgIGRlbGV0ZSBtRGF0YVF1ZXVlOworICAgIGRlbGV0ZSBtVXBDb21tYW5kUXVldWU7CiB9CiAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgQXVkaW9FbmRwb2ludF92YWxpZGF0ZVF1ZXVlRGVzY3JpcHRvcihjb25zdCBjaGFyICp0eXBlLApAQCAtMTE4LDI0ICsxMjEsMjggQEAKIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9FbmRwb2ludF92YWxpZGF0ZURlc2NyaXB0b3IocEVuZHBvaW50RGVzY3JpcHRvcik7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IgcmV0dXJuZWQgJWQgJXMiLAotICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gdXAgbWVzc2FnZSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcjsKICAgICBpZihkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lICE9IHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSkpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQ6OmNvbmZpZ3VyZSgpIGJ5dGVzUGVyRnJhbWUgIT0gc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSA9ICVkIiwKKyAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgYnl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpID0gJWQiLAogICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKICAgICBpZihkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IoKSBOVUxMIGNvdW50ZXIgYWRkcmVzcyIpOworICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBOVUxMIGNvdW50ZXIgYWRkcmVzcyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogCisgICAgLy8gUHJldmVudCBtZW1vcnkgbGVhayBhbmQgcmV1c2UuCisgICAgaWYobVVwQ29tbWFuZFF1ZXVlICE9IG51bGxwdHIgfHwgbURhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGVuZHBvaW50IGFscmVhZHkgdXNlZCIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKwogICAgIG1VcENvbW1hbmRRdWV1ZSA9IG5ldyBGaWZvQnVmZmVyKAogICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSwKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMsCkBAIC0xNDYsOCArMTUzLDggQEAKIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gZGF0YSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGRlc2NyaXB0b3IgPSAmcEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvcjsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludDo6Y29uZmlndXJlKCkgZGF0YSBmcmFtZXNQZXJCdXJzdCA9ICVkIiwgZGVzY3JpcHRvci0+ZnJhbWVzUGVyQnVyc3QpOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50Ojpjb25maWd1cmUoKSBkYXRhIHJlYWRDb3VudGVyQWRkcmVzcyA9ICVwIiwKKyAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBkYXRhIGZyYW1lc1BlckJ1cnN0ID0gJWQiLCBkZXNjcmlwdG9yLT5mcmFtZXNQZXJCdXJzdCk7CisgICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCiAgICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzKTsKIAogICAgIC8vIEFuIGV4YW1wbGUgb2YgZnJlZSBydW5uaW5nIGlzIHdoZW4gdGhlIG90aGVyIHNpZGUgaXMgcmVhZCBvciB3cml0dGVuIGJ5IGhhcmR3YXJlIERNQQpAQCAtMTU2LDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzIC8vIHJlYWQgYnkgb3RoZXIgc2lkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQogICAgIG1GcmVlUnVubmluZyA9IChyZW1vdGVDb3VudGVyID09IG51bGxwdHIpOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50Ojpjb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKKyAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKIAogICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZtRGF0YVJlYWRDb3VudGVyCkBAIC0yNTQsMyArMjYxLDcgQEAKICAgICBBTE9HRCgiQXVkaW9FbmRwb2ludDogZGF0YSByZWFkQ291bnRlciAgPSAlbGxkIiwgKGxvbmcgbG9uZykgbURhdGFRdWV1ZS0+Z2V0UmVhZENvdW50ZXIoKSk7CiAgICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnQ6IGRhdGEgd3JpdGVDb3VudGVyID0gJWxsZCIsIChsb25nIGxvbmcpIG1EYXRhUXVldWUtPmdldFdyaXRlQ291bnRlcigpKTsKIH0KKwordm9pZCBBdWRpb0VuZHBvaW50OjplcmFzZURhdGFNZW1vcnkoKSB7CisgICAgbURhdGFRdWV1ZS0+ZXJhc2VNZW1vcnkoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAppbmRleCA4MWE0ZjdiLi5mNWI2N2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCkBAIC04Niw2ICs4NiwxMSBAQAogCiAgICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBXcml0ZSB6ZXJvcyB0byB0aGUgZGF0YSBxdWV1ZSBtZW1vcnkuCisgICAgICovCisgICAgdm9pZCBlcmFzZURhdGFNZW1vcnkoKTsKKwogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA0YzdkMGY3Li4yZmRiZmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCkBAIC01NSw3ICs1NCw3IEBACiAvLyBXYWl0IGF0IGxlYXN0IHRoaXMgbWFueSB0aW1lcyBsb25nZXIgdGhhbiB0aGUgb3BlcmF0aW9uIHNob3VsZCB0YWtlLgogI2RlZmluZSBNSU5fVElNRU9VVF9PUEVSQVRJT05TICAgIDQKIAotI2RlZmluZSBMT0dfVElNRVNUQU1QUyAgIDAKKyNkZWZpbmUgTE9HX1RJTUVTVEFNUFMgICAgICAgICAgICAwCiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OkF1ZGlvU3RyZWFtSW50ZXJuYWwoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsIGJvb2wgaW5TZXJ2aWNlKQogICAgICAgICA6IEF1ZGlvU3RyZWFtKCkKQEAgLTYzLDkgKzYyLDkgQEAKICAgICAgICAgLCBtQXVkaW9FbmRwb2ludCgpCiAgICAgICAgICwgbVNlcnZpY2VTdHJlYW1IYW5kbGUoQUFVRElPX0hBTkRMRV9JTlZBTElEKQogICAgICAgICAsIG1GcmFtZXNQZXJCdXJzdCgxNikKLSAgICAgICAgLCBtU3RyZWFtVm9sdW1lKDEuMGYpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKKyAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKICAgICAgICAgLCBtV2FrZXVwRGVsYXlOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRXYWtldXBEZWxheU1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgLCBtTWluaW11bVNsZWVwTmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0TWluaW11bVNsZWVwTWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICB7CkBAIC03OSw5ICs3OCwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGludDMyX3QgY2FwYWNpdHk7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwotICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25PdXRwdXQ7CiAKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogYWxyZWFkeSBvcGVuISBzdGF0ZSA9ICVkIiwgZ2V0U3RhdGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHRvIHRoZSBzdHJlYW0uCiAgICAgcmVzdWx0ID0gQXVkaW9TdHJlYW06Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk3LDEwMyArMTAzLDEwOCBAQAogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICByZXF1ZXN0LnNldFVzZXJJZChnZXR1aWQoKSk7CiAgICAgcmVxdWVzdC5zZXRQcm9jZXNzSWQoZ2V0cGlkKCkpOwotICAgIHJlcXVlc3Quc2V0RGlyZWN0aW9uKGdldERpcmVjdGlvbigpKTsKICAgICByZXF1ZXN0LnNldFNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZChpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpKTsKICAgICByZXF1ZXN0LnNldEluU2VydmljZShtSW5TZXJ2aWNlKTsKIAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGdldERldmljZUlkKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbihnZXREaXJlY3Rpb24oKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoZ2V0U2hhcmluZ01vZGUoKSk7CiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRCdWZmZXJDYXBhY2l0eShidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCi0gICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pOworICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7CiAgICAgICAgIHJlc3VsdCA9IG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbC5vcGVuKCk6IG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gY29uZmlndXJhdGlvbi52YWxpZGF0ZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgotICAgICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICBzZXREZXZpY2VJZChjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOwotICAgICAgICBzZXRTaGFyaW5nTW9kZShjb25maWd1cmF0aW9uLmdldFNoYXJpbmdNb2RlKCkpOwotCi0gICAgICAgIC8vIFNhdmUgZGV2aWNlIGZvcm1hdCBzbyB3ZSBjYW4gZG8gZm9ybWF0IGNvbnZlcnNpb24gYW5kIHZvbHVtZSBzY2FsaW5nIHRvZ2V0aGVyLgotICAgICAgICBtRGV2aWNlRm9ybWF0ID0gY29uZmlndXJhdGlvbi5nZXRGb3JtYXQoKTsKLQotICAgICAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5nZXRTdHJlYW1EZXNjcmlwdGlvbihtU2VydmljZVN0cmVhbUhhbmRsZSwgbUVuZFBvaW50UGFyY2VsYWJsZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVzb2x2ZSBwYXJjZWxhYmxlIGludG8gYSBkZXNjcmlwdG9yCi0gICAgICAgIHJlc3VsdCA9IG1FbmRQb2ludFBhcmNlbGFibGUucmVzb2x2ZSgmbUVuZHBvaW50RGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIGVuZHBvaW50IGJhc2VkIG9uIGRlc2NyaXB0b3IuCi0gICAgICAgIG1BdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgmbUVuZHBvaW50RGVzY3JpcHRvciwgZ2V0RGlyZWN0aW9uKCkpOwotCi0gICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzOwotCi0gICAgICAgIC8vIFZhbGlkYXRlIHJlc3VsdCBmcm9tIHNlcnZlci4KLSAgICAgICAgaWYgKG1GcmFtZXNQZXJCdXJzdCA8IDE2IHx8IG1GcmFtZXNQZXJCdXJzdCA+IDE2ICogMTAyNCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpvcGVuKCk6IGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYXBhY2l0eSA8IG1GcmFtZXNQZXJCdXJzdCB8fCBjYXBhY2l0eSA+IDMyICogMTAyNCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpvcGVuKCk6IGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgY2FwYWNpdHkpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KG1GcmFtZXNQZXJCdXJzdCk7Ci0KLSAgICAgICAgaWYgKGdldERhdGFDYWxsYmFja1Byb2MoKSkgewotICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKLSAgICAgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwotICAgICAgICAvLyBvbmx5IGNvbm5lY3QgdG8gQXVkaW9NYW5hZ2VyIGlmIHRoaXMgaXMgYSBwbGF5YmFjayBzdHJlYW0gcnVubmluZyBpbiBjbGllbnQgcHJvY2VzcwotICAgICAgICBpZiAoIW1JblNlcnZpY2UgJiYgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIGluaXQoYW5kcm9pZDo6UExBWUVSX1RZUEVfQUFVRElPLCBBVURJT19VU0FHRV9NRURJQSk7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogb3BlblN0cmVhbSgpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICByZXN1bHQgPSBjb25maWd1cmF0aW9uT3V0cHV0LnZhbGlkYXRlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgorICAgIHNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVSYXRlKCkpOworICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICBzZXREZXZpY2VJZChjb25maWd1cmF0aW9uT3V0cHV0LmdldERldmljZUlkKCkpOworICAgIHNldFNoYXJpbmdNb2RlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2hhcmluZ01vZGUoKSk7CisKKyAgICAvLyBTYXZlIGRldmljZSBmb3JtYXQgc28gd2UgY2FuIGRvIGZvcm1hdCBjb252ZXJzaW9uIGFuZCB2b2x1bWUgc2NhbGluZyB0b2dldGhlci4KKyAgICBtRGV2aWNlRm9ybWF0ID0gY29uZmlndXJhdGlvbk91dHB1dC5nZXRGb3JtYXQoKTsKKworICAgIHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLmdldFN0cmVhbURlc2NyaXB0aW9uKG1TZXJ2aWNlU3RyZWFtSGFuZGxlLCBtRW5kUG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIFJlc29sdmUgcGFyY2VsYWJsZSBpbnRvIGEgZGVzY3JpcHRvci4KKyAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLnJlc29sdmUoJm1FbmRwb2ludERlc2NyaXB0b3IpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIGVuZHBvaW50IGJhc2VkIG9uIGRlc2NyaXB0b3IuCisgICAgcmVzdWx0ID0gbUF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCZtRW5kcG9pbnREZXNjcmlwdG9yLCBnZXREaXJlY3Rpb24oKSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtRnJhbWVzUGVyQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisgICAgY2FwYWNpdHkgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lczsKKworICAgIC8vIFZhbGlkYXRlIHJlc3VsdCBmcm9tIHNlcnZlci4KKyAgICBpZiAobUZyYW1lc1BlckJ1cnN0IDwgMTYgfHwgbUZyYW1lc1BlckJ1cnN0ID4gMTYgKiAxMDI0KSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKGNhcGFjaXR5IDwgbUZyYW1lc1BlckJ1cnN0IHx8IGNhcGFjaXR5ID4gMzIgKiAxMDI0KSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgY2FwYWNpdHkpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1DbG9ja01vZGVsLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworCisgICAgaWYgKGdldERhdGFDYWxsYmFja1Byb2MoKSkgeworICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOworICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID4gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAvIDIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCisgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgfSBlbHNlIGlmIChtQ2FsbGJhY2tGcmFtZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07CisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIGNsb3NlKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmNsb3NlKCkgewotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpOiBtU2VydmljZVN0cmVhbUhhbmRsZSA9IDB4JTA4WCIsCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBBTE9HRCgiY2xvc2UoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLAogICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgIT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIC8vIERvbid0IGNsb3NlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuCkBAIC0yMDIsMTAgKzIxMywxMCBAQAogICAgICAgICAgICAgcmVxdWVzdFN0b3AoKTsKICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBuZXh0U3RhdGU7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyA9IE1JTl9USU1FT1VUX05BTk9TOwotICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHdhaXRGb3JTdGF0ZUNoYW5nZShjdXJyZW50U3RhdGUsICZuZXh0U3RhdGUsCisgICAgICAgICAgICByZXN1bHQgPSB3YWl0Rm9yU3RhdGVDaGFuZ2UoY3VycmVudFN0YXRlLCAmbmV4dFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXROYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkICVzIiwKKyAgICAgICAgICAgICAgICBBTE9HRSgiY2xvc2UoKSB3YWl0Rm9yU3RhdGVDaGFuZ2UoKSByZXR1cm5lZCAlZCAlcyIsCiAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE2LDE0ICsyMjcsMTYgQEAKICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZVtdIG1DYWxsYmFja0J1ZmZlcjsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbnVsbHB0cjsKKwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7Ci0gICAgICAgIHJldHVybiBtRW5kUG9pbnRQYXJjZWxhYmxlLmNsb3NlKCk7CisgICAgICAgIHJlc3VsdCA9IG1FbmRQb2ludFBhcmNlbGFibGUuY2xvc2UoKTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDIgPSBBdWRpb1N0cmVhbTo6Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgIT0gQUFVRElPX09LKSA/IHJlc3VsdCA6IHJlc3VsdDI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiB9CiAKLQogc3RhdGljIHZvaWQgKmFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYyh2b2lkICpjb250ZXh0KQogewogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKnN0cmVhbSA9IChBdWRpb1N0cmVhbUludGVybmFsICopY29udGV4dDsKQEAgLTIzNSwyNCArMjQ4LDQ2IEBACiAgICAgfQogfQogCisvKgorICogSXQgbm9ybWFsbHkgdGFrZXMgYWJvdXQgMjAtMzAgbXNlYyB0byBzdGFydCBhIHN0cmVhbSBvbiB0aGUgc2VydmVyLgorICogQnV0IHRoZSBmaXJzdCB0aW1lIGNhbiB0YWtlIGFzIG11Y2ggYXMgMjAwLTMwMCBtc2VjLiBUaGUgSFcKKyAqIHN0YXJ0cyByaWdodCBhd2F5IHNvIGJ5IHRoZSB0aW1lIHRoZSBjbGllbnQgZ2V0cyBhIGNoYW5jZSB0byB3cml0ZSBpbnRvCisgKiB0aGUgYnVmZmVyLCBpdCBpcyBhbHJlYWR5IGluIGEgZGVlcCB1bmRlcmZsb3cgc3RhdGUuIFRoYXQgY2FuIGNhdXNlIHRoZQorICogWFJ1bkNvdW50IHRvIGJlIG5vbi16ZXJvLCB3aGljaCBjb3VsZCBsZWFkIGFuIGFwcCB0byB0dW5lIGl0cyBsYXRlbmN5IGhpZ2hlci4KKyAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2Ugc2V0IGEgcmVxdWVzdCBmb3IgdGhlIHByb2Nlc3NpbmcgY29kZSB0byBzdGFydCB0aGUKKyAqIGNsaWVudCBzdHJlYW0gYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhlIHNlcnZlciBzdHJlYW0uCisgKiBUaGUgcHJvY2Vzc2luZyBjb2RlIHdpbGwgdGhlbiBzYXZlIHRoZSBjdXJyZW50IG9mZnNldAorICogYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBhbmQgYXBwbHkgdGhhdCB0byBhbnkgcG9zaXRpb24gZ2l2ZW4gdG8gdGhlIGFwcC4KKyAqLwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdGFydCgpCiB7CiAgICAgaW50NjRfdCBzdGFydFRpbWU7Ci0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWwoKTo6cmVxdWVzdFN0YXJ0KCkiKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgaWYgKGlzQWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIGFscmVhZHkgYWN0aXZlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUgPSBnZXRTdGF0ZSgpOwogCisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUgPSBnZXRTdGF0ZSgpOworICAgIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBidXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOworICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhcnRXaXRoU3RhdHVzKCkpOworCisgICAgLy8gQ2xlYXIgYW55IHN0YWxlIHRpbWVzdGFtcHMgZnJvbSB0aGUgcHJldmlvdXMgcnVuLgorICAgIGRyYWluVGltZXN0YW1wc0Zyb21TZXJ2aWNlKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogCiAgICAgc3RhcnRUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKICAgICBtQ2xvY2tNb2RlbC5zdGFydChzdGFydFRpbWUpOworICAgIG1OZWVkQ2F0Y2hVcC5yZXF1ZXN0KCk7ICAvLyBBc2sgZGF0YSBwcm9jZXNzaW5nIGNvZGUgdG8gY2F0Y2ggdXAgd2hlbiBmaXJzdCB0aW1lc3RhbXAgcmVjZWl2ZWQuCiAKKyAgICAvLyBTdGFydCBkYXRhIGNhbGxiYWNrIHRocmVhZC4KICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiBnZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBMYXVuY2ggdGhlIGNhbGxiYWNrIGxvb3AgdGhyZWFkLgogICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zID0gbUNhbGxiYWNrRnJhbWVzCkBAIC0yOTcsMTQgKzMzMiwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wSW50ZXJuYWwoKQogewogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKICAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RvcFdpdGhTdGF0dXMoKSk7CisgICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworCisgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnN0b3BTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQpAQCAtMzE5LDYgKzM1Niw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJyZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucmVnaXN0ZXJBdWRpb1RocmVhZChtU2VydmljZVN0cmVhbUhhbmRsZSwKQEAgLTMyOCw2ICszNjYsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dW5yZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyVGhyZWFkKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS51bnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGdldHRpZCgpKTsKQEAgLTMzOCw2ICszNzcsNyBAQAogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdGFydENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwgY2xpZW50LCBjbGllbnRIYW5kbGUpOwogfQogCkBAIC0zNTEsMTUgKzM5MSwyMCBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKLSAgICAvLyBUT0RPIEdlbmVyYXRlIGluIHNlcnZlciBhbmQgcGFzcyB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaW50NjRfdCB0aW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKLSAgICAqZnJhbWVQb3NpdGlvbiA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvLyBUT0RPIEdldCBhIG1vcmUgYWNjdXJhdGUgdGltZXN0YW1wIGZyb20gdGhlIHNlcnZpY2UuIFRoaXMgY29kZSBqdXN0IGFkZHMgYSBmdWRnZSBmYWN0b3IuCi0gICAgKnRpbWVOYW5vc2Vjb25kcyA9IHRpbWUgKyAoNiAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgLy8gR2VuZXJhdGVkIGluIHNlcnZlciBhbmQgcGFzc2VkIHRvIGNsaWVudC4gUmV0dXJuIGxhdGVzdC4KKyAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgICAgICBpbnQ2NF90IHBvc2l0aW9uID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCkgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CisgICAgICAgIGlmIChwb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAqZnJhbWVQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgKnRpbWVOYW5vc2Vjb25kcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjp1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKSB7CiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsgLy8gc3RhdGUgaXMgZ2V0dGluZyB1cGRhdGVkIGJ5IHRoZSBjYWxsYmFjayB0aHJlYWQgcmVhZC93cml0ZSBjYWxsCiAgICAgfQpAQCAtMzcxLDIxICs0MTYsMjEgQEAKICAgICBzdGF0aWMgaW50NjRfdCBvbGRUaW1lID0gMDsKICAgICBpbnQ2NF90IGZyYW1lUG9zaXRpb24gPSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9UaW1lID0gY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOiB0aW1lc3RhbXAgc2F5cyBmcmFtZVBvc2l0aW9uID0gJTA4bGxkIGF0IG5hbm9UaW1lICVsbGQiLAorICAgIEFMT0dEKCJsb2dUaW1lc3RhbXA6IHRpbWVzdGFtcCBzYXlzIGZyYW1lUG9zaXRpb24gPSAlOGxsZCBhdCBuYW5vVGltZSAlbGxkIiwKICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lUG9zaXRpb24sCiAgICAgICAgICAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgaW50NjRfdCBuYW5vc0RlbHRhID0gbmFub1RpbWUgLSBvbGRUaW1lOwogICAgIGlmIChuYW5vc0RlbHRhID4gMCAmJiBvbGRUaW1lID4gMCkgewogICAgICAgICBpbnQ2NF90IGZyYW1lc0RlbHRhID0gZnJhbWVQb3NpdGlvbiAtIG9sZFBvc2l0aW9uOwogICAgICAgICBpbnQ2NF90IHJhdGUgPSAoZnJhbWVzRGVsdGEgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORCkgLyBuYW5vc0RlbHRhOwotICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDogZnJhbWVzRGVsdGEgPSAlMDhsbGQsIG5hbm9zRGVsdGEgPSAlMDhsbGQsIHJhdGUgPSAlbGxkIiwKKyAgICAgICAgQUxPR0QoImxvZ1RpbWVzdGFtcDogICAgIGZyYW1lc0RlbHRhID0gJThsbGQsIG5hbm9zRGVsdGEgPSAlOGxsZCwgcmF0ZSA9ICVsbGQiLAogICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZXNEZWx0YSwgKGxvbmcgbG9uZykgbmFub3NEZWx0YSwgKGxvbmcgbG9uZykgcmF0ZSk7CiAgICAgfQogICAgIG9sZFBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKICAgICBvbGRUaW1lID0gbmFub1RpbWU7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvblRpbWVzdGFtcEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvblRpbWVzdGFtcFNlcnZpY2UoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICNpZiBMT0dfVElNRVNUQU1QUwogICAgIGxvZ1RpbWVzdGFtcCgqbWVzc2FnZSk7CiAjZW5kaWYKQEAgLTM5MywyMyArNDM4LDI5IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBUaW1lc3RhbXAgdGltZXN0YW1wKG1lc3NhZ2UtPnRpbWVzdGFtcC5wb3NpdGlvbiwgbWVzc2FnZS0+dGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcihBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgc3dpdGNoIChtZXNzYWdlLT5ldmVudC5ldmVudCkgewogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIik7CisgICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCIpOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQiKTsKKyAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQiKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEIik7CisgICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCIpOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CiAgICAgICAgICAgICB9CkBAIC00MjYsMTAgKzQ3NywxNCBAQAogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgLy8gUHJldmVudCBoYXJkd2FyZSBmcm9tIGxvb3Bpbmcgb24gb2xkIGRhdGEgYW5kIG1ha2luZyBidXp6aW5nIHNvdW5kcy4KKyAgICAgICAgICAgIGlmIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICAgICAgICAgIG1BdWRpb0VuZHBvaW50LmVyYXNlRGF0YU1lbW9yeSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HIC0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQgLSBGSUZPIGNsZWFyZWQiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRToKICAgICAgICAgICAgIG1TdHJlYW1Wb2x1bWUgPSAoZmxvYXQpbWVzc2FnZS0+ZXZlbnQuZGF0YURvdWJsZTsKQEAgLTQ0NSw2ICs1MDAsMzQgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6ZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKworICAgIHdoaWxlIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmIChtQXVkaW9FbmRwb2ludC5yZWFkVXBDb21tYW5kKCZtZXNzYWdlKSAhPSAxKSB7CisgICAgICAgICAgICBicmVhazsgLy8gbm8gY29tbWFuZCB0aGlzIHRpbWUsIG5vIHByb2JsZW0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgLy8gaWdub3JlIG1vc3QgbWVzc2FnZXMKKyAgICAgICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOgorICAgICAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX0hBUkRXQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpFVkVOVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvbkV2ZW50RnJvbVNlcnZlcigmbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIldBUk5JTkcgLSBkcmFpblRpbWVzdGFtcHNGcm9tU2VydmljZSgpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIFByb2Nlc3MgYWxsIHRoZSBjb21tYW5kcyBjb21pbmcgZnJvbSB0aGUgc2VydmVyLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NDb21tYW5kcygpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwpAQCAtNDU2LDggKzUzOSwxMiBAQAogICAgICAgICAgICAgYnJlYWs7IC8vIG5vIGNvbW1hbmQgdGhpcyB0aW1lLCBubyBwcm9ibGVtCiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QOgotICAgICAgICAgICAgcmVzdWx0ID0gb25UaW1lc3RhbXBGcm9tU2VydmVyKCZtZXNzYWdlKTsKKyAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX1NFUlZJQ0U6CisgICAgICAgICAgICByZXN1bHQgPSBvblRpbWVzdGFtcFNlcnZpY2UoJm1lc3NhZ2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX0hBUkRXQVJFOgorICAgICAgICAgICAgcmVzdWx0ID0gb25UaW1lc3RhbXBIYXJkd2FyZSgmbWVzc2FnZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpFVkVOVDoKQEAgLTQ2NSw3ICs1NTIsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJXQVJOSU5HIC0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0NvbW1hbmRzKCkgVW5yZWNvZ25pemVkIHdoYXQgPSAlZCIsCisgICAgICAgICAgICBBTE9HRSgiV0FSTklORyAtIHByb2Nlc3NDb21tYW5kcygpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAogICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MTcsMTIgKzYwNCwxOSBAQAogICAgICAgICAgICAgICAgIHdha2VUaW1lTmFub3MgKz0gbVdha2V1cERlbGF5TmFub3M7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgaW50NjRfdCBlYXJsaWVzdFdha2VUaW1lID0gY3VycmVudFRpbWVOYW5vcyArIG1NaW5pbXVtU2xlZXBOYW5vczsKKyAgICAgICAgICAgIC8vIEd1YXJhbnRlZSBhIG1pbmltdW0gc2xlZXAgdGltZS4KKyAgICAgICAgICAgIGlmICh3YWtlVGltZU5hbm9zIDwgZWFybGllc3RXYWtlVGltZSkgeworICAgICAgICAgICAgICAgIHdha2VUaW1lTmFub3MgPSBlYXJsaWVzdFdha2VUaW1lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAod2FrZVRpbWVOYW5vcyA+IGRlYWRsaW5lTmFub3MpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB0aW1lIG91dCwganVzdCByZXR1cm4gdGhlIGZyYW1lc1dyaXR0ZW4gc28gZmFyLgogICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIHdlIGZpeCB0aGUgZGVhZGxpbmUgYnVnCiAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IGVudGVyZWQgYXQgJWxsZCBuYW5vcywgY3VycmVudGx5ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGVudHJ5VGltZU5hbm9zLCAobG9uZyBsb25nKSBjdXJyZW50VGltZU5hbm9zKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogdGltZWQgb3V0IGFmdGVyICVsbGQgbmFub3MiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzRGF0YSgpOiBUSU1FT1VUIGFmdGVyICVsbGQgbmFub3MiLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVvdXROYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IHdha2VUaW1lID0gJWxsZCwgZGVhZGxpbmUgPSAlbGxkIG5hbm9zIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB3YWtlVGltZU5hbm9zLCAobG9uZyBsb25nKSBkZWFkbGluZU5hbm9zKTsKQEAgLTUzMywxMyArNjI3LDYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGVhcmxpZXN0V2FrZVRpbWUgPSBjdXJyZW50VGltZU5hbm9zICsgbU1pbmltdW1TbGVlcE5hbm9zOwotICAgICAgICAgICAgLy8gR3VhcmFudGVlIGEgbWluaW11bSBzbGVlcCB0aW1lLgotICAgICAgICAgICAgaWYgKHdha2VUaW1lTmFub3MgPCBlYXJsaWVzdFdha2VUaW1lKSB7Ci0gICAgICAgICAgICAgICAgd2FrZVRpbWVOYW5vcyA9IGVhcmxpZXN0V2FrZVRpbWU7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBmdWxsRnJhbWVzID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoZmlmb05hbWUsIGZ1bGxGcmFtZXMpOwpAQCAtNTc2LDcgKzY2Myw3IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhyZXF1ZXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CisgICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC01OTksMzIgKzY4NiwzIEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwogfQotCi12b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmRvU2V0Vm9sdW1lKCkgewotICAgIC8vIE5vIHBhbiBhbmQgb25seSBsZWZ0IHZvbHVtZSBpcyB0YWtlbiBpbnRvIGFjY291bnQgZnJvbSBJUExheWVyIGludGVyZmFjZQotICAgIG1Wb2x1bWVSYW1wLnNldFRhcmdldChtU3RyZWFtVm9sdW1lICogbVZvbHVtZU11bHRpcGxpZXJMIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW1wbGVtZW50YXRpb24gb2YgUGxheWVyQmFzZQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cGxheWVyU3RhcnQoKSB7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1TZXJ2aWNlSW50ZXJmYWNlLnN0YXJ0U3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnBsYXllclBhdXNlKCkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsOjpwbGF5ZXJTdG9wKCkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnBsYXllclNldFZvbHVtZSgpIHsKLSAgICBkb1NldFZvbHVtZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1N0cmVhbUludGVybmFsOjpkZXN0cm95KCkgewotICAgIGJhc2VEZXN0cm95KCk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMWI5OTFkZS4uNDcwMjRjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBBTkRST0lEX0FBVURJT19BVURJT19TVFJFQU1fSU5URVJOQUxfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvUGxheWVyQmFzZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKQEAgLTM2LDcgKzM1LDcgQEAKIG5hbWVzcGFjZSBhYXVkaW8gewogCiAvLyBBIHN0cmVhbSB0aGF0IHRhbGtzIHRvIHRoZSBBQXVkaW9TZXJ2aWNlIG9yIGRpcmVjdGx5IHRvIGEgSEFMLgotY2xhc3MgQXVkaW9TdHJlYW1JbnRlcm5hbCA6IHB1YmxpYyBBdWRpb1N0cmVhbSwgcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgIHsKK2NsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWwgOiBwdWJsaWMgQXVkaW9TdHJlYW0gewogCiBwdWJsaWM6CiAgICAgQXVkaW9TdHJlYW1JbnRlcm5hbChBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UpOwpAQCAtNTAsNyArNDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVwZGF0ZVN0YXRlTWFjaGluZSgpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSBvdmVycmlkZTsKIApAQCAtODUsMTQgKzg0LDE1IEBACiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVvdXQgYmFzZWQgb24gZnJhbWVzUGVyQnVyc3QKICAgICBpbnQ2NF90IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KCk7CiAKLSAgICAvL1BsYXllckJhc2UgdmlydHVhbHMKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7CiAKKyAgICBhYXVkaW9faGFuZGxlX3QgZ2V0U2VydmljZUhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlU3RyZWFtSGFuZGxlOworICAgIH0KKwogcHJvdGVjdGVkOgogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByb2Nlc3NEYXRhKHZvaWQgKmJ1ZmZlciwKQEAgLTExMSwzMiArMTExLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKndha2VUaW1lUHRyKSA9IDA7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCBwcm9jZXNzQ29tbWFuZHMoKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcEludGVybmFsKCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENhbGxiYWNrKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIHt9CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb25FdmVudEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9uVGltZXN0YW1wRnJvbVNlcnZlcihBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IG9uVGltZXN0YW1wU2VydmljZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CiAKICAgICB2b2lkIGxvZ1RpbWVzdGFtcChBQXVkaW9TZXJ2aWNlTWVzc2FnZSAmbWVzc2FnZSk7CiAKICAgICAvLyBDYWxjdWxhdGUgdGltZW91dCBmb3IgYW4gb3BlcmF0aW9uIGludm9sdmluZyBmcmFtZXNQZXJPcGVyYXRpb24uCiAgICAgaW50NjRfdCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChpbnQzMl90IGZyYW1lc1Blck9wZXJhdGlvbik7CiAKLSAgICB2b2lkIGRvU2V0Vm9sdW1lKCk7Ci0KLSAgICAvL1BsYXllckJhc2UgdmlydHVhbHMKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBsYXllclN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheWVyU3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCk7Ci0KICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKQEAgLTE0Nyw5ICsxNDQsNiBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3Q7ICAgICAvLyBmcmFtZXMgcGVyIEhBTCB0cmFuc2ZlcgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtWFJ1bkNvdW50ID0gMDsgICAgICAvLyBob3cgbWFueSB1bmRlcnJ1biBldmVudHM/CiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Wb2x1bWU7Ci0KICAgICAvLyBPZmZzZXQgZnJvbSB1bmRlcmx5aW5nIGZyYW1lIHBvc2l0aW9uLgogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgPSAwOyAvLyBvZmZzZXQgZm9yIHRpbWVzdGFtcHMKIApAQCAtMTYxLDYgKzE1NSwxMiBAQAogCiAgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJm1TZXJ2aWNlSW50ZXJmYWNlOyAgIC8vIGFic3RyYWN0IGludGVyZmFjZSB0byB0aGUgc2VydmljZQogCisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisKKyAgICBBdG9taWNSZXF1ZXN0b3IgICAgICAgICAgbU5lZWRDYXRjaFVwOyAgIC8vIEFzayByZWFkKCkgb3Igd3JpdGUoKSB0byBzeW5jIG9uIGZpcnN0IHRpbWVzdGFtcC4KKworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lID0gMS4wZjsKKwogcHJpdmF0ZToKICAgICAvKgogICAgICAqIEFzeW5jaHJvbm91cyB3cml0ZSB3aXRoIGRhdGEgY29udmVyc2lvbi4KQEAgLTE4MSw2ICsxODEsOCBAQAogCiAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgIG1FbmRQb2ludFBhcmNlbGFibGU7IC8vIGRlc2NyaXB0aW9uIG9mIHRoZSBidWZmZXJzIGZpbGxlZCBieSBzZXJ2aWNlCiAgICAgRW5kcG9pbnREZXNjcmlwdG9yICAgICAgIG1FbmRwb2ludERlc2NyaXB0b3I7IC8vIGJ1ZmZlciBkZXNjcmlwdGlvbiB3aXRoIHJlc29sdmVkIGFkZHJlc3NlcworCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCmluZGV4IDdiMWU1M2UuLmI3OTJlY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKQEAgLTM5LDYgKzM5LDIxIEBACiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjp+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKSB7fQogCit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgeworICAgIGludDY0X3QgcmVhZENvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKKyAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKKworICAgIC8vIEJ1bXAgb2Zmc2V0IHNvIGNhbGxlciBkb2VzIG5vdCBzZWUgdGhlIHJldHJvZ3JhZGUgbW90aW9uIGluIGdldEZyYW1lc1JlYWQoKS4KKyAgICBpbnQ2NF90IG9mZnNldCA9IHJlYWRDb3VudGVyIC0gd3JpdGVDb3VudGVyOworICAgIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSArPSBvZmZzZXQ7CisgICAgQUxPR0QoImFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSByZWFkTiA9ICVsbGQsIHdyaXRlTiA9ICVsbGQsIG9mZnNldCA9ICVsbGQiLAorICAgICAgICAgIChsb25nIGxvbmcpcmVhZENvdW50ZXIsIChsb25nIGxvbmcpd3JpdGVDb3VudGVyLCAobG9uZyBsb25nKW1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7CisKKyAgICAvLyBGb3JjZSByZWFkQ291bnRlciB0byBtYXRjaCB3cml0ZUNvdW50ZXIuCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHdyaXRlIGNvdW50ZXIgaW4gdGhlIGhhcmR3YXJlLgorICAgIG1BdWRpb0VuZHBvaW50LnNldERhdGFSZWFkQ291bnRlcih3cml0ZUNvdW50ZXIpOworfQorCiAvLyBXcml0ZSB0aGUgZGF0YSwgYmxvY2sgaWYgbmVlZGVkIGFuZCB0aW1lb3V0TWlsbGlzID4gMAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQpAQCAtNTcsNiArNzIsMTggQEAKICAgICBjb25zdCBjaGFyICp0cmFjZU5hbWUgPSAiYWFSZE5vdyI7CiAgICAgQVRSQUNFX0JFR0lOKHRyYWNlTmFtZSk7CiAKKyAgICBpZiAobUNsb2NrTW9kZWwuaXNTdGFydGluZygpKSB7CisgICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgZ290IGFueSB0aW1lc3RhbXBzIGZyb20gc2VydmVyLgorICAgICAgICAvLyBLZWVwIHdhaXRpbmcgdW50aWwgd2UgZ2V0IHNvbWUgdmFsaWQgdGltZXN0YW1wcyB0aGVuIHN0YXJ0IHdyaXRpbmcgdG8gdGhlCisgICAgICAgIC8vIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgorICAgICAgICBBTE9HRCgicHJvY2Vzc0RhdGFOb3coKSB3YWl0IGZvciB2YWxpZCB0aW1lc3RhbXBzIik7CisgICAgICAgIC8vIFNsZWVwIHZlcnkgYnJpZWZseSBhbmQgaG9wZSB3ZSBnZXQgYSB0aW1lc3RhbXAgc29vbi4KKyAgICAgICAgKndha2VUaW1lUHRyID0gY3VycmVudE5hbm9UaW1lICsgKDIwMDAgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gSWYgd2UgaGF2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB0aW1lc3RhbXAgZnJvbSBzZXJ2ZXIuCisKICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuaXNGcmVlUnVubmluZygpKSB7CiAgICAgICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpwcm9jZXNzRGF0YU5vdygpIC0gdXBkYXRlIHJlbW90ZSBjb3VudGVyIik7CiAgICAgICAgIC8vIFVwZGF0ZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIHRoZSB0aW1pbmcgbW9kZWwuCkBAIC02NSw2ICs5MiwxNCBAQAogICAgICAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhV3JpdGVDb3VudGVyKGVzdGltYXRlZFJlbW90ZUNvdW50ZXIpOwogICAgIH0KIAorICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHZhbGlkIHRpbWVzdGFtcHMuCisgICAgaWYgKG1OZWVkQ2F0Y2hVcC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIC8vIENhdGNoIGFuIE1NQVAgcG9pbnRlciB0aGF0IGlzIGFscmVhZHkgYWR2YW5jaW5nLgorICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgaW5pdGlhbCB1bmRlcnJ1bnMgY2F1c2VkIGJ5IGEgc2xvdyBjb2xkIHN0YXJ0LgorICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCk7CisgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOworICAgIH0KKwogICAgIC8vIElmIHRoZSB3cml0ZSBpbmRleCBwYXNzZWQgdGhlIHJlYWQgaW5kZXggdGhlbiBjb25zaWRlciBpdCBhbiBvdmVycnVuLgogICAgIGlmIChtQXVkaW9FbmRwb2ludC5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgewogICAgICAgICBtWFJ1bkNvdW50Kys7CkBAIC0xMDAsOCArMTM1LDggQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSByZWFkQ291bnRlciBiZWNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFJlYWRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0OwotICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRSZWFkUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCkgKyBtRnJhbWVzUGVyQnVyc3Q7CisgICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUobmV4dFBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODYsOCArMjIxLDcgQEAKIH0KIAogaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Z2V0RnJhbWVzUmVhZCgpIHsKLSAgICBpbnQ2NF90IGZyYW1lcyA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOworICAgIGludDY0X3QgZnJhbWVzID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCkgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgLy9BTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1JlYWQoKSByZXR1cm5zICVsbGQiLCAobG9uZyBsb25nKWZyYW1lcyk7CiAgICAgcmV0dXJuIGZyYW1lczsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCmluZGV4IDE3ZjM3ZTguLjI5NGRiYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaApAQCAtNDYsNiArNDYsOCBAQAogICAgIH0KIHByb3RlY3RlZDoKIAorICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworCiAvKioKICAqIExvdyBsZXZlbCBkYXRhIHByb2Nlc3NpbmcgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHJlYWQgb3Igd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDMxZTBhNDAuLjFlMDJlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQ4LDcgKzQ4LDggQEAKIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQocGF1c2VXaXRoU3RhdHVzKCkpOworICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKyAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucGF1c2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZSgpCkBAIC03MiwyMSArNzMsMjUgQEAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UuZmx1c2hTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvbkZsdXNoRnJvbVNlcnZlcigpIHsKK3ZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSB7CiAgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpOwogICAgIGludDY0X3Qgd3JpdGVDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpOwogCiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgotICAgIGludDY0X3QgZnJhbWVzRmx1c2hlZCA9IHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyOwotICAgIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSArPSBmcmFtZXNGbHVzaGVkOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkZsdXNoRnJvbVNlcnZlcigpIHJlYWROID0gJWxsZCwgd3JpdGVOID0gJWxsZCwgb2Zmc2V0ID0gJWxsZCIsCisgICAgaW50NjRfdCBvZmZzZXQgPSB3cml0ZUNvdW50ZXIgLSByZWFkQ291bnRlcjsKKyAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgKz0gb2Zmc2V0OworICAgIEFMT0dEKCJhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgcmVhZE4gPSAlbGxkLCB3cml0ZU4gPSAlbGxkLCBvZmZzZXQgPSAlbGxkIiwKICAgICAgICAgICAobG9uZyBsb25nKXJlYWRDb3VudGVyLCAobG9uZyBsb25nKXdyaXRlQ291bnRlciwgKGxvbmcgbG9uZyltRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwogCi0gICAgLy8gRmx1c2ggd3JpdHRlbiBmcmFtZXMgYnkgZm9yY2luZyB3cml0ZUNvdW50ZXIgdG8gcmVhZENvdW50ZXIuCi0gICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBtb3ZlIHRoZSByZWFkIGNvdW50ZXIgaW4gdGhlIGhhcmR3YXJlLgorICAgIC8vIEZvcmNlIHdyaXRlQ291bnRlciB0byBtYXRjaCByZWFkQ291bnRlci4KKyAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgY2Fubm90IGNoYW5nZSB0aGUgcmVhZCBjb3VudGVyIGluIHRoZSBoYXJkd2FyZS4KICAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhV3JpdGVDb3VudGVyKHJlYWRDb3VudGVyKTsKIH0KIAordm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b25GbHVzaEZyb21TZXJ2ZXIoKSB7CisgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworfQorCiAvLyBXcml0ZSB0aGUgZGF0YSwgYmxvY2sgaWYgbmVlZGVkIGFuZCB0aW1lb3V0TWlsbGlzID4gMAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQpAQCAtMTA2LDYgKzExMSwxOCBAQAogICAgIGNvbnN0IGNoYXIgKnRyYWNlTmFtZSA9ICJhYVdyTm93IjsKICAgICBBVFJBQ0VfQkVHSU4odHJhY2VOYW1lKTsKIAorICAgIGlmIChtQ2xvY2tNb2RlbC5pc1N0YXJ0aW5nKCkpIHsKKyAgICAgICAgLy8gU3RpbGwgaGF2ZW4ndCBnb3QgYW55IHRpbWVzdGFtcHMgZnJvbSBzZXJ2ZXIuCisgICAgICAgIC8vIEtlZXAgd2FpdGluZyB1bnRpbCB3ZSBnZXQgc29tZSB2YWxpZCB0aW1lc3RhbXBzIHRoZW4gc3RhcnQgd3JpdGluZyB0byB0aGUKKyAgICAgICAgLy8gY3VycmVudCBidWZmZXIgcG9zaXRpb24uCisgICAgICAgIEFMT0dEKCJwcm9jZXNzRGF0YU5vdygpIHdhaXQgZm9yIHZhbGlkIHRpbWVzdGFtcHMiKTsKKyAgICAgICAgLy8gU2xlZXAgdmVyeSBicmllZmx5IGFuZCBob3BlIHdlIGdldCBhIHRpbWVzdGFtcCBzb29uLgorICAgICAgICAqd2FrZVRpbWVQdHIgPSBjdXJyZW50TmFub1RpbWUgKyAoMjAwMCAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpOworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBJZiB3ZSBoYXZlIGdvdHRlbiB0aGlzIGZhciB0aGVuIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHRpbWVzdGFtcCBmcm9tIHNlcnZlci4KKwogICAgIC8vIElmIGEgRE1BIGNoYW5uZWwgb3IgRFNQIGlzIHJlYWRpbmcgdGhlIG90aGVyIGVuZCB0aGVuIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSByZWFkQ291bnRlci4KICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuaXNGcmVlUnVubmluZygpKSB7CiAgICAgICAgIC8vIFVwZGF0ZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIHRoZSB0aW1pbmcgbW9kZWwuCkBAIC0xMTQsNiArMTMxLDEzIEBACiAgICAgICAgIG1BdWRpb0VuZHBvaW50LnNldERhdGFSZWFkQ291bnRlcihlc3RpbWF0ZWRSZWFkQ291bnRlcik7CiAgICAgfQogCisgICAgaWYgKG1OZWVkQ2F0Y2hVcC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIC8vIENhdGNoIGFuIE1NQVAgcG9pbnRlciB0aGF0IGlzIGFscmVhZHkgYWR2YW5jaW5nLgorICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgaW5pdGlhbCB1bmRlcnJ1bnMgY2F1c2VkIGJ5IGEgc2xvdyBjb2xkIHN0YXJ0LgorICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCk7CisgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOworICAgIH0KKwogICAgIC8vIElmIHRoZSByZWFkIGluZGV4IHBhc3NlZCB0aGUgd3JpdGUgaW5kZXggdGhlbiBjb25zaWRlciBpdCBhbiB1bmRlcnJ1bi4KICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgewogICAgICAgICBtWFJ1bkNvdW50Kys7CkBAIC0xNTMsOSArMTc3LDkgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSB3cml0ZUNvdW50ZXIgYmVjYXVzZQogICAgICAgICAgICAgICAgIC8vIHRoZSByZWFkQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFJlYWRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKSArIG1GcmFtZXNQZXJCdXJzdAorICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAtIG1BdWRpb0VuZHBvaW50LmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOwotICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRSZWFkUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRQb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMjY2LDcgKzI5MCw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLQogaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzUmVhZCgpCiB7CiAgICAgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmU7CkBAIC0zNDAsMyArMzYzLDEwIEBACiAgICAgICAgICAgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKICAgICByZXR1cm4gTlVMTDsKIH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcGxlbWVudGF0aW9uIG9mIFBsYXllckJhc2UKK3N0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojpkb1NldFZvbHVtZSgpIHsKKyAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQobVN0cmVhbVZvbHVtZSAqIGdldER1Y2tBbmRNdXRlVm9sdW1lKCkpOworICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IGU1OWQwMmMuLmQ1YzFiMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtNTQsOCArNTQsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2VJbnRlcm5hbCgpOwogCisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgb3ZlcnJpZGU7CisKICAgICB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkgb3ZlcnJpZGU7CiAKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkb1NldFZvbHVtZSgpIG92ZXJyaWRlOworCiAvKioKICAqIExvdyBsZXZlbCB3cml0ZSB0aGF0IHdpbGwgbm90IGJsb2NrLiBJdCB3aWxsIGp1c3Qgd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCiAgKgpAQCAtNzgsNiArODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKTsKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSAwOyAvLyB1c2VkIHRvIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24KKworICAgIExpbmVhclJhbXAgICAgICAgICAgICAgICBtVm9sdW1lUmFtcDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCA0ZDBhN2I4Li5iYWM2OWYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2RlZmluZSBNSU5fTEFURU5FU1NfTkFOT1MgKDEwICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBJc29jaHJvbm91c0Nsb2NrTW9kZWw6Oklzb2Nocm9ub3VzQ2xvY2tNb2RlbCgpCkBAIC00OSwxOSArNDgsMjYgQEAKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0YXJ0KGludDY0X3QgbmFub1RpbWUpIHsKLSAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzdGFydChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RhcnQobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIG1NYXJrZXJOYW5vVGltZSA9IG5hbm9UaW1lOwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUQVJUSU5HOwogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChpbnQ2NF90IG5hbm9UaW1lKSB7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgc2V0UG9zaXRpb25BbmRUaW1lKGNvbnZlcnRUaW1lVG9Qb3NpdGlvbihuYW5vVGltZSksIG5hbm9UaW1lKTsKICAgICAvLyBUT0RPIHNob3VsZCB3ZSBzZXQgcG9zaXRpb24/CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CisvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCisvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKKy8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IGZyYW1lUG9zaXRpb24gLSBtTWFya2VyRnJhbWVQb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9zRGVsdGEgPSBuYW5vVGltZSAtIG1NYXJrZXJOYW5vVGltZTsKICAgICBpZiAobmFub3NEZWx0YSA8IDEwMDApIHsKQEAgLTcxLDkgKzc3LDYgQEAKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtTWFya2VyRnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbU1hcmtlck5hbm9UaW1lICVsbHUiLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJGcmFtZVBvc2l0aW9uLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJOYW5vVGltZSk7Ci0vLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCi0vLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKLS8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAKICAgICBpbnQ2NF90IGV4cGVjdGVkTmFub3NEZWx0YSA9IGNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKGZyYW1lc0RlbHRhKTsKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBleHBlY3RlZE5hbm9zRGVsdGEgPSAlbGxkLCBuYW5vc0RlbHRhID0gJWxsdSIsCkBAIC0xMTcsNiArMTIwLDggQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CisKKy8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtU3RhdGUgPSAlZCIsIG1TdGF0ZSk7CiB9CiAKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA1ODVmNTNhLi43MTgyMzc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMzYsNiArMzYsOCBAQAogICAgIHZvaWQgc3RhcnQoaW50NjRfdCBuYW5vVGltZSk7CiAgICAgdm9pZCBzdG9wKGludDY0X3QgbmFub1RpbWUpOwogCisgICAgYm9vbCBpc1N0YXJ0aW5nKCk7CisKICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uMWVhZWU4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0yNCwxNSArMjQsMTQgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KIAorI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbS5oIgotI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCi0jaW5jbHVkZSAiSGFuZGxlVHJhY2tlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0KIC8vIE1hY3JvcyBmb3IgY29tbW9uIGNvZGUgdGhhdCBpbmNsdWRlcyBhIHJldHVybi4KIC8vIFRPRE8gQ29uc2lkZXIgdXNpbmcgZG97fXdoaWxlKDApIGNvbnN0cnVjdC4gSSB0cmllZCBidXQgaXQgaHVuZyBBbmRyb2lkU3R1ZGlvCiAjZGVmaW5lIENPTlZFUlRfQlVJTERFUl9IQU5ETEVfT1JfUkVUVVJOKCkgXApAQCAtMTAxLDcgKzEwMCw2IEBACiAgKi8KIHN0YXRpYyBhYXVkaW9fcG9saWN5X3Qgc19NTWFwUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCi0KIHN0YXRpYyBBdWRpb1N0cmVhbSAqY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIChBdWRpb1N0cmVhbSopIHN0cmVhbTsKQEAgLTE0NCwxNyArMTQyLDE2IEBACiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwogICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIyMSw2ICsyMTgsNyBAQAogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCiAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLCBhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgYXVkaW9TdHJlYW0tPnJlZ2lzdGVyUGxheWVyQmFzZSgpOwogICAgICAgICAqc3RyZWFtUHRyID0gKEFBdWRpb1N0cmVhbSopIGF1ZGlvU3RyZWFtOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpzdHJlYW1QdHIgPSBudWxscHRyOwpAQCAtMjQ0LDYgKzI0Miw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkiLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIGF1ZGlvU3RyZWFtLT5jbG9zZSgpOworICAgICAgICBhdWRpb1N0cmVhbS0+dW5yZWdpc3RlclBsYXllckJhc2UoKTsKICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KQEAgLTI1NCw4ICsyNTMsOCBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RhcnQoKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCglcCkgcmV0dXJuZWQgLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7CisgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjMsNyArMjYyLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0UGF1c2UoKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVBhdXNlKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKQpAQCAtMjc3LDcgKzI3Niw3IEBACiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RvcCgpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLApAQCAtMzU5LDggKzM1OCw3IEBACiAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewotICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggNjVjMmI0Ni4uODI0NDVlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtMzQsNiArMzQsMTYgQEAKIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6fkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogCit2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKSB7CisgICAgbVNhbXBsZXNQZXJGcmFtZSA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CisgICAgbVNhbXBsZVJhdGUgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOworICAgIG1EZXZpY2VJZCAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7CisgICAgbVNoYXJpbmdNb2RlICAgICA9IG90aGVyLm1TaGFyaW5nTW9kZTsKKyAgICBtQXVkaW9Gb3JtYXQgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OworICAgIG1EaXJlY3Rpb24gICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOworICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc4LDYgKzg4LDE2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAorICAgIHN3aXRjaCAobURpcmVjdGlvbikgeworICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBkaXJlY3Rpb24gbm90IHZhbGlkID0gJWQiLCBtRGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTg3LDUgKzEwNyw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNhbXBsZXNQZXJGcmFtZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNoYXJpbmdNb2RlICAgICA9ICVkIiwgKGludCltU2hhcmluZ01vZGUpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1BdWRpb0Zvcm1hdCAgICAgPSAlZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKKyAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtRGlyZWN0aW9uICAgICAgID0gJWQiLCBtRGlyZWN0aW9uKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtQnVmZmVyQ2FwYWNpdHkgID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggOTczNzljYy4uNWU2N2M5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTc5LDYgKzgwLDI0IEBACiAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGZyYW1lczsKICAgICB9CiAKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpcmVjdGlvbjsKKyAgICB9CisKKyAgICB2b2lkIHNldERpcmVjdGlvbihhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgfQorCisgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdmFyaWFibGVzIGRlZmluZWQgaW4gb3RoZXIgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBpbnN0YW5jZSB0byB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKi8KKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKTsKKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKQEAgLTg5LDkgKzEwOCwxMCBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCiAKLSNlbmRpZiAvL0FBVURJT19TVFJFQU1fUEFSQU1FVEVSU19IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmIC8vQUFVRElPX1NUUkVBTV9QQVJBTUVURVJTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDQ4NTljNjkuLjhkY2MzN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMjksMTMgKzI5LDI2IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb1N0cmVhbTo6QXVkaW9TdHJlYW0oKQotICAgICAgICA6IG1DYWxsYmFja0VuYWJsZWQoZmFsc2UpCisgICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKIHsKICAgICAvLyBtVGhyZWFkIGlzIGEgcHRocmVhZF90IG9mIHVua25vd24gc2l6ZSBzbyB3ZSBuZWVkIG1lbXNldC4KICAgICBtZW1zZXQoJm1UaHJlYWQsIDAsIHNpemVvZihtVGhyZWFkKSk7CiAgICAgc2V0UGVyaW9kTmFub3NlY29uZHMoMCk7CiB9CiAKK0F1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7CisgICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKyAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCisgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYXVkaW8gc3RyZWFtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKworICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewogICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKICAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7CkBAIC05MCwxNSArMTAzLDEyIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKLSAgICBjbG9zZSgpOwotfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OndhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICpuZXh0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0xMTIsNyArMTIyLDcgQEAKICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBGb3JOYW5vcyhkdXJhdGlvbk5hbm9zKTsKICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzIC09IGR1cmF0aW9uTmFub3M7CiAKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHVwZGF0ZVN0YXRlV2hpbGVXYWl0aW5nKCk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB1cGRhdGVTdGF0ZU1hY2hpbmUoKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE1Myw2ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRocmVhZEFyZykKIHsKICAgICBpZiAobUhhc1RocmVhZCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW06OmNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAodGhyZWFkUHJvYyA9PSBudWxscHRyKSB7CkBAIC0xNzQsNiArMTg1LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogI2lmIDAKQEAgLTE4NywzICsxOTksMzggQEAKICAgICByZXR1cm4gZXJyID8gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKSA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CiB9CiAKKworI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgorYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKKyAgICBBTE9HVygiYXBwbHlWb2x1bWVTaGFwZXIoKSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1czo6b2soKTsKK30KKyNlbmRpZgorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgeworfQorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgeworICAgIEFMT0dWKCJNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoJXApIGRlbGV0ZWQiLCB0aGlzKTsKK30KKwordm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CisgICAgaWYgKCFtUmVnaXN0ZXJlZCkgeworICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQVVESU9fVVNBR0VfTUVESUEpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkgeworICAgIGlmIChtUmVnaXN0ZXJlZCkgeworICAgICAgICBiYXNlRGVzdHJveSgpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIH0KK30KKworCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CisgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggZTVmZGNjNi4uMzQyMDJkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTIxLDEwICsyMSwxOCBAQAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAorI2luY2x1ZGUgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIgorI2luY2x1ZGUgIm1lZGlhL1BsYXllckJhc2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIgogCisvLyBDYW5ub3QgZ2V0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXIgdG8gY29tcGlsZSEKKyNkZWZpbmUgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSICAwCisKIG5hbWVzcGFjZSBhYXVkaW8gewogCiB0eXBlZGVmIHZvaWQgKigqYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QpKHZvaWQgKik7CkBAIC02OCwxMCArNzYsMTAgQEAKIAogCiAgICAgLyoqCi0gICAgICogVXBkYXRlIHN0YXRlIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygd2FpdEZvclN0YXRlQ2hhbmdlKCkKKyAgICAgKiBVcGRhdGUgc3RhdGUgbWFjaGluZS4oKQogICAgICAqIEByZXR1cm4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSA9IDA7CiAKIAogICAgIC8vID09PT09PT09PT09IEVuZCBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjM0LDggKzI0MiwxMzIgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIHRvIGR1Y2sgYW5kIG11dGUgdGhlIHN0cmVhbSB3aGVuIGNoYW5naW5nIGF1ZGlvIGZvY3VzLgorICAgIHZvaWQgc2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpIHsKKyAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gZHVja0FuZE11dGVWb2x1bWU7CisgICAgICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCisgICAgfQorCisgICAgZmxvYXQgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSB7CisgICAgICAgIHJldHVybiBtRHVja0FuZE11dGVWb2x1bWU7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGhlIG91dHB1dCBzdWJjbGFzc2VzLgorICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgZG9TZXRWb2x1bWUoKSB7IHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCk7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIgaWYgbmVlZGVkLgorICAgICAqIE9ubHkgcmVnaXN0ZXIgb3V0cHV0IHN0cmVhbXMuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGNsaWVudCBzdHJlYW1zIGFuZCBub3QgZm9yIHN0cmVhbXMKKyAgICAgKiB0aGF0IHJ1biBpbiB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgICAgICBtUGxheWVyQmFzZS0+cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIuCisgICAgICogVGhpcyB3aWxsIG9ubHkgdW5yZWdpc3RlciBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgeworICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKKyAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCisgICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgeworICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcCgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKIHByb3RlY3RlZDoKIAorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgorICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KKyAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KKyAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGZvciB2b2x1bWUgY2hhbmdlcyBhbmQgcmVtb3RlIGNvbnRyb2wuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVblJlZ2lzdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBKdXN0IGNhbGxzIHVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGRlc3Ryb3koKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gbVBhcmVudCBzaG91bGQgTk9UIGJlIG51bGwuIFNvIGdvIGFoZWFkIGFuZCBjcmFzaCBpZiBpdCBpcy4KKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RQYXVzZSgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RvcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RvcCgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gTm8gcGFuIGFuZCBvbmx5IGxlZnQgdm9sdW1lIGlzIHRha2VuIGludG8gYWNjb3VudCBmcm9tIElQTGF5ZXIgaW50ZXJmYWNlCisgICAgICAgICAgICBtUGFyZW50LT5zZXREdWNrQW5kTXV0ZVZvbHVtZShtVm9sdW1lTXVsdGlwbGllckwgIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKKyAgICAgICAgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFyZW50LT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvU3RyZWFtICAgICAgICAgICptUGFyZW50OworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgbVJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgfTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgpAQCAtMjc1LDcgKzQwNyw5IEBACiAKICAgICBzdGQ6Om11dGV4ICAgICAgICAgICBtU3RyZWFtTXV0ZXg7CiAKLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICBtQ2FsbGJhY2tFbmFibGVkOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gMS4wZjsKIAogcHJvdGVjdGVkOgogCkBAIC0yODgsNiArNDIyLDggQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOworCiAgICAgLy8gVGhlc2UgZG8gbm90IGNoYW5nZSBhZnRlciBvcGVuKCkuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IDQzYTFlZjEuLjA5ZWJiM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0xODQsMTYgKzE4NCw2IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgc3dpdGNoIChtRGlyZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjogZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgICAgICAgICAvLyBicmVhazsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG1QZXJmb3JtYW5jZU1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAppbmRleCA2ZTU0OGIxLi5hNDNjZmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCkBAIC0zNSwxNSArMzUsNiBAQAogCiAgICAgfkF1ZGlvU3RyZWFtQnVpbGRlcigpOwogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGdldERpcmVjdGlvbigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EaXJlY3Rpb247Ci0gICAgfQotCi0gICAgQXVkaW9TdHJlYW1CdWlsZGVyKiBzZXREaXJlY3Rpb24oYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKICAgICB9CkBAIC0xMTMsNyArMTA0LDYgQEAKIAogcHJpdmF0ZToKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIAogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgIG1EYXRhQ2FsbGJhY2tQcm9jID0gbnVsbHB0cjsgIC8vIGV4dGVybmFsIGNhbGxiYWNrIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IDhkMmM2MmQuLmE4Njk4ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIxMCwzICsyMTAsOSBAQAogICAgIHJldHVybiBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKIH0KIAordm9pZCBGaWZvQnVmZmVyOjplcmFzZU1lbW9yeSgpIHsKKyAgICBpbnQzMl90IG51bUJ5dGVzID0gY29udmVydEZyYW1lc1RvQnl0ZXMoZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpKTsKKyAgICBpZiAobnVtQnl0ZXMgPiAwKSB7CisgICAgICAgIG1lbXNldChtU3RvcmFnZSwgMCwgKHNpemVfdCkgbnVtQnl0ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IGE5NGU5YjAuLmY1YTllMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMTExLDYgKzExMSwxMSBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIC8qCisgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICB2b2lkIGVyYXNlTWVtb3J5KCk7CisKIHByaXZhdGU6CiAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggZGQ1ZTNjMC4uZWUyNTA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgpAQCAtMzAsNyArMzEsOCBAQAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogQXVkaW9TdHJlYW1MZWdhY3k6OkF1ZGlvU3RyZWFtTGVnYWN5KCkKLSAgICAgICAgOiBBdWRpb1N0cmVhbSgpLCBtRGV2aWNlQ2FsbGJhY2sobmV3IFN0cmVhbURldmljZUNhbGxiYWNrKHRoaXMpKSB7CisgICAgICAgIDogQXVkaW9TdHJlYW0oKQorICAgICAgICAsIG1EZXZpY2VDYWxsYmFjayhuZXcgU3RyZWFtRGV2aWNlQ2FsbGJhY2sodGhpcykpIHsKIH0KIAogQXVkaW9TdHJlYW1MZWdhY3k6On5BdWRpb1N0cmVhbUxlZ2FjeSgpIHsKQEAgLTQ2LDMzICs0OCw1MSBAQAogICAgIHJldHVybiBBdWRpb1N0cmVhbUxlZ2FjeV9jYWxsYmFjazsKIH0KIAotLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKLWludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6Om9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSB7Ci0gICAgaW50MzJfdCBmcmFtZUNvdW50ID0gbnVtQnl0ZXMgLyBnZXRCeXRlc1BlckZyYW1lKCk7CitpbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICAvLyBJbmNyZW1lbnQgYmVmb3JlIGJlY2F1c2Ugd2UgYWxyZWFkeSBnb3QgdGhlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgorICAgICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKG51bUZyYW1lcyk7CisgICAgfQorCiAgICAgLy8gQ2FsbCB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGFwcENhbGxiYWNrID0gZ2V0RGF0YUNhbGxiYWNrUHJvYygpOwotICAgIHJldHVybiAoKmFwcENhbGxiYWNrKSgKKyAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9ICgqYXBwQ2FsbGJhY2spKAogICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAogICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgICAgICAgICAgbnVtRnJhbWVzKTsKKworICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFCisgICAgICAgICAgICAmJiBnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICAvLyBJbmNyZW1lbnQgYWZ0ZXIgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGRldmljZS4KKyAgICAgICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gY2FsbGJhY2tSZXN1bHQ7Cit9CisKKy8vIEltcGxlbWVudCBGaXhlZEJsb2NrUHJvY2Vzc29yCitpbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpvblByb2Nlc3NGaXhlZEJsb2NrKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1CeXRlcykgeworICAgIGludDMyX3QgbnVtRnJhbWVzID0gbnVtQnl0ZXMgLyBnZXRCeXRlc1BlckZyYW1lKCk7CisgICAgcmV0dXJuIGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoYnVmZmVyLCBudW1GcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwogCi0gICAgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQTogewotICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgYW4gQXVkaW9UcmFjazo6QnVmZmVyIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgotICAgICAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmF1ZGlvQnVmZmVyID0gc3RhdGljX2Nhc3Q8QXVkaW9UcmFjazo6QnVmZmVyICo+KGluZm8pOwotICAgICAgICAgICAgICAgIGlmIChhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAgICAgICAgIC8vIEF1ZGlvUmVjb3JkOjpCdWZmZXIKKyAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KKyAgICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYXVkaW9CdWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7CisgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCB8fCAhbUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7IC8vIHNpbGVuY2UgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KICAgICAgICAgICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7CkBAIC04MSw0NCArMTAxLDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgYXVkaW9CdWZmZXItPnJhdywgYnl0ZUNvdW50KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9ICgqZ2V0RGF0YUNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKCh1aW50OF90ICopYXVkaW9CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyBGQUxMIFRIUk9VR0gKIAotICAgICAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVEOiB7Ci0gICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBBTE9HRCgicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICAgICAgaWYgKGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICgqZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSkoCi0gICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KKyAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdHJlYW0gZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAorCisKK3ZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKSB7CisgICAgaWYgKG1SZXF1ZXN0RGlzY29ubmVjdC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIEFMT0dEKCJjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCkgbVJlcXVlc3REaXNjb25uZWN0IGFja25vd2xlZGdlZCIpOworICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgbVJlcXVlc3REaXNjb25uZWN0LmFja25vd2xlZGdlKCk7CisgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Zm9yY2VEaXNjb25uZWN0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgaWYgKGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKKyAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRCZXN0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcywKQEAgLTEzNiw4ICsxNzEsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBleHRlbmRlZFRpbWVzdGFtcC0+Z2V0QmVzdFRpbWVzdGFtcChmcmFtZVBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsIHRpbWViYXNlKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb24gbG9jYXRpb24gPSBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb246OkxPQ0FUSU9OX0lOVkFMSUQ7CisgICAgaW50NjRfdCBsb2NhbFBvc2l0aW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IGV4dGVuZGVkVGltZXN0YW1wLT5nZXRCZXN0VGltZXN0YW1wKCZsb2NhbFBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJhc2UsICZsb2NhdGlvbik7CisgICAgLy8gdXNlIE1vbm90b25pY0NvdW50ZXIgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBtVGltZXN0YW1wUG9zaXRpb24udXBkYXRlMzIoKGludDMyX3QpbG9jYWxQb3NpdGlvbik7CisgICAgKmZyYW1lUG9zaXRpb24gPSBtVGltZXN0YW1wUG9zaXRpb24uZ2V0KCk7CisKKy8vICAgIEFMT0dEKCJnZXRCZXN0VGltZXN0YW1wKCkgZnBvc2l0aW9uOiBzZXJ2ZXIgPSAlNmxsZCwga2VybmVsID0gJTZsbGQsIGxvY2F0aW9uID0gJWQiLAorLy8gICAgICAgICAgKGxvbmcgbG9uZykgZXh0ZW5kZWRUaW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb246OkxPQ0FUSU9OX1NFUlZFUl0sCisvLyAgICAgICAgICAobG9uZyBsb25nKSBleHRlbmRlZFRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fS0VSTkVMXSwKKy8vICAgICAgICAgIChpbnQpbG9jYXRpb24pOworICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQpAQCAtMTQ1LDE1ICsxOTUsMTggQEAKICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIGRldmljZUlkICVkIiwgKGludClkZXZpY2VJZCk7CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQgJiYKICAgICAgICAgICAgIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgZGF0YSBjYWxsYmFjayBhbmQgdGhlIHN0cmVhbSBpcyBhY3RpdmUsIHNlbmQgdGhlIGVycm9yIGNhbGxiYWNrIGZyb20KLSAgICAgICAgLy8gZGF0YSBjYWxsYmFjayB0aHJlYWQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNURUQgc3RhdGUKLSAgICAgICAgaWYgKCFpc0RhdGFDYWxsYmFja0FjdGl2ZSgpICYmIGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAvLyBOb3RlIHRoYXQgaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSBpcyBhZmZlY3RlZCBieSBzdGF0ZSBzbyBjYWxsIGl0IGJlZm9yZSBESVNDT05ORUNUSU5HLgorICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgZGF0YSBjYWxsYmFjayBhbmQgdGhlIHN0cmVhbSBpcyBhY3RpdmUsIHRoZW4gYXNrIHRoZSBkYXRhIGNhbGxiYWNrCisgICAgICAgIC8vIHRvIERJU0NPTk5FQ1QgYW5kIGNhbGwgdGhlIGVycm9yIGNhbGxiYWNrLgorICAgICAgICBpZiAoaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSkgeworICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSByZXF1ZXN0IERJU0NPTk5FQ1QgaW4gZGF0YSBjYWxsYmFjayBkdWUgdG8gZGV2aWNlIGNoYW5nZSIpOworICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgZGF0YSBjYWxsYmFjayBoYXMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZQorICAgICAgICAgICAgLy8gcmVxdWVzdCB0aGVuIHRoZSByZXF1ZXN0U3RvcCgpIGFuZCByZXF1ZXN0UGF1c2UoKSBtZXRob2RzIHdpbGwgaGFuZGxlIGl0IGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgaGFzIHN0b3BwZWQuCisgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QucmVxdWVzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93Iik7CisgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKICAgICAgICAgfQogICAgIH0KICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCBkMmVmM2M3Li43ZTI4NTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAiQUF1ZGlvTGVnYWN5LmgiCisjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewpAQCAtNjMsNiArNjQsOCBAQAogCiAgICAgYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IGdldExlZ2FjeUNhbGxiYWNrKCk7CiAKKyAgICBpbnQzMl90IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXModWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CisKICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgQXVkaW9UcmFjay9BdWRpb1JlY29yZCBjbGllbnQuCiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pID0gMDsKQEAgLTEwOSw2ICsxMTIsMTAgQEAKIAogICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKIAorICAgIHZvaWQgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOworCisgICAgdm9pZCBmb3JjZURpc2Nvbm5lY3QoKTsKKwogICAgIHZvaWQgb25TdGFydCgpIHsgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsgfQogICAgIHZvaWQgb25TdG9wKCkgeyBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsgfQogCkBAIC0xMjIsMTEgKzEyOSwxNCBAQAogCiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47CiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbUZyYW1lc1JlYWQ7CisgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbVRpbWVzdGFtcFBvc2l0aW9uOwogCiAgICAgRml4ZWRCbG9ja0FkYXB0ZXIgICAgICAgICAqbUJsb2NrQWRhcHRlciA9IG51bGxwdHI7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190ICAgbVBvc2l0aW9uV2hlblN0YXJ0aW5nID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpzcDxTdHJlYW1EZXZpY2VDYWxsYmFjaz4gICBtRGV2aWNlQ2FsbGJhY2s7CisKKyAgICBBdG9taWNSZXF1ZXN0b3IgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAppbmRleCA4ZTgwNzBjLi5iYzZlNjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TdHJlYW1SZWNvcmQiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTE1OSw2ICsxNTksOSBAQAogICAgICAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKICAgICB9CiAgICAgc2V0UGVyZm9ybWFuY2VNb2RlKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CisKKyAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7IC8vIEVYQ0xVU0lWRSBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gbGVnYWN5CisKICAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KICAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKICAgICAgICAgICAgICAiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCkBAIC0xNzgsMTEgKzE4MSwxMiBAQAogewogICAgIC8vIFRPRE8gYWRkIGNsb3NlKCkgb3IgcmVsZWFzZSgpIHRvIEF1ZGlvUmVjb3JkIEFQSSB0aGVuIGNhbGwgaXQgZnJvbSBoZXJlCiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgbUF1ZGlvUmVjb3JkLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CiAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CiAgICAgfQogICAgIG1GaXhlZEJsb2NrV3JpdGVyLmNsb3NlKCk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gQXVkaW9TdHJlYW06OmNsb3NlKCk7CiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1SZWNvcmQ6OnByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKQEAgLTIwNyw3ICsyMTEsNyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcGxheWluZy4KKyAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4gdGhlIHRyYWNrIGlzIHJlY29yZGluZy4KICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuU3RhcnRpbmcpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CkBAIC0yMzAsMTIgKzIzNCwxNSBAQAogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CisgICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6dXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKQogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190IHBvc2l0aW9uOwpAQCAtMjkyLDYgKzI5OSwxMiBAQAogICAgIH0KICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkoYnl0ZXNSZWFkIC8gYnl0ZXNQZXJGcmFtZSk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChmcmFtZXNSZWFkKTsKKworICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlTWFjaGluZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcmV0dXJuIChhYXVkaW9fcmVzdWx0X3QpIGZyYW1lc1JlYWQ7CiB9CiAKQEAgLTMyNSw4ICszMzgsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSB7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXh0ZW5kZWRUaW1lc3RhbXA7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5nZXRUaW1lc3RhbXAoJmV4dGVuZGVkVGltZXN0YW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBnZXRCZXN0VGltZXN0YW1wKGNsb2NrSWQsIGZyYW1lUG9zaXRpb24sIHRpbWVOYW5vc2Vjb25kcywgJmV4dGVuZGVkVGltZXN0YW1wKTsKIH0KKworaW50NjRfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0RnJhbWVzV3JpdHRlbigpIHsKKyAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgcG9zaXRpb247CisgICAgc3RhdHVzX3QgcmVzdWx0OworICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgeworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CisgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRGcmFtZXNXcml0dGVuKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAppbmRleCAyYzZhN2ViLi5jMTcyM2JhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKQEAgLTU5LDkgKzU5LDExIEBACiAKICAgICBpbnQzMl90IGdldFhSdW5Db3VudCgpIGNvbnN0IG92ZXJyaWRlOwogCisgICAgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGU7CisKICAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNzdmMzFlMi4uMGU5YWFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBdWRpb1N0cmVhbVRyYWNrIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogICAgIEFMT0dEKCJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCksIHJlcXVlc3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gJWQsIGZyYW1lQ291bnQgPSAldSIsCiAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCAodWludClmcmFtZUNvdW50KTsKLSAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CisgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOyAvLyBUT0RPIHJldmlldwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtQXVkaW9UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGdldERldmljZUlkKCkpOwogICAgIH0KQEAgLTE0Myw4ICsxNDMsNyBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9CiAKLSAgICAvL1RyYWNrUGxheWVyQmFzZSBpbml0Ci0gICAgaW5pdChtQXVkaW9UcmFjay5nZXQoKSwgUExBWUVSX1RZUEVfQUFVRElPLCBBVURJT19VU0FHRV9NRURJQSk7CisgICAgZG9TZXRWb2x1bWUoKTsKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1RyYWNrLgogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkpOwpAQCAtMTcxLDE4ICsxNzAsMjAgQEAKICAgICBzZXREZXZpY2VJZChtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSk7CiAgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKIAotICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtLgorICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtIGZsYWdzLgogICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgc2FtcGxlIHJhdGUgaXMgbm90IGFsbG93ZWQgdGhlbiB5b3Ugd29uJ3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhY3R1YWxGbGFncyA9IG1BdWRpb1RyYWNrLT5nZXRGbGFncygpOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKLSAgICBpZiAoKGFjdHVhbEZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpKQotICAgICAgICA9PSAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykpIHsKKyAgICAvLyBXZSBtYXkgbm90IGdldCB0aGUgUkFXIGZsYWcuIEJ1dCBhcyBsb25nIGFzIHdlIGdldCB0aGUgRkFTVCBmbGFnIHdlIGNhbiBjYWxsIGl0IExPV19MQVRFTkNZLgorICAgIGlmICgoYWN0dWFsRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwKSB7CiAgICAgICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwotCiAgICAgfSBlbHNlIGlmICgoYWN0dWFsRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgewogICAgICAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc7CiAgICAgfQogICAgIHNldFBlcmZvcm1hbmNlTW9kZShhY3R1YWxQZXJmb3JtYW5jZU1vZGUpOworCisgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOyAvLyBFWENMVVNJVkUgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGxlZ2FjeQorCiAgICAgLy8gTG9nIHdhcm5pbmcgaWYgd2UgZGlkIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCBmb3IuCiAgICAgQUxPR1dfSUYoYWN0dWFsRmxhZ3MgIT0gZmxhZ3MsCiAgICAgICAgICAgICAgIkF1ZGlvU3RyZWFtVHJhY2s6Om9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCkBAIC0xOTcsNyArMTk4LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpjbG9zZSgpCiB7CiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgZGVzdHJveSgpOworICAgICAgICBtQXVkaW9UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CiAgICAgfQogICAgIG1GaXhlZEJsb2NrUmVhZGVyLmNsb3NlKCk7CkBAIC0yMjIsMTEgKzIyMywxMSBAQAogICAgIHJldHVybjsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydCgpCi17CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7CiAKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcGxheWluZy4KQEAgLTIzNSw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9CiAKLSAgICBlcnIgPSBzdGFydFdpdGhTdGF0dXMoKTsKKyAgICBlcnIgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0yNDUsMTEgKzI0NiwxMSBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0UGF1c2UoKQoteworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwogCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RQYXVzZSgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0gZWxzZSBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HCiAgICAgICAgICAgICAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgewpAQCAtMjU5LDcgKzI2MCw4IEBACiAgICAgfQogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgcGF1c2UoKTsKKyAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKKyAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CiAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuUGF1c2luZyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKQEAgLTI3MSwxNCArMjczLDE3IEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKIAogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9IGVsc2UgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIG5vdCBwYXVzZWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtMjg2LDE3ICsyOTEsMjEgQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwogCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1JlYWQoZ2V0RnJhbWVzV3JpdHRlbigpIC0gZ2V0RnJhbWVzUmVhZCgpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBzdG9wKCk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNXcml0dGVuKCkpOwogICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CisgICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjp1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6dXBkYXRlU3RhdGVNYWNoaW5lKCkKIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190IHBvc2l0aW9uOwpAQCAtMzczLDYgKzM4MiwxMiBAQAogICAgIH0KICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkoYnl0ZXNXcml0dGVuIC8gYnl0ZXNQZXJGcmFtZSk7CiAgICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihmcmFtZXNXcml0dGVuKTsKKworICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlTWFjaGluZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTQzMSw4ICs0NDYsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKCZleHRlbmRlZFRpbWVzdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9Ci0gICAgcmV0dXJuIGdldEJlc3RUaW1lc3RhbXAoY2xvY2tJZCwgZnJhbWVQb3NpdGlvbiwgdGltZU5hbm9zZWNvbmRzLCAmZXh0ZW5kZWRUaW1lc3RhbXApOworICAgIGludDY0X3QgcG9zaXRpb24gPSAwOworICAgIGludDY0X3QgbmFub3NlY29uZHMgPSAwOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRCZXN0VGltZXN0YW1wKGNsb2NrSWQsICZwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFub3NlY29uZHMsICZleHRlbmRlZFRpbWVzdGFtcCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgZ2V0RnJhbWVzV3JpdHRlbigpKSB7CisgICAgICAgICAgICAqZnJhbWVQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgKnRpbWVOYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsgLy8gVE9ETyByZXZpZXcsIGRvY3VtZW50ZWQgYnV0IG5vdCBjb25zaXN0ZW50CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdHVzX3QgQXVkaW9TdHJlYW1UcmFjazo6ZG9TZXRWb2x1bWUoKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fSU5JVDsKKyAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBmbG9hdCB2b2x1bWUgPSBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOworICAgICAgICBtQXVkaW9UcmFjay0+c2V0Vm9sdW1lKHZvbHVtZSwgdm9sdW1lKTsKKyAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI7CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKworICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gc3BDb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gc3BPcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24ob3BlcmF0aW9uKTsKKworICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJhcHBseVZvbHVtZVNoYXBlcigpIGZyb20gSVBsYXllciIpOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoc3BDb25maWd1cmF0aW9uLCBzcE9wZXJhdGlvbik7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7IC8vIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGlzIHRoZSB2b2x1bWUgc2hhcGVyIGlkLgorICAgICAgICAgICAgQUxPR0UoImFwcGx5Vm9sdW1lU2hhcGVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImFwcGx5Vm9sdW1lU2hhcGVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgIiBubyBBdWRpb1RyYWNrIGZvciB2b2x1bWUgY29udHJvbCBmcm9tIElQbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCmluZGV4IGZmNDI5ZWEuLmE4NzFkYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxtZWRpYS9UcmFja1BsYXllckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1CdWlsZGVyLmgiCkBAIC0zMiw3ICszMyw3IEBACiAvKioKICAqIEludGVybmFsIHN0cmVhbSB0aGF0IHVzZXMgdGhlIGxlZ2FjeSBBdWRpb1RyYWNrIHBhdGguCiAgKi8KLWNsYXNzIEF1ZGlvU3RyZWFtVHJhY2sgOiBwdWJsaWMgQXVkaW9TdHJlYW1MZWdhY3ksIHB1YmxpYyBhbmRyb2lkOjpUcmFja1BsYXllckJhc2UgeworY2xhc3MgQXVkaW9TdHJlYW1UcmFjayA6IHB1YmxpYyBBdWRpb1N0cmVhbUxlZ2FjeSB7CiBwdWJsaWM6CiAgICAgQXVkaW9TdHJlYW1UcmFjaygpOwogCkBAIC02Nyw3ICs2OCw3IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgb3ZlcnJpZGU7CiAKICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSBvdmVycmlkZTsKQEAgLTc2LDEzICs3NywyMiBAQAogICAgICAgICByZXR1cm4gaW5jcmVtZW50RnJhbWVzV3JpdHRlbihmcmFtZXMpOwogICAgIH0KIAorICAgIGFuZHJvaWQ6OnN0YXR1c190IGRvU2V0Vm9sdW1lKCkgb3ZlcnJpZGU7CisKKyNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyNlbmRpZgorCiBwcml2YXRlOgogCisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CisKICAgICAvLyBhZGFwdHMgYmV0d2VlbiB2YXJpYWJsZSBzaXplZCBibG9ja3MgYW5kIGZpeGVkIHNpemUgYmxvY2tzCiAgICAgRml4ZWRCbG9ja1JlYWRlciAgICAgICAgICAgICAgICAgbUZpeGVkQmxvY2tSZWFkZXI7CiAKLSAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvUmVjb3JkIGFuZCB1c2UgaXQuCi0gICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190ICAgICAgICAgbVBvc2l0aW9uV2hlblN0YXJ0aW5nID0gMDsKKyAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvVHJhY2sgYW5kIHVzZSBpdC4KICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICAgICAgICBtUG9zaXRpb25XaGVuUGF1c2luZyA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggYWNkMzE5Yi4uM2FmYTk3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtMjU4LDQgKzI1OCwxMTIgQEAKICAgICB9CiB9CiAKKworLyoqCisgKiBTaW1wbGUgZG91YmxlIGJ1ZmZlciBmb3IgYSBzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgd3JpdHRlbiBvY2Nhc2lvbmFsbHkgYW5kIHJlYWQgb2NjYXNpb25hbGx5LgorICogVGhpcyBhbGxvd3MgYSBTSU5HTEUgd3JpdGVyIHdpdGggbXVsdGlwbGUgcmVhZGVycy4KKyAqCisgKiBJdCBpcyBPSyBpZiB0aGUgRklGTyBvdmVyZmxvd3MgYW5kIHdlIGxvc2Ugb2xkIHZhbHVlcy4KKyAqIEl0IGlzIGFsc28gT0sgaWYgd2UgcmVhZCBhbiBvbGQgdmFsdWUuCisgKiBUaHJlYWQgbWF5IHJldHVybiBhIG5vbi1hdG9taWMgcmVzdWx0IGlmIHRoZSBvdGhlciB0aHJlYWQgaXMgcmFwaWRseSB3cml0aW5nCisgKiBuZXcgdmFsdWVzIG9uIGFub3RoZXIgY29yZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBTaW1wbGVEb3VibGVCdWZmZXIgeworcHVibGljOgorICAgIFNpbXBsZURvdWJsZUJ1ZmZlcigpCisgICAgICAgICAgICA6IG1WYWx1ZXMoKSB7fQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCB3cml0ZShUIHZhbHVlKSB7CisgICAgICAgIGludCBpbmRleCA9IG1Db3VudGVyLmxvYWQoKSAmIDE7CisgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIG1Db3VudGVyKys7IC8vIEluY3JlbWVudCBBRlRFUiB1cGRhdGluZyBzdG9yYWdlLCBPSyBpZiBpdCB3cmFwcy4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjYWxscyB3cml0ZSgpIG9yIHdoZW4KKyAgICAgKiBubyBvdGhlciB0aHJlYWQgaXMgY2FsbGluZyB3cml0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtQ291bnRlci5zdG9yZSgwKTsKKyAgICB9CisKKyAgICBUIHJlYWQoKSBjb25zdCB7CisgICAgICAgIFQgcmVzdWx0OworICAgICAgICBpbnQgYmVmb3JlOworICAgICAgICBpbnQgYWZ0ZXI7CisgICAgICAgIGludCB0aW1lb3V0ID0gMzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgd3JpdGUgb2NjdXJyZWQgd2hpbGUgd2VyZSByZWFkaW5nLgorICAgICAgICAgICAgYmVmb3JlID0gbUNvdW50ZXIubG9hZCgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gKGJlZm9yZSAmIDEpIF4gMTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1WYWx1ZXNbaW5kZXhdOworICAgICAgICAgICAgYWZ0ZXIgPSBtQ291bnRlci5sb2FkKCk7CisgICAgICAgIH0gd2hpbGUgKChhZnRlciAhPSBiZWZvcmUpICYmIChhZnRlciA+IDApICYmICgtLXRpbWVvdXQgPiAwKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvdW50ZXIubG9hZCgpID4gMDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVCAgICAgICAgICAgICAgICAgICAgbVZhbHVlc1syXTsKKyAgICBzdGQ6OmF0b21pYzxpbnQ+ICAgICBtQ291bnRlcnswfTsKK307CisKK2NsYXNzIFRpbWVzdGFtcCB7CitwdWJsaWM6CisgICAgVGltZXN0YW1wKCkKKyAgICAgICAgICAgIDogbVBvc2l0aW9uKDApCisgICAgICAgICAgICAsIG1OYW5vc2Vjb25kcygwKSB7fQorICAgIFRpbWVzdGFtcChpbnQ2NF90IHBvc2l0aW9uLCBpbnQ2NF90IG5hbm9zZWNvbmRzKQorICAgICAgICAgICAgOiBtUG9zaXRpb24ocG9zaXRpb24pCisgICAgICAgICAgICAsIG1OYW5vc2Vjb25kcyhuYW5vc2Vjb25kcykge30KKworICAgIGludDY0X3QgZ2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtUG9zaXRpb247IH0KKworICAgIGludDY0X3QgZ2V0TmFub3NlY29uZHMoKSBjb25zdCB7IHJldHVybiBtTmFub3NlY29uZHM7IH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGVzZSBjYW5ub3QgYmUgY29uc3QgYmVjYXVzZSB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGUgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgIGludDY0X3QgbVBvc2l0aW9uOworICAgIGludDY0X3QgbU5hbm9zZWNvbmRzOworfTsKKworCisvKioKKyAqIFBhc3MgYSByZXF1ZXN0IHRvIGFub3RoZXIgdGhyZWFkLgorICogVGhpcyBpcyB1c2VkIHdoZW4gb25lIHRocmVhZCwgQSwgd2FudHMgYW5vdGhlciB0aHJlYWQsIEIsIHRvIGRvIHNvbWV0aGluZy4KKyAqIEEgbmFpdmUgYXBwcm9hY2ggd291bGQgYmUgZm9yIEEgdG8gc2V0IGEgZmxhZyBhbmQgZm9yIEIgdG8gY2xlYXIgaXQgd2hlbiBkb25lLgorICogQnV0IHRoYXQgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uLiBUaGlzIHRlY2huaXF1ZSBhdm9pZHMgdGhlIHJhY2UgY29uZGl0aW9uLgorICoKKyAqIEFzc3VtZXMgb25seSBvbmUgcmVxdWVzdGVyIGFuZCBvbmUgYWNrbm93bGVkZ2VyLgorICovCitjbGFzcyBBdG9taWNSZXF1ZXN0b3IgeworcHVibGljOgorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCByZXF1ZXN0KCkgeworICAgICAgICBtUmVxdWVzdGVkKys7CisgICAgfQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgYm9vbCBpc1JlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtUmVxdWVzdGVkLmxvYWQoKSAtIG1BY2tub3dsZWRnZWQubG9hZCgpKSA+IDA7CisgICAgfQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCBhY2tub3dsZWRnZSgpIHsKKyAgICAgICAgbUFja25vd2xlZGdlZCsrOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZXF1ZXN0ZWR7MH07CisgICAgc3RkOjphdG9taWM8aW50PiBtQWNrbm93bGVkZ2VkezB9OworfTsKICNlbmRpZiAvL1VUSUxJVFlfQUFVRElPX1VUSUxJVElFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2U5NWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlICJBQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJIYW5kbGVUcmFja2VyLmgiCi0KLXVzaW5nIGFuZHJvaWQ6Ok11dGV4OwotCi0vLyBIYW5kbGUgZm9ybWF0IGlzOiB0Z2dnaWlpaQotLy8gd2hlcmUgZWFjaCBsZXR0ZXIgaXMgNCBiaXRzLCB0PXR5cGUsIGc9Z2VuZXJhdGlvbiwgaT1pbmRleAotCi0jZGVmaW5lIFRZUEVfU0laRSAgICAgICAgICAgNAotI2RlZmluZSBHRU5FUkFUSU9OX1NJWkUgICAgMTIKLSNkZWZpbmUgSU5ERVhfU0laRSAgICAgICAgIDE2Ci0KLSNkZWZpbmUgR0VORVJBVElPTl9JTlZBTElEICAwCi0jZGVmaW5lIEdFTkVSQVRJT05fU0hJRlQgICAgSU5ERVhfU0laRQotCi0jZGVmaW5lIFRZUEVfTUFTSyAgICAgICAgICAgKCgxIDw8IFRZUEVfU0laRSkgLSAxKQotI2RlZmluZSBHRU5FUkFUSU9OX01BU0sgICAgICgoMSA8PCBHRU5FUkFUSU9OX1NJWkUpIC0gMSkKLSNkZWZpbmUgSU5ERVhfTUFTSyAgICAgICAgICAoKDEgPDwgSU5ERVhfU0laRSkgLSAxKQotCi0jZGVmaW5lIFNMT1RfVU5BVkFJTEFCTEUgICAgKC0xKQotCi0vLyBFcnJvciBpZiBoYW5kbGUgaXMgbmVnYXRpdmUgc28gdHlwZSBpcyBsaW1pdGVkIHRvIGJvdHRvbSBoYWxmLgotI2RlZmluZSBIQU5ETEVfSU5WQUxJRF9UWVBFIFRZUEVfTUFTSwotCi1zdGF0aWNfYXNzZXJ0KEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUyA9PSAoMSA8PCAoVFlQRV9TSVpFIC0gMSkpLAotICAgICJNaXNtYXRjaCBiZXR3ZWVuIGhlYWRlciBhbmQgY3BwLiIpOwotc3RhdGljX2Fzc2VydChIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyA9PSAoMSA8PCAoSU5ERVhfU0laRSkpLAotICAgICJNaXNtYXRjaCBiZXR3ZWVuIGhlYWRlciBhbmQgY3BwLiIpOwotCi1IYW5kbGVUcmFja2VyOjpIYW5kbGVUcmFja2VyKHVpbnQzMl90IG1heEhhbmRsZXMpCi0gICAgICAgIDogbU1heEhhbmRsZUNvdW50KG1heEhhbmRsZXMpCi0gICAgICAgICwgbUhhbmRsZUhlYWRlcnMobnVsbHB0cikKLXsKLSAgICBhc3NlcnQobWF4SGFuZGxlcyA8PSBIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyk7Ci0gICAgLy8gQWxsb2NhdGUgYXJyYXlzIHRvIGhvbGQgYWRkcmVzc2VzIGFuZCB2YWxpZGF0aW9uIGluZm8uCi0gICAgbUhhbmRsZUFkZHJlc3NlcyA9IChoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgKikKLSAgICAgICAgICAgIG5ldyhzdGQ6Om5vdGhyb3cpIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdFttYXhIYW5kbGVzXTsKLSAgICBpZiAobUhhbmRsZUFkZHJlc3NlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1IYW5kbGVIZWFkZXJzID0gbmV3KHN0ZDo6bm90aHJvdykgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3RbbWF4SGFuZGxlc107Ci0KLSAgICAgICAgaWYgKG1IYW5kbGVIZWFkZXJzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGluaXRpYWxIZWFkZXIgPSBidWlsZEhlYWRlcigwLCAxKTsKLSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbGlua2VkIGxpc3Qgb2YgZnJlZSBub2Rlcy4gbnVsbHB0ciB0ZXJtaW5hdGVkLgotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IChtYXhIYW5kbGVzIC0gMSk7IGkrKykgewotICAgICAgICAgICAgICAgIG1IYW5kbGVBZGRyZXNzZXNbaV0gPSAmbUhhbmRsZUFkZHJlc3Nlc1tpICsgMV07IC8vIHBvaW50IHRvIG5leHQgbm9kZQotICAgICAgICAgICAgICAgIG1IYW5kbGVIZWFkZXJzW2ldID0gaW5pdGlhbEhlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAmbUhhbmRsZUFkZHJlc3Nlc1swXTsKLSAgICAgICAgICAgIG1IYW5kbGVBZGRyZXNzZXNbbWF4SGFuZGxlcyAtIDFdID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1IYW5kbGVIZWFkZXJzW21heEhhbmRsZXMgLSAxXSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtSGFuZGxlQWRkcmVzc2VzOyAvLyBzbyB0aGUgY2xhc3MgYXBwZWFycyB1bmluaXRpYWxpemVkCi0gICAgICAgICAgICBtSGFuZGxlQWRkcmVzc2VzID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotSGFuZGxlVHJhY2tlcjo6fkhhbmRsZVRyYWNrZXIoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZGVsZXRlW10gbUhhbmRsZUFkZHJlc3NlczsKLSAgICBkZWxldGVbXSBtSGFuZGxlSGVhZGVyczsKLSAgICBtSGFuZGxlQWRkcmVzc2VzID0gbnVsbHB0cjsKLX0KLQotYm9vbCBIYW5kbGVUcmFja2VyOjppc0luaXRpYWxpemVkKCkgY29uc3QgewotICAgIHJldHVybiBtSGFuZGxlQWRkcmVzc2VzICE9IG51bGxwdHI7Ci19Ci0KLQotCi1zdGQ6OnN0cmluZyBIYW5kbGVUcmFja2VyOjpkdW1wKCkgY29uc3QgewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiAiSGFuZGxlVHJhY2tlciBpcyBub3QgaW5pdGlhbGl6ZWRcbiI7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwotICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAotICAgICAgICAgICAgW3RoaXNdKCktPmJvb2wgeyByZXR1cm4gbUxvY2sudHJ5TG9jaygpOyB9IC8qIGYgKi8sCi0gICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKLSAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOwotICAgIGlmICghaXNMb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJIYW5kbGVUcmFja2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOwotICAgIH0KLQotICAgIHJlc3VsdCA8PCAiSGFuZGxlVHJhY2tlcjpcbiI7Ci0gICAgcmVzdWx0IDw8ICIgIEhhbmRsZUhlYWRlcnM6XG4iOwotICAgIC8vIGF0TGluZVN0YXJ0KCkgY2FuIGJlIGNoYW5nZWQgdG8gc3VwcG9ydCBhbiBhcmJpdHJhcnkgbGluZSBicmVha2luZyBhbGdvcml0aG07Ci0gICAgLy8gaXQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBuZXcgbGluZSBzdGFydHMuCi0gICAgLy8gRm9yIHNpbXBsaWNpdHksIHdlIHdpbGwgdXNlIGEgY29uc3RhbnQgMTYgaXRlbXMgcGVyIGxpbmUuCi0gICAgY29uc3QgYXV0byBhdExpbmVTdGFydCA9IFtdKGludCBpbmRleCkgLT4gYm9vbCB7Ci0gICAgICAgIC8vIE1hZ2ljIGNvbnN0YW50IG9mIDB4ZiB1c2VkIGZvciBtYXNrIHRvIGRldGVjdCBzdGFydCBldmVyeSAxNiBpdGVtcy4KLSAgICAgICAgcmV0dXJuIChpbmRleCAmIDB4ZikgPT0gMDsgfTsKLSAgICBjb25zdCBhdXRvIGF0TGluZUVuZCA9IFt0aGlzLCAmYXRMaW5lU3RhcnRdKGludCBpbmRleCkgLT4gYm9vbCB7Ci0gICAgICAgIHJldHVybiBhdExpbmVTdGFydChpbmRleCArIDEpIHx8IGluZGV4ID09IG1NYXhIYW5kbGVDb3VudCAtIDE7IH07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhIYW5kbGVDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChhdExpbmVTdGFydChpKSkgewotICAgICAgICAgICAgcmVzdWx0IDw8ICIgICAgIjsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXR3KDQpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IG1IYW5kbGVIZWFkZXJzW2ldCi0gICAgICAgICAgICAgICA8PCAoYXRMaW5lRW5kKGkpID8gIlxuIiA6ICIgIik7Ci0gICAgfQotCi0gICAgaWYgKGlzTG9ja2VkKSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi1oYW5kbGVfdHJhY2tlcl9zbG90X3QgSGFuZGxlVHJhY2tlcjo6YWxsb2NhdGVTbG90X2woKSB7Ci0gICAgdm9pZCAqKmFsbG9jYXRlZCA9IG1OZXh0RnJlZUFkZHJlc3M7Ci0gICAgaWYgKGFsbG9jYXRlZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBTTE9UX1VOQVZBSUxBQkxFOwotICAgIH0KLSAgICAvLyBSZW1vdmUgdGhpcyBzbG90IGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0LgotICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAodm9pZCAqKikgKmFsbG9jYXRlZDsKLSAgICByZXR1cm4gKGFsbG9jYXRlZCAtIG1IYW5kbGVBZGRyZXNzZXMpOwotfQotCi1oYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgSGFuZGxlVHJhY2tlcjo6bmV4dEdlbmVyYXRpb25fbChoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXgpIHsKLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbiA9IChtSGFuZGxlSGVhZGVyc1tpbmRleF0gKyAxKSAmIEdFTkVSQVRJT05fTUFTSzsKLSAgICAvLyBBdm9pZCBnZW5lcmF0aW9uIHplcm8gc28gdGhhdCAweDAgaXMgbm90IGEgdmFsaWQgaGFuZGxlLgotICAgIGlmIChnZW5lcmF0aW9uID09IEdFTkVSQVRJT05fSU5WQUxJRCkgewotICAgICAgICBnZW5lcmF0aW9uKys7Ci0gICAgfQotICAgIHJldHVybiBnZW5lcmF0aW9uOwotfQotCi1hYXVkaW9faGFuZGxlX3QgSGFuZGxlVHJhY2tlcjo6cHV0KGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLCB2b2lkICphZGRyZXNzKQotewotICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUykgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFKTsKLSAgICB9Ci0gICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX05PX01FTU9SWSk7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIC8vIEZpbmQgYW4gZW1wdHkgc2xvdC4KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBhbGxvY2F0ZVNsb3RfbCgpOwotICAgIGlmIChpbmRleCA9PSBTTE9UX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIEFMT0dFKCJIYW5kbGVUcmFja2VyOjpwdXQoKSBubyByb29tIGZvciBtb3JlIGhhbmRsZXMiKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX05PX0ZSRUVfSEFORExFUyk7Ci0gICAgfQotCi0gICAgLy8gQ3ljbGUgdGhlIGdlbmVyYXRpb24gY291bnRlciBzbyBzdGFsZSBoYW5kbGVzIGNhbiBiZSBkZXRlY3RlZC4KLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbiA9IG5leHRHZW5lcmF0aW9uX2woaW5kZXgpOyAvLyByZWFkcyBoZWFkZXIgdGFibGUKLSAgICBoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCBpbnB1dEhlYWRlciA9IGJ1aWxkSGVhZGVyKHR5cGUsIGdlbmVyYXRpb24pOwotCi0gICAgLy8gVGhlc2UgdHdvIHdyaXRlcyBtYXkgbmVlZCB0byBiZSBvYnNlcnZlZCBieSBvdGhlciB0aHJlYWRzIG9yIGNvcmVzIGR1cmluZyBnZXQoKS4KLSAgICBtSGFuZGxlSGVhZGVyc1tpbmRleF0gPSBpbnB1dEhlYWRlcjsKLSAgICBtSGFuZGxlQWRkcmVzc2VzW2luZGV4XSA9IGFkZHJlc3M7Ci0gICAgLy8gVE9ETyB1c2Ugc3RvcmUgcmVsZWFzZSB0byBlbmZvcmNlIG1lbW9yeSBvcmRlciB3aXRoIGdldCgpCi0KLSAgICAvLyBHZW5lcmF0ZSBhIGhhbmRsZS4KLSAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gYnVpbGRIYW5kbGUoaW5wdXRIZWFkZXIsIGluZGV4KTsKLQotICAgIEFMT0dWKCJIYW5kbGVUcmFja2VyOjpwdXQoJXApIHJldHVybnMgMHglMDh4IiwgYWRkcmVzcywgaGFuZGxlKTsKLSAgICByZXR1cm4gaGFuZGxlOwotfQotCi1oYW5kbGVfdHJhY2tlcl9zbG90X3QgSGFuZGxlVHJhY2tlcjo6aGFuZGxlVG9JbmRleChoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0Ci17Ci0gICAgLy8gVmFsaWRhdGUgdGhlIGhhbmRsZS4KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBleHRyYWN0SW5kZXgoaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gbU1heEhhbmRsZUNvdW50KSB7Ci0gICAgICAgIEFMT0dFKCJIYW5kbGVUcmFja2VyOjpoYW5kbGVUb0luZGV4KCkgaW52YWxpZCBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOwotICAgIH0KLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgaGFuZGxlR2VuZXJhdGlvbiA9IGV4dHJhY3RHZW5lcmF0aW9uKGhhbmRsZSk7Ci0gICAgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgaW5wdXRIZWFkZXIgPSBidWlsZEhlYWRlcih0eXBlLCBoYW5kbGVHZW5lcmF0aW9uKTsKLSAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBzeW5jaHJvbml6ZSB0aGlzIGFjY2VzcyB0byBtSGFuZGxlSGVhZGVycyBiZWNhdXNlIGl0IGlzIGNvbnN0YW50IGZvcgotICAgIC8vIHRoZSBsaWZldGltZSBvZiB0aGUgaGFuZGxlLgotICAgIGlmIChpbnB1dEhlYWRlciAhPSBtSGFuZGxlSGVhZGVyc1tpbmRleF0pIHsKLSAgICAgICAgQUxPR0UoIkhhbmRsZVRyYWNrZXI6OmhhbmRsZVRvSW5kZXgoKSBpbnB1dEhlYWRlciA9IDB4JTA4eCAhPSBtSGFuZGxlSGVhZGVyc1slZF0gPSAweCUwOHgiLAotICAgICAgICAgICAgIGlucHV0SGVhZGVyLCBpbmRleCwgbUhhbmRsZUhlYWRlcnNbaW5kZXhdKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1oYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgSGFuZGxlVHJhY2tlcjo6Z2V0KGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAotewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBoYW5kbGVUb0luZGV4KHR5cGUsIGhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gc3luY2hyb25pemUgdGhpcyBhY2Nlc3MgdG8gbUhhbmRsZUhlYWRlcnMgYmVjYXVzZSB0aGlzIHNsb3QKLSAgICAgICAgLy8gaXMgYWxsb2NhdGVkIGFuZCwgdGhlcmVmb3JlLCBub3QgcGFydCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBzbG90cy4KLSAgICAgICAgcmV0dXJuIG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX0KLQotaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IEhhbmRsZVRyYWNrZXI6OnJlbW92ZShoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSwgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkgewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBoYW5kbGVUb0luZGV4KHR5cGUsaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgYWRkcmVzcyA9IG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdOwotCi0gICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGhlYWRlciB0eXBlIGJ1dCBwcmVzZXJ2ZSB0aGUgZ2VuZXJhdGlvbiBjb3VudC4KLSAgICAgICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IGdlbmVyYXRpb24gPSBtSGFuZGxlSGVhZGVyc1tpbmRleF0gJiBHRU5FUkFUSU9OX01BU0s7Ci0gICAgICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGlucHV0SGVhZGVyID0gYnVpbGRIZWFkZXIoCi0gICAgICAgICAgICAgICAgKGhhbmRsZV90cmFja2VyX3R5cGVfdCkgSEFORExFX0lOVkFMSURfVFlQRSwgZ2VuZXJhdGlvbik7Ci0gICAgICAgIG1IYW5kbGVIZWFkZXJzW2luZGV4XSA9IGlucHV0SGVhZGVyOwotCi0gICAgICAgIC8vIEFkZCB0aGlzIHNsb3QgdG8gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0LgotICAgICAgICBtSGFuZGxlQWRkcmVzc2VzW2luZGV4XSA9IG1OZXh0RnJlZUFkZHJlc3M7Ci0gICAgICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAoaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190ICopICZtSGFuZGxlQWRkcmVzc2VzW2luZGV4XTsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1hYXVkaW9faGFuZGxlX3QgSGFuZGxlVHJhY2tlcjo6YnVpbGRIYW5kbGUoaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgdHlwZUdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCkgewotICAgIHJldHVybiAoYWF1ZGlvX2hhbmRsZV90KSgodHlwZUdlbmVyYXRpb24gPDwgR0VORVJBVElPTl9TSElGVCkgfCAoaW5kZXggJiBJTkRFWF9NQVNLKSk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX2hlYWRlcl90IEhhbmRsZVRyYWNrZXI6OmJ1aWxkSGVhZGVyKGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IGdlbmVyYXRpb24pCi17Ci0gICAgcmV0dXJuIChoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCkgKCgodHlwZSAmIFRZUEVfTUFTSykgPDwgR0VORVJBVElPTl9TSVpFKQotICAgICAgICB8IChnZW5lcmF0aW9uICYgR0VORVJBVElPTl9NQVNLKSk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX3Nsb3RfdCBIYW5kbGVUcmFja2VyOjpleHRyYWN0SW5kZXgoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICByZXR1cm4gaGFuZGxlICYgSU5ERVhfTUFTSzsKLX0KLQotaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IEhhbmRsZVRyYWNrZXI6OmV4dHJhY3RHZW5lcmF0aW9uKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgcmV0dXJuIChoYW5kbGUgPj4gR0VORVJBVElPTl9TSElGVCkgJiBHRU5FUkFUSU9OX01BU0s7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0hhbmRsZVRyYWNrZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNTFjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVVRJTElUWV9IQU5ETEVfVFJBQ0tFUl9ICi0jZGVmaW5lIFVUSUxJVFlfSEFORExFX1RSQUNLRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLXR5cGVkZWYgaW50MzJfdCAgYWF1ZGlvX2hhbmRsZV90OwotdHlwZWRlZiBpbnQzMl90ICBoYW5kbGVfdHJhY2tlcl90eXBlX3Q7ICAgICAgIC8vIHdoYXQga2luZCBvZiBoYW5kbGUKLXR5cGVkZWYgaW50MzJfdCAgaGFuZGxlX3RyYWNrZXJfc2xvdF90OyAgICAgICAvLyBpbmRleCBpbiBhbGxvY2F0aW9uIHRhYmxlCi10eXBlZGVmIGludDMyX3QgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdDsgLy8gaW5jcmVtZW50ZWQgd2hlbiBzbG90IHVzZWQKLXR5cGVkZWYgdWludDE2X3QgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3Q7ICAgICAvLyBjb21iaW5lcyB0eXBlIGFuZCBnZW5lcmF0aW9uCi10eXBlZGVmIHZvaWQgICAgKmhhbmRsZV90cmFja2VyX2FkZHJlc3NfdDsgICAgLy8gYWRkcmVzcyBvZiBzb21ldGhpbmcgdGhhdCBpcyBzdG9yZWQgaGVyZQotCi0jZGVmaW5lIEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUyAgICAoMSA8PCAzKQotI2RlZmluZSBIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyAgKDEgPDwgMTYpCi0KLS8qKgotICogUmVwcmVzZW50IE9iamVjdHMgdXNpbmcgYW4gaW50ZWdlciBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIEphdmEuCi0gKiBUaGlzIGFsc28gbWFrZXMgdGhlICdDJyBBQkkgbW9yZSByb2J1c3QuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgotICogSWYgeW91IGNhbGwgaXQgZnJvbSBtb3JlIHRoYW4gb25lIHRocmVhZCB0aGVuIHlvdSBuZWVkIHRvIHVzZSB5b3VyIG93biBtdXRleC4KLSAqLwotY2xhc3MgSGFuZGxlVHJhY2tlciB7Ci0KLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWF4SGFuZGxlcyBjYW5ub3QgZXhjZWVkIEhBTkRMRV9UUkFDS0VSX01BWF9IQU5ETEVTCi0gICAgICovCi0gICAgSGFuZGxlVHJhY2tlcih1aW50MzJfdCBtYXhIYW5kbGVzID0gMjU2KTsKLSAgICB2aXJ0dWFsIH5IYW5kbGVUcmFja2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb24ndCB1c2UgaWYgdGhpcyByZXR1cm5zIGZhbHNlOwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZXJuYWwgYWxsb2NhdGlvbiBzdWNjZWVkZWQKLSAgICAgKi8KLSAgICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSGFuZGxlVHJhY2tlciBpbmZvcm1hdGlvbi4KLSAgICAgKgotICAgICAqIFdpbGwgYXR0ZW1wdCB0byBnZXQgdGhlIG9iamVjdCBsb2NrLCBidXQgd2lsbCBwcm9jZWVkCi0gICAgICogZXZlbiBpZiBpdCBjYW5ub3QuCi0gICAgICoKLSAgICAgKiBFYWNoIGxpbmUgb2YgaW5mb3JtYXRpb24gZW5kcyB3aXRoIGEgbmV3bGluZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBIYW5kbGVUcmFja2VyIGluZm8uCi0gICAgICovCi0gICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogU3RvcmUgYSBwb2ludGVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgcG9pbnRlci4KLSAgICAgKgotICAgICAqIEl0IGlzIHNhZmUgdG8gY2FsbCBwdXQoKSBvciByZW1vdmUoKSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgdHJhY2tlZAotICAgICAqIEBwYXJhbSBhZGRyZXNzIHBvaW50ZXIgdG8gYmUgY29udmVydGVkIHRvIGEgaGFuZGxlCi0gICAgICogQHJldHVybiBhIHZhbGlkIGhhbmRsZSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgYWF1ZGlvX2hhbmRsZV90IHB1dChoYW5kbGVfdHJhY2tlcl90eXBlX3QgZXhwZWN0ZWRUeXBlLCBoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgYWRkcmVzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICogVGhlIGhhbmRsZSB3aWxsIGJlIHZhbGlkYXRlZCB0byBwcmV2ZW50IHN0YWxlIGhhbmRsZXMgZnJvbSBiZWluZyByZXVzZWQuCi0gICAgICogTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgY29tbW9uIGNvZGluZyBlcnJvcnMgYW5kIG5vdAotICAgICAqIHRvIHByZXZlbnQgZGVsaWJlcmF0ZSBoYWNraW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBzaG91bGRtYXRjaCB0aGUgdHlwZSB3ZSBwYXNzZWQgdG8gcHV0KCkKLSAgICAgKiBAcGFyYW0gaGFuZGxlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBvaW50ZXIKLSAgICAgKiBAcmV0dXJuIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZSBvciBudWxscHRyCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IGdldChoYW5kbGVfdHJhY2tlcl90eXBlX3QgZXhwZWN0ZWRUeXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdXAgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICogU3Vic2VxdWVudCBhdHRlbXB0cyB0byB1c2UgdGhlIGhhbmRsZSB3aWxsIGZhaWwuCi0gICAgICoKLSAgICAgKiBEbyBOT1QgcmVtb3ZlKCkgYSBoYW5kbGUgd2hpbGUgZ2V0KCkgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgc2FtZSBoYW5kbGUgZnJvbSBhbm90aGVyIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgc2hvdWxkbWF0Y2ggdGhlIHR5cGUgd2UgcGFzc2VkIHRvIHB1dCgpCi0gICAgICogQHBhcmFtIGhhbmRsZSB0byBiZSByZW1vdmVkIGZyb20gdHJhY2tpbmcKLSAgICAgKiBAcmV0dXJuIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZSBvciBudWxscHRyIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCByZW1vdmUoaGFuZGxlX3RyYWNrZXJfdHlwZV90IGV4cGVjdGVkVHlwZSwgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICAgIG1NYXhIYW5kbGVDb3VudDsgICAvLyBzaXplIG9mIGFycmF5Ci0gICAgLy8gVGhpcyBhZGRyZXNzIGlzIGNvbnN0IGFmdGVyIGluaXRpYWxpemF0aW9uLgotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCAgKiBtSGFuZGxlQWRkcmVzc2VzOyAgLy8gYWRkcmVzcyBvZiBvYmplY3RzIG9yIGEgZnJlZSBsaW5rZWQgbGlzdCBub2RlCi0gICAgLy8gVGhpcyBhZGRyZXNzIGlzIGNvbnN0IGFmdGVyIGluaXRpYWxpemF0aW9uLgotICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90ICAgKiBtSGFuZGxlSGVhZGVyczsgICAgLy8gY29tYmluYXRpb24gb2YgdHlwZSBhbmQgZ2VuZXJhdGlvbgotICAgIC8vIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIGZyZWUgbm9kZXMgaW4gbUhhbmRsZUFkZHJlc3NlcwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCAgKiBtTmV4dEZyZWVBZGRyZXNzOwotCi0gICAgLy8gVGhpcyBNdXRleCBwcm90ZWN0cyB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBub2Rlcy4KLSAgICAvLyBUaGUgbGlzdCBpcyBtYW5hZ2VkIHVzaW5nIG1IYW5kbGVBZGRyZXNzZXMgYW5kIG1OZXh0RnJlZUFkZHJlc3MuCi0gICAgLy8gVGhlIGRhdGEgaW4gbUhhbmRsZUhlYWRlcnMgaXMgb25seSBjaGFuZ2VkIGJ5IHB1dCgpIGFuZCByZW1vdmUoKS4KLSAgICBtdXRhYmxlIGFuZHJvaWQ6Ok11dGV4ICAgICAgbUxvY2s7Ci0KLSAgICAvKioKLSAgICAgKiBQdWxsIHNsb3Qgb2ZmIG9mIGEgbGlzdCBvZiBlbXB0eSBzbG90cy4KLSAgICAgKiBAcmV0dXJuIGluZGV4IG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAgICAgKi8KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgYWxsb2NhdGVTbG90X2woKTsKLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNsb3QsIGF2b2lkaW5nIHplcm8uCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IG5leHRHZW5lcmF0aW9uX2woaGFuZGxlX3RyYWNrZXJfc2xvdF90IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBoYW5kbGUgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbmRleC4KLSAgICAgKiBAcmV0dXJuIHNsb3QgaW5kZXggb3IgYSBuZWdhdGl2ZSBlcnJvcgotICAgICAqLwotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBoYW5kbGVUb0luZGV4KGFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGhhbmRsZSBmcm9tIGEgaGVhZGVyIGFuZCBhbiBpbmRleC4KLSAgICAgKiBAcGFyYW0gaGVhZGVyIGNvbWJpbmF0aW9uIG9mIGEgdHlwZSBhbmQgYSBnZW5lcmF0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IHNsb3QgaW5kZXggcmV0dXJuZWQgZnJvbSBhbGxvY2F0ZVNsb3QKLSAgICAgKiBAcmV0dXJuIGhhbmRsZSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgc3RhdGljIGFhdWRpb19oYW5kbGVfdCBidWlsZEhhbmRsZShoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCBoZWFkZXIsIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21iaW5lIGEgdHlwZSBhbmQgYSBnZW5lcmF0aW9uIGZpZWxkIGludG8gYSBoZWFkZXIuCi0gICAgICovCi0gICAgc3RhdGljIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGJ1aWxkSGVhZGVyKGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uKTsKLQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgdGhlIGluZGV4IGZyb20gYSBoYW5kbGUuCi0gICAgICogRG9lcyBub3QgdmFsaWRhdGUgdGhlIGhhbmRsZS4KLSAgICAgKiBAcmV0dXJuIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBhIGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBoYW5kbGVfdHJhY2tlcl9zbG90X3QgZXh0cmFjdEluZGV4KGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgZ2VuZXJhdGlvbiBmcm9tIGEgaGFuZGxlLgotICAgICAqIERvZXMgbm90IHZhbGlkYXRlIHRoZSBoYW5kbGUuCi0gICAgICogQHJldHVybiBnZW5lcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZXh0cmFjdEdlbmVyYXRpb24oYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7Ci0KLX07Ci0KLSNlbmRpZiAvL1VUSUxJVFlfSEFORExFX1RSQUNLRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggODFkN2Y4OS4uMTNjOTJhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC00MSw2ICs0MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHNldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgorICAgICAqLworICAgIHZvaWQgc2V0KGludDY0X3QgY291bnRlcikgeworICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBZHZhbmNlIHRoZSBjb3VudGVyIGlmIGRlbHRhIGlzIHBvc2l0aXZlLgogICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5tawppbmRleCBlNGVlZjA2Li4zN2IwMTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5tawpAQCAtNSwxNiArNSw2IEBACiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X2hhbmRsZV90cmFja2VyLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X2hhbmRsZV90cmFja2VyCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCiBMT0NBTF9TUkNfRklMRVM6PSB0ZXN0X21hcnNoYWxsaW5nLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwogTE9DQUxfTU9EVUxFIDo9IHRlc3RfYWF1ZGlvX21hcnNoYWxsaW5nCkBAIC0zNCw2ICsyNCwxNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKKyAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcworTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF90aW1lc3RhbXBzLmNwcAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KK0xPQ0FMX01PRFVMRSA6PSB0ZXN0X3RpbWVzdGFtcHMKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKIExPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfbGluZWFyX3JhbXAuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfaGFuZGxlX3RyYWNrZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfaGFuZGxlX3RyYWNrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRiNDdhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2hhbmRsZV90cmFja2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVW5pdCB0ZXN0cyBmb3IgQUF1ZGlvIEhhbmRsZSBUcmFja2VyCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgInV0aWxpdHkvSGFuZGxlVHJhY2tlci5oIgotCi0vLyBUZXN0IGFkZGluZyBvbmUgYWRkcmVzcy4KLVRFU1QodGVzdF9oYW5kbGVfdHJhY2tlciwgYWF1ZGlvX2hhbmRsZV90cmFja2VyKSB7Ci0gICAgY29uc3QgaW50IE1BWF9IQU5ETEVTID0gNDsKLSAgICBIYW5kbGVUcmFja2VyIHRyYWNrZXIoTUFYX0hBTkRMRVMpOwotICAgIGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlID0gMzsgLy8gYXJiaXRyYXJ5IGdlbmVyaWMgdHlwZQotICAgIGludCBkYXRhOyAvLyBzb21ldGhpbmcgdGhhdCBoYXMgYW4gYWRkcmVzcyB3ZSBjYW4gdXNlCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IGZvdW5kOwotCi0gICAgLy8gcmVwZWF0IHRoZSB0ZXN0IHNldmVyYWwgdGltZXMgdG8gc2VlIGlmIGl0IGJyZWFrcwotICAgIGNvbnN0IGludCBTRVZFUkFMID0gNTsgLy8gYXJiaXRyYXJ5Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTRVZFUkFMOyBpKyspIHsKLSAgICAgICAgLy8gc2hvdWxkIGZhaWwgdG8gZmluZCBhIGJvZ3VzIGhhbmRsZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIDApOyAgLy8gYmFkIGhhbmRsZQotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHZhbGlkIGhhbmRsZSBhbmQgdXNlIGl0IHRvIGxvb2t1cCB0aGUgb2JqZWN0IGFnYWluCi0gICAgICAgIGFhdWRpb19oYW5kbGVfdCBkYXRhSGFuZGxlID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGEpOwotICAgICAgICBBU1NFUlRfVFJVRShkYXRhSGFuZGxlID4gMCk7Ci0gICAgICAgIGZvdW5kID0gdHJhY2tlci5nZXQodHlwZSwgZGF0YUhhbmRsZSk7Ci0gICAgICAgIEVYUEVDVF9FUSgmZGF0YSwgZm91bmQpOwotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIDApOyAvLyBiYWQgaGFuZGxlCi0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBmb3VuZCk7Ci0KLSAgICAgICAgLy8gd3JvbmcgdHlwZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUrMSwgZGF0YUhhbmRsZSk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBmb3VuZCk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGZyb20gc3RvcmFnZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGEsIGZvdW5kKTsKLSAgICAgICAgLy8gc2hvdWxkIGZhaWwgdGhlIHNlY29uZCB0aW1lCi0gICAgICAgIGZvdW5kID0gdHJhY2tlci5yZW1vdmUodHlwZSwgZGF0YUhhbmRsZSk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBmb3VuZCk7Ci0gICAgfQotfQotCi0vLyBUZXN0IGZpbGxpbmcgdGhlIHRyYWNrZXIuCi1URVNUKHRlc3RfaGFuZGxlX3RyYWNrZXIsIGFhdWRpb19mdWxsX3VwKSB7Ci0gICAgY29uc3QgaW50IE1BWF9IQU5ETEVTID0gNTsKLSAgICBIYW5kbGVUcmFja2VyIHRyYWNrZXIoTUFYX0hBTkRMRVMpOwotICAgIGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlID0gNDsgLy8gYXJiaXRyYXJ5IGdlbmVyaWMgdHlwZQotICAgIGludCBkYXRhW01BWF9IQU5ETEVTXTsKLSAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlc1tNQVhfSEFORExFU107Ci0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IGZvdW5kOwotCi0gICAgLy8gcmVwZWF0IHRoZSB0ZXN0IHNldmVyYWwgdGltZXMgdG8gc2VlIGlmIGl0IGJyZWFrcwotICAgIGNvbnN0IGludCBTRVZFUkFMID0gNTsgLy8gYXJiaXRyYXJ5Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTRVZFUkFMOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSEFORExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBhZGQgYSBoYW5kbGUKLSAgICAgICAgICAgIGhhbmRsZXNbaV0gPSB0cmFja2VyLnB1dCh0eXBlLCAmZGF0YVtpXSk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGVzW2ldID4gMCk7Ci0gICAgICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbaV0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKCZkYXRhW2ldLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgdGhhdCBpdCBpcyBmdWxsLCB0cnkgdG8gYWRkIG9uZSBtb3JlLgotICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGFbMF0pOwotICAgICAgICBFWFBFQ1RfVFJVRShoYW5kbGUgPCAwKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9IQU5ETEVTOyBpKyspIHsKLSAgICAgICAgICAgIC8vIGxvb2sgdXAgZWFjaCBoYW5kbGUKLSAgICAgICAgICAgIGZvdW5kID0gdHJhY2tlci5nZXQodHlwZSwgaGFuZGxlc1tpXSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbaV0sIGZvdW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBvbmUgZnJvbSBzdG9yYWdlCi0gICAgICAgIGZvdW5kID0gdHJhY2tlci5yZW1vdmUodHlwZSwgaGFuZGxlc1syXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgmZGF0YVsyXSwgZm91bmQpOwotICAgICAgICAvLyBub3cgdHJ5IHRvIGxvb2sgdXAgdGhlIHNhbWUgaGFuZGxlIGFuZCBmYWlsCi0gICAgICAgIGZvdW5kID0gdHJhY2tlci5nZXQodHlwZSwgaGFuZGxlc1syXSk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBmb3VuZCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoYXQgc2FtZSBvbmUgYmFjawotICAgICAgICBoYW5kbGUgPSB0cmFja2VyLnB1dCh0eXBlLCAmZGF0YVsyXSk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGhhbmRsZSA+IDApOwotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZSk7Ci0gICAgICAgIEVYUEVDVF9FUSgmZGF0YVsyXSwgZm91bmQpOwotICAgICAgICAvLyBub3cgdXNlIGEgc3RhbGUgaGFuZGxlIGFnYWluIHdpdGggYSB2YWxpZCBpbmRleCBhbmQgZmFpbAotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbMl0pOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIHJlbW92ZSB0aGVtIGFsbAotICAgICAgICBoYW5kbGVzWzJdID0gaGFuZGxlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9IQU5ETEVTOyBpKyspIHsKLSAgICAgICAgICAgIC8vIGxvb2sgdXAgZWFjaCBoYW5kbGUKLSAgICAgICAgICAgIGZvdW5kID0gdHJhY2tlci5yZW1vdmUodHlwZSwgaGFuZGxlc1tpXSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbaV0sIGZvdW5kKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdGltZXN0YW1wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNjNlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gUGxheSBzaWxlbmNlIGFuZCByZWNvdmVyIGZyb20gZGVhZCBzZXJ2ZXJzIG9yIGRpc2Nvbm5lY3RlZCBkZXZpY2VzLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgorI2luY2x1ZGUgInV0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oIgorI2luY2x1ZGUgIi4uL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oIgorCisvLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcywgb25jZSBwZXIgc2Vjb25kIGF0IDQ4MDAwIEh6LgorI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICA0ODAwMAorLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgorI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQorCisjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgICAgICAgIDEwMDAKKworI2RlZmluZSBERUZBVUxUX1RJTUVPVVRfTkFOT1MgICAoKGludDY0X3QpMTAwMDAwMDAwMCkKKworI2RlZmluZSBOVU1fU0VDT05EUyAgICAgICAgICAgICAxCisjZGVmaW5lIE5VTV9MT09QUyAgICAgICAgICAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wSW5mbyB7CisgICAgaW50NjRfdCAgICAgICAgIGZyYW1lc1RvdGFsOworICAgIGludDY0X3QgICAgICAgICBhcHBQb3NpdGlvbjsgLy8gZnJhbWVzCisgICAgaW50NjRfdCAgICAgICAgIGFwcE5hbm9zZWNvbmRzOworICAgIGludDY0X3QgICAgICAgICB0aW1lc3RhbXBQb3NpdGlvbjsgIC8vIGZyYW1lcworICAgIGludDY0X3QgICAgICAgICB0aW1lc3RhbXBOYW5vczsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworfSBUaW1lc3RhbXBJbmZvOworCit0eXBlZGVmIHN0cnVjdCBUaW1lc3RhbXBDYWxsYmFja0RhdGFfcyB7CisgICAgVGltZXN0YW1wSW5mbyAgdGltZXN0YW1wc1tNQVhfVElNRVNUQU1QU107CisgICAgaW50NjRfdCAgICAgICAgZnJhbWVzVG90YWwgPSAwOworICAgIGludDY0X3QgICAgICAgIG5leHRGcmFtZVRvR2xpdGNoID0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CisgICAgaW50MzJfdCAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCisgICAgYm9vbCAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKK30gVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3Q7CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCB0aW1lc3RhbXBEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSBfX3VudXNlZCwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworCisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgIGlmICh1c2VyRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jIG5lZWRzIHVzZXJEYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICB9CisgICAgVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3QgKnRpbWVzdGFtcERhdGEgPSAoVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3QgKikgdXNlckRhdGE7CisKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihzdHJlYW0pOworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICB0aW1lc3RhbXBEYXRhLT5mcmFtZXNUb3RhbCArPSBudW1GcmFtZXM7CisgICAgfQorCisgICAgaWYgKHRpbWVzdGFtcERhdGEtPmZvcmNlVW5kZXJydW5zKSB7CisgICAgICAgIGlmICh0aW1lc3RhbXBEYXRhLT5mcmFtZXNUb3RhbCA+IHRpbWVzdGFtcERhdGEtPm5leHRGcmFtZVRvR2xpdGNoKSB7CisgICAgICAgICAgICB1c2xlZXAoRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyk7CisgICAgICAgICAgICBwcmludGYoIlNpbXVsYXRlIGdsaXRjaCBhdCAlbGxkXG4iLCAobG9uZyBsb25nKSB0aW1lc3RhbXBEYXRhLT5mcmFtZXNUb3RhbCk7CisgICAgICAgICAgICB0aW1lc3RhbXBEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCArPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBDb3VudCA8IE1BWF9USU1FU1RBTVBTKSB7CisgICAgICAgIFRpbWVzdGFtcEluZm8gKnRpbWVzdGFtcCA9ICZ0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBzW3RpbWVzdGFtcERhdGEtPnRpbWVzdGFtcENvdW50XTsKKyAgICAgICAgdGltZXN0YW1wLT5yZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MpOworICAgICAgICB0aW1lc3RhbXAtPmZyYW1lc1RvdGFsID0gdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWw7CisgICAgICAgIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24gPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgID8gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKQorICAgICAgICAgICAgICAgIDogQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICAgICAgdGltZXN0YW1wLT5hcHBOYW5vc2Vjb25kcyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgIHRpbWVzdGFtcERhdGEtPnRpbWVzdGFtcENvdW50Kys7CisgICAgfQorCisgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICB0aW1lc3RhbXBEYXRhLT5mcmFtZXNUb3RhbCArPSBudW1GcmFtZXM7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOworfQorCitzdGF0aWMgVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3Qgc1RpbWVzdGFtcERhdGE7CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdFRpbWVTdGFtcHMoYWF1ZGlvX3BvbGljeV90IG1tYXBQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZvcm1hbmNlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgZmxvYXQgKmJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IDA7CisgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gMDsKKyAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CisgICAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0gMDsKKyAgICBpbnQzMl90IGZpbmFsQnVmZmVyU2l6ZSA9IDA7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFjdHVhbERhdGFGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKworICAgIG1lbXNldCgmc1RpbWVzdGFtcERhdGEsIDAsIHNpemVvZihzVGltZXN0YW1wRGF0YSkpOworCisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0gdGVzdFRpbWVTdGFtcHMocG9saWN5ID0gJWQsIHNoYXJpbmcgPSAlcywgcGVyZiA9ICVzLCBkaXIgPSAlcykgLS0tLS0tLS0tLS1cbiIsCisgICAgICAgICAgIG1tYXBQb2xpY3ksCisgICAgICAgICAgIGdldFNoYXJpbmdNb2RlVGV4dChzaGFyaW5nTW9kZSksCisgICAgICAgICAgIGdldFBlcmZvcm1hbmNlTW9kZVRleHQocGVyZm9ybWFuY2VNb2RlKSwKKyAgICAgICAgICAgZ2V0RGlyZWN0aW9uVGV4dChkaXJlY3Rpb24pKTsKKworICAgIEFBdWRpb19zZXRNTWFwUG9saWN5KG1tYXBQb2xpY3kpOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlciByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChhYXVkaW9CdWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoYWF1ZGlvQnVpbGRlciwgc2hhcmluZ01vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZvcm1hbmNlTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oYWF1ZGlvQnVpbGRlciwgZGlyZWN0aW9uKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCB0aW1lc3RhbXBEYXRhQ2FsbGJhY2tQcm9jLCAmc1RpbWVzdGFtcERhdGEpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSB3aGF0IGtpbmQgb2Ygc3RyZWFtIHdlIGFjdHVhbGx5IGdvdC4KKyAgICBhY3R1YWxTYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoYWF1ZGlvU3RyZWFtKTsKKyAgICBhY3R1YWxDaGFubmVsQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KGFhdWRpb1N0cmVhbSk7CisgICAgYWN0dWFsRGF0YUZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoYWF1ZGlvU3RyZWFtKTsKKworICAgIGFjdHVhbFNoYXJpbmdNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFNoYXJpbmdNb2RlKGFhdWRpb1N0cmVhbSk7CisgICAgaWYgKGFjdHVhbFNoYXJpbmdNb2RlICE9IHNoYXJpbmdNb2RlKSB7CisgICAgICAgIHByaW50ZigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgc2hhcmluZ01vZGUsIGdvdCAlM2QsIHNraXBwaW5nIHRlc3RcbiIsCisgICAgICAgICAgICAgICBhY3R1YWxTaGFyaW5nTW9kZSk7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvU3RyZWFtKTsKKyAgICBpZiAoYWN0dWFsUGVyZm9ybWFuY2VNb2RlICE9IHBlcmZvcm1hbmNlTW9kZSkgeworICAgICAgICBwcmludGYoImRpZCBub3QgZ2V0IGV4cGVjdGVkIHBlcmZvcm1hbmNlTW9kZSwgZ290ICUzZCwgc2tpcHBpbmcgdGVzdFxuIiwKKyAgICAgICAgICAgICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgcHJpbnRmKCIgICAgY2hhbnMgPSAlM2QsIHJhdGUgPSAlNmQgZm9ybWF0ID0gJWRcbiIsCisgICAgICAgICAgIGFjdHVhbENoYW5uZWxDb3VudCwgYWN0dWFsU2FtcGxlUmF0ZSwgYWN0dWFsRGF0YUZvcm1hdCk7CisgICAgcHJpbnRmKCIgICAgSXMgTU1BUCB1c2VkPyAlc1xuIiwgQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoYWF1ZGlvU3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInllcyIgOiAibm8iKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgcmVhZCBpbiBvbmUgY2h1bmsgYnkgYSBETUEgY29udHJvbGxlcgorICAgIC8vIG9yIGEgRFNQIG9yIGEgbWl4ZXIuCisgICAgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoYWF1ZGlvU3RyZWFtKTsKKyAgICBwcmludGYoIiAgICBmcmFtZXNQZXJCdXJzdCA9ICUzZFxuIiwgZnJhbWVzUGVyQnVyc3QpOworCisgICAgb3JpZ2luYWxCdWZmZXJTaXplID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0pOworICAgIHJlcXVlc3RlZEJ1ZmZlclNpemUgPSA0ICogZnJhbWVzUGVyQnVyc3Q7CisgICAgZmluYWxCdWZmZXJTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIHJlcXVlc3RlZEJ1ZmZlclNpemUpOworCisgICAgcHJpbnRmKCIgICAgQnVmZmVyU2l6ZTogb3JpZ2luYWwgPSAlNGQsIHJlcXVlc3RlZCA9ICU0ZCwgZmluYWwgPSAlNGRcbiIsCisgICAgICAgICAgIG9yaWdpbmFsQnVmZmVyU2l6ZSwgcmVxdWVzdGVkQnVmZmVyU2l6ZSwgZmluYWxCdWZmZXJTaXplKTsKKworICAgIHsKKyAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKKyAgICAgICAgaW50NjRfdCBuYW5vc2Vjb25kczsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChhYXVkaW9TdHJlYW0sIENMT0NLX01PTk9UT05JQywgJnBvc2l0aW9uLCAmbmFub3NlY29uZHMpOworICAgICAgICBwcmludGYoImJlZm9yZSBzdGFydCwgQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcCgpIHJldHVybnMgJXNcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBydW5zID0gMDsgcnVucyA8IE5VTV9MT09QUzsgcnVucysrKSB7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tIGxvb3AgIyVkXG4iLCBydW5zKTsKKworICAgICAgICBpbnQ2NF90IHRlbXAgPSBzVGltZXN0YW1wRGF0YS5mcmFtZXNUb3RhbDsKKyAgICAgICAgbWVtc2V0KCZzVGltZXN0YW1wRGF0YSwgMCwgc2l6ZW9mKHNUaW1lc3RhbXBEYXRhKSk7CisgICAgICAgIHNUaW1lc3RhbXBEYXRhLmZyYW1lc1RvdGFsID0gdGVtcDsKKworICAgICAgICBzVGltZXN0YW1wRGF0YS5mb3JjZVVuZGVycnVucyA9IGZhbHNlOworCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IE5VTV9TRUNPTkRTOyBzZWNvbmQrKykgeworICAgICAgICAgICAgLy8gR2l2ZSBBQXVkaW8gY2FsbGJhY2sgdGltZSB0byBydW4gaW4gdGhlIGJhY2tncm91bmQuCisgICAgICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICAgICAgLy8gUGVyaW9kaWNhbGx5IHByaW50IHRoZSBwcm9ncmVzcyBzbyB3ZSBrbm93IGl0IGhhc24ndCBkaWVkLgorICAgICAgICAgICAgcHJpbnRmKCJmcmFtZXNXcml0dGVuID0gJWQsIFhSdW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oYWF1ZGlvU3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KGFhdWRpb1N0cmVhbSkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJ0aW1lc3RhbXBDb3VudCA9ICVkXG4iLCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudCk7CisgICAgICAgIGludCBwcmludGVkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmc1RpbWVzdGFtcERhdGEudGltZXN0YW1wc1tpXTsKKyAgICAgICAgICAgIGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOworICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wTmFub3MpOworICAgICAgICAgICAgaWYgKChwcmludGVkIDwgMjApICYmICgoaSA8IDEwKSB8fCBwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC0+cmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcmVzdWx0ID0gJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPCAwOworICAgICAgICAgICAgICAgICAgICBib29sIHJldHJvID0gKGkgPiAwICYmICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbikpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlID0gbmVnYXRpdmUgPyAiIDw9TkVHQVRJVkUhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIik7CisKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3kgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFNUQU1QOiBwb3MgPSAlOGxsZCwgbmFub3MgPSAlOGxsZCwgbGF0ID0gJTcuMWYgbXNlYyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBdm9pZCByYWNlIGNvbmRpdGlvbnMgaW4gQXVkaW9GbGluZ2VyLgorICAgICAgICAvLyBUaGVyZSBpcyBub3JtYWxseSBhIGRlbGF5IGJldHdlZW4gYSByZWFsIHVzZXIgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgYSBzdHJlYW0uCisgICAgICAgIHNsZWVwKDEpOworICAgIH0KKworZmluaXNoOgorICAgIGlmIChhYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKKyAgICB9CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CisgICAgcHJpbnRmKCJyZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgKHZvaWQpIGFyZ2M7CisgICAgKHZvaWQgKikgYXJndjsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuM1xuIik7CisKKyAgICAvLyBMZWdhY3kKKyAgICBhYXVkaW9fcG9saWN5X3QgcG9saWN5ID0gQUFVRElPX1BPTElDWV9ORVZFUjsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisKKyAgICAvLyBNTUFQCisgICAgcG9saWN5ID0gQUFVRElPX1BPTElDWV9BTFdBWVM7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSBBQVVESU9fT0spID8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IGE1ZjlhYjYuLmIxY2IwZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTEzNSw3ICsxMzUsMTEgQEAKICAgICAgICAgICAgICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CiAKICAgICBpZiAoaUVmZmVjdCA9PSAwIHx8IChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7Ci0gICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0LCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7CisgICAgICAgIGNoYXIgdHlwZUJ1ZmZlcls2NF0sIHV1aWRCdWZmZXJbNjRdOworICAgICAgICBndWlkVG9TdHJpbmcodHlwZSwgdHlwZUJ1ZmZlciwgc2l6ZW9mKHR5cGVCdWZmZXIpKTsKKyAgICAgICAgZ3VpZFRvU3RyaW5nKHV1aWQsIHV1aWRCdWZmZXIsIHNpemVvZih1dWlkQnVmZmVyKSk7CisgICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0ICVzIC8gJXMsIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgIHR5cGVCdWZmZXIsIHV1aWRCdWZmZXIsIG1TdGF0dXMpOwogICAgICAgICBpZiAoaUVmZmVjdCA9PSAwKSB7CiAgICAgICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDYxMWNkZTcuLmJhNGFjYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICAgICAgfQogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICAvLyBUT0RPOiBhZGQgYXVkaW8gaGFyZHdhcmUgaW5wdXQgbGF0ZW5jeSBoZXJlCi0gICAgbUxhdGVuY3kgPSAoMTAwMCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwogICAgIG1NYXJrZXJQb3NpdGlvbiA9IDA7CiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwpAQCAtNDk5LDE5ICs0OTksMjYgQEAKICAgICByZXR1cm4gbVNlbGVjdGVkRGV2aWNlSWQ7CiB9CiAKKy8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAordm9pZCBBdWRpb1JlY29yZDo6dXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpCit7CisgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBpbmFjdGl2ZSwgZG8gbm90IHVwZGF0ZSBhY3R1YWwgZGV2aWNlIGFzIHRoZSBpbnB1dCBzdHJlYW0gbWF5YmUgcm91dGVkCisgICAgLy8gZnJvbSBhIGRldmljZSBub3QgcmVsZXZhbnQgdG8gdGhpcyBjbGllbnQgYmVjYXVzZSBvZiBvdGhlciBhY3RpdmUgdXNlIGNhc2VzLgorICAgIGlmICghbUFjdGl2ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKG1JbnB1dCk7CisgICAgICAgIGlmIChkZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgfQorICAgICB9Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9SZWNvcmQ6OmdldFJvdXRlZERldmljZUlkKCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICAvLyBpZiB0aGUgaW5wdXQgc3RyZWFtIGRvZXMgbm90IGhhdmUgYW4gYWN0aXZlIGF1ZGlvIHBhdGNoLCB1c2UgZWl0aGVyIHRoZSBkZXZpY2UgaW5pdGlhbGx5Ci0gICAgLy8gc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb3IgdGhlIGxhc3Qgcm91dGVkIGRldmljZQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtSW5wdXQpOwotICAgIGlmIChkZXZpY2VJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIH0KLSAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworICAgIHJldHVybiBtUm91dGVkRGV2aWNlSWQ7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUzNyw5ICs1NDQsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKLSAgICB9CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CiAKICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCkBAIC03NDQsNiArNzQ4LDE1IEBACiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3QpIG5vdGlmaWNhdGlvbkZyYW1lczsKIAorCisgICAgLy9tSW5wdXQgIT0gaW5wdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIGZvciBmaXJzdCBjcmVhdGlvbgorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gaW5wdXQpIHsKKyAgICAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBpbnB1dCk7CisgICAgfQorCiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCiAgICAgbUlucHV0ID0gaW5wdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwpAQCAtNzYzLDEwICs3NzYsNiBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKLSAgICB9Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAvLyBFbmQgb2YgcmV0cnkgbG9vcC4KQEAgLTEyMzgsNyArMTI0Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobURldmljZUNhbGxiYWNrID09IGNhbGxiYWNrKSB7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKICAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0xMjQ2LDkgKzEyNTUsOSBAQAogICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMTI2MiwxNyArMTI3MSwzOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICB9Ci0gICAgbURldmljZUNhbGxiYWNrID0gMDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9SZWNvcmQ6Om9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBpZiAoYXVkaW9JbyAhPSBtSW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9IG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCk7CisgICAgICAgIC8vIG9ubHkgdXBkYXRlIGRldmljZSBpZiB0aGUgcmVjb3JkIGlzIGFjdGl2ZSBhcyByb3V0ZSBjaGFuZ2VzIGR1ZSB0byBvdGhlciB1c2UgY2FzZXMgYXJlCisgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRoaXMgY2xpZW50CisgICAgICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBjYWxsYmFjay0+b25BdWRpb0RldmljZVVwZGF0ZShtSW5wdXQsIG1Sb3V0ZWREZXZpY2VJZCk7CisgICAgfQorfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjcxMGJkLi5jZGM3NWFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC00OTMsMTQgKzQ5MywxNiBAQAogICAgIGlmIChpb0Rlc2MgPT0gMCB8fCBpb0Rlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CisgICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6Ci0gICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOiB7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6IHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgewogICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLmFkZChpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKQEAgLTUxMSwxMyArNTEzLDE5IEBACiAKICAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpb0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyBvcGVuZWQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLCBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEID8gIm91dHB1dCIgOiAiaW5wdXQiLAorICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggY2hhbm5lbCBtYXNrICUjeCAiCisgICAgICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCiAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtNTYzLDkgKzU3MSwyMyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIGJvb2wgY2FsbGJhY2tSZW1vdmVkID0gZmFsc2U7CiAgICAgLy8gY2FsbGJhY2tzLnNpemUoKSAhPSAwID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2FsbGJhY2tzW2ldLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyApIHsKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBjYWxsYmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY2xlYW4gdXAgY2FsbGJhY2sgbGlzdCB3aGlsZSB3ZSBhcmUgaGVyZSBpZiBzb21lIGNsaWVudHMgaGF2ZSBkaXNhcHBlYXJlZCB3aXRob3V0CisgICAgLy8gdW5yZWdpc3RlcmluZyB0aGVpciBjYWxsYmFjaworICAgIGlmIChjYWxsYmFja1JlbW92ZWQpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgY2FsbGJhY2tzKTsKICAgICB9CiB9CiAKQEAgLTYxOCwxNyArNjQwLDE3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CisgICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CiAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPj0gMCkgewogICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdID09IGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0udW5zYWZlX2dldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQpAQCAtNjM5LDE4ICs2NjEsMTggQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQorICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShhdWRpb0lvKTsKICAgICBpZiAoaW9JbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBWZWN0b3IgPCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CiAKICAgICBzaXplX3QgY2JJbmRleDsKICAgICBmb3IgKGNiSW5kZXggPSAwOyBjYkluZGV4IDwgY2FsbGJhY2tzLnNpemUoKTsgY2JJbmRleCsrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTExMjgsNyArMTE1MCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewpAQCAtMTE0NSw3ICsxMTY3LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CiAgICAgaWYgKGFmYyA9PSAwKSB7CkBAIC0xMjk3LDcgKzEzMTksNyBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTEzMDcsNyArMTMyOSw3IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGIwYjAxZGIuLjM1MjlkMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgpAQCAtNjIsOSArNjMsMTIgQEAKICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBjb252ZXJ0VGltZXNwZWNUb05zKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCi17Ci0gICAgcmV0dXJuIHR2LnR2X3NlYyAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCArIHR2LnR2X25zZWM7CisvLyBUT0RPIG1vdmUgdG8gYXVkaW9fdXRpbHMuCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aW1lc3BlYyBjb252ZXJ0TnNUb1RpbWVzcGVjKGludDY0X3QgbnMpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHY7CisgICAgdHYudHZfc2VjID0gc3RhdGljX2Nhc3Q8dGltZV90PihucyAvIE5BTk9TX1BFUl9TRUNPTkQpOworICAgIHR2LnR2X25zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihucyAlIE5BTk9TX1BFUl9TRUNPTkQpOworICAgIHJldHVybiB0djsKIH0KIAogLy8gY3VycmVudCBtb25vdG9uaWMgdGltZSBpbiBtaWNyb3NlY29uZHMuCkBAIC0yNzIsNyArMjc2LDcgQEAKICAgICAgICAgfQogICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKQEAgLTU0Myw3ICs1NDcsOCBAQAogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwogICAgIG1Qb3NpdGlvbiA9IDA7CiAgICAgbVJlbGVhc2VkID0gMDsKLSAgICBtU3RhcnRVcyA9IDA7CisgICAgbVN0YXJ0TnMgPSAwOworICAgIG1TdGFydEZyb21aZXJvVXMgPSAwOwogICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKQEAgLTU5MSw2ICs1OTYsNyBAQAogICAgICAgICAgICAgbVN0YXJ0RXRzLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgbVN0YXJ0TnMgPSBzeXN0ZW1UaW1lKCk7IC8vIHNhdmUgdGhpcyBmb3IgdGltZXN0YW1wIGFkanVzdG1lbnQgYWZ0ZXIgc3RhcnRpbmcuCiAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBwcmV2aW91c1N0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKICAgICAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgICAgIG1Qb3NpdGlvbiA9IDA7CkBAIC02MDksNyArNjE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGFydEV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0pLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tRmx1c2hlZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7Ci0gICAgICAgICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCA9IC1tU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdOworICAgICAgICAgICAgLy8gbVN0YXJ0RXRzIGlzIGFscmVhZHkgYWRqdXN0ZWQgYnkgbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQsIHNvIHdlIGRlbHRhIGFkanVzdC4KKyAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0IC09IG1TdGFydEV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl07CiAgICAgICAgIH0KICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gPSAwOwogICAgICAgICBtUHJveHktPmNsZWFyVGltZXN0YW1wKCk7IC8vIG5lZWQgbmV3IHNlcnZlciBwdXNoIGZvciB2YWxpZCB0aW1lc3RhbXAKQEAgLTYxOSw3ICs2MjYsNyBAQAogICAgICAgICAvLyBzaW5jZSB0aGUgZmx1c2ggaXMgYXN5bmNocm9ub3VzIGFuZCBzdG9wIG1heSBub3QgZnVsbHkgZHJhaW4uCiAgICAgICAgIC8vIFdlIHNhdmUgdGhlIHRpbWUgd2hlbiB0aGUgdHJhY2sgaXMgc3RhcnRlZCB0byBsYXRlciB2ZXJpZnkgd2hldGhlcgogICAgICAgICAvLyB0aGUgY291bnRlcnMgYXJlIHJlYWxpc3RpYyAoaS5lLiBzdGFydCBmcm9tIHplcm8gYWZ0ZXIgdGhpcyB0aW1lKS4KLSAgICAgICAgbVN0YXJ0VXMgPSBnZXROb3dVcygpOworICAgICAgICBtU3RhcnRGcm9tWmVyb1VzID0gbVN0YXJ0TnMgLyAxMDAwOwogCiAgICAgICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CiAgICAgICAgIC8vIHdyaXRlIGJlZm9yZSBzdG9wIGNvdWxkIGJlIHBhcnRpYWwuCkBAIC0xMjIyLDE5ICsxMjI5LDI2IEBACiAgICAgcmV0dXJuIG1TZWxlY3RlZERldmljZUlkOwogfQogCisvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9UcmFjazo6dXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpCit7CisgICAgLy8gaWYgdGhlIHRyYWNrIGlzIGluYWN0aXZlLCBkbyBub3QgdXBkYXRlIGFjdHVhbCBkZXZpY2UgYXMgdGhlIG91dHB1dCBzdHJlYW0gbWF5YmUgcm91dGVkCisgICAgLy8gdG8gYSBkZXZpY2Ugbm90IHJlbGV2YW50IHRvIHRoaXMgY2xpZW50IGJlY2F1c2Ugb2Ygb3RoZXIgYWN0aXZlIHVzZSBjYXNlcy4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtT3V0cHV0KTsKKyAgICAgICAgaWYgKGRldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgICAgICB9CisgICAgfQorfQorCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgLy8gaWYgdGhlIG91dHB1dCBzdHJlYW0gZG9lcyBub3QgaGF2ZSBhbiBhY3RpdmUgYXVkaW8gcGF0Y2gsIHVzZSBlaXRoZXIgdGhlIGRldmljZSBpbml0aWFsbHkKLSAgICAvLyBzZWxlY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvciB0aGUgbGFzdCByb3V0ZWQgZGV2aWNlCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKG1PdXRwdXQpOwotICAgIGlmIChkZXZpY2VJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIH0KLSAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworICAgIHJldHVybiBtUm91dGVkRGV2aWNlSWQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCkBAIC0xMjcyLDcgKzEyODYsNyBAQAogICAgICAgICBBTE9HVygiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogfQogCkBAIC0xMjk4LDEyICsxMzEyLDEwIEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7Ci0gICAgfQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgPSAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8gJm1BdHRyaWJ1dGVzIDogTlVMTDsKKyAgICBib29sIGNhbGxiYWNrQWRkZWQgPSBmYWxzZTsKIAogICAgIC8vIG1GbGFncyAobm90IG1PcmlnRmxhZ3MpIGlzIG1vZGlmaWVkIGRlcGVuZGluZyBvbiB3aGV0aGVyIGZhc3QgcmVxdWVzdCBpcyBhY2NlcHRlZC4KICAgICAvLyBBZnRlciBmYXN0IHJlcXVlc3QgaXMgZGVuaWVkLCB3ZSB3aWxsIHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZC4KQEAgLTE1MDgsMTIgKzE1MjAsMTQgQEAKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAgICAgdm9pZCAqaU1lbVBvaW50ZXIgPSBpTWVtLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKQEAgLTE1NzUsNiArMTU4OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy9tT3V0cHV0ICE9IG91dHB1dCBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIGZvciBmaXJzdCBjcmVhdGlvbgorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IG91dHB1dCkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgb3V0cHV0KTsKKyAgICAgICAgY2FsbGJhY2tBZGRlZCA9IHRydWU7CisgICAgfQorCiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCiAgICAgbU91dHB1dCA9IG91dHB1dDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CkBAIC0xNTkwLDcgKzE2MTMsOCBAQAogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjM1LDE1ICsxNjU5LDE1IEBACiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOwotICAgIH0KLQogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKIHJlbGVhc2U6CiAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICBpZiAoY2FsbGJhY2tBZGRlZCkgeworICAgICAgICAvLyBub3RlOiBtT3V0cHV0IGlzIGFsd2F5cyB2YWxpZCBpcyBjYWxsYmFja0FkZGVkIGlzIHRydWUKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgfQogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICB9CkBAIC0yMDkwLDcgKzIxMTQsMTQgQEAKICAgICAvLyBDb252ZXJ0IGZyYW1lIHVuaXRzIHRvIHRpbWUgdW5pdHMKICAgICBuc2Vjc190IG5zID0gTlNfV0hFTkVWRVI7CiAgICAgaWYgKG1pbkZyYW1lcyAhPSAodWludDMyX3QpIH4wKSB7Ci0gICAgICAgIG5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtaW5GcmFtZXMsIHNhbXBsZVJhdGUsIHNwZWVkKSArIGtXYWl0UGVyaW9kTnM7CisgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBjb25zdW1wdGlvbiBvZiBjbGllbnQgZGF0YSBtYXkgYmUgaXJyZWd1bGFyIHdoZW4gY29taW5nIG91dCBvZiBkZXZpY2UKKyAgICAgICAgLy8gc3RhbmRieSBzaW5jZSB0aGUga2VybmVsIGJ1ZmZlcnMgcmVxdWlyZSBmaWxsaW5nLiBUaGlzIGlzIHRocm90dGxlZCB0byBubyBtb3JlIHRoYW4gMngKKyAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHJhdGUgaW4gdGhlIE1peGVyVGhyZWFkLiBIZW5jZSwgd2UgcmVkdWNlIHRoZSBlc3RpbWF0ZWQgdGltZSB0byB3YWl0IGJ5IG9uZQorICAgICAgICAvLyBoYWxmIChidXQgbm8gbW9yZSB0aGFuIGhhbGYgYSBzZWNvbmQpIHRvIGltcHJvdmUgY2FsbGJhY2sgYWNjdXJhY3kgZHVyaW5nIHRoZXNlIHRlbXBvcmFyeQorICAgICAgICAvLyBkYXRhIHN1cmdlcy4KKyAgICAgICAgY29uc3QgbnNlY3NfdCBlc3RpbWF0ZWROcyA9IGZyYW1lc1RvTmFub3NlY29uZHMobWluRnJhbWVzLCBzYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgIGNvbnN0ZXhwciBuc2Vjc190IG1heFRocm90dGxlQ29tcGVuc2F0aW9uTnMgPSA1MDAwMDAwMDBMTDsKKyAgICAgICAgbnMgPSBlc3RpbWF0ZWROcyAtIG1pbihlc3RpbWF0ZWROcyAvIDIsIG1heFRocm90dGxlQ29tcGVuc2F0aW9uTnMpICsga1dhaXRQZXJpb2ROczsKICAgICAgICAgbnMgLT0gKHRpbWVBZnRlckNhbGxiYWNrcyAtIHRpbWVCZWZvcmVDYWxsYmFja3MpOyAgLy8gYWNjb3VudCBmb3IgY2FsbGJhY2sgdGltZQogICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2Ugd2FybiBpZiB0aGUgY2FsbGJhY2sgdGltZSBpcyB0b28gbG9uZz8KICAgICAgICAgaWYgKG5zIDwgMCkgbnMgPSAwOwpAQCAtMjU2Myw3ICsyNTk0LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgLyogbm90IG5lZWRlZDogU1RBVEVfUEFVU0VEX1NUT1BQSU5HICovKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWcgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA8IDApCkBAIC0yNTc1LDggKzI2MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYXQgPCBsaW1pdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCBwYXVzZSBsYWc6JWxsZCBhZGp1c3RpbmcgZnJvbSAlbGxkIHRvICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWxhZywgKGxvbmcgbG9uZylhdCwgKGxvbmcgbG9uZylsaW1pdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUudHZfc2VjID0gbGltaXQgLyBOQU5PU19QRVJfU0VDT05EOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lLnR2X25zZWMgPSBsaW1pdCAlIE5BTk9TX1BFUl9TRUNPTkQ7IC8vIGNvbXBpbGVyIG9wdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1QcmV2aW91c0xvY2F0aW9uID0gbG9jYXRpb247CkBAIC0yNjE5LDE4ICsyNjQ5LDE4IEBACiAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBzb25nIHVuZGVyIGdhcGxlc3MgcGxheWJhY2suCiAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIHNvbWV0aW1lcyBzZWUgemVybyB0aW1lc3RhbXBzLCB0aGVuIGEgZ2xpdGNoIG9mCiAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBzb25nJ3MgcG9zaXRpb24sIGFuZCB0aGVuIGNvcnJlY3QgdGltZXN0YW1wcyBhZnRlcndhcmRzLgotICAgICAgICBpZiAobVN0YXJ0VXMgIT0gMCAmJiBtU2FtcGxlUmF0ZSAhPSAwKSB7CisgICAgICAgIGlmIChtU3RhcnRGcm9tWmVyb1VzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgewogICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVGltZUppdHRlclVzID0gMTAwMDAwOyAvLyAxMDAgbXMKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgazFTZWNVcyA9IDEwMDAwMDA7CiAKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZU5vdyA9IGdldE5vd1VzKCk7CiAKLSAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0VXMgKyBrMVNlY1VzKSB7IC8vIHdpdGhpbiBmaXJzdCBzZWNvbmQgb2Ygc3RhcnRpbmcKKyAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0RnJvbVplcm9VcyArIGsxU2VjVXMpIHsgLy8gd2l0aGluIGZpcnN0IHNlY29uZCBvZiBzdGFydGluZwogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wVGltZVVzID0gY29udmVydFRpbWVzcGVjVG9Vcyh0aW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBUaW1lVXMgPCBtU3RhcnRVcykgeworICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBUaW1lVXMgPCBtU3RhcnRGcm9tWmVyb1VzKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVRpbWVVcyA9IHRpbWVzdGFtcFRpbWVVcyAtIG1TdGFydEZyb21aZXJvVXM7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IChkb3VibGUpdGltZXN0YW1wLm1Qb3NpdGlvbiAqIDEwMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgIC8gKChkb3VibGUpbVNhbXBsZVJhdGUgKiBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CiAKQEAgLTI2NTMsMTAgKzI2ODMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbkJ5VXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCB3ZSBnb3QgdmFsaWQgbm9uemVybyBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0RnJvbVplcm9VcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCB3ZSBnb3QgdmFsaWQgbm9uemVybyBwb3NpdGlvbi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWUgZXhwaXJlZC4KKyAgICAgICAgICAgICAgICBtU3RhcnRGcm9tWmVyb1VzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWUgZXhwaXJlZC4KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMjY5NCwxMyArMjcyNCwzMyBAQAogICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24gaW4gdGltZXN0YW1wLgogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcHJldmlvdXNUaW1lc3RhbXBWYWxpZCBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBzdGFydGluZyBhZnRlciBhIHN0b3Agb3IgZmx1c2guCiAgICAgICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcFZhbGlkKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9OcyhtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBwcmV2aW91c1RpbWVOYW5vcyA9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpOworCisgICAgICAgICAgICAvLyBGaXggc3RhbGUgdGltZSB3aGVuIGNoZWNraW5nIHRpbWVzdGFtcCByaWdodCBhZnRlciBzdGFydCgpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBvZmZsb2FkIGNvbXBhdGliaWxpdHksIHVzZSBhIGRlZmF1bHQgbGFnIHZhbHVlIGhlcmUuCisgICAgICAgICAgICAvLyBBbnkgdGltZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgdXBkYXRlIGFuZCB0aGUgcGF1c2UgdGltZXN0YW1wIGlzIGhhbmRsZWQKKyAgICAgICAgICAgIC8vIGJ5IHRoZSByZXRyb2dyYWRlIGNoZWNrIGFmdGVyd2FyZHMuCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhZ05zID0gaW50NjRfdChtQWZMYXRlbmN5ICogMTAwMDAwMExMKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGltaXROcyA9IG1TdGFydE5zIC0gbGFnTnM7CisgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IGxpbWl0TnMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylsaW1pdE5zLCAobG9uZyBsb25nKW1TdGFydE5zKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBjb252ZXJ0TnNUb1RpbWVzcGVjKGxpbWl0TnMpOworICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBsaW1pdE5zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGltZU5hbm9zIG5vdCB1c2VkIGJlbG93LgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBMb29raW5nIGF0IHNpZ25lZCBkZWx0YSB3aWxsIHdvcmsgZXZlbiB3aGVuIHRoZSB0aW1lc3RhbXBzCkBAIC0yNzI2LDcgKzI3NzYsNyBAQAogI2lmIDAKICAgICAgICAgICAgIC8vIFVuY29tbWVudCB0aGlzIHRvIHZlcmlmeSBhdWRpbyB0aW1lc3RhbXAgcmF0ZS4KICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSkgLSBwcmV2aW91c1RpbWVOYW5vczsKICAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY29tcHV0ZWRTYW1wbGVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24gKiAobG9uZyBsb25nKU5BTk9TX1BFUl9TRUNPTkQgLyBkZWx0YVRpbWU7CkBAIC0yODE4LDcgKzI4NjgsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayA9PSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMjgyNiw5ICsyODc2LDkgQEAKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgbU91dHB1dCk7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjg0MiwxNyArMjg5MiwzOSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICB9Ci0gICAgbURldmljZUNhbGxiYWNrID0gMDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKwordm9pZCBBdWRpb1RyYWNrOjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjazsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvSW8gIT0gbU91dHB1dCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrID0gbURldmljZUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICAgICAgLy8gb25seSB1cGRhdGUgZGV2aWNlIGlmIHRoZSB0cmFjayBpcyBhY3RpdmUgYXMgcm91dGUgY2hhbmdlcyBkdWUgdG8gb3RoZXIgdXNlIGNhc2VzIGFyZQorICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0aGlzIGNsaWVudAorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUobU91dHB1dCwgbVJvdXRlZERldmljZUlkKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjLCBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb24gbG9jYXRpb24pCiB7CiAgICAgaWYgKG1zZWMgPT0gbnVsbHB0ciB8fApAQCAtMjkxMCw3ICsyOTgyLDcgQEAKICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CiAgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBzdGFydGVkIGluIHRoZSBwYXN0IHRvIHJldHVybiB0cnVlLgotICAgICAgICAgICAgcmV0dXJuIG1TdGFydFVzID4gMDsKKyAgICAgICAgICAgIHJldHVybiBtU3RhcnRGcm9tWmVyb1VzID4gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBIG5vcm1hbCBhdWRpbyB0cmFjayBtYXkgc3RpbGwgYmUgZHJhaW5pbmcsIHNvCiAgICAgICAgIC8vIGNoZWNrIGlmIHN0cmVhbSBoYXMgZW5kZWQuICBUaGlzIGNvdmVycyBmYXN0dHJhY2sgcG9zaXRpb24KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMDhjMzdmOC4uN2JmNGY5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIC8vIGEgdmFsdWUgYmV0d2VlbiAib3RoZXIiICsgMSBhbmQgIm90aGVyIiArIElOVDMyX01BWCwgdGhlIGNob2ljZSBvZgogLy8gd2hpY2ggbmVlZHMgdG8gYmUgdGhlICJsZWFzdCByZWNlbnRseSB1c2VkIiBzZXF1ZW5jZSB2YWx1ZSBmb3IgInNlbGYiLgogLy8gSW4gZ2VuZXJhbCwgdGhpcyBtZWFucyAobmV3X3NlbGYpIHJldHVybmVkIGlzIG1heChzZWxmLCBvdGhlcikgKyAxLgotCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHN0YXRpYyB1aW50MzJfdCBpbmNyZW1lbnRTZXF1ZW5jZSh1aW50MzJfdCBzZWxmLCB1aW50MzJfdCBvdGhlcikgewogICAgIGludDMyX3QgZGlmZiA9IChpbnQzMl90KSBzZWxmIC0gKGludDMyX3QpIG90aGVyOwogICAgIGlmIChkaWZmID49IDAgJiYgZGlmZiA8IElOVDMyX01BWCkgewpAQCAtMzkzLDYgKzM5Myw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCiB7CiAgICAgLy8gVGhpcyB3b3JrcyBmb3IgbUZyYW1lQ291bnRQMiA8PSAyXjMwCkBAIC04NDAsNiArODQxLDI1IEBACiAgICAgcmV0dXJuIGZpbGxlZDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9UcmFja1NlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgY29uc3QgaW50MzJfdCBmbHVzaCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisgICAgaWYgKGZsdXNoICE9IG1GbHVzaCkgeworICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIGJvb2wgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c2V0U3RyZWFtRW5kRG9uZSgpIHsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICBib29sIG9sZCA9CkBAIC04NTEsNiArODcxLDcgQEAKICAgICByZXR1cm4gb2xkOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CkBAIC05MDgsNiArOTI5LDExIEBACiAgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7CiB9CiAKK3NpemVfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7Cit9CisKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dXBkYXRlU3RhdGVXaXRoTG9vcCgKICAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLCBjb25zdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgJnVwZGF0ZSkgY29uc3QKIHsKQEAgLTEwMDEsNiArMTAyNyw3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBtU3RhdGUubVBvc2l0aW9uOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoKQogewogICAgIGlmIChtSXNTaHV0ZG93bikgewpAQCAtMTA0Nyw2ICsxMDc0LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpCiB7CiAgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+bUZyYW1lQ291bnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IDk4YTA1MjEuLmFkN2YxZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC00OCw2ICs0OCwxOCBAQAogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY29uZmlnLT5mb3JtYXQpOwogfQogCitpbmxpbmUgdm9pZCByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworfQorCitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOworICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KIHsKQEAgLTgwLDE0ICs5MiwxMyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOwpAQCAtMTIzLDE0ICsxMzQsMTQgQEAKICAgICBjYXNlIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBldmVudCA9IChpbnQpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBjbGllbnRJbmZvOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWc7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZkZXZpY2VDb25maWcpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiOWZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZ2thc3RlbkBnb29nbGUuY29tCitqbXRyaXZpQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaAppbmRleCBmZWQ4NmM5Li44NTlmMWE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCkBAIC0yMCw5ICsyMCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCB7CisgICAgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQsCiAgICAgQVVESU9fT1VUUFVUX09QRU5FRCwKICAgICBBVURJT19PVVRQVVRfQ0xPU0VELAogICAgIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCwKKyAgICBBVURJT19JTlBVVF9SRUdJU1RFUkVELAogICAgIEFVRElPX0lOUFVUX09QRU5FRCwKICAgICBBVURJT19JTlBVVF9DTE9TRUQsCiAgICAgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggZTZhNWVmYi4uZGQ3MjE3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMzMsNyArMzMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvUmVjb3JkIDogcHVibGljIFJlZkJhc2UKK2NsYXNzIEF1ZGlvUmVjb3JkIDogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiB7CiBwdWJsaWM6CiAKQEAgLTQyNCw3ICs0MjQsMTIgQEAKIAogICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGlucHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9SZWNvcmQKICAgICAgICogaXMgYXR0YWNoZWQuCi0gICAgICAqIEEgdmFsdWUgb2YgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgdGhlIEF1ZGlvUmVjb3JkIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgaW5wdXQuCisgICAgICAqIFRoZSBkZXZpY2UgSUQgaXMgcmVsZXZhbnQgb25seSBpZiB0aGUgQXVkaW9SZWNvcmQgaXMgYWN0aXZlLgorICAgICAgKiBXaGVuIHRoZSBBdWRpb1JlY29yZCBpcyBpbmFjdGl2ZSwgdGhlIGRldmljZSBJRCByZXR1cm5lZCBjYW4gYmUgZWl0aGVyOgorICAgICAgKiAtIEFVRElPX1BPUlRfSEFORExFX05PTkUgaWYgdGhlIEF1ZGlvUmVjb3JkIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgb3V0cHV0LgorICAgICAgKiAtIFRoZSBkZXZpY2UgSUQgdXNlZCBiZWZvcmUgcGF1c2VkIG9yIHN0b3BwZWQuCisgICAgICAqIC0gVGhlIGRldmljZSBJRCBzZWxlY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvZiBzZXRPdXRwdXREZXZpY2UoKSBpZiB0aGUgQXVkaW9SZWNvcmQKKyAgICAgICogaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgKgogICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAgKiAgbm9uZS4KQEAgLTQ1NCw2ICs0NTksMTAgQEAKICAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCisgICAgICAgICAgICAvLyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gdmlydHVhbHMKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKwogcHJpdmF0ZToKICAgICAvKiBJZiBub25Db250aWcgaXMgbm9uLU5VTEwsIGl0IGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mCiAgICAgICogYWRkaXRpb25hbCBub24tY29udGlndW91cyBmcmFtZXMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIGJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwKQEAgLTU2MSw2ICs1NzAsOCBAQAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pOwogCisgICAgICAgICAgICB2b2lkICAgICB1cGRhdGVSb3V0ZWREZXZpY2VJZF9sKCk7CisKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gICBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKQEAgLTY2NSw3ICs2NzYsNyBAQAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Sb3V0ZWREZXZpY2VJZDsgICAvLyBEZXZpY2UgYWN0dWFsbHkgc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF5IG5vdCBtYXRjaCB0aGUgYXBwIHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBhbmQgY29ubmVjdGVkIGRldmljZXMKLSAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOworICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICBtUG9ydElkOyAgLy8gdW5pcXVlIElEIGFsbG9jYXRlZCBieSBhdWRpbyBwb2xpY3kKIAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCAyZTM5ZDIzLi41YTgxZDgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0zMyw3ICszMyw3IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBpbnQgc291cmNlLAordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTM3MCw5ICszNzAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CiAgICAgfTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKIAogICAgIHN0YXRpYyBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CkBAIC00MDMsOSArNDAzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYyk7CiAKIAotICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwotICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CiAKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+ID4gICBtSW9EZXNjcmlwdG9yczsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKICAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIGdldElucHV0QnVmZmVyU2l6ZSgpIHF1ZXJpZXMKICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZlNpemU7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKQEAgLTQ0MCw4ICs0NDAsOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKIAogICAgIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGIxNjhmYzkuLjQ3ZDg3ZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0zNSw3ICszNSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlCitjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiB7CiBwdWJsaWM6CiAKQEAgLTYwNSw3ICs2MDUsMTEgQEAKIAogICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKICAgICAgICogYXR0YWNoZWQuCi0gICAgICAqIEEgdmFsdWUgb2YgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgb3V0cHV0LgorICAgICAgKiBXaGVuIHRoZSBBdWRpb1RyYWNrIGlzIGluYWN0aXZlLCB0aGUgZGV2aWNlIElEIHJldHVybmVkIGNhbiBiZSBlaXRoZXI6CisgICAgICAqIC0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpZiB0aGUgQXVkaW9UcmFjayBpcyBub3QgYXR0YWNoZWQgdG8gYW55IG91dHB1dC4KKyAgICAgICogLSBUaGUgZGV2aWNlIElEIHVzZWQgYmVmb3JlIHBhdXNlZCBvciBzdG9wcGVkLgorICAgICAgKiAtIFRoZSBkZXZpY2UgSUQgc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2Ygc2V0T3V0cHV0RGV2aWNlKCkgaWYgdGhlIEF1ZGlvVHJhY2sKKyAgICAgICogaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgKgogICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAgKiAgbm9uZS4KQEAgLTg0NSw2ICs4NDksMTIgQEAKICAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCisgICAgICAgICAgICAvLyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gdmlydHVhbHMKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKworCisKICAgICAvKiBPYnRhaW4gdGhlIHBlbmRpbmcgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBwbGF5YmFjayBvZiBwdXJlIFBDTQogICAgICAqIChtaXhhYmxlIHdpdGhvdXQgZW1iZWRkZWQgdGltaW5nKSBkYXRhIHJlbWFpbmluZyBpbiBBdWRpb1RyYWNrLgogICAgICAqCkBAIC05NzQsNiArOTg0LDggQEAKIAogICAgICAgICAgICAgdm9pZCAgICAgcmVzdGFydElmRGlzYWJsZWQoKTsKIAorICAgICAgICAgICAgdm9pZCAgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworCiAgICAgLy8gTmV4dCA0IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKICAgICBzcDxJQXVkaW9UcmFjaz4gICAgICAgICBtQXVkaW9UcmFjazsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKQEAgLTEwODUsOCArMTA5NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGJ5IHN0b3AoKSBidXQgY29udGludWVzIG1vbm90b25pY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciBuZXcgSUF1ZGlvVHJhY2sgdG8gcmVzdG9yZSBtUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvdWxkIGJlIGVhc2lseSB3aWRlbmVkIHRvIHVpbnQ2NF90Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbVN0YXJ0VXM7ICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IHRpbWUgYWZ0ZXIgZmx1c2ggb3Igc3RvcC4KKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtU3RhcnRGcm9tWmVyb1VzOyAgICAgICAvLyB0aGUgc3RhcnQgdGltZSBhZnRlciBmbHVzaCBvciBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gcG9zaXRpb24gc2hvdWxkIGJlIDAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbVN0YXJ0TnM7ICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgd2hlbiBzdGFydCgpIGlzIGNhbGxlZC4KICAgICBFeHRlbmRlZFRpbWVzdGFtcCAgICAgICBtU3RhcnRFdHM7ICAgICAgICAgICAgICAvLyBFeHRlbmRlZCB0aW1lc3RhbXAgYXQgc3RhcnQgZm9yIG5vcm1hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2tzLgogICAgIEF1ZGlvVGltZXN0YW1wICAgICAgICAgIG1TdGFydFRzOyAgICAgICAgICAgICAgIC8vIFRpbWVzdGFtcCBhdCBzdGFydCBmb3Igb2ZmbG9hZGVkIG9yIGRpcmVjdApAQCAtMTE2Myw3ICsxMTc3LDcgQEAKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAKLSAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOworICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJRCBhbGxvY2F0ZWQgYnkgYXVkaW8gcG9saWN5CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGQ5NGFkMDAuLmUwZDI0OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0yNiw2ICsyNiwxNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0cnVjdCByZWNvcmRfY2xpZW50X2luZm8geworICAgIHVpZF90IHVpZDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gcmVjb3JkX2NsaWVudF9pbmZvX3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CkBAIC0zOCw4ICs0OCw4IEBACiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG1peGluZyBzdGF0ZSBvZiBhIHNwZWNpZmljIG1peCBpbiBhIGR5bmFtaWMgYXVkaW8gcG9saWN5CiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyByZWNvcmRpbmcgY29uZmlndXJhdGlvbgotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCmluZGV4IGU1OTIxNjkuLjgyNzkwOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJjdXRpbHMgICBcCiAgICAgbGlibG9nICAgICAgXAogICAgIGxpYnV0aWxzICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggNzFmYmQ5OC4uNDllZjk5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTk4LDcgKzk4LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSkgeworICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7CiB9CiAKIERldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewpAQCAtMTIwLDI0ICsxMjEsMjEgQEAKIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIHByaW1hcnlEZXYtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBwcmltYXJ5RGV2LT5nZXRNYXN0ZXJWb2x1bWUoCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewpAQCAtMTQ5LDkgKzE0Nyw4IEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBwcmltYXJ5RGV2LT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKaW5kZXggOWRhMDJhNC4uODY1MWI1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CiAgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsSGlkbC5jcHAKaW5kZXggYjQ5Yjk3NS4uNjFmYjZiYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC00MCw3ICs0MCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSkgeworICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7CiB9CiAKIEVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewpAQCAtNDksNiArNDksOSBAQAogICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CiAgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmFiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAppbmRleCA0Mjc4NWQ1Li4wY2FmYTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtNDcsNyArNDcsMjAgQEAKIFN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQogICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKICAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQogfQogCiBTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKQEAgLTYxLDcgKzc0LDExIEBACiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewpAQCAtMTM1LDYgKzE1Miw3IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIApAQCAtMTg5LDYgKzIwNywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgeworICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOworfQorCiBib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7CiAgICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMDcsMTEgKzMzMywyMiBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCiAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCiAgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewogICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKQEAgLTMyMCw2ICszNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CiAgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCkBAIC01ODAsNyArNjE5LDcgQEAKICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CiAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKICAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAogICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKICAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7CkBAIC01OTEsNiArNjMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwogICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwogICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKaW5kZXggYTdkZjI3Ni4uZDRhYjk0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47CkBAIC0xMDEsMTIgKzEwMiwxOCBAQAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCiAgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwogCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCiAgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwogICAgIElTdHJlYW0gKm1TdHJlYW07CiAgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7CiB9OwogCiBjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCmluZGV4IDA1ODAwYTAuLmRjMTdmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTI3LDcgKzI3LDE1IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9CiB9CiAKIFN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CkBAIC05NSw3ICsxMDMsOSBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKQEAgLTEzMyw2ICsxNDMsNyBAQAogICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKICAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7CiAgICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICAqd3JpdHRlbiA9IDA7CkBAIC0yNjYsNiArMjc3LDcgQEAKICAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwogICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewogICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKnJlYWQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKaW5kZXggOGM5NmMxZi4uYzcxMzZkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICiAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgzLDYgKzg0LDkgQEAKIAogICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwogCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKwogICBwcml2YXRlOgogICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGIxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL1N0cmVhbUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icAppbmRleCBjY2FhMmI0Li4wZGQzZjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCkBAIC0xICsxIEBACi1zdWJkaXJzID0gWyJmYWN0b3J5Il0KK3N1YmRpcnMgPSBbImZhY3RvcnkiLCAiY29uZmlnIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAora3JvY2FyZEBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCityYWdvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOThhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTcgQEAKKy8vIEVmZmVjdCBjb25maWd1cmF0aW9uCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmVmZmVjdHNjb25maWciLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbInNyYy9FZmZlY3RzQ29uZmlnLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ0aW55eG1sMiIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTczMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorCisvKiogQGZpbGUgUGFyc2VzIGF1ZGlvIGVmZmVjdHMgY29uZmlndXJhdGlvbiBmaWxlIHRvIEMgYW5kIEMrKyBzdHJ1Y3R1cmUuCisgKiBAc2VlIGF1ZGlvX2VmZmVjdHNfY29uZl9WMl8wLnhzZCBmb3IgZG9jdW1lbnRhdGlvbiBvbiBlYWNoIHN0cnVjdHVyZQorICovCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3RzQ29uZmlnIHsKKworLyoqIERlZmF1bHQgcGF0aCBvZiBlZmZlY3QgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY29uc3RleHByIGNoYXIgREVGQVVMVF9QQVRIW10gPSAiL3ZlbmRvci9ldGMvYXVkaW9fZWZmZWN0cy54bWwiOworCisvKiogRGlyZWN0b3JpZXMgd2hlcmUgdGhlIGVmZmVjdCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2ggZm9yLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIExEX0VGRkVDVF9MSUJSQVJZX1BBVEhbXSA9CisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKKyAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OworI2VuZGlmCisKK3N0cnVjdCBMaWJyYXJ5IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6c3RyaW5nIHBhdGg7Cit9OwordXNpbmcgTGlicmFyaWVzID0gc3RkOjp2ZWN0b3I8TGlicmFyeT47CisKK3N0cnVjdCBFZmZlY3RJbXBsIHsKKyAgICBMaWJyYXJ5KiBsaWJyYXJ5OyAvLzwgT25seSB2YWxpZCBhcyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkgdmVjdG9yIGlzIHVubW9kaWZpZWQKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Cit9OworCitzdHJ1Y3QgRWZmZWN0IDogcHVibGljIEVmZmVjdEltcGwgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc1Byb3h5OworICAgIEVmZmVjdEltcGwgbGliU3c7IC8vPCBPbmx5IHZhbGlkIGlmIGlzUHJveHkKKyAgICBFZmZlY3RJbXBsIGxpYkh3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5Cit9OworCit1c2luZyBFZmZlY3RzID0gc3RkOjp2ZWN0b3I8RWZmZWN0PjsKKwordGVtcGxhdGUgPGNsYXNzIFR5cGU+CitzdHJ1Y3QgU3RyZWFtIHsKKyAgICBUeXBlIHR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxFZmZlY3Q+PiBlZmZlY3RzOworfTsKK3VzaW5nIE91dHB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zdHJlYW1fdHlwZV90PjsKK3VzaW5nIElucHV0U3RyZWFtID0gU3RyZWFtPGF1ZGlvX3NvdXJjZV90PjsKKworLyoqIFBhcnNlZCBjb25maWd1cmF0aW9uLgorICogSW50ZW5kZWQgdG8gYmUgYSB0cmFuc2llbnQgc3RydWN0dXJlIG9ubHkgdXNlZCBmb3IgZGVzZXJpYWxpemF0aW9uLgorICogTm90ZTogRXZlcnl0aGluZyBpcyBjb3BpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgeG1sIGRvbS4KKyAqICAgICAgIElmIGNvcGllcyBuZWVkZWQgdG8gYmUgYXZvaWRlZCBkdWUgdG8gcGVyZm9ybWFuY2UgaXNzdWUsCisgKiAgICAgICBjb25zaWRlciBrZWVwaW5nIGEgcHJpdmF0ZSBoYW5kbGUgb24gdGhlIHhtbCBkb20gYW5kIHJlcGxhY2UgYWxsIHN0cmluZ3MgYnkgZG9tIHBvaW50ZXJzLgorICogICAgICAgT3IgZXZlbiBiZXR0ZXIsIHVzZSBTQVggcGFyc2luZyB0byBhdm9pZCB0aGUgYWxsb2NhdGlvbnMgYWxsIHRvZ2V0aGVyLgorICovCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIExpYnJhcmllcyBsaWJyYXJpZXM7CisgICAgRWZmZWN0cyBlZmZlY3RzOworICAgIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbT4gcG9zdHByb2Nlc3M7CisgICAgc3RkOjp2ZWN0b3I8SW5wdXRTdHJlYW0+IHByZXByb2Nlc3M7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIGxpYnJhcnksIGVmZmVjdCBvciBwcm9jZXNzaW5nIGNoYWluCit9OworCisvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBlZmZlY3QgY29uZmlndXJhdGlvbi4KKyAqIFBhcnNpbmcgZG8gbm90IHN0b3Agb2YgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBidXQgY29udGludWVzIHRvIHRoZSBuZXh0LgorICogQHNlZSBQYXJzaW5nUmVzdWx0OjpuYlNraXBwZWRFbGVtZW50CisgKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCA9IERFRkFVTFRfUEFUSCk7CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ2MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzQ29uZmlnIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx0aW55eG1sMi5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKwordXNpbmcgbmFtZXNwYWNlIHRpbnl4bWwyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBBbGwgZnVuY3Rpb25zIGV4Y2VwdCBgcGFyc2UoY29uc3QgY2hhciopYCBhcmUgc3RhdGljLiAqLworbmFtZXNwYWNlIHsKKworLyoqIEByZXR1cm4gYWxsIGBub2RlYHMgY2hpbGRyZW4gdGhhdCBhcmUgZWxlbWVudHMgYW5kIG1hdGNoIHRoZSB0YWcgaWYgcHJvdmlkZWQuICovCitzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFhNTEVsZW1lbnQ+PiBnZXRDaGlsZHJlbihjb25zdCBYTUxOb2RlJiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2hpbGRUYWcgPSBudWxscHRyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gY2hpbGRyZW47CisgICAgZm9yIChhdXRvKiBjaGlsZCA9IG5vZGUuRmlyc3RDaGlsZEVsZW1lbnQoY2hpbGRUYWcpOyBjaGlsZCAhPSBudWxscHRyOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+TmV4dFNpYmxpbmdFbGVtZW50KGNoaWxkVGFnKSkgeworICAgICAgICBjaGlsZHJlbi5lbXBsYWNlX2JhY2soKmNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNoaWxkcmVuOworfQorCisvKiogQHJldHVybiB4bWwgZHVtcCBvZiB0aGUgcHJvdmlkZWQgZWxlbWVudC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYSBwcmludGVyLCBpdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgaW4gdGhlIGNhbGxlciBjb250ZXh0LgorICogSW4gc3VjaCBjYXNlIHRoZSByZXR1cm4gcG9pbnRlciBoYXMgdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZyBkdW1wKCkuCisgKi8KK2NvbnN0IGNoYXIqIGR1bXAoY29uc3QgWE1MRWxlbWVudCYgZWxlbWVudCwgWE1MUHJpbnRlciYmIHByaW50ZXIgPSB7fSkgeworICAgIGVsZW1lbnQuQWNjZXB0KCZwcmludGVyKTsKKyAgICByZXR1cm4gcHJpbnRlci5DU3RyKCk7Cit9CisKKworYm9vbCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIHVpbnQzMl90IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKiogTWFwIHRoZSBlbnVtIGFuZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgdHlwZS4KKyAqICBJbnRlbmRlZCB0byBiZSBzcGVjaWFsaXplZCBmb3IgZWFjaCBlbnVtIHRvIGRlc2VyaWFsaXplLgorICogIFRoZSBnZW5lcmFsIHRlbXBsYXRlIGlzIGRpc2FibGVkLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgRW51bT4KK2NvbnN0ZXhwciBzdGQ6OmVuYWJsZV9pZjxmYWxzZSwgRW51bT4gU1RSRUFNX05BTUVfTUFQOworCisvKiogQWxsIG91dHB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc3RyZWFtX3R5cGVfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zdHJlYW1fdHlwZV90PltdID0geworICAgICAgICB7QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fU1lTVEVNLCAic3lzdGVtIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fUklORywgInJpbmcifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9NVVNJQywgIm11c2ljIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fQUxBUk0sICJhbGFybSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIm5vdGlmaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sICJibHVldG9vdGhfc2NvIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgImVuZm9yY2VkX2F1ZGlibGUifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9EVE1GLCAiZHRtZiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1RUUywgInR0cyJ9LAorfTsKKworLyoqIEFsbCBpbnB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc291cmNlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc291cmNlX3Q+W10gPSB7CisgICAgICAgIHtBVURJT19TT1VSQ0VfTUlDLCAibWljIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLCAidm9pY2VfdXBsaW5rIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssICJ2b2ljZV9kb3dubGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCAiY2FtY29yZGVyIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorfTsKKworLyoqIEZpbmQgdGhlIHN0cmVhbSB0eXBlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgbmFtZSBvciByZXR1cm4gZmFsc2UgKi8KK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorYm9vbCBzdHJpbmdUb1N0cmVhbVR5cGUoY29uc3QgY2hhciAqc3RyZWFtTmFtZSwgVHlwZSogdHlwZSkKK3sKKyAgICBmb3IgKGF1dG8mIHN0cmVhbU5hbWVQYWlyIDogU1RSRUFNX05BTUVfTUFQPFR5cGU+KSB7CisgICAgICAgIGlmIChzdHJjbXAoc3RyZWFtTmFtZVBhaXIuc2Vjb25kLCBzdHJlYW1OYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAqdHlwZSA9IHN0cmVhbU5hbWVQYWlyLmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogUGFyc2UgYSBsaWJyYXJ5IHhtbCBub3RlIGFuZCBwdXNoIHRoZSByZXN1bHQgaW4gbGlicmFyaWVzIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUxpYnJhcnkoY29uc3QgWE1MRWxlbWVudCYgeG1sTGlicmFyeSwgTGlicmFyaWVzKiBsaWJyYXJpZXMpIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoInBhdGgiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyIHx8IHBhdGggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgibGlicmFyeSBtdXN0IGhhdmUgYSBuYW1lIGFuZCBhIHBhdGg6ICVzIiwgZHVtcCh4bWxMaWJyYXJ5KSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGlicmFyaWVzLT5wdXNoX2JhY2soe25hbWUsIHBhdGh9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIEZpbmQgYW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuCisgKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxsZW1lbnRzIGFkZHJlc3MgaWYgZm91bmQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCogZmluZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OnZlY3RvcjxUPiYgY29sbGVjdGlvbikgeworICAgIGF1dG8gaXQgPSBmaW5kX2lmKGJlZ2luKGNvbGxlY3Rpb24pLCBlbmQoY29sbGVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdIChhdXRvJiBpdGVtKSB7IHJldHVybiBpdGVtLm5hbWUgPT0gbmFtZTsgfSk7CisgICAgcmV0dXJuIGl0ICE9IGVuZChjb2xsZWN0aW9uKSA/ICYqaXQgOiBudWxscHRyOworfQorCisvKiogUGFyc2UgYW4gZWZmZWN0IGZyb20gYW4geG1sIGVsZW1lbnQgZGVzY3JpYmluZyBpdC4KKyAqIEByZXR1cm4gdHJ1ZSBhbmQgcHVzaGVzIHRoZSBlZmZlY3QgaW4gZWZmZWN0cyBvbiBzdWNjZXNzLAorICogICAgICAgICBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUVmZmVjdChjb25zdCBYTUxFbGVtZW50JiB4bWxFZmZlY3QsIExpYnJhcmllcyYgbGlicmFyaWVzLCBFZmZlY3RzKiBlZmZlY3RzKSB7CisgICAgRWZmZWN0IGVmZmVjdHt9OworCisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbEVmZmVjdC5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGhhdmUgYSBuYW1lOiAlcyIsIHhtbEVmZmVjdC5WYWx1ZSgpLCBkdW1wKHhtbEVmZmVjdCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVmZmVjdC5uYW1lID0gbmFtZTsKKworICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGVmZmVjdC5saWJyYXJ5IGFuZCBlZmZlY3QudXVpZCBmcm9tIHhtbAorICAgIGF1dG8gcGFyc2VJbXBsID0gWyZsaWJyYXJpZXNdKGNvbnN0IFhNTEVsZW1lbnQmIHhtbEltcGwsIEVmZmVjdEltcGwmIGVmZmVjdCkgeworICAgICAgICAvLyBSZXRyaWV2ZSBsaWJyYXJ5IG5hbWUgYW5kIHV1aWQgZnJvbSB4bWwKKyAgICAgICAgY29uc3QgY2hhciogbGlicmFyeU5hbWUgPSB4bWxJbXBsLkF0dHJpYnV0ZSgibGlicmFyeSIpOworICAgICAgICBjb25zdCBjaGFyKiB1dWlkID0geG1sSW1wbC5BdHRyaWJ1dGUoInV1aWQiKTsKKyAgICAgICAgaWYgKGxpYnJhcnlOYW1lID09IG51bGxwdHIgfHwgdXVpZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZWZmZWN0IG11c3QgaGF2ZSBhIGxpYnJhcnkgbmFtZSBhbmQgYSB1dWlkOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBsaWJyYXJ5IG5hbWUgdG8gYSBwb2ludGVyIHRvIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBsaWJyYXJ5CisgICAgICAgIGF1dG8qIGxpYnJhcnkgPSBmaW5kQnlOYW1lKGxpYnJhcnlOYW1lLCBsaWJyYXJpZXMpOworICAgICAgICBpZiAobGlicmFyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbGlicmFyeSByZWZlcmVuY2VkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdC5saWJyYXJ5ID0gbGlicmFyeTsKKworICAgICAgICBpZiAoIXN0cmluZ1RvVXVpZCh1dWlkLCAmZWZmZWN0LnV1aWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1dWlkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBpZiAoIXBhcnNlSW1wbCh4bWxFZmZlY3QsIGVmZmVjdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEhhbmRsZSBwcm94eSBlZmZlY3RzCisgICAgZWZmZWN0LmlzUHJveHkgPSBmYWxzZTsKKyAgICBpZiAoc3RkOjpzdHJjbXAoeG1sRWZmZWN0Lk5hbWUoKSwgImVmZmVjdFByb3h5IikgPT0gMCkgeworICAgICAgICBlZmZlY3QuaXNQcm94eSA9IHRydWU7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gdG8gcGFyc2UgbGliaHcgYW5kIGxpYnN3CisgICAgICAgIGF1dG8gcGFyc2VQcm94eSA9IFsmeG1sRWZmZWN0LCAmcGFyc2VJbXBsXShjb25zdCBjaGFyKiB0YWcsIEVmZmVjdEltcGwmIHByb3h5TGliKSB7CisgICAgICAgICAgICBhdXRvKiB4bWxQcm94eUxpYiA9IHhtbEVmZmVjdC5GaXJzdENoaWxkRWxlbWVudCh0YWcpOworICAgICAgICAgICAgaWYgKHhtbFByb3h5TGliID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZWZmZWN0UHJveHkgbXVzdCBjb250YWluIGEgPCVzPjogJXMiLCB0YWcsIGR1bXAoKnhtbFByb3h5TGliKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW1wbCgqeG1sUHJveHlMaWIsIHByb3h5TGliKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFwYXJzZVByb3h5KCJsaWJodyIsIGVmZmVjdC5saWJIdykgfHwgIXBhcnNlUHJveHkoImxpYnN3IiwgZWZmZWN0LmxpYlN3KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZWZmZWN0cy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShlZmZlY3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFBhcnNlIGFuIHN0cmVhbSBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgc3RyZWFtIGluIHN0cmVhbXMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK3RlbXBsYXRlIDxjbGFzcyBTdHJlYW0+Citib29sIHBhcnNlU3RyZWFtKGNvbnN0IFhNTEVsZW1lbnQmIHhtbFN0cmVhbSwgRWZmZWN0cyYgZWZmZWN0cywgc3RkOjp2ZWN0b3I8U3RyZWFtPiogc3RyZWFtcykgeworICAgIGNvbnN0IGNoYXIqIHN0cmVhbVR5cGUgPSB4bWxTdHJlYW0uQXR0cmlidXRlKCJ0eXBlIik7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgic3RyZWFtIG11c3QgaGF2ZSBhIHR5cGU6ICVzIiwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTdHJlYW0gc3RyZWFtOworICAgIGlmICghc3RyaW5nVG9TdHJlYW1UeXBlKHN0cmVhbVR5cGUsICZzdHJlYW0udHlwZSkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXM6ICVzIiwgc3RyZWFtVHlwZSwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byYgeG1sQXBwbHkgOiBnZXRDaGlsZHJlbih4bWxTdHJlYW0sICJhcHBseSIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVmZmVjdE5hbWUgPSB4bWxBcHBseS5nZXQoKS5BdHRyaWJ1dGUoImVmZmVjdCIpOworICAgICAgICBpZiAoZWZmZWN0TmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgic3RyZWFtL2FwcGx5IG11c3QgaGF2ZSByZWZlcmVuY2UgYW4gZWZmZWN0OiAlcyIsIGR1bXAoeG1sQXBwbHkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvKiBlZmZlY3QgPSBmaW5kQnlOYW1lKGVmZmVjdE5hbWUsIGVmZmVjdHMpOworICAgICAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBlZmZlY3QgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLmVmZmVjdHMuZW1wbGFjZV9iYWNrKCplZmZlY3QpOworICAgIH0KKyAgICBzdHJlYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHN0cmVhbSkpOworICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UKKworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgWE1MRG9jdW1lbnQgZG9jOworICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKKyAgICBpZiAoZG9jLkVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAorICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorCisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGF1dG8gcmVnaXN0ZXJGYWlsdXJlID0gWyZuYlNraXBwZWRFbGVtZW50c10oYm9vbCByZXN1bHQpIHsKKyAgICAgICAgbmJTa2lwcGVkRWxlbWVudHMgKz0gcmVzdWx0ID8gMCA6IDE7CisgICAgfTsKKyAgICBmb3IgKGF1dG8mIHhtbENvbmZpZyA6IGdldENoaWxkcmVuKGRvYywgImF1ZGlvX2VmZmVjdHNfY29uZiIpKSB7CisKKyAgICAgICAgLy8gUGFyc2UgbGlicmFyeQorICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcmllcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgImxpYnJhcmllcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcnkgOiBnZXRDaGlsZHJlbih4bWxMaWJyYXJpZXMsICJsaWJyYXJ5IikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VMaWJyYXJ5KHhtbExpYnJhcnksICZjb25maWctPmxpYnJhcmllcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgZWZmZWN0cworICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdHMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJlZmZlY3RzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sRWZmZWN0IDogZ2V0Q2hpbGRyZW4oeG1sRWZmZWN0cykpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VFZmZlY3QoeG1sRWZmZWN0LCBjb25maWctPmxpYnJhcmllcywgJmNvbmZpZy0+ZWZmZWN0cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgcHJlIHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUHJlcHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInByZXByb2Nlc3MiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxTdHJlYW0gOiBnZXRDaGlsZHJlbih4bWxQcmVwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnByZXByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHBvc3QgcHJvY2Vzc2luZyBjaGFpbnMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxQb3N0cHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInBvc3Rwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUG9zdHByb2Nlc3MsICJzdHJlYW0iKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZVN0cmVhbSh4bWxTdHJlYW0sIGNvbmZpZy0+ZWZmZWN0cywgJmNvbmZpZy0+cG9zdHByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggNzNmNmVmNS4uYTVmYmYxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTIwLDYgKzIwLDcgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAorIy1EQlVJTERfRkxPQVQKIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCA3YzY4NWVjLi5iNGExZDc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMzLDYgKzMzLDEwIEBACiAKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKKyNlbmRpZgorCiAvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCiB0eXBlZGVmIGVudW0gewogICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCkBAIC04Miw4ICs4NiwxOSBAQAogCiAvLyBudW1iZXIgb2YgZWZmZWN0cyBpbiB0aGlzIGxpYnJhcnkKIGNvbnN0IGludCBrTmJFZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3N0YXRpYyBMVk1fRkxPQVQgY2xhbXBfZmxvYXQoTFZNX0ZMT0FUIGEpIHsKKyAgICBpZiAoYSA+IDEuMGYpIHsKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorICAgIGVsc2UgaWYgKGEgPCAtMS4wZikgeworICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9Cit9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVGVzdCBjb2RlCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI4Niw3ICszMDEsNyBAQAogICAgIHJldHVybiAtRUlOVkFMOwogfQogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCiBzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKQEAgLTM4NSw3ICs0MDAsMTA4IEBACiAKICAgICByZXR1cm4gMDsKIH0KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCiAKK3N0YXRpYyBpbnQgRG93bm1peF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKKworICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXI7CisgICAgTFZNX0ZMT0FUICpwU3JjLCAqcERzdDsKKyAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKilzZWxmOworCisgICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcERvd25taXhlciA9IChkb3dubWl4X29iamVjdF90KikgJnBEd21Nb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYW4gdW5pbml0aWFsaXplZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIGlmIChwRG93bm1peGVyLT5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYSBub24tY29uZmlndXJlZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKworICAgIHBTcmMgPSAoTFZNX0ZMT0FUICopIGluQnVmZmVyLT5zMTY7CisgICAgcERzdCA9IChMVk1fRkxPQVQgKikgb3V0QnVmZmVyLT5zMTY7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKKworICAgIGNvbnN0IGJvb2wgYWNjdW11bGF0ZSA9CisgICAgICAgICAgICAocER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIGNvbnN0IHVpbnQzMl90IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0gcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworCisgICAgc3dpdGNoKHBEb3dubWl4ZXItPnR5cGUpIHsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfU1RSSVA6CisgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyBwU3JjWzBdKTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgcFNyY1sxXSk7CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBwU3JjWzBdOworICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IHBTcmNbMV07CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKKyNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKKyAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gZm9ybWF0cworICAgICAgICBzd2l0Y2goKGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3QpZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IERvd25taXhfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKQEAgLTgyMiw2ICs5MzgsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgpAQCAtODQ5LDcgKzk2NiwzNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUlIKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBGTCArIFJMCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArICgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZikpOworICAgICAgICAgICAgLy8gRlIgKyBSUgorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdCgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZik7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKQEAgLTg2OCw2ICsxMDEzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTkxMiw3ICsxMDU4LDUyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbHNlCit2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gNjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTdQb2ludDEoKQpAQCAtOTMxLDYgKzExMjIsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTApAQCAtOTc3LDggKzExNjksNTQgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07CisgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gODsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEdlbmVyaWMoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDA1LDYgKzEyNDMsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAKQEAgLTEwOTYsMyArMTMzNSw5NiBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KKyNlbHNlCitib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKworICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKG1hc2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGhhc1NpZGVzID0gKG1hc2sgJiBrU2lkZXMpICE9IDA7CisgICAgY29uc3QgYm9vbCBoYXNCYWNrcyA9IChtYXNrICYga0JhY2tzKSAhPSAwOworCisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CisgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKKyAgICBjb25zdCBib29sIGhhc0xGRSA9CisgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKKyAgICBjb25zdCBib29sIGhhc0JDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKTsKKyAgICAvLyBjb21wdXRlIGF0IHdoYXQgaW5kZXggZWFjaCBjaGFubmVsIGlzOiBzYW1wbGVzIHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgICAvLyAgIEZMIEZSIEZDIExGRSBCTCBCUiBCQyBTTCBTUgorICAgIC8vIHdoZW4gYSBjaGFubmVsIGlzIG5vdCBwcmVzZW50LCBpdHMgaW5kZXggaXMgc2V0IHRvIHRoZSBzYW1lIGFzIHRoZSBpbmRleCBvZiB0aGUgcHJlY2VkaW5nCisgICAgLy8gY2hhbm5lbAorICAgIGNvbnN0IGludCBpbmRleEZDICA9IGhhc0ZDICAgID8gMiAgICAgICAgICAgIDogMTsgICAgICAgIC8vIGZyb250IGNlbnRlcgorICAgIGNvbnN0IGludCBpbmRleExGRSA9IGhhc0xGRSAgID8gaW5kZXhGQyArIDEgIDogaW5kZXhGQzsgIC8vIGxvdyBmcmVxdWVuY3kKKyAgICBjb25zdCBpbnQgaW5kZXhCTCAgPSBoYXNCYWNrcyA/IGluZGV4TEZFICsgMSA6IGluZGV4TEZFOyAvLyBiYWNrIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhCUiAgPSBoYXNCYWNrcyA/IGluZGV4QkwgKyAxICA6IGluZGV4Qkw7ICAvLyBiYWNrIHJpZ2h0CisgICAgY29uc3QgaW50IGluZGV4QkMgID0gaGFzQkMgICAgPyBpbmRleEJSICsgMSAgOiBpbmRleEJSOyAgLy8gYmFjayBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhTTCAgPSBoYXNTaWRlcyA/IGluZGV4QkMgKyAxICA6IGluZGV4QkM7ICAvLyBzaWRlIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhTUiAgPSBoYXNTaWRlcyA/IGluZGV4U0wgKyAxICA6IGluZGV4U0w7ICAvLyBzaWRlIHJpZ2h0CisKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliID0gMDsKKyAgICAgICAgICAgIGlmIChoYXNGQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEZDXTsgfQorICAgICAgICAgICAgaWYgKGhhc0xGRSkgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsgfQorICAgICAgICAgICAgaWYgKGhhc0JDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4QkNdOyB9CisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiAqPSBNSU5VU18zX0RCX0lOX0ZMT0FUOworICAgICAgICAgICAgLy8gYWx3YXlzIGhhcyBGTC9GUgorICAgICAgICAgICAgbHQgPSBwU3JjWzBdOworICAgICAgICAgICAgcnQgPSBwU3JjWzFdOworICAgICAgICAgICAgLy8gbWl4IGluIHNpZGVzIGFuZCBiYWNrcworICAgICAgICAgICAgaWYgKGhhc1NpZGVzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleFNMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4U1JdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0JhY2tzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleEJMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4QlJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICBydCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IG51bUNoYW47CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAppbmRleCAyMzk5YWJkLi5jMWJlMGYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKQEAgLTI3LDcgKzI3LDkgQEAKICovCiAKICNkZWZpbmUgRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fRkxPQVQgZmxvYXQKKyNlbmRpZgogdHlwZWRlZiBlbnVtIHsKICAgICBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQsCiAgICAgRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCwKQEAgLTk1LDExICs5NywxOCBAQAogaW50IERvd25taXhfUmVzZXQoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOwogaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Citib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2Vsc2UKIHZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIGJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgdWludDMyX3QgbWFzaywgaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2VuZGlmCiAKICNlbmRpZiAvKkFORFJPSURfRUZGRUNURE9XTk1JWF9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IDE2NjgwYmQuLmRkYmZkZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCkBAIC0xMCwxOCArMTAsNDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZWZmZWN0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAotICAgIHNyY3M6IFsiRWZmZWN0c0ZhY3RvcnkuYyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgICJFZmZlY3RzRmFjdG9yeS5jIiwKKyAgICAgICAgICJFZmZlY3RzQ29uZmlnTG9hZGVyLmMiLAorICAgICAgICAgIkVmZmVjdHNGYWN0b3J5U3RhdGUuYyIsCisgICAgICAgICAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAiLAorICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKICAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUiXSwKKyAgICBjZmxhZ3M6IFsiLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOlsiaW5jbHVkZS9tZWRpYSJdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJlZmZlY3RzX2hlYWRlcnMiLAorICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJlZmZlY3RzX2hlYWRlcnMiXSwKIH0KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiZHVtcEVmZmVjdENvbmZpZ0ZpbGUiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbInRlc3QvRHVtcENvbmZpZy5jcHAiXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAorICAgICAgICAibGliZWZmZWN0cyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6WyIuIiwgImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZWYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUNvbmZpZ0xvYWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKKy8vIFRvIGdldCBhbmQgYWRkIHRoZSBlZmZlY3QgcG9pbnRlZCBieSB0aGUgcGFzc2VkIG5vZGUgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitzdGF0aWMgaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCk7CitzdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CisKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCisKK2ludCBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCkKK3sKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IGxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKyAgICBsb2FkTGlicmFyaWVzKHJvb3QpOworICAgIGxvYWRFZmZlY3RzKHJvb3QpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJJRVNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZExpYnJhcnkobm9kZSwgbm9kZS0+bmFtZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fTFA2NF9fCisvLyBhdWRpb19lZmZlY3RzLmNvbmYgYWx3YXlzIHNwZWNpZmllcyAzMiBiaXQgbGliIHBhdGg6IGNvbnZlcnQgdG8gNjQgYml0IHBhdGggaWYgbmVlZGVkCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQorICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBrTGlicmFyeVBhdGhSb290U2l6ZSA9CisgICAgICAgIChzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdCkgLyBzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdFswXSkpOworCisvLyBDaGVja3MgaWYgdGhlIGxpYnJhcnkgcGF0aCBwYXNzZWQgYXMgbGliX3BhdGhfaW4gY2FuIGJlIG9wZW5lZCBhbmQgaWYgbm90CisvLyB0cmllcyBpbiBzdGFuZGFyZCBlZmZlY3QgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoIGp1c3QgdGhlIGxpYnJhcnkgbmFtZSBhbmQgcmV0dXJucyBjb3JyZWN0IHBhdGgKKy8vIGluIGxpYl9wYXRoX291dAoraW50IGNoZWNrTGlicmFyeVBhdGgoY29uc3QgY2hhciAqbGliX3BhdGhfaW4sIGNoYXIgKmxpYl9wYXRoX291dCkgeworICAgIGNoYXIgKnN0cjsKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZTsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGxpYl9wYXRoX2luID09IE5VTEwgfHwgbGliX3BhdGhfb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RybGNweShsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCk7CisKKyAgICAvLyBUcnkgZXhhY3QgcGF0aCBmaXJzdAorICAgIHN0ciA9IHN0cnN0cihsaWJfcGF0aF9vdXQsICIvbGliL3NvdW5kZngvIik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgbGlicmFyeSBuYW1lIGZyb20gaW5wdXQgcGF0aAorICAgIGxlbiA9IHN0ciAtIGxpYl9wYXRoX291dDsKKyAgICBsaWJfbmFtZSA9IGxpYl9wYXRoX2luICsgbGVuICsgc3RybGVuKCIvbGliL3NvdW5kZngvIik7CisKKyAgICAvLyBUaGVuIHRyeSB3aXRoIGxpYnJhcnkgbmFtZSBhbmQgc3RhbmRhcmQgcGF0aCBuYW1lcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTGlicmFyeVBhdGhSb290U2l6ZTsgaSsrKSB7CisgICAgICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICAgICAgc25wcmludGYocGF0aCwKKyAgICAgICAgICAgICAgICAgUEFUSF9NQVgsCisgICAgICAgICAgICAgICAgICIlcy8lcyIsCisgICAgICAgICAgICAgICAgIGtMaWJyYXJ5UGF0aFJvb3RbaV0sCisgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgaWYgKEZfT0sgPT0gYWNjZXNzKHBhdGgsIDApKSB7CisgICAgICAgICAgICBzdHJjcHkobGliX3BhdGhfb3V0LCBwYXRoKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKHN0cm5jbXAobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpICE9IDAsCisgICAgICAgICAgICAgICAgImNoZWNrTGlicmFyeVBhdGgoKSBjb3JyZWN0ZWQgbGlicmFyeSBwYXRoICVzIHRvICVzIiwgbGliX3BhdGhfaW4sIGxpYl9wYXRoX291dCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworCisKK2ludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICB2b2lkICpoZGwgPSBOVUxMOworICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CisgICAgbGlzdF9lbGVtX3QgKmU7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tMaWJyYXJ5UGF0aCgoY29uc3QgY2hhciAqKW5vZGUtPnZhbHVlLCBwYXRoKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChoZGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyIsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgQUxPR1coImdldExpYnJhcnkoKSBiYWQgdGFnICUwOHggaW4gbGliIGluZm8gc3RydWN0IiwgZGVzYy0+dGFnKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2MtPnZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKyAgICBsLT5oYW5kbGUgPSBoZGw7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKKworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gbDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGdMaWJyYXJ5TGlzdCA9IGU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgcGF0aCk7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKKyAgICB9CisgICAgLy9hZGQgZW50cnkgZm9yIGxpYnJhcnkgZXJyb3JzIGluIGdMaWJyYXJ5RmFpbGVkTGlzdAorICAgIGxpYl9mYWlsZWRfZW50cnlfdCAqZmwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9mYWlsZWRfZW50cnlfdCkpOworICAgIGZsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7CisgICAgZmwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKworICAgIGxpc3RfZWxlbV90ICpmZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBmZS0+b2JqZWN0ID0gZmw7CisgICAgZmUtPm5leHQgPSBnTGlicmFyeUZhaWxlZExpc3Q7CisgICAgZ0xpYnJhcnlGYWlsZWRMaXN0ID0gZmU7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgZXJyb3IgaW4gbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGZsLCBwYXRoKTsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvLyBUaGlzIHdpbGwgZmluZCB0aGUgbGlicmFyeSBhbmQgVVVJRCB0YWdzIG9mIHRoZSBzdWIgZWZmZWN0IHBvaW50ZWQgYnkgdGhlCisvLyBub2RlLCBnZXRzIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBhbmQgbGliX2VudHJ5X3QgYW5kIGFkZHMgdGhlIHN1YmVmZmVjdCAtCisvLyBzdWJfZW50cnlfdCB0byB0aGUgZ1N1YkVmZmVjdExpc3QKK2ludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCIpOworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGxpc3RfZWxlbV90ICplOworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJfZWZmZWN0ID0gbWFsbG9jKHNpemVvZihzdWJfZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBzdWJfZWZmZWN0LT5vYmplY3QgPSBkOworICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKKyAgICBzdWJfZWZmZWN0LT5saWIgPSBsOworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gc3ViX2VmZmVjdDsKKyAgICBlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtOworICAgIGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbSA9IGU7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGxpYl9lbnRyeV90ICp0bXA7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGZpbmRFZmZlY3QoTlVMTCwgJnV1aWQsICZ0bXAsIE5VTEwpID09IDApIHsKKyAgICAgICAgQUxPR1coInNraXBwaW5nIGR1cGxpY2F0ZSB1dWlkICVzICVzIiwgbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA/ICJhbmQgaXRzIHN1Yi1lZmZlY3RzIiA6ICIiKTsKKyAgICAgICAgc2tpcCA9IHRydWU7CisgICAgfQorCisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGlmIChza2lwKSB7CisgICAgICAgIGUtPm5leHQgPSBnU2tpcHBlZEVmZmVjdHM7CisgICAgICAgIGdTa2lwcGVkRWZmZWN0cyA9IGU7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSB7CisgICAgICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgICAgICBsLT5lZmZlY3RzID0gZTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aGUgVVVJRCBub2RlIGluIHRoZSBjb25maWdfdHJlZSwgaWYgbm9kZS0+bmV4dCBpcyB2YWxpZCwKKyAgICAvLyB0aGF0IHdvdWxkIGJlIHN1YiBlZmZlY3Qgbm9kZS4KKyAgICAvLyBGaW5kIHRoZSBzdWIgZWZmZWN0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGdTdWJFZmZlY3RMaXN0CisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgaW50IGNvdW50ID0gMjsKKyAgICBib29sIGh3U3ViZWZ4ID0gZmFsc2UsIHN3U3ViZWZ4ID0gZmFsc2U7CisgICAgbGlzdF9zdWJfZWxlbV90ICpzdWJlID0gTlVMTDsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJBZGRpbmcgdGhlIGVmZmVjdCB0byBnRWZmZWN0U3ViTGlzdCBhcyB0aGVyZSBhcmUgc3ViIGVmZmVjdHMiKTsKKyAgICAgICAgc3ViZSA9IG1hbGxvYyhzaXplb2YobGlzdF9zdWJfZWxlbV90KSk7CisgICAgICAgIHN1YmUtPm9iamVjdCA9IGQ7CisgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKKyAgICAgICAgc3ViZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0OworICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmU7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwgJiYgY291bnQpIHsKKyAgICAgICBpZiAoYWRkU3ViRWZmZWN0KG5vZGUpKSB7CisgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGFkZCBzdWJFZmZlY3QgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZ1N1YkVmZmVjdExpc3QgdG8gcG9pbnQgdG8gb2xkZXIgbGlzdDsKKyAgICAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlLT5uZXh0OworICAgICAgICAgICBmcmVlKHN1YmUtPnN1Yl9lbGVtKTsvLyBGcmVlIGFuIGFscmVhZHkgYWRkZWQgc3ViIGVmZmVjdAorICAgICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgICAgIGZyZWUoc3ViZSk7CisgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgIH0KKyAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CisgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7CisgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKKyAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAorICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCisgICAgICAgIGlmICghKChzdWJFZmZlY3REZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpKSB7CisgICAgICAgICAgICAgc3dTdWJlZnggPSB0cnVlOworICAgICAgICAgICAgICpkID0gKnN1YkVmZmVjdERlc2M7CisgICAgICAgICAgICAgZC0+dXVpZCA9IHV1aWQ7CisgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSBDaGFuZ2VkIHRoZSBQcm94eSBkZXNjIik7CisgICAgICAgfSBlbHNlCisgICAgICAgICAgIGh3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICBjb3VudC0tOworICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICAvLyAxIEhXIGFuZCAxIFNXIHN1YiBlZmZlY3QgZm91bmQuIFNldCB0aGUgb2ZmbG9hZCBmbGFnIGluIHRoZSBQcm94eSBkZXNjCisgICAgaWYgKGh3U3ViZWZ4ICYmIHN3U3ViZWZ4KSB7CisgICAgICAgIGQtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgorICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgeworICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7CisgICAgfQorCisgICAgZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MjYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgY29uZmlndXJhdGlvbgorICogYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiB0aGUgZ2xvYmFsIEVmZmVjdEZhY3RvcnlTdGF0ZS4gKi8KK0FORFJPSURfQVBJCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKaW5kZXggMzdjMGJiNy4uY2QwZTc2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTE3LDY1ICsxNyw0NiBAQAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgogCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdFZmZlY3RMaXN0OyAvLyBsaXN0IG9mIGVmZmVjdF9lbnRyeV90OiBhbGwgY3VycmVudGx5IGNyZWF0ZWQgZWZmZWN0cwotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcwotc3RhdGljIGxpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQKLS8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAotLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCi1zdGF0aWMgbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOyAvLyBjb250cm9scyBhY2Nlc3MgdG8gZ0xpYnJhcnlMaXN0CiBzdGF0aWMgdWludDMyX3QgZ051bUVmZmVjdHM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG51bWJlciBvZiBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJMaWI7ICAgIC8vIGN1cnJlbnQgbGlicmFyeSBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJFZmZlY3Q7IC8vIGN1cnJlbnQgZWZmZWN0IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyB1aW50MzJfdCBnQ3VyRWZmZWN0SWR4OyAgICAgICAvLyBjdXJyZW50IGVmZmVjdCBpbmRleCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCi1zdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorLyoqIE51bWJlciBvZiBlbGVtZW50cyBza2lwcGVkIGR1cmluZyB0aGUgZWZmZWN0cyBjb25maWd1cmF0aW9uIGxvYWRpbmcuCisgKiAgLTEgaWYgdGhlIGNvbmZpZyBsb2FkZXIgZmFpbGVkCisgKiAgLTIgaWYgY29uZmlnIGxvYWQgd2FzIHNraXBwZWQKKyAqLworc3RhdGljIHNzaXplX3QgZ0NvbmZpZ05iRWxlbVNraXBwZWQgPSAtMjsKIAogc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAogc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKLQotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0aWMgaW50IGluaXQoKTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOwotc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7Ci0vLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOwotc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwogc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOwogc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKLXN0YXRpYyBpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogLy8gVG8gc2VhcmNoIGEgc3ViZWZmZWN0IGluIHRoZSBnU3ViRWZmZWN0TGlzdAogc3RhdGljIGludCBmaW5kU3ViRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKLXN0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7Ci1zdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOwotc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC00NjEsMTAgKzQ0MiwxMiBAQAogICAgIGlmIChpZ25vcmVGeENvbmZGaWxlcykgewogICAgICAgICBBTE9HSSgiQXVkaW8gZWZmZWN0cyBpbiBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgYmUgaWdub3JlZCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkID0gRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhOVUxMKTsKKyAgICAgICAgaWYgKGdDb25maWdOYkVsZW1Ta2lwcGVkIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBsb2FkIFhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiwgZmFsbGJhY2sgdG8gLmNvbmYiKTsKKyAgICAgICAgICAgIEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICV6ZCBlbGVtZW50cyIsIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDc0LDM2NyArNDU3LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0gICAgbG9hZExpYnJhcmllcyhyb290KTsKLSAgICBsb2FkRWZmZWN0cyhyb290KTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBfX0xQNjRfXwotLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KLSAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKLQotLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAotLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCi0vLyBpbiBsaWJfcGF0aF9vdXQKLWludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgY29uc3QgY2hhciAqbGliX25hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOwotCi0gICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKLSAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKLSAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7Ci0gICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOwotCi0gICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgewotICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgICAgIHNucHJpbnRmKHBhdGgsCi0gICAgICAgICAgICAgICAgIFBBVEhfTUFYLAotICAgICAgICAgICAgICAgICAiJXMvJXMiLAotICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAotICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7Ci0gICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgewotICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7Ci0gICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAotICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi1pbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgdm9pZCAqaGRsID0gTlVMTDsKLSAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOwotICAgIGxpc3RfZWxlbV90ICplOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKLSAgICBpZiAoaGRsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7Ci0gICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKLSAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0gICAgbC0+aGFuZGxlID0gaGRsOwotICAgIGwtPmRlc2MgPSBkZXNjOwotICAgIGwtPmVmZmVjdHMgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7Ci0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGw7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKLSAgICBnTGlicmFyeUxpc3QgPSBlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAgIGlmIChoZGwgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKGhkbCk7Ci0gICAgfQotICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKLSAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKLSAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0KLSAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZmUtPm9iamVjdCA9IGZsOwotICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OwotICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7Ci0KLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQotLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQotLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci1pbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQotewotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7Ci0gICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKLSAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5Ci0gICAgc3ViX2VmZmVjdC0+bGliID0gbDsKLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7Ci0gICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKLSAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOwotICAgIGlmIChsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsaWJfZW50cnlfdCAqdG1wOwotICAgIGJvb2wgc2tpcCA9IGZhbHNlOwotICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAotICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7Ci0gICAgICAgIHNraXAgPSB0cnVlOwotICAgIH0KLQotICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKLSAgICAgICAgY2hhciBzWzQwXTsKLSAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICBjaGFyIHNbNTEyXTsKLSAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKLSAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gZDsKLSAgICBpZiAoc2tpcCkgewotICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOwotICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9IGVsc2UgewotICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgbC0+ZWZmZWN0cyA9IGU7Ci0gICAgfQotCi0gICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCi0gICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCi0gICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIGludCBjb3VudCA9IDI7Ci0gICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOwotICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7Ci0gICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOwotICAgICAgICBzdWJlLT5vYmplY3QgPSBkOwotICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7Ci0gICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKLSAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOwotICAgIH0KLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7Ci0gICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgewotICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7Ci0gICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKLSAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKLSAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICAgICBmcmVlKHN1YmUpOwotICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICAgICB9Ci0gICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OwotICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOwotICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKLSAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCi0gICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKLSAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYwotICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgewotICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOwotICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOwotICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOwotICAgICAgIH0gZWxzZQotICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7Ci0gICAgICAgY291bnQtLTsKLSAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYwotICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgewotICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIC8vIFNlYXJjaGVzIHRoZSBzdWIgZWZmZWN0IG1hdGNoaW5nIHRvIHRoZSBzcGVjaWZpZWQgdXVpZAogLy8gaW4gdGhlIGdTdWJFZmZlY3RMaXN0LiBJdCBnZXRzIHRoZSBsaWJfZW50cnlfdCBmb3IKIC8vIHRoZSBtYXRjaGVkIHN1Yl9lZmZlY3QgLiBVc2VkIGluIEVmZmVjdENyZWF0ZSBvZiBzdWIgZWZmZWN0cwpAQCAtODgxLDI5ICs1MDMsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKLSAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKLSAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OwotICAgIH0KLQotICAgIGUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgd2hpbGUgKGUpIHsKLSAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7Ci0gICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7Ci0gICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7Ci0gICAgICAgICAgICByZXR1cm4gbDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC05MzUsMTE0ICs1MzQsNiBAQAogICAgIHJldHVybiBjbnQ7CiB9CiAKLWludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCi0gICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKLXsKLSAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKLSAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIHdoaWxlIChlICYmICFmb3VuZCkgewotICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgd2hpbGUgKGVmeCkgewotICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0ID0gLUVOT0VOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7Ci0gICAgICAgICpsaWIgPSBsOwotICAgICAgICBpZiAoZGVzYykgewotICAgICAgICAgICAgKmRlc2MgPSBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKLSAgICBjaGFyIHNbMjU2XTsKLSAgICBjaGFyIHNzWzI1Nl07Ci0gICAgY2hhciBpZHRbaW5kZW50ICsgMV07Ci0KLSAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7Ci0gICAgaWR0W2luZGVudF0gPSAwOwotCi0gICAgc3RyWzBdID0gMDsKLQotICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7Ci0gICAgc3RybGNhdChzdHIsIHMsIGxlbik7Ci0KLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7Ci0gICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7Ci0gICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKLSAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotfQotCi1pbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKLXsKLSAgICBpbnQgdG1wWzEwXTsKLQotICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKLSAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKLSAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKLSAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107Ci0gICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKLSAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOwotICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07Ci0gICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKLSAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOwotICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCi17Ci0KLSAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csCi0gICAgICAgICAgICB1dWlkLT50aW1lTWlkLAotICAgICAgICAgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLAotICAgICAgICAgICAgdXVpZC0+bm9kZVswXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMV0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzJdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVszXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbNF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzVdKTsKLQotICAgIHJldHVybiAwOwotfQotCiBpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKSB7CiAgICAgY2hhciBzWzUxMl07CiAKQEAgLTEwOTIsNiArNTgzLDIwIEBACiAgICAgICAgICAgICBlID0gZS0+bmV4dDsKICAgICAgICAgfQogICAgIH0KKyAgICBzd2l0Y2ggKGdDb25maWdOYkVsZW1Ta2lwcGVkKSB7CisgICAgY2FzZSAtMjoKKyAgICAgICAgZHByaW50ZihmZCwgIkVmZmVjdCBjb25maWd1cmF0aW9uIGxvYWRpbmcgc2tpcHBlZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIGZhaWxlZCB0byBsb2FkLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gcGFydGlhbGx5IGxvYWRlZCwgc2tpcHBlZCAlemQgZWxlbWVudHMuXG4iLAorICAgICAgICAgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA3MmUwOTMxLi4yOWRiYzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwpAQCAtOTYsNiArOTYsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgc3ViIGVmZmVjdCBkZXNjcmlwdG9ycy4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXRTdWJFZmZlY3RzKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICoqcFN1YmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlTdGF0ZSIKKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsKK2xpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7CitsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKK3sKKyAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChlICYmICFmb3VuZCkgeworICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CisgICAgICAgICpsaWIgPSBsOworICAgICAgICBpZiAoZGVzYykgeworICAgICAgICAgICAgKmRlc2MgPSBkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB1dWlkLT50aW1lTG93LAorICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgeworICAgIGNoYXIgc1syNTZdOworICAgIGNoYXIgc3NbMjU2XTsKKyAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKKworICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKKyAgICBpZHRbaW5kZW50XSA9IDA7CisKKyAgICBzdHJbMF0gPSAwOworCisgICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAorICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY5NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAZmlsZSBDb250YWlucyB0aGUgc3RhdGUgc2hhcmVkIHdpdGggY29uZmlndXJhdGlvbiBsb2FkZXIgb2YgdGhlIEVmZmVjdCBmYWN0b3J5LgorICogICAgICAgIFRoaXMgZ2xvYmFsIHN0YXRlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvciBpbiBhIHN0cnVjdHVyZQorICogICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgbG9hZGVyIG9uIEVmZmVjdHNGYWN0b3J5IGluaXQuCisgKiAgICAgICAgVGhpcyBoZWFkZXIgYWxzbyBjb250YWlucyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayBvbiB0aGUgc3RhdGUuCisgKi8KKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcworLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZCBvciBpbnZhbGlkIHZlcnNpb24KK2V4dGVybiBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCisvLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KK2V4dGVybiBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnTGliTG9jazsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorCitleHRlcm4gbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKKworaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOworLyoqIFVzZWQgdG8gbG9nIFVVSURzICovCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CisKKy8qKiBVc2VkIGZvciBkZWJ1Z2luZy4gKi8KK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4Yjc4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworLyoqIFNpbWlsYXJseSB0byBkbG9wZW4sIGxvb2tzIGZvciB0aGUgcHJvdmlkZWQgcGF0aCBpbiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRILgorICogQHJldHVybiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGZvdW5kIGFuZCBzZXQgcmVzb2x2ZWRQYXRoIHRvIGl0cyBhYnNvbHV0ZSBwYXRoLgorICogICAgICAgICBmYWxzZSBpZiBub3QgZm91bmQKKyAqLworYm9vbCByZXNvbHZlTGlicmFyeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIHJlc29sdmVkUGF0aCkgeworICAgIGZvciAoYXV0byogbGlicmFyeURpcmVjdG9yeSA6IExEX0VGRkVDVF9MSUJSQVJZX1BBVEgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FuZGlkYXRlUGF0aCA9IHN0ZDo6c3RyaW5nKGxpYnJhcnlEaXJlY3RvcnkpICsgJy8nICsgcGF0aDsKKyAgICAgICAgaWYgKGFjY2VzcyhjYW5kaWRhdGVQYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICpyZXNvbHZlZFBhdGggPSBzdGQ6Om1vdmUoY2FuZGlkYXRlUGF0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBMb2FkcyBhIGxpYnJhcnkgZ2l2ZW4gaXRzIHJlbGF0aXZlIHBhdGggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGxpYkVudHJ5LgorICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGgsIGhhbmRsZSBhbmQgZGVzYyBmaWxsZWQKKyAqICAgICAgICAgZmFsc2Ugb24gc3VjY2VzcyB3aXRoIGxpYkVudHJ5J3MgcGF0aCBmaWxsZWQgd2l0aCB0aGUgcGF0aCBvZiB0aGUgZmFpbGVkIGxpYgorICogVGhlIGNhbGxlciBNVVNUIGZyZWUgdGhlIHJlc291cmNlcyBwYXRoIChmcmVlKSBhbmQgaGFuZGxlIChkbGNsb3NlKSBpZiBmaWxsZWQuCisgKi8KK2Jvb2wgbG9hZExpYnJhcnkoY29uc3QgY2hhciogcmVsYXRpdmVQYXRoLCBsaWJfZW50cnlfdCogbGliRW50cnkpIG5vZXhjZXB0IHsKKworICAgIHN0ZDo6c3RyaW5nIGFic29sdXRlUGF0aDsKKyAgICBpZiAoIXJlc29sdmVMaWJyYXJ5KHJlbGF0aXZlUGF0aCwgJmFic29sdXRlUGF0aCkpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgaW4gZWZmZWN0IGRpcmVjdG9yaWVzOiAlcyIsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgY2hhciogcGF0aCA9IGFic29sdXRlUGF0aC5jX3N0cigpOworICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBsaWIgaXMgY2xvc2VkIG9uIGVhcmx5IHJldHVybgorICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShkbGNsb3NlKSo+IGxpYkhhbmRsZShkbG9wZW4ocGF0aCwgUlRMRF9OT1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGRsb3BlbiBsaWJyYXJ5ICVzOiAlcyIsIHBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvKiBkZXNjcmlwdGlvbiA9IHN0YXRpY19jYXN0PGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QqPigKKyAgICAgICAgICBkbHN5bShsaWJIYW5kbGUuZ2V0KCksIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUikpOworICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVmZmVjdCBsaWJyYXJ5LCBmYWlsZWQgbm90IGZpbmQgc3ltYm9sICclcycgaW4gJXM6ICVzIiwKKyAgICAgICAgICAgICAgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRlc2NyaXB0aW9uLT50YWcgIT0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHKSB7CisgICAgICAgIEFMT0dFKCJCYWQgdGFnICUjMDh4IGluIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi0+dGFnLCBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2NyaXB0aW9uLT52ZXJzaW9uKTsKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTik7CisgICAgaWYgKG1ham9yVmVyc2lvbiAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbiAlIzA4eCwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBtYWpvclZlcnNpb24sIGV4cGVjdGVkTWFqb3JWZXJzaW9uLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxpYkVudHJ5LT5oYW5kbGUgPSBsaWJIYW5kbGUucmVsZWFzZSgpOworICAgIGxpYkVudHJ5LT5kZXNjID0gZGVzY3JpcHRpb247CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBCZWNhdXNlIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZGVzdHJveWVkIGJ5IGMgY29kZSwgdXNpbmcgbmV3IHRvIGFsbG9jYXRlIHNoYXJlZCBzdHJ1Y3R1cmUKKyAqIGlzIG5vdCBwb3NzaWJsZS4gUHJvdmlkZSBhIGVxdWl2YWxlbnQgb2YgdW5pcXVlX3B0ciBmb3IgbWFsbG9jL2ZyZWVkIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUKKyAqIHRoZXkgYXJlIG5vdCBsZWFrZWQgaW4gdGhlIGMrKyBjb2RlLgorIEB7ICovCitzdHJ1Y3QgRnJlZURlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwKSB7CisgICAgICAgIGZyZWUocCk7CisgICAgfQorfTsKKy8qKiB1bmlxdWVfcHRyIGZvciBvYmplY3QgY3JlYXRlZCB3aXRoIG1hbGxvYy4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgVW5pcXVlQ1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBGcmVlRGVsZXRlcj47CisKKy8qKiBjIHZlcnNpb24gb2Ygc3RkOjptYWtlX3VuaXF1ZS4gVXNlcyBtYWxsb2MgYW5kIGZyZWUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1VuaXF1ZUNQdHI8VD4gbWFrZVVuaXF1ZUMoKSB7CisgICAgVCogcHRyID0gbmV3IChtYWxsb2Moc2l6ZW9mKFQpKSkgVHt9OyAvLyBVc2UgcGxhY2VtZW50IG5ldyB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUKKyAgICByZXR1cm4gVW5pcXVlQ1B0cjxUPntwdHJ9OworfQorCisvKiogQH0gKi8KKworLyoqIFB1c2ggYW4gbm90IG93bmVkIGVsZW1lbnQgaW4gYSBsaXN0X2VsZW0gbGluayBsaXN0IHdpdGggYW4gb3B0aW9uYWwgbG9jay4gKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMaXN0RWxlbT4KK3ZvaWQgbGlzdFB1c2goVCogb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgYXV0byBsaXN0RWxlbSA9IG1ha2VVbmlxdWVDPExpc3RFbGVtPigpOworICAgIGxpc3RFbGVtLT5vYmplY3QgPSBvYmplY3Q7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKKyAgICB9CisgICAgbGlzdEVsZW0tPm5leHQgPSAqbGlzdDsKKyAgICAqbGlzdCA9IGxpc3RFbGVtLnJlbGVhc2UoKTsKKyAgICBpZiAobXV0ZXggIT0gbnVsbHB0cikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgICAgfQorfQorCisvKiogUHVzaCBhbiBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFVuaXF1ZUNQdHI8VD4mJiBvYmplY3QsIExpc3RFbGVtKiogbGlzdCwgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IG51bGxwdHIpIG5vZXhjZXB0IHsKKyAgICBsaXN0UHVzaChvYmplY3QucmVsZWFzZSgpLCBsaXN0LCBtdXRleCk7Cit9CisKK3NpemVfdCBsb2FkTGlicmFyaWVzKGNvbnN0IGVmZmVjdHNDb25maWc6OkxpYnJhcmllcyYgbGlicywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliTGlzdCwgcHRocmVhZF9tdXRleF90KiBsaWJMaXN0TG9jaywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliRmFpbGVkTGlzdCkKK3sKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisgICAgZm9yIChhdXRvJiBsaWJyYXJ5IDogbGlicykgeworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGxpYiBlbnRyeQorICAgICAgICBhdXRvIGxpYkVudHJ5ID0gbWFrZVVuaXF1ZUM8bGliX2VudHJ5X3Q+KCk7CisgICAgICAgIGxpYkVudHJ5LT5uYW1lID0gc3RyZHVwKGxpYnJhcnkubmFtZS5jX3N0cigpKTsKKyAgICAgICAgbGliRW50cnktPmVmZmVjdHMgPSBudWxscHRyOworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpYkVudHJ5LT5sb2NrLCBudWxscHRyKTsKKworICAgICAgICBpZiAoIWxvYWRMaWJyYXJ5KGxpYnJhcnkucGF0aC5jX3N0cigpLCBsaWJFbnRyeS5nZXQoKSkpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgbG9hZCBmYWlsdXJlCisgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJGYWlsZWRMaXN0KTsKKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShsaWJFbnRyeSksIGxpYkxpc3QsIGxpYkxpc3RMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKKy8qKiBGaW5kIGEgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBsaXN0LiAqLworbGliX2VudHJ5X3QqIGZpbmRMaWJyYXJ5KGNvbnN0IGNoYXIqIG5hbWUsIGxpc3RfZWxlbV90KiBsaXN0KSB7CisKKyAgICB3aGlsZSAobGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8qIG9iamVjdCA9IHN0YXRpY19jYXN0PGxpYl9lbnRyeV90Kj4obGlzdC0+b2JqZWN0KTsKKyAgICAgICAgaWYgKHN0cmNtcChvYmplY3QtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdHJ1Y3QgVXVpZFN0ciB7CisgICAgLyoqIExlbmd0aCBvZiBhbiB1dWlkIHJlcHJlc2VudGVkIGFzIHN0cmluZy4gQFRPRE86IHVzZSBhIGNvbnN0YW50IGluc3RlYWQgb2YgNDAuICovCisgICAgY2hhciBidWZmWzQwXTsKK307CisKKy8qKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvdmlkZWQgdXVpZC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYW4gb3V0cHV0IGJ1ZmZlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgdXVpZFRvU3RyaW5nKCkKKyAqLworY2hhciogdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsIFV1aWRTdHImJiBzdHIgPSB7fSkgeworICAgIHV1aWRUb1N0cmluZygmdXVpZCwgc3RyLmJ1ZmYsIHNpemVvZihzdHIuYnVmZikpOworICAgIHJldHVybiBzdHIuYnVmZjsKK30KKworc3RydWN0IExvYWRFZmZlY3RSZXN1bHQgeworICAgIC8qKiB0cnVlIGlmIHRoZSBlZmZlY3QgaXMgdXNhYmxlIChha2EsIGV4aXN0aW5nIGxpYiwgZGVzYywgcmlnaHQgdmVyc2lvbiwgdW5pcXVlIHV1aWQpICovCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgLyoqIFNldCBpZiB0aGUgZWZmZWN0IGxpYiB3YXMgZm91bmQqLworICAgIGxpYl9lbnRyeV90KiBsaWIgPSBudWxscHRyOworICAgIC8vKiBTZXQgaWYgdGhlIGRlc2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVseSByZXRyaWV2ZWQgZnJvbSB0aGUgbGliICovCisgICAgVW5pcXVlQ1B0cjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3REZXNjOworfTsKKworTG9hZEVmZmVjdFJlc3VsdCBsb2FkRWZmZWN0KGNvbnN0IEVmZmVjdEltcGwmIGVmZmVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqIGxpYkxpc3QpIHsKKyAgICBMb2FkRWZmZWN0UmVzdWx0IHJlc3VsdDsKKworICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBsaWJyYXJ5CisgICAgcmVzdWx0LmxpYiA9IGZpbmRMaWJyYXJ5KGVmZmVjdC5saWJyYXJ5LT5uYW1lLmNfc3RyKCksIGxpYkxpc3QpOworICAgIGlmIChyZXN1bHQubGliID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMgdG8gbG9hZCBlZmZlY3QgJXMiLAorICAgICAgICAgICAgICBlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdC5lZmZlY3REZXNjID0gbWFrZVVuaXF1ZUM8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4oKTsKKworICAgIC8vIEdldCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IKKyAgICBpZiAocmVzdWx0LmxpYi0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJmVmZmVjdC51dWlkLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSkgIT0gMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsCisgICAgICAgICAgICAgIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIHJlc3VsdC5saWItPm5hbWUpOworICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIER1bXAgZWZmZWN0IGZvciBkZWJ1ZworI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsIHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzKTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgZWZmZWN0IGlzIHN1cHBvcnRlZAorICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uKSAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiQmFkIEFQSSB2ZXJzaW9uICUjMDh4IGZvciBlZmZlY3QgJXMgaW4gbGliICVzLCBleHBlY3RlZCBtYWpvciAlIzA4eCIsCisgICAgICAgICAgICAgIHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uLCBuYW1lLmNfc3RyKCksIHJlc3VsdC5saWItPm5hbWUsIGV4cGVjdGVkTWFqb3JWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBsaWJfZW50cnlfdCAqXzsKKyAgICBpZiAoZmluZEVmZmVjdChudWxscHRyLCAmZWZmZWN0LnV1aWQsICZfLCBudWxscHRyKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgJXMgdXVpZCAlcyBhbHJlYWR5IGV4aXN0IiwgdXVpZFRvU3RyaW5nKGVmZmVjdC51dWlkKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuc3VjY2VzcyA9IHRydWU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZV90IGxvYWRFZmZlY3RzKGNvbnN0IEVmZmVjdHMmIGVmZmVjdHMsIGxpc3RfZWxlbV90KiBsaWJMaXN0LCBsaXN0X2VsZW1fdCoqIHNraXBwZWRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgIGxpc3Rfc3ViX2VsZW1fdCoqIHN1YkVmZmVjdExpc3QpIHsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKworICAgICAgICBhdXRvIGVmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdCwgZWZmZWN0Lm5hbWUsIGxpYkxpc3QpOworICAgICAgICBpZiAoIWVmZmVjdExvYWRSZXN1bHQuc3VjY2VzcykgeworICAgICAgICAgICAgaWYgKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmZmVjdC5pc1Byb3h5KSB7CisgICAgICAgICAgICBhdXRvIHN3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYlN3LCBlZmZlY3QubmFtZSArICIgbGlic3ciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGF1dG8gaHdFZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QubGliSHcsIGVmZmVjdC5uYW1lICsgIiBsaWJodyIsIGxpYkxpc3QpOworICAgICAgICAgICAgaWYgKCFzd0VmZmVjdExvYWRSZXN1bHQuc3VjY2VzcyB8fCAhaHdFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtYWluIGVmZmVjdCBpbiB0aGUgc2tpcHBlZCBsaXN0IGV2ZW4gaWYgb25seSBhIHN1YmVmZmVjdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgLy8gYXMgdGhlIG1haW4gZWZmZWN0IGlzIG5vdCB1c2FibGUgd2l0aG91dCBpdHMgc3ViZWZmZWN0cy4KKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgc2tpcHBlZEVmZmVjdHMpOworICAgICAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RQdXNoKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgc3ViRWZmZWN0TGlzdCk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECisgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOworICAgICAgICAgICAgZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLT51dWlkID0gZWZmZWN0LnV1aWQ7CisKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIGF1dG8gcmVnaXN0ZXJTdWJFZmZlY3QgPSBbc3ViRWZmZWN0TGlzdF0oYXV0byYmIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBtYWtlVW5pcXVlQzxzdWJfZWZmZWN0X2VudHJ5X3Q+KCk7CisgICAgICAgICAgICAgICAgZW50cnktPm9iamVjdCA9IHJlc3VsdC5lZmZlY3REZXNjLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAgICAgZW50cnktPmxpYiA9IHJlc3VsdC5saWI7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVudHJ5KSwgJigqc3ViRWZmZWN0TGlzdCktPnN1Yl9lbGVtKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoc3dFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoaHdFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgJmVmZmVjdExvYWRSZXN1bHQubGliLT5lZmZlY3RzKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgSW50ZXJmYWNlIGZ1bmN0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiAiQyIgc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgdXNpbmcgZWZmZWN0c0NvbmZpZzo6cGFyc2U7CisgICAgYXV0byByZXN1bHQgPSBwYXRoID8gcGFyc2UocGF0aCkgOiBwYXJzZSgpOworICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgKz0gbG9hZExpYnJhcmllcyhyZXN1bHQucGFyc2VkQ29uZmlnLT5saWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ0xpYnJhcnlMaXN0LCAmZ0xpYkxvY2ssICZnTGlicmFyeUZhaWxlZExpc3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRWZmZWN0cyhyZXN1bHQucGFyc2VkQ29uZmlnLT5lZmZlY3RzLCBnTGlicmFyeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdTa2lwcGVkRWZmZWN0cywgJmdTdWJFZmZlY3RMaXN0KTsKKworICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICIlenUgZXJyb3JzIGR1cmluZyBsb2FkaW5nIG9mIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCwgcGF0aCA/OiBlZmZlY3RzQ29uZmlnOjpERUZBVUxUX1BBVEgpOworCisgICAgcmV0dXJuIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgeG1sIGNvbmZpZ3VyYXRpb24gYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiBFZmZlY3RGYWN0b3J5U3RhdGUuCisgKiBAcGFyYW1baW5dIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvciBOVUxMwqB0byBsb2FkIHRoZSBkZWZhdWx0IG9uZQorICogQHJldHVybiAtMcKgb24gdW5yZWNvdmVyYWJsZSBlcnJvciAoZWc6IG5vIGNvbmZpZ3VyYXRpb24gZmlsZSkKKyAqICAgICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgaW52YWxpZCBlbGVtZW50cyAobGliICYgZWZmZWN0KSBza2lwcGVkIGlmIHRoZSBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQKKyAqIEBub3RlIHRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZm9yIHRlc3QgcHVycG9zZSBvbmx5LiBEbyBub3QgY2FsbCBmcm9tIG91dHNpZGUgdGhpcyBsaWJyYXJ5LgorICovCitBTkRST0lEX0FQSQorc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpOworCisjaWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCmluZGV4IDY0YTMyMTIuLmE1YTEyZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KIAorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC01Miw2ICs1Myw3IEBACiAvLyAgICAgICAgKnBOdW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGluIGZhY3RvcnkKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTc5LDYgKzgxLDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMTAsNiArMTEzLDcgQEAKIC8vICAgICAgICAqcEhhbmRsZTogICAgICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBoYW5kbGUuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAogICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpOwogCkBAIC0xMzAsNiArMTM0LDcgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIGludGVyZmFjZSBoYW5kbGUKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTUzLDYgKzE1OCw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjksOCArMTc1LDEwIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgdXVpZCBpcyBlcXVhbCB0byBFRkZFQ1RfVVVJRF9OVUxMLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdElzTnVsbFV1aWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOwogCitBTkRST0lEX0FQSQogaW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCk7CiAKICNpZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvdGVzdC9EdW1wQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE1NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gbnVsbHB0cjsKKyAgICBib29sIGxlZ2FjeUZvcm1hdDsKKworICAgIGlmIChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWxlZ2FjeSIpID09IDApIHsKKyAgICAgICAgbGVnYWN5Rm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGxlZ2FjeSBlZmZlY3QgY29uZmlnIGZpbGVcbiIpOworICAgIH0gZWxzZSBpZiAoKGFyZ2MgPT0gMiB8fCBhcmdjID09IDMpICYmIHN0cmNtcChhcmd2WzFdLCAiLS14bWwiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeUZvcm1hdCA9IGZhbHNlOworICAgICAgICBpZiAoYXJnYyA9PSAzKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgWE1MIGVmZmVjdCBjb25maWcgZmlsZTogJXNcbiIsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGRlZmF1bHQgWE1MIGVmZmVjdCBjb25maWcgZmlsZS5cbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFyZ3VtZW50cy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2FnZTogJXMgWy0tbGVnYWN5fC0teG1sIFtGSUxFXV1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWxlZ2FjeUZvcm1hdCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcocGF0aCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvYWRYbWxFZmZlY3RDb25maWcgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnRpYWxseSBmYWlsZWQgdG8gbG9hZCBjb25maWcuIFNraXBwZWQgJXp1IGVsZW1lbnRzLCAiCisgICAgICAgICAgICAgICAgICAgICJzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iLCAoc2l6ZV90KXJldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVnYWN5Rm9ybWF0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkRWZmZWN0Q29uZmlnIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxlZ2FjeSBsb2FkRWZmZWN0Q29uZmlnIGhhcyBwcm9iYWJseSBzdWNjZWVkLCBzZWUgbG9nY2F0IHRvIG1ha2Ugc3VyZS5cbiIpOworICAgIH0KKworICAgIGlmIChFZmZlY3REdW1wRWZmZWN0cyhTVERPVVRfRklMRU5PKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWZmZWN0IGR1bXAgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawppbmRleCA4M2U4Mjg4Li45NDFlYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtNzIsMTkgKzcyLDI1IEBACiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAogICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKICAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKICAgICBDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMgXAogICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBcCisgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKICAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKICAgICBDb21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIFwKICAgICBDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIFwKICAgICBDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCkBAIC0xMjAsNyArMTI2LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCiAgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE3OSw2ICsxODUsNyBAQAogICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL2xpYiBcCiAgICAgJChMT0NBTF9QQVRIKS9Db21tb24vc3JjCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDIyODk3N2QuLjRjMmI5NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC0xOTgsNiArMTk4LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIxMCw2ICsyMTQsMTAgQEAKICAgICBMVkRCRV9GU18zMjAwMCA9IDYsCiAgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAogICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBMVkRCRV9GU185NjAwMCA9IDksCisgICAgTFZEQkVfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfRnNfZW47CiAKQEAgLTQ1MCwxMiArNDU4LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggYjFlYmFkZi4uZjMyZWQzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfX0xWREJFX0NPRUZGU19IX18KIAogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MTQsNSArNTE1LDYzMiBAQAogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGlnaCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNzY5OGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzOTAwMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDA4MDdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzM4MThmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU3MzJmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU2NjkwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MzAwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MzI3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NzE3NmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTQ5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njk5NTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTUzNDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzc4NjNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MTA1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU3MTAyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NjYyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjA4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDc0NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjYxOTRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODg5MzFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4OTkyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY3MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg5ODMxZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyMDgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTk0OTE1ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc0NTg4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk3NDU4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzQ2MWYKICNlbmRpZgorCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2MDMyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI2ODEwZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkyOTM5NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNTI3NWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0Njg4MWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDgyNTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Mjk0MzVmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTExOTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxMjQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzMzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDA1MmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTAxOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzQzNmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM3ODRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTMxMjVmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzU1OTRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MDkzZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjk1ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTg2MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NDAxOWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjcxOGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODY4MDVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjUwNzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODc3OTdmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzEwNzdmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTM4OThmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQwODZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY5NDlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2OTU0ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS44OTMzODdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTM1MTdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE1OTk4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MjI5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTE0MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyMDg5MmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MjMyNmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDM5NDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzQ3OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTY3NDBmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ2MzEzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4NjA3ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA5MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0ODc5N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTE1N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzE1NjhmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU4MzZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzgzNjdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYxNjQ5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg0MzAzZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQyNWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjkwMGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTU3OGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTk4NGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjc4OWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzUzOWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjM5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS44ODA4MjVmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTAwMjMxZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTA0OTc3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjc2NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45Mjc1NzlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzAxMTFmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTEyMzg3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzQ1OWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MjgzNjVmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUwMDg3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTUxMzAzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTYxOGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3NzhmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjQ0MjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ0NDc3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjcyMWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTI1ODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1MDQwZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc1MzQ3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTI4MmYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODE4ODhmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODIwNTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYwNzI0ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MzM1OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4ODkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxNjgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyOTkyZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1ODQwZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTg0OGYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTE5N2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NTQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODU0ODhmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0NjRmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYxNTBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MTUwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjczM2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzU1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMTg5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTMyMDlmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMwODVmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMDg1ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzU1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Mzc1OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MTk5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY1MzdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY1OTlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NDVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTQ1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjgyM2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDc2MmYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTg0NjFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDAzODFmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk5MjM0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MjM4ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MjA5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTc5OTY2ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEzNjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODQ2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA4NDY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjg1ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODI4NjlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjM2NGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MzY0ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NDU3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjI2ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjg4ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA2NDFmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDI1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkxMTAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTEzOThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE5MmYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTkyZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzMzc0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MjIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTUzMDlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjEzMWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMTMxZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1NjE1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTc4NjhmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg5MzlmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODk0NWYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTg1NzJmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxODU3MmYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1ODc0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNDI3ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMzU0NWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MDY0N2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTcyNTk2ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMjQ1OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzE0OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTc0Nzk1ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTM3M2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MDEwOGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDM3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjgxOWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTcxNGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg2MjA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjI2OGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjkwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MzE4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDcwOWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI0MGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNDczZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzQyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk1NWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzMDc4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzE0NGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzUzNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NTU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAtMS45OTY4NjBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNzc4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg0MzdmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODQ0NGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDkwNzNmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5NTNmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY2MTlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Mzc5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NjM3N2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxNTI4OWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTUyODlmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2ODgyZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDY3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzU0NzdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzY3MTFmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgzNzlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MjM5NWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA0N2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNzcwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDc3MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgzODYzZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDE0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODc5NzdmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODgyODhmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQyMDdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTMyNGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MTQ4OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzg2N2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDM4NjdmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyMDM4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTYxMzRmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5ODA3NWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5ODA4NWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgdGltZSBjb25zdGFudHMgYW5kIGdhaW4gc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUdDIFRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg0MTM5NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODgyMjIzZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTEyNTFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzI3NmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MjY3ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NDQwNjFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzc0NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MTU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKKyNlbmRpZgorCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA0MmYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMwZgorI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyMWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCisjZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA4ZgorI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCisjZW5kaWYKKworLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4NTUzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzA5NTczZgorI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjA3OTQ1OGYKKyNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi45NDMyODJmCisjZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZvbHVtZSBjb250cm9sIGdhaW4gKi8KKyNkZWZpbmUgVk9MVU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKworLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjQ2OTBmCisjZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE3OTc3ZgorI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjUyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI0MjJmCisjZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MDI5ZgorI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODI5OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYyMzFmCisjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgorI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgorI2VuZGlmCisjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLworI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCisjZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLworI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCisjZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLworI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLworI2VuZGlmCisKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmluZGV4IGI2NjMyYTMuLmZkNDAxNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwpAQCAtMTA3LDM1ICsxMDcsNjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKIAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKLQorICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfMTkyMDAwKSkpOworI2Vsc2UKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cworICAgICAqLworICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpL3NpemVvZihMVk1fSU5UMTYpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyNlbHNlCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfQzMyX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOworI2Vsc2UKKyAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9GTE9BVF9Db2Vmc190ICopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQorICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfQzMyX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOwotCisjZWxzZQorICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworI2VuZGlmCiB9CiAKIApAQCAtMTc1LDcgKzIwOCw5IEBACiAgICAgewogICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KICAgICB9CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKIAogfQpAQCAtMjEyLDYgKzI0Nyw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgIGRCU2hpZnRzX2ZhYzsKKyNlbmRpZgogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBpZiBlbmFibGVkCiAgICAgICovCkBAIC0yMzcsMzMgKzI3NSw1OCBAQAogICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKDYgKyBWb2x1bWUgJSA2KTsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwogICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGRCU2hpZnRzX2ZhYyA9IChMVk1fRkxPQVQpKDEgPDwgZEJTaGlmdHMpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIDw8IDE2KTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPj4gZEJTaGlmdHM7Ci0KKyNlbHNlCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0IC8gZEJTaGlmdHNfZmFjOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVNoaWZ0ID0gVk9MVU1FX1NISUZUKzE7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKICAgICAgKi8KICAgICBpZihkQlNoaWZ0cyA+IDApCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKCgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSkgPj4gZEJTaGlmdHMpKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0gLyBkQlNoaWZ0c19mYWMpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbmRpZgogfQogCiAKQEAgLTMwOSw3ICszNzIsMTEgQEAKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKyNlbHNlCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworI2VuZGlmCiAKIAogICAgIC8qCkBAIC0zMzIsMTIgKzM5OSwxOSBAQAogICAgIHsKICAgICAgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogCiAKICAgICB9CkBAIC0zNTcsMTMgKzQzMSwyMyBAQAogCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwweDAwMDA3RkZGKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOworI2VuZGlmCiAgICAgfQogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwppbmRleCBhMzYyM2JjLi4zZmZmMmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTgwLDcgKzgwLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIERhdGEgbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICA9IHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpOworI2Vsc2UKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0RhdGFfdCk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtODgsNyArOTIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29lZiBtZW1vcnkKICAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOworI2Vsc2UKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtOTYsNyArMTA0LDEyIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLwogICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CkBAIC0xNTEsMTAgKzE2NCwxNiBAQAogewogCiAgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgTWl4R2FpbjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE1peEdhaW47CisjZW5kaWYKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKIAogCiAgICAgLyoKQEAgLTIzNSw3ICsyNTQsMTEgQEAKICAgICAvLyBpbml0aWFsaXplIHRoZSBtaXhlciB3aXRoIHNvbWUgZml4ZXMgdmFsdWVzIHNpbmNlIG90aGVyd2lzZSBMVkRCRV9TZXRWb2x1bWUgZW5kcyB1cAogICAgIC8vIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhCiAgICAgcE1peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGLDB4MDAwMDdGRkYpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgMS4wLCAxLjApOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIHZvbHVtZQpAQCAtMjQ1LDkgKzI2OCwxMyBAQAogCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSBhcyB0aGUgdGFyZ2V0ICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKKyNlbHNlCisgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBNaXhHYWluLCBNaXhHYWluKTsKKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJlIHRoZSBtaXhlciBwcm9jZXNzIHBhdGggKi8KICAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOwpAQCAtMjY4LDkgKzI5NSwxMSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTA7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLwpAQCAtMjc4LDkgKzMwNywxNSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTA7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAogICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgMS4wLCAxLjApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAKICAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA4MzM5ZDNjLi40ZTUyMDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTc3LDYgKzc3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEYXRhIHN0cnVjdHVyZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBBR0MgcGFyYW1ldGVycyAqLwpAQCAtOTgsNyArOTksMjkgQEAKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCiAKIH0gTFZEQkVfQ29lZl90OworI2Vsc2UKKy8qIERhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEFHQyBwYXJhbWV0ZXJzICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworCit9IExWREJFX0RhdGFfRkxPQVRfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KK30gTFZEQkVfQ29lZl9GTE9BVF90OworI2VuZGlmCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xMDgsOCArMTMxLDEzIEBACiAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIERhdGEgYW5kIGNvZWZmaWNpZW50IHBvaW50ZXJzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZEQkVfRGF0YV90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLwogICAgIExWREJFX0NvZWZfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworI2Vsc2UKKyAgICBMVkRCRV9EYXRhX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl9GTE9BVF90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisjZW5kaWYKIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogCkBAIC0xMzYsNSArMTY0LDMgQEAKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgICAgICAvKiBfX0xWREJFX1BSSVZBVEVfSF9fICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggNjlkNzlkMi4uMTBlYTcwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiQUdDLmgiCiAjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTcyLDEzNiArNzEsMjM2IEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgY29uc3QgTFZNX0lOVDE2ICpwSW5EYXRhLCBMVk1fSU5UMTYgKnBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKKyAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKikgaEluc3RhbmNlOworICBMVk1fSU5UMzIgKnBTY3JhdGNoID0KKyAgICAgIChMVk1fSU5UMzIgKikgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0lOVDMyICpwTW9ubzsKKyAgTFZNX0lOVDE2ICpwSW5wdXQgPSAoTFZNX0lOVDE2ICopIHBJbkRhdGE7CisKKyAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikgKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisKKyAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBwTW9ubyA9ICZwU2NyYXRjaFsyICogTnVtU2FtcGxlc107CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CisgICAgcmV0dXJuIChMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICovCisgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTikKKyAgICAgIHx8IChMVkNfTWl4ZXJfR2V0Q3VycmVudCgKKyAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT0gTFZDX01peGVyX0dldFRhcmdldCgKKyAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpIHsKKworICAgIC8qCisgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCisgICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCisgICAgICovCisgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCisgICAgcFNjcmF0Y2gsIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgeworICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAoTFZNX0lOVDMyICopIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAqLworICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKKyAgICAgKiAoTm90IHJlcXVpcmVkIGZvciAxNi1iaXQgaW1wbGVtZW5hdGlvbnMpCisgICAgICovCisgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCisgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgLyogRGVzdC4gMTYtYml0IGRhdGEgICAgICovCisgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgTFZEQkVfU0NBTEVTSElGVCk7IC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgIH0KKworICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpCisgICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCisgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCisgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKSB7CisKKyAgICAvKgorICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgKi8KKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLCBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisKKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgcFNjcmF0Y2hWb2wsIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7CisKKyAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKK30KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKKyAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAorICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKIAotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBNb25vOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dCAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOworICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCisgIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKKyAgTFZNX0ZMT0FUICpwTW9ubzsKKyAgTFZNX0lOVDMyIGlpID0gMDsKIAorICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7CisvLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKIAotICAgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIHNob3J0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0lOVDE2ICopKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOwogCi0gICAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICAgIHBNb25vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJnBTY3JhdGNoWzIqTnVtU2FtcGxlc107CisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgeworICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0CisgICAqLworICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisKKyAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07CisgIH0KKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKKyAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQorICB7CiAKICAgICAvKgotICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7Ci0gICAgICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKLSAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKLSAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCi0gICAgICAgICAqIChGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gYXBwbHkgaGVhZHJvb20gbG9zcyBoZXJlKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1NDQUxFU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCi0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KLSAgICAgICAgICovCi0gICAgICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgotICAgICAgICAgKi8KLSAgICAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKLSAgICAgICAgICogKE5vdCByZXF1aXJlZCBmb3IgMTYtYml0IGltcGxlbWVuYXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLCAgICAgICAgICAgIC8qIERlc3QuIDE2LWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLSAgICB9Ci0KLSAgICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAotICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKQotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQotICAgICAgICAgKi8KLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICAgKi8KLQotICAgIH0KKyAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KIAogICAgIC8qCi0gICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOworICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgorICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOworICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcFNjcmF0Y2hfaW4sCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICB9CisKKyAgLyoKKyAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAqLworICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworCisgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKIH0KLQotCi0KLQotCi0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggZjVkMjI5ZS4uYzRhOWIxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtMzYsNyArMzYsMTEgQEAKIC8qCiAgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUV9GTE9BVF9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKQEAgLTgzLDYgKzg3LDE4IEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTMwLDYgKzE0NiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTc3LDYgKzIwNiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjIzLDEyICsyNjUsMzIgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfX07CisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKK307CiAKIC8qCiAgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJQX0MzMl9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM4MDAwX0ZjNTVfQjIsCkBAIC0yNTcsNiArMzE5LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yODYsNiArMzU2LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMzE1LDYgKzM5MywxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTM0Myw3ICs0MjksMTkgQEAKICAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX19OworICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKKworfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzUzLDcgKzQ1MSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAogICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKICAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCkBAIC0zNjIsMTAgKzQ2NCwyMCBAQAogICAgIEFHQ19BVFRBQ0tfRnMyNDAwMCwKICAgICBBR0NfQVRUQUNLX0ZzMzIwMDAsCiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAotICAgIEFHQ19BVFRBQ0tfRnM0ODAwMH07CisgICAgQUdDX0FUVEFDS19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAorICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisjZW5kaWYKKworfTsKIAogLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19ERUNBWV9GczgwMDAsCiAgICAgQUdDX0RFQ0FZX0ZzMTEwMjUsCiAgICAgQUdDX0RFQ0FZX0ZzMTIwMDAsCkBAIC0zNzQsMTAgKzQ4NiwyMCBAQAogICAgIEFHQ19ERUNBWV9GczI0MDAwLAogICAgIEFHQ19ERUNBWV9GczMyMDAwLAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAotICAgIEFHQ19ERUNBWV9GczQ4MDAwfTsKKyAgICBBR0NfREVDQVlfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRlMxOTIwMDAKKyNlbmRpZgorCit9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19HQUlOXzBkQiwKICAgICBBR0NfR0FJTl8xZEIsCiAgICAgQUdDX0dBSU5fMmRCLApAQCAtMzk2LDcgKzUxOCwxMSBAQAogICAgIEFHQ19HQUlOXzE1ZEJ9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19IUEZHQUlOXzBkQiwKICAgICBBR0NfSFBGR0FJTl8xZEIsCiAgICAgQUdDX0hQRkdBSU5fMmRCLApAQCAtNDIyLDYgKzU0OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg0MDAwLCAgICAgICAgICAgICAvKiAtNmRCICovCiAgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCkBAIC00MzAsOCArNTU3LDIyIEBACiAgICAgMHg2NUFELCAgICAgICAgICAgICAvKiAtMmRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCiAgICAgMHg3RkZGfTsgICAgICAgICAgICAvKiAgMGRCICovCisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0geworICAgIDAuNTAwMDAwZiwgICAgICAgICAvKiAtNmRCICovCisgICAgMC41NjIzNDFmLCAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjYzMDk1N2YsICAgICAgICAgLyogLTRkQiAqLworICAgIDAuNzA3OTQ2ZiwgICAgICAgICAvKiAtM2RCICovCisgICAgMC43OTQzMjhmLCAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjg5MTI1MWYsICAgICAgICAgLyogLTFkQiAqLworICAgIDEuMDAwMDAwZn07ICAgICAgICAvKiAgMGRCICovCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgVk9MX1RDX0ZzODAwMCwKICAgICBWT0xfVENfRnMxMTAyNSwKICAgICBWT0xfVENfRnMxMjAwMCwKQEAgLTQ0MCw5ICs1ODEsMTcgQEAKICAgICBWT0xfVENfRnMyNDAwMCwKICAgICBWT0xfVENfRnMzMjAwMCwKICAgICBWT0xfVENfRnM0NDEwMCwKLSAgICBWT0xfVENfRnM0ODAwMH07CisgICAgVk9MX1RDX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTkyMDAwCisjZW5kaWYKK307CisKKwogCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CisKICAgICBNSVhfVENfRnM4MDAwLAogICAgIE1JWF9UQ19GczExMDI1LAogICAgIE1JWF9UQ19GczEyMDAwLApAQCAtNDUxLDYgKzYwMCwxMCBAQAogICAgIE1JWF9UQ19GczI0MDAwLAogICAgIE1JWF9UQ19GczMyMDAwLAogICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwfTsKKyAgICBNSVhfVENfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxOTIwMDAKKyNlbmRpZgogCi0KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKaW5kZXggNDc2ZTZhMC4uY2E0NmUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03Niw4ICs3Nyw1NyBAQAogCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXTsKIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQorICovCitleHRlcm4gY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJQX0ZMT0FUX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdOworCisvKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXTsKKworI2VuZGlmIC8qQlVJTERfRkxPQVQqLworCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdOwogCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDFmZjJhMmMuLjliNmRhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC01MTQsMTEgKzUxNCwxOSBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworI2Vsc2UKIExWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCmluZGV4IDZjYmVlN2QuLjBhM2MzMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwpAQCAtNDgsNyArNDgsMTUyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycworICAgICAqLworICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKyAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgICpwVG9Qcm9jZXNzID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBQcm9jZXNzZWQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyArIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgICA9IExWTV9GSVJTVENBTEw7CisgICAgfQorICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIHRvIG91dHB1dCBpcyBzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisKKworICAgIC8qCisgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGRlbGF5IGJ1ZmZlciBhcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCisgICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAvKiBOdW1iZXIgb2YgZGVsYXkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLworICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZSBjb3VudCAqLworICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgIC8qIFVwZGF0ZSB0aGUgZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzIGZvciB0aGlzIGNhbGwgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiAwKQorICAgIHsKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIgYW5kIHNhbXBsZXMgdG8gb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICsgTnVtU2FtcGxlcyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgorICAgICAqLworICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7CisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisKKworICAgIC8qCisgICAgICogU2F2ZSBzYW1wbGVzIHRvIHRoZSBkZWxheSBidWZmZXIgaWYgYW55IGxlZnQgdW5wcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0xBU1RDQUxMKSkKKyAgICB7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgcFN0YXJ0ICAgICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC0xODksNyArMzM0LDcgQEAKICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLwogICAgIH0KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMTMsNyArMzU4LDQ3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGUgYmxvY2sgc2l6ZSB0byBwcm9jZXNzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBwcm9jZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7CisgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICoqcFByb2Nlc3NlZCwKQEAgLTI1Miw3ICs0MzcsNyBAQAogICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOwogICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNzgsNiArNDYzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZEluKExWTV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtNDE2LDcgKzYwMiw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlckluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDcxLDcgKzY1NywzNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC01MDEsNyArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTIyLDcgKzczOCwxNTYgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBkZXN0aW5hdGlvbiAqLworICAgIH0KKyAgICBwRGVzdCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBvdXRwdXQgYWRkcmVzcyAqLworCisKKyAgICAvKgorICAgICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBzYW1wbGVzIHRvIHNlbmQgdG8KKyAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgorICAgICAgICAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgZGVsYXllZCBvdXRwdXQgYnVmZmVyIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCisgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHByb2Nlc3NlZCByZXN1bHRzIHRvIHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYKKyAgICAgICAgKFNhbXBsZUNvdW50ICE9IDApKQorICAgIHsKKyAgICAgICAgaWYgKFNhbXBsZUNvdW50IDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZW1haW5pbmcgcHJvY2Vzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGNvdW50ICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHBvaW50ZXJzLCBjb3VudHMgYW5kIHNldCBkZWZhdWx0IGJ1ZmZlciBwcm9jZXNzaW5nCisgICAgICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIHNpemUgKi8KKyAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQpAQCAtNjcyLDcgKzEwMzcsNyBAQAogICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgYmxvY2sgc2l6ZSAqLwogICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsgICAgICAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzQxLDYgKzExMDYsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0KExWTV9IYW5kbGVfdCAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQogewpAQCAtODA1LDcgKzExNzEsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg0Myw3ICsxMjA5LDMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKQEAgLTg2Nyw0ICsxMjU3LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAppbmRleCAyNzEyYjJjLi4zNTM1NjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCkBAIC0yNiwxMCArMjYsNjU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFRyZWJsZUJvb3N0Q29ybmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgVHJlYmxlQm9vc3RNaW5SYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDM4NDM0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMxNTk5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wODE1NTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODg0NzUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTk0MworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI0MDA5MAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg0MjMyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTg1ODAxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNDUxNDUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjQ4ODcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxMzQ5MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1NjU0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzkwMTc3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMDE0NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc2MjE5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwNjE4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwMjcyOAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MTA4MgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zMTEwNDkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDI2MjAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyNTg4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU2ODk1NgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTk5NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MjE5NjQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNjM2NzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkzNjQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA4NjI2NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyNDAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNDQ2NjIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjMyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDc3MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE3MzE3NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTUwOTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTE2OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMTQwODYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTM4NjMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI4NDg3MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMTY5MjEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0MjkxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDk2MzQyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTg1NDU0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NTMzODkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg1NDQwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42NjU1NzQKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzk3NjI1CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyMzQ5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzMjY4MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjQ3MzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTExNDgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIzMTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAwMTAwMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ2ODQ0NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0OTgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42OTIyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDI0MzM4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjk0NjMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDYyNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yOTI0NDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzYzMQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTU5NDMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkwOTE5MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwNTkzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ0MTAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NDM2NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTMyNTcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTc4MDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzc2Njk1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTE0MjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40NzAzMTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc1MzU1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc0MzIwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY5MzIxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjA2NTU5CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODI1NDUzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM4MjgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MjE0MTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTQwMzA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTA4MjA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjMyNzEwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMxNzc5MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjUzNjY4NworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU1Mjk1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc3MTg0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxNjgwNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAzNTY5OAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMTI4NTIKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzMxNzQ2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDQ1MDIzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjYzOTE2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuODE3NzI0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDM2NjE4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNDUzMDYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY0MTUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzIxMDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjYxNTM4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41Mjk0ODgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYzODc1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDkzNDA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzYxMzU5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjMwOTcxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5ODkyMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTMyNjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODQ5OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyNjQ0NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNTI4MDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyMDc1OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS42Mzg3NzgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42MTU0NTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS44ODM0MDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44ODk5MjQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xNTc4NzMKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjQ2NTgzNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0MzQyNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjgxMTM3NAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTMxMTI3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy4xOTkwNzYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKyNpZmRlZiBISUdIRVJfRlMKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk2MjMzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NzM1ODMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA0MjA4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43ODE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzI1MzU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDI3MDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ2MTI5MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAzODY0MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjEzODEwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTkxMTYwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg0OTM5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjM2MjI4OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjU1NDI5OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTkyMzg3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzY5NzM4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDM0MTEzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMTE0NjQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi4yODI2ODUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDk2NTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi41ODcwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzUxMDk3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuOTI4NDQ3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjMxMTU1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTY0MDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy43NDE0MTQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjY0NjM3MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMjIzNzIxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44NzUxNTAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjg4MDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45OTYxMzAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0NTQ0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTMxODcxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI4NDE3NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjg3NzM3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ1NTA2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjg3OTQ3NworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNjQ2ODA0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODYxOTQwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMzU5OTkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTAzMzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYwNjgzOQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjM3NDE2NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi42NzgwNTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjI1MTY5MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMTkwMjAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYzNDI2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy40MDE1OTEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy44MzA4NDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NDUxNDUKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMzEyNDcyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA1LjA4NTU0MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00Ljg1Mjg2OAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKworI2VuZGlmCisKKyNlbHNlCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDIyMDUwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTY0MjkxICovCkBAIC01NzEsMyArMTIxNiw0IEBACiAKIAogI2VuZGlmCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwppbmRleCA3MjU2NGQ0Li5jZmU1M2I4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKQEAgLTY1LDkgKzY1LDE2IEBACiAgICAgaWYoCiAgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwogICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisjZWxzZQogICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorI2VuZGlmCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CiAgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKICAgICB7CkBAIC0yNjgsNyArMjc1LDEyIEBACiB2b2lkIExWTV9TZXRUcmVibGVCb29zdChMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyNlbHNlCiAgICAgZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE9mZnNldDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IDA7CiAKQEAgLTI5OCw2ICszMTAsMjAgQEAKICAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQogICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CkBAIC0zMDksNiArMzM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgLyogRGVzdGluYXRpb24uXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtMzQyLDYgKzM2OSw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwogICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwogICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgVGVtcDsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCkBAIC00MDEsMjIgKzQzMSw0NiBAQAogICAgICAqLwogICAgIGlmKGRCU2hpZnRzID09IDApCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7Ci0gICAgfQorI2VuZGlmCisgICAgICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFRlbXAgPSBMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdOworICAgICAgICB3aGlsZShkQlNoaWZ0cykgeworICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOworICAgICAgICAgICAgZEJTaGlmdHMtLTsKKyAgICAgICAgfQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pPj5kQlNoaWZ0cykpOworI2VuZGlmCiAgICAgfQogICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAscEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZW5kaWYKICAgICB9CiB9CiAKQEAgLTU1NCw4ICs2MDgsMjMgQEAKICAgICAgICAgLyogQ29uZmlndXJlIE1peGVyIG1vZHVsZSBmb3IgZ3JhZHVhbCBjaGFuZ2VzIHRvIHZvbHVtZSovCiAgICAgICAgIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPCAwKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogRHJvcCBpbiByaWdodCBjaGFubmVsIHZvbHVtZSovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTYzLDExICs2MzIsMjcgQEAKICAgICAgICAgICAgIFRhcmdldCA9IGRCX3RvX0xpbjMyKChMVk1fSU5UMTYpKExvY2FsUGFyYW1zLlZDX0JhbGFuY2U8PDQpKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPjApCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyNlbHNlCiAgICAgICAgICAgICBMVk1fSU5UMzIgVGFyZ2V0OworI2VuZGlmCiAgICAgICAgICAgICAvKiBEcm9wIGluIGxlZnQgY2hhbm5lbCB2b2x1bWUqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTc1LDE3ICs2NjAsMzYgQEAKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogTm8gZHJvcCovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CiAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KICAgICAvKgpAQCAtMTAwOCwxOCArMTExMiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSkKIHsKICAgICBMVk1fSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICBUYXJnZXQ7CisjZWxzZQogICAgIExWTV9JTlQzMiAgICBUYXJnZXQ7CisjZW5kaWYKIAogICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CiAgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CiAKICAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKICAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0pOworICAgIGlmKFRhcmdldCA9PSAxLjBmKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CisgICAgfQorI2Vsc2UKICAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7CiAKICAgICBpZihUYXJnZXQgPT0gMHg3RkZGKQogICAgIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CiAgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwppbmRleCA1NDJjM2M4Li4yNmMxYzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTIzMiw3ICsyMzIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKIApAQCAtMjY1LDcgKzI2OSwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CkBAIC01NDIsMTAgKzU1MCwxNSBAQAogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAvKiBTY3JhdGNoIDEgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilCdW5kbGVTY3JhdGNoU2l6ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZWxzZQogICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCkBAIC01OTgsMTQgKzYxMSwyNiBAQAogICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLwogICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsMCk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgfQogCisjaWZkZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2VuZGlmCiAKICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCICAgICAgICAgICAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgICAgICAgICAgICA9IDA7CkBAIC02MTUsMTUgKzY0MCwyNCBAQAogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CiAKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGRlZmF1bHQgRVFOQiBwcmUtZ2FpbiBhbmQgcG9pbnRlciB0byB0aGUgYmFuZCBkZWZpbml0aW9ucwogICAgICAqLwpAQCAtNzA5LDcgKzc0MywxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogCkBAIC03NjMsNyArODAxLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKQEAgLTg2OCw5ICs5MTAsMTQgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fSU5UMTYpKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwwKTsKIAogCkBAIC05OTQsNyArMTA0MSw2IEBACiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CiAKLQogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggMmU4NWY3Ny4uYjQ1MzIyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0xMzgsNiArMTM4LDIzIEBACiAKIAogLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLworfSBMVk1fQnVmZmVyX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwpAQCAtMTUwLDIyICsxNjcsMjggQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCiB9IExWTV9CdWZmZXJfdDsKLQorI2VuZGlmCiAKIC8qIEZpbHRlciB0YXBzICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCisjZW5kaWYKIH0gTFZNX1RFX0RhdGFfdDsKIAotCiAvKiBDb2VmZmljaWVudHMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2VuZGlmCiB9IExWTV9URV9Db2Vmc190OwogCi0KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KQEAgLTE4MSwxNSArMjA0LDI0IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KICAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJhdGlvbiBudW1iZXIgKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTnVtYmVyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgKi8KICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCkBAIC0yMDksOCArMjQxLDE2IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICBWQ19Wb2x1bWU7ICAgICAgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCkBAIC0yMzQsNyArMjc0LDExIEBACiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCiAgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwUFNBSW5wdXQ7ICAgICAgICAgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOb1Ntb290aFZvbHVtZTsgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBzbW9vdGggdm9sdW1lIGNoYW5nZXMqLwogCkBAIC0yNjEsMTYgKzMwNSwyOCBAQAogCiB2b2lkICAgIExWTV9TZXRIZWFkcm9vbSggICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgIExWTV9CdWZmZXJJbiggICBMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOworI2Vsc2UKIHZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCmluZGV4IGY1YTAxZjMuLjRhMTlhMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwpAQCAtNTEsNyArNTEsMjMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgorICAgICAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBhIGdvb2QgbXVsdGlwbGUgKHVubWFuYWdlZCBtb2RlIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZigoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZXcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisKKyAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgZnJvbSBNb25vIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCisgICAgeworICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOworICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBwcm9jZXNzaW5nCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVySW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgJnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAmcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgorICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+Q1NfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICh2b2lkKUxWQ1NfUHJvY2VzcyhwSW5zdGFuY2UtPmhDU0luc3RhbmNlLCAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJ5cGFzcyBtb2RlIG9yIGV2ZXJ5dGhpbmcgb2ZmLCBzbyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPT0gTFZNX1BTQV9PTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworCisgICAgICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEQyByZW1vdmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI3MywzICs0OTcsNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCBlMTRmOTA5Li4xOTlkZGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yOSw3ICsyOSwzNDIgQEAKIC8qICAgIFRyZWJsZSBCb29zdCBGaWx0ZXIgQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogCitGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0NGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCiBGT19DMTZfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CiAKICAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLwpAQCAtMzQwLDggKzY3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwogICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9TaGlmdH19OwotCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9CisgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MCw2ICs2ODYsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXSA9IHsKKyAgICAxLjAwMGYsICAgICAgICAgICAgIC8qICAwZEIgKi8KKyAgICAwLjg5MWYsICAgICAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAwLjc5NGYsICAgICAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjcwOGYsICAgICAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAwLjYzMWYsICAgICAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjU2MmYsICAgICAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjUwMWZ9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg3RkZGLCAgICAgICAgICAgICAvKiAgMGRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCkBAIC0zNTgsNiArNzA0LDcgQEAKICAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KICAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KICAgICAweDQwMDB9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAppbmRleCBhNzYwMWZmLi40Y2Y3MTE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCkBAIC0zNywxNiArMzcsMjMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2V4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZWxzZQogZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdOworI2Vsc2UKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107CisjZW5kaWYKKwogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW107CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAppbmRleCAyMDgwZDY0Li45YTNkMzVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApAQCAtMzcsNyArMzcsNyBAQAogLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KQEAgLTUyLDIwICs1MiwzOSBAQAogICAgIExWTV9JTlQxNiAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19NYXhHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICBWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgQUdDX1RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgQUdDX0F0dGFjazsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19EZWNheTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBkZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIFZvbHVtZVRDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCit9IEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdDsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDdhYzdmYmQuLjNlZTdmNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0yNywxOSArMjcsMzQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKIAorfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOwogCiB9IEJpcXVhZF9JbnN0YW5jZV90OwotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENPRUZGSUNJRU5UIFRZUEUgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIEJpcXVhZCBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEEyOyAgIC8qICBhMiAgKi8KKyAgICBMVk1fRkxPQVQgIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMjsgICAvKiAgYTIgICovCkBAIC01Nyw4ICs3MiwxNyBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUV9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTE7ICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KK30gRk9fRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAvKiAgYTEgICovCkBAIC03Miw4ICs5NiwxNyBAQAogICAgIExWTV9JTlQzMiAgQTA7ICAgLyogIGEwICAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBGT19DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyB3aXRoIFNoaWZ0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEExOyAgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgICAvKiAtYjEhICovCit9IEZPX0ZMT0FUX0xTaHhfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAgLyogIGExICAqLwpAQCAtODEsOCArMTE0LDE2IEBACiAgICAgTFZNX0lOVDE2IEIxOyAgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2IFNoaWZ0OyAvKiBTaGlmdCAqLwogfSBGT19DMTZfTFNoeF9Db2Vmc190OwotCisjZW5kaWYKIC8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLworfSBCUF9GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTk2LDggKzEzNywxOCBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUF9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIFBlYWtpbmcgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KKyAgICBMVk1fRkxPQVQgIEc7ICAgLyogR2FpbiAqLworfSBQS19GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTExMywxNiArMTY0LDI2IEBACiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KIH0gUEtfQzMyX0NvZWZzX3Q7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgVEFQUyBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSoyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8xSV9PcmRlcjFfVGFwc190OwogCkBAIC0xMzAsMTIgKzE5MSwyMiBAQAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMioyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdDsKLQorI2VuZGlmCiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogeworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSo0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdDsKIApAQCAtMTQzLDcgKzIxNCw3IEBACiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKLQorI2VuZGlmCiAvKiBUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byBzYXRpc2Z5IFFBQyBydWxlczogTmFtZSBzaG91bGQgYmUgVW5pcXVlIHdpdGhpbmcgMTYgY2hhcmFjdGVycyovCiAjZGVmaW5lIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgIEluaXRfQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDEKICNkZWZpbmUgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgICAgICAgVFdPX0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyCkBAIC0xNTQsNTkgKzIyNSwxNDggQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yMTUsMzMgKzM3NSw2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjUwLDEzICs0NDMsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQkFORCBQQVNTIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjc0LDEwICs0ODIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yODYsNDIgKzUwMSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIAogLyoqKiAzMiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCiB2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogREMgUkVNT1ZBTCBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAppbmRleCA0Y2I4YWEyLi40OThmYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCkBAIC02NiwxMyArNjYsMTcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7CisjZWxzZQogdm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZJbiwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0ZXJCZk91dCwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7Ci0KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAppbmRleCAyMjk3MDFhLi4wYzg5NTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMzMsMTEgKzMzLDMyIEBACiAgICBERUZJTkVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRklMVEVSX0xPU1MgICAgIDMyNzMwICAgICAgIC8qIC0wLjAxZEIgbG9zcyB0byBhdm9pZCB3cmFwcGluZyBkdWUgdG8gYmFuZCByaXBwbGUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIEZJTFRFUl9MT1NTX0ZMT0FUICAgIDAuOTk4ODQ5ZgorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CisKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIFgpOworI2lmZGVmIEhJR0hFUl9GUworTFZNX0ZMT0FUICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMzIgIEZjLAorI2Vsc2UKK0xWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGUpOworCitMVk1fRkxPQVQgTFZNX0ZPX0xQRiggICAgTFZNX0ZMT0FUICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKKworTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgIExWTV9GTE9BVCAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcyk7CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgWCk7CkBAIC01Miw3ICs3Myw3IEBACiAKIExWTV9JTlQzMiAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA2OGM1NWY3Li5jYjE1YjYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtNDQsNiArNDQsOSBAQAogCiAjZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KICNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLjBmCisjZW5kaWYKICNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwogI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3CiAKQEAgLTk1LDcgKzk4LDkgQEAKIHR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNzaW9uIGZsb2F0aW5nIHBvaW50Ki8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTMzLDYgKzEzOCwxMCBAQAogICAgIExWTV9GU18zMjAwMCA9IDYsCiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAorI2lmZGVmIEhJR0hFUl9GUworICAgIExWTV9GU185NjAwMCA9IDksCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9Gc19lbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IDg5ZGViMGQuLjA3YzUzY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMzAsNiArMzAsNDMgQEAKICAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZhbHVlLiAgU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBDdXJyZW50OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZS4gIFNldCBieSB0aGUgbWl4ZXIgZnVuY3Rpb24uICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTsgICAgICAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit9IE1peF8xU3RfQ2xsX0ZMT0FUX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEFscGhhMTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQxOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQxOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMTsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMTsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMTsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMTsKKworICAgIExWTV9GTE9BVCAgIEFscGhhMjsgICAgICAgICAgICAgICAgICAgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gTWl4XzFTdF9DbGxfdCBpbiBzb21lIGZ1bmN0aW9ucyAqLworICAgIExWTV9GTE9BVCAgIFRhcmdldDI7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDI7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0yOworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUyOworICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UyOworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOworfSBNaXhfMlN0X0NsbF9GTE9BVF90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCkBAIC02NCw5ICsxMDEsMzUgQEAKIAogfSBNaXhfMlN0X0NsbF90OwogCisjZW5kaWYKIAogLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKKwordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCAgICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKQEAgLTg4LDEwICsxNTEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwogCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKExPVyBMRVZFTCBTVUJGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC0xMDcsNiArMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCkBAIC0xMTUsMTMgKzE5NSwzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8qIF9fTUlYRVJfSF9fICovCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAppbmRleCAzZDYyNzA0Li5jZGIzODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCkBAIC0zNCw3ICszNCwxMiBAQAogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiAKIC8qIEFic29sdXRlIHZhbHVlIGluY2x1ZGluZyB0aGUgY29ybmVyIGNhc2UgZm9yIHRoZSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICAgaW5wdXQpOworI2Vsc2UKIExWTV9JTlQzMiAgIEFic18zMihMVk1fSU5UMzIgICAgIGlucHV0KTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQpAQCAtNDgsOCArNTMsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKICAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpOworI2Vsc2UKIExWTV9JTlQzMiBkQl90b19MaW4zMihMVk1fSU5UMTYgIGRiX2ZpeCk7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMmI3OTFiZC4uMGJhMjBhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtMjksNiArMjksMTEgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMb2FkQ29uc3RfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIExvYWRDb25zdF8xNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtMzYsMTAgKzQxLDE3IEBACiB2b2lkIExvYWRDb25zdF8zMiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbm90ZTogSW4gTXVsdDNzXzE2eDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgpAQCAtNDksMTAgKzYxLDE3IEBACiAgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE11bHQzc19GbG9hdCggICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIE11bHQzc18xNngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTY2LDIwICs4NSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgRGVsYXlNaXhfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogdm9pZCBEZWxheVdyaXRlXzMyKCAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtODcsNyArMTE3LDEzIEBACiB2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNYWMzc19TYXRfMTZ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC05Nyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiB2b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKCAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgY29lZmYsICAgICAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLwpAQCAtMTA5LDcgKzE0NSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBTSElGVCBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKTsKKyNlbHNlCiB2b2lkIFNoaWZ0X1NhdF92MTZ4djE2ICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTExOSwxMSArMTYwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQVVESU8gRk9STUFUIENPTlZFUlNJT04gRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNb25vVG8ySV8xNiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKQEAgLTEzMSwyOSArMTc2LDUyIEBACiB2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgTVNUbzJpX1NhdF8xNngxNiggICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQogdm9pZCBKb2luVG8yaV8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIERBVEEgVFlQRSBDT05WRVJTSU9OIEZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCA5MjBiNTE1Li5mYTlmMDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzMsNyArMzMsMTAgQEAKIAogI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSw3ICs3Miw3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCkBAIC0xOTMsNCArMTk2LDExMyBAQAogCiAgICAgcmV0dXJuOwogfQorI2Vsc2UKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworewogCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIFJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE51bVNhbXBsZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIExlZnQgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7CisgICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKKyAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisgICAgICAgICpwRHN0KysgPSBSaWdodDsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAqLworICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCmluZGV4IDkxMjhiODIuLjg0ZmFiZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCkBAIC00Nyw0ICs0NywxNCBAQAogICAgIH0KICAgICByZXR1cm4gaW5wdXQ7CiB9Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIC8qIE5lZ2F0aXZlIGlucHV0LCBzbyBpbnZlcnQgKi8KKyAgICAgICAgaW5wdXQgPSAoTFZNX0ZMT0FUKSgtaW5wdXQpOworICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCmluZGV4IDY5ZDM1N2UuLmUzZWRjY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwpAQCAtNTcsNCArNTcsMzMgQEAKICAgICByZXR1cm47CiB9CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBZGQyX1NhdF9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpICpzcmMpICsgKChMVk1fRkxPQVQpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IGY0YzU3NTcuLjg4Zjk5ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNTEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKIAorCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiAoKCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMiw1IEBACiAgICAgICAgIH0KIAogICAgIH0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggODg5MTRhZC4uMjdhYjU3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC00OSw2ICs2Miw3IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09cENvZWYtPkIyOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKICAgfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5ODA1MzljLi5lMTk0ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggYmExYTQyZi4uM2FiZGQ0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw0OCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCit7CisgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CiAKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD0gKEEwICogKHgobilMIC0geChuLTIpTCApKQorICAgICAgICB0ZW1wbCA9IChMVk1fRkxPQVQpICpwRGF0YUluIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkpCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgIH0KK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC04MCw0ICsxMjEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGU4MzMyMTguLmQ2ZTA0N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTQ4LDYgKzQ4LDIwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKKworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU5LDYgKzczLDcgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5Y2NhNjI3Li5hYTllNjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNiw1ICsyNiwxMiBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwppbmRleCBiMDljMWFhLi5hYmRiMmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKQEAgLTMzLDcgKzMzLDUyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAgKiAoeChuKUwgIC0geChuLTIpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSB5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKaW5kZXggOTM2NzkxMi4uNTU5MGMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpAQCAtMzcsNiArMzcsMjEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUwLDYgKzY1LDcgQEAKIAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKaW5kZXggNWNjMWNlMi4uODBjMzkyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApAQCAtMjYsNSArMjYsMTMgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0KiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogCiAjZW5kaWYgLypfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBmMmY4YzZiLi5lZTliZjdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTMyLDcgKzMyLDU2IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODIsNCArMTMxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiYWYwYzFhLi4zZDViZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyA7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDkwOWM2OTkuLjgxMWRhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDQgKzI3LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggOTJmNmNhZi4uYzc0YTEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw1NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODEsNCArMTI4LDQgQEAKIAogICAgICAgICB9CiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBhZWExMGYwLi45ODEyMjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCAxZDZiZTRlLi5mZWFlMjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Nyw2ICs3OCw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDk3MmU3MDQuLjliMGZkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsODEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTCAgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKworICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTIsMyArMTg2LDQgQEAKIAogICAgIH0KIAorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZTA1NjM3My4uZjI0ZGI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw4MSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTEsNCArMTg1LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCAwYThhYzM1Li4zOWUxYmRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTcsNiArNzgsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3ZDQyY2VkLi4wNjkxYjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1s1XTsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYwppbmRleCA0YTBjY2U0Li42MWMwN2M3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDc5IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9QTIgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEqIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAqIHgobilMICAgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKiB5bkwrPS1CMip5KG4tMilMICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MKz0tQjEqeShuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCogeChuKVIgICAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPS1CMiAqIHkobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPS1CMSAqIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTUsNCArMTg3LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDA1MmUyYTAuLmNmMTllMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsODIgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgICkpKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiAgKSkqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpICAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE4OSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYwppbmRleCA4Yzc0MWUxLi4yNjExYjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDg0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpIGluIFExNSAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgLyogVXBkYXRlIHkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE5MSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNGYwY2Y2Ny4uYzAzMTljOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCA0NTkxZWUwLi40ZDliYmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU2LDYgKzc2LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggZmQ4MjEyZTQuLjk2MGRlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsOTQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCiAKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx5blIsdGVtcGwsdGVtcGQ7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCisgICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMjMsNCArMjEwLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTcwOWY3MS4uZmZmMDVlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDc0N2FmNmEuLmMwZjBkY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI5LDQgKzI5LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKaW5kZXggMjA0MDRhZC4uZTQ4OTAzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtNTQsNSArNTQsMzUgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCBiZjY5ZTM1Li5lYTk4MDQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDFTaG9ydDsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDJTaG9ydDsKIAorICAgIEN1cnJlbnQxU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50MSk7CisgICAgQ3VycmVudDJTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQyKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjMSsrOworICAgICAgICBUZW1wMyA9IFRlbXAxICogQ3VycmVudDFTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAqc3JjMisrOworICAgICAgICBUZW1wMSA9IFRlbXAyICogQ3VycmVudDJTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAoVGVtcDEgLyAyLjBmKSArIChUZW1wMyAvIDIuMGYpOworICAgICAgICBpZiAoVGVtcDIgPiAwLjVmKQorICAgICAgICAgICAgVGVtcDIgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmICkKKyAgICAgICAgICAgIFRlbXAyID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyID0gKFRlbXAyICogMik7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCkBAIC01NSw2ICs4NSw1IEBACiAgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCAzNDcxZjA1Li4yODE0ZjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0yNiw2ICsyNiw3MCBAQAogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7CisgICAgTFZNX0lOVDE2ICAgICBpaSxqajsKKworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLXBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQpOworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9KExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgVGVtcDIgPSAqZHN0OworCisgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOworCisgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTg5LDYgKzE1Myw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKaW5kZXggNzA5YzMwNC4uODE0Y2NlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTI1LDcgKzI1LDc5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9GTE9BVCBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9GTE9BVCBDdXJyZW50VGltZXNBbHBoYTsKIAorICAgIExWTV9JTlQxNiBpaTsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKKyAgICB7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCAhPSAwKQorICAgIHsKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSAocEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYSk7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC05OCw2ICsxNzAsNSBAQAogICAgICAgICAgICAgZHN0Kys7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwppbmRleCA0OWZhMTg0Li5kMjYxYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTE4LDcgKzE4LDUzIEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIExlZnREQyxSaWdodERDOworICAgICAgICBMVk1fRkxPQVQgRGlmZjsKKyAgICAgICAgTFZNX0lOVDMyIGo7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKIAorICAgICAgICBMZWZ0REMgPSBwQmlxdWFkU3RhdGUtPkxlZnREQzsKKyAgICAgICAgUmlnaHREQyA9IHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKKyAgICAgICAgZm9yKGogPSBOclNhbXBsZXMtMTsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgTGVmdERDIC09IERDX0ZMT0FUX1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExlZnREQyArPSBEQ19GTE9BVF9TVEVQOyB9CisKKworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworICAgICAgICB9CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOworICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOworCisKKyAgICB9CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNjQsNCArMTEwLDQgQEAKIAogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0NjhhODhkLi40ZjRmY2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNywxMSArMTcsMTggQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKK30KKyNlbHNlCiB2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKIHsKICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDA7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMDsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggODlhNGU2OC4uZmE2YjcyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMTgsMTEgKzE4LDIzIEBACiAjaWZuZGVmIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAjZGVmaW5lIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNlbHNlCiAjZGVmaW5lIERDX0QxNl9TVEVQICAgICAweDIwMDsKKyNlbmRpZgogCiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfCit7CisgICAgTFZNX0ZMT0FUICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCisgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLworfUZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCkBAIC0zMCw1ICs0Miw1IEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCisjZW5kaWYKICNlbmRpZiAvKiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKaW5kZXggN2UzMTgyZC4uZjUwMjcxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCkBAIC0zNiwxMCArMzYsNTUgQEAKICAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgdGVtcDsKIAorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIG9mZnNldCAqLworICAgICpwT2Zmc2V0ID0gT2Zmc2V0OworCisgICAgcmV0dXJuOworfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKwogICAgIGZvciAoaT0wOyBpPG47IGkrKykKICAgICB7CiAgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNDksNyArOTQsNyBAQAogCiAKICAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNjksNSArMTE0LDUgQEAKIAogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGRlNzczNjEuLjAzOWM4OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzEsNiArMzEsNDYgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03MSw0ICsxMTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDk2MjUyY2MuLmIyMWI4YTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDIyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Myw2ICs2OSw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDUxNmNhODMuLjZmZGIwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKaW5kZXggMGYxZDViYy4uNDE2ZThlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCkBAIC0zMSw3ICszMSw0NyBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2ICBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTcxLDQgKzExMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTM2ZTRmNi4uZjMzZDI0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUyLDYgKzY5LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTRhZDQ4Yy4uZmRiNTI4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjksNCArMjksMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUXworeworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwppbmRleCA4Mzg4MDUwLi4xOTI5MjdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw5MiBAQAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW5MLHluUjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgTmVnU2F0VmFsdWU7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOwogCisgICAgICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBOZWdTYXRWYWx1ZSA9IC0xLjBmOworCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8vIHluTCA9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAgICAgLy8geW5SID1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilMCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCoocERhdGFJbisxKSk7CisKKworICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5MICs9IFRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IFRlbXA7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSB5blI7IC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgaWYoeW5MID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5bkwgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluTCA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5MID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih5blIgPiAxLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHluUiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoeW5SIDwgTmVnU2F0VmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5blIgPSBOZWdTYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTI1LDQgKzIxMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGExOWMzMmMuLjMzY2E2Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyMyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKQEAgLTU1LDYgKzcyLDcgQEAKICAgdGVtcD1wQ29lZi0+U2hpZnQ7CiAgIHBCaXF1YWRTdGF0ZS0+U2hpZnQgPSB0ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA0NjQwNzQzLi4zNjhiZmNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsNiArMjAsMTUgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICAgIExWTV9GTE9BVCAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9GbG9hdF9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfRmxvYXRfU3RhdGUgKiBQRmlsdGVyX0Zsb2F0X1N0YXRlIDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewogICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpAQCAtMjgsNSArMzcsNSBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCmluZGV4IDRkMzJkZjEuLmIxZmRlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKQEAgLTM0LDYgKzM0LDcgQEAKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEsIEEyLCBCMSBhbmQgQjIgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgICAgICBMVk1fSU5UMTYgICBBMDsKQEAgLTQzLDEyICs0NCwyMiBAQAogICAgICAgICBMVk1fSU5UMTYgICBCMjsKICAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQTA7CisgICAgTFZNX0ZMT0FUICAgQTE7CisgICAgTFZNX0ZMT0FUICAgQTI7CisgICAgTFZNX0ZMT0FUICAgQjE7CisgICAgTFZNX0ZMT0FUICAgQjI7CisgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisjZW5kaWYKIC8qCiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExIGFuZCBCMSBjb2VmZmljaWVudHMKICAqLwogLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgICAgIExWTV9JTlQxNiAgIEEwOwpAQCAtNTYsOCArNjcsMTUgQEAKICAgICAgICAgTFZNX0lOVDE2ICAgQjE7CiAgICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDFCMUNvZWZzU1BfdDsKLQotCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBMDsKKyAgICBMVk1fRkxPQVQgICBBMTsKKyAgICBMVk1fRkxPQVQgICBCMTsKKyAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK30gQmlxdWFkQTAxQjFDb2Vmc1NQX3Q7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKaW5kZXggNzk3NWU4Yi4uMmM2ZTZjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtNTMsNSArNTMsMzQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01TX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAxLGxlZnQscmlnaHQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbGVmdCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgc3JjKys7CiAKKyAgICAgICAgcmlnaHQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0TSsrOworCisgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RTID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0UysrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IDhiYjI5MmYuLmFjMWVlYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC00Niw1ICs0NiwyNyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBUZW1wOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKCpzcmMpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgKmRzdCA9IFRlbXAgLyAyLjBmOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKaW5kZXggOWI5MzhiZC4uZWJjNDc3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCkBAIC00OSw2ICs0OSwzMSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBzcmNMICs9IG4gLSAxOworICAgIHNyY1IgKz0gbiAtIDE7CisgICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyY1I7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmNSLS07CisKKyAgICAgICAgKmRzdCA9ICpzcmNMOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjTC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCAzZDM5YjkzLi5lYjU3NTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0yNyw3ICsyNywzOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKIAorICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTItPkN1cnJlbnQpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgIH0KKworCit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLApAQCAtNjYsNCArOTgsNSBAQAogCiAKIH0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKaW5kZXggMmRhZjc0YS4uZWMwYmFhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMjQsNyArMjQsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworICAgIExWTV9GTE9BVCBDdXJyZW50MjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorCisgICAgQ3VycmVudDEgPSAocEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgQ3VycmVudDIgPSAocEluc3RhbmNlMi0+Q3VycmVudCk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAgPSAoKChMVk1fRkxPQVQpKihzcmMxKyspICogKExWTV9GTE9BVClDdXJyZW50MSkpICsKKyAgICAgICAgICAgICAgICgoKExWTV9GTE9BVCkqKHNyYzIrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQyKSk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLApAQCAtNTQsNiArODQsNSBAQAogICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggY2FhMDk1MS4uZDI2OTRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNSw3ICsyNSw5NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQorewogCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudCA8IFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEyMyw2ICsyMTIsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCmluZGV4IDA5ZWM0MjcuLjY1NmExMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDEyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIEFERDJfU0FUX0ZMT0FUKExWTV9GTE9BVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGMpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgdGVtcCA9IGEgKyBiIDsKKyAgICBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICBjID0gLTEuMGY7CisgICAgZWxzZSBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIGMgPSAxLjBmOworICAgIGVsc2UKKyAgICAgICAgYyA9IHRlbXA7CisgICAgcmV0dXJuIGM7Cit9Cit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZUwgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZVIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorICAgIExWTV9GTE9BVCAgIERlbHRhTCA9IHBJbnN0YW5jZUwtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnRMID0gcEluc3RhbmNlTC0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRMID0gcEluc3RhbmNlTC0+VGFyZ2V0OworCisgICAgTFZNX0ZMT0FUICAgRGVsdGFSID0gcEluc3RhbmNlUi0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudFIgPSBwSW5zdGFuY2VSLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldFIgPSBwSW5zdGFuY2VSLT5UYXJnZXQ7CisKKyAgICBMVk1fRkxPQVQgICBUZW1wID0gMDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZiAoT3V0TG9vcCkKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIDI7IGlpICE9IDA7IGlpIC09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcCAqIDI7IGlpICE9IDA7IGlpLT0yKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgfQorICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQgPSBDdXJyZW50TDsKKyAgICBwSW5zdGFuY2VSLT5DdXJyZW50ID0gQ3VycmVudFI7CisKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCkBAIC0xNDAsNCArMjYwLDUgQEAKICAgICBwSW5zdGFuY2VSLT5DdXJyZW50PUN1cnJlbnRSOwogCiB9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGYxYTljYTMuLmI1ZTdmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDg2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOwogCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEwMSw2ICsxODAsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAwMDUyZGQ3Li4xOTJmMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsODAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTEwOCw1ICsxODEsNSBAQAogICAgIH0KIAogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKaW5kZXggZjQ0M2M4Zi4uYmQ1YTkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0zMyw3ICszMywxMzggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykKKyAgICB7CisgICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IDEuMGYpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gMS4wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xNDgsNSArMjc5LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCmluZGV4IGM4ZGNhZDcuLjEwMTdkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsNzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVk1peGVyM19NSVhTT0ZUXzFTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICBlbHNlIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTA3LDUgKzE3Nyw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZi8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCA3MjQwNzA1Li4zYzkwMDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCkBAIC02Niw1ICsxMDgsNSBAQAogICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9Ci0KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCA5ODBjNzgzLi5mOTA0OTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMzEsNiArMzEsMTkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMVk1peGVyM19zdCBzdHJ1Y3R1cmUgc3RvcmVzIEluc3RhbmNlIHBhcmFtZXRlcnMgZm9yIG9uZSBhdWRpbyBzdHJlYW0gKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTFZNaXhlcjNfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCkBAIC00MCwyMiArNTMsMzUgQEAKICAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KICAgICBMVk1fQ2FsbGJhY2sgICAgcENhbGxCYWNrOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19zdDsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK30gTFZNaXhlcjNfMVN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KIH0gTFZNaXhlcjNfMVN0X3N0OwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMl07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KK30gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzJTdF9zdDsKLQorI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVszXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0aHJlZSBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzNTdF9zdDsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoSElHSCBMRVZFTCBGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc1LDU3ICsxMDEsMTE1IEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgVGFyZ2V0R2Fpbik7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSk7CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOworI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZW5kaWYKIAogLyoqKiAxNiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMF0gYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVsxXSBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLQotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwppbmRleCBiNWFlMjY0Li41OTkwNDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKQEAgLTMxLDcgKzMxLDE1IEBACiAvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgQ3VycmVudEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIEN1cnJlbnRHYWluID0gcEluc3RhbmNlLT5DdXJyZW50OyAgLy8gQ3VycmVudEdhaW4KKyAgICByZXR1cm4gQ3VycmVudEdhaW47Cit9CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSkKIHsKICAgICBMVk1fSU5UMzIgICAgICAgQ3VycmVudEdhaW47CkBAIC0zOSwzICs0Nyw0IEBACiAgICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0CiAgICAgcmV0dXJuIEN1cnJlbnRHYWluOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKaW5kZXggZGMyZjhlOS4uYzY3NDU1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpAQCAtMzAsNyArMzAsMTYgQEAKIC8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIAorICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsgIC8vIFRhcmdldEdhaW4KKyAgICByZXR1cm4gVGFyZ2V0R2FpbjsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCiB7CiAgICAgTFZNX0lOVDMyICAgICAgIFRhcmdldEdhaW47CkBAIC00MCwzICs0OSw0IEBACiAKICAgICByZXR1cm4gVGFyZ2V0R2FpbjsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKaW5kZXggNDQ5ZTdiMS4uNzM3ZTI2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCkBAIC00NCw3ICs0NCwxOSBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2FpbikKK3sKKyAgICBMVk1fRkxPQVQgTWF4R2FpbiA9IFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgaWYoQ3VycmVudEdhaW4gPiBNYXhHYWluKQorICAgICAgICBNYXhHYWluID0gQ3VycmVudEdhaW47CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudEdhaW47IC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudEdhaW4pCkBAIC02NCw0ICs3Niw0IEBACiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKICAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCmluZGV4IDI5NGUwNWMuLmQwZDBlMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMjYsNiArMjYsMTUgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKIC8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIFRhcmdldCBHYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCit9IE1peF9Qcml2YXRlX0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogR2VuZXJhbCAqLwpAQCAtMzQsOCArNDMsNyBAQAogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgLyogTGVmdCBTaGlmdCBmb3IgSW50ZWdlciBwYXJ0IG9mIEdhaW4gKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyB0aGUgZnJhY3Rpb25hbCB2YWx1ZSBvZiBEZWx0YSBHYWluICovCiB9IE1peF9Qcml2YXRlX3N0OwotCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKQEAgLTQ5LDIzICs1Nyw0MyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnBJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzMsMTIgKzEwMSwxOSBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NiwxNiArMTIxLDIyIEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0KLQorI2VuZGlmCiAKIC8qKiogMzIgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtMTEyLDcgKzE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCmluZGV4IDVlZmE1MDEuLjU3NzE3OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKQEAgLTQzLDcgKzQzLDE0IEBACiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbikKIHsKQEAgLTY0LDMgKzcxLDQgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudEdhaW48PCgxNi1TaGlmdCk7ICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAogICAgIHBJbnN0YW5jZS0+U2hpZnQ9U2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA0YzFjOGIyLi40OGY1ZDU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCkBAIC00NCw3ICs0NCw1MSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisjZWxzZQorICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2Z9Oy8qNDgwMDAqLworI2VuZGlmCiAKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKKyAgICBEZWx0YSA9IERlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgIGVsc2UKKyAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKQEAgLTczLDMgKzExNyw0IEBACiAKICAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggOGQ1MzA0ZS4uOWRjN2QyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNDUsNyArNDUsNzIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2NmYsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KKyNlbmRpZgorICAgIExWTV9GTE9BVCBUY19taWxsaXNlY19mbG9hdDsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAorICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGEgLyAoTnVtQ2hhbm5lbHMpOworCisgICAgLyogIEdldCBnYWluIHZhbHVlcyAgKi8KKyAgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWNfZmxvYXQgPSAoTFZNX0ZMT0FUKShUY19taWxsaXNlYykgLyAoQ3VycmVudCAtIFRhcmdldCk7CisgICAgICAgIGlmIChUY19taWxsaXNlY19mbG9hdCA8IDApCisgICAgICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAxLjAwMDAwMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihEZWx0YSA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7ICAvKiBNaW5pbXVtIHZhbHVlIGZvciBwcm9wZXIgY2FsbC1iYWNrcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLApAQCAtOTMsMyArMTU4LDQgQEAKIAogICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwppbmRleCA2ZDhmZTQ2Li45MDk0NjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTksIENvZWZmaWNpZW50cywgdyk7CiAKKyAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCisgICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KKyAgICBZID0gWSAtIDAuNWY7ICAgICAgICAgLyogQTA9WT0oQjEvMiAtIDAuNSkqLworCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7ICAgICAgICAgICAgICAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCisgICAgcENvZWZmcy0+QTEgPSAtcENvZWZmcy0+QTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgQTE9LUEwKi8KKworICAgIHJldHVybiAxOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fRk9fSFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQogewpAQCAtOTcsNCArMTI2LDQgQEAKIAogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwppbmRleCA4NmVjOTUxLi45ZmU2N2Y4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTA9KDErQjEpLzI9IEIxLzIgKyAwLjUKKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgIC8vIEEwPVk9QjEvMgorICAgIFkgPSBZICsgMC41ZjsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCiAKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsKKyAgICBwQ29lZmZzLT5BMSA9IHBDb2VmZnMtPkEwOworCisgICAgcmV0dXJuIDE7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCiB7CkBAIC05NCw0ICsxMjAsNCBAQAogICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOwogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKaW5kZXggZjNiOWIzYy4uNzg0NmNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKQEAgLTMyLDE2ICszMiw0NSBAQAogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwICwgLyogOGtIeiBpbiBRNDEsIDE2a0h6IGluIFE0MiwgMzJrSHogaW4gUTQzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1LCAgLyogMTEwMjUgSHogaW4gUTQxLCAyMjA1MEh6IGluIFE0MiwgNDQxMDAgSHogaW4gUTQzKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTIwMDB9OyAvKiAxMmtIeiBpbiBRNDEsIDI0a0h6IGluIFE0MiwgNDhrSHogaW4gUTQzICovCi0KKyNlbmRpZgogCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDBfZiAgICAgICAgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgICAgICAgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgICAgICAgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgICAgICAgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgICAgICAgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgICAgICAgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgICAgICAgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgICAgICAgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKKyNlbmRpZgorY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjVfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xNjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjIwNTBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzI0MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8zMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE5MjAwMF9mCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OSw3ICs4OCwyMCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBISUdIRVJfRlMKK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCisjZWxzZQorTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKKyNlbmRpZgoreworICAgIExWTV9GTE9BVCAgIHc7CisgICAgdyA9IChMVk1fRkxPQVQpRmMgKiBMVlZETF8yUGlPbkZzVGFibGVbRnNdOworICAgIHJldHVybiB3OworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCiB7CkBAIC02Nyw0ICsxMDksNCBAQAogICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCiAgICAgcmV0dXJuIHc7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCmluZGV4IDY4NDZkNDkuLmYxZTQ1ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKQEAgLTg3LDUgKzg3LDU4IEBACiAjZGVmaW5lIEFMUEhBXzQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwogI2RlZmluZSBBTFBIQV81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF81ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzYgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF84ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzkgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTU3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMSAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5MzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEyICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODc5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MjlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE1ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NjU4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk1MTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE4ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MDMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTg2MzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIxICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjY4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTYxMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMjk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNiAgICAgICAgICAgICAgICAgICAgICAgMC45ODkxMjNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI3ICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MzcwZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yOSAgICAgICAgICAgICAgICAgICAgICAgMC45Njk1NTNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMwICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwMDUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMiAgICAgICAgICAgICAgICAgICAgICAgMC45MTYyOTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMzICAgICAgICAgICAgICAgICAgICAgICAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgICAgICAgICAgICAgICAgICAgICAgIDAuODM5NjQ1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNSAgICAgICAgICAgICAgICAgICAgICAgMC43ODEwMzZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM2ICAgICAgICAgICAgICAgICAgICAgICAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgICAgICAgICAgICAgICAgICAgICAgIDAuNjEwMTA4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOCAgICAgICAgICAgICAgICAgICAgICAgMC40OTcyMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM5ICAgICAgICAgICAgICAgICAgICAgICAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQ3MzUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MSAgICAgICAgICAgICAgICAgICAgICAgMC4xMzg3MjJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQyICAgICAgICAgICAgICAgICAgICAgICAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgICAgICAgICAgICAgICAgICAgICAgIDAuMDE5MjY3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM3NTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ1ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NyAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ4ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF81MCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKaW5kZXggODA5ZDkwNC4uMThiMjc4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwpAQCAtNTcsNyArNTcsMTEwIEBACiAvKiAgQWxwaGEgICAtIHRoZSBmaWx0ZXIgY29lZmZpY2llbnQgUTMxIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgRnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKK3sKIAorICAgIExWTV9VSU5UMzIgIFByb2R1Y3Q7CisgICAgTFZNX0ZMT0FUICBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2ICAgSW50ZXJwb2xhdGVTaG9ydDsKKyAgICBMVk1fRkxPQVQgICBJbnRlcnBvbGF0ZTsKKyAgICBMVk1fVUlOVDE2ICBTaGlmdDsKKyAgICBMVk1fRkxPQVQgICBEaWZmOworICAgIExWTV9GTE9BVCAgVGFibGVbXSA9IHtBTFBIQV9GbG9hdF8wLCAgICAgICAgICAgICAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUwfTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9IFByb2R1Y3QgKyAoKCh0YyAmIDB4MDAwMEZGRkYpICogKExWTV9VSU5UMzIpRnMpID4+IDMpOworCisgICAgaWYgKE51bUNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA+PiAxOyAgIC8qIE1vbm8gdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KKyAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0IDw8IDE7CisgICAgfQorICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CisKKyAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKKyAgICB7CisgICAgICAgIFNoaWZ0Kys7CisgICAgfQorCisgICAgSW50ZXJwb2xhdGVTaG9ydCA9IChMVk1fSU5UMTYpKChQcm9kdWN0ID4+IDE1KSAmIDB4MDAwMDdGRkYpOworICAgIEludGVycG9sYXRlID0gKExWTV9GTE9BVClJbnRlcnBvbGF0ZVNob3J0IC8gMzI3NjguMGY7CisKKyAgICBEaWZmID0gKFRhYmxlW1NoaWZ0XSAtIFRhYmxlW1NoaWZ0ICsgMV0pOworICAgIERpZmYgPSBEaWZmICogSW50ZXJwb2xhdGU7CisgICAgUHJvZHVjdEZsb2F0ID0gVGFibGVbU2hpZnQgKyAxXSArIERpZmY7CisKKyAgICByZXR1cm4gUHJvZHVjdEZsb2F0OworfQorI2Vsc2UKIExWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKQEAgLTE1NCwzICsyNTcsNCBAQAogCiAgICAgcmV0dXJuIFByb2R1Y3Q7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCmluZGV4IGE2ZDdkYjIuLmNkNTc3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwpAQCAtMjUsNyArMjUsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcG9seW5vbWlhbCBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwLDcgKzQwLDQ4IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSBwb2x5bm9taWFsIGV4cGFuc2lvbiBpbiBRMS4zMSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpwQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICBYKQoreworICAgIExWTV9JTlQzMiBpOworICAgIExWTV9GTE9BVCBZLEEsWFRlbXAsVGVtcCxzaWduOwogCisgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZihYID09IC0xLjBmKQorICAgIHsKKyAgICAgICAgVGVtcCA9IC0xOworICAgICAgICBzaWduID0gVGVtcDsKKyAgICAgICAgZm9yKGkgPSAxOyBpIDw9IE47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWSArPSAoKCpwQ29lZmZpY2llbnRzKSAqIHNpZ24pOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworICAgICAgICAgICAgc2lnbiAqPSBUZW1wOworICAgICAgICB9CisKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBYVGVtcCA9IFg7CisgICAgICAgIGZvcihpID0gTi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworCisgICAgICAgICAgICBUZW1wID0gQSAqIFhUZW1wOworICAgICAgICAgICAgWSArPSBUZW1wOworCisgICAgICAgICAgICBUZW1wID0gWFRlbXAgKiBYOworICAgICAgICAgICAgWFRlbXAgPSBUZW1wOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBZOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKQpAQCAtOTMsNCArMTM0LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIFk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKaW5kZXggNmNhMTA3Ny4uODc4NTU5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCkBAIC00NCw3ICs0NCw3IEBACiAvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNyArNTQsMjggQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoZSByZXN1bHQgb2YgdGhlIDEweCBleHBhbnNpb24gaW4gUTguMjQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCisgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICBYKTsKKyAgICByZXR1cm4gWTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQogewogICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCkBAIC03NSw0ICs5Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBYKTsKICAgICByZXR1cm4gWTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCmluZGV4IDJmMWU1OTEuLjllMTRjM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCkBAIC0yNCw3ICsyNCwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSB2YWw7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbHNlCiB2b2lkIExvYWRDb25zdF8zMihjb25zdCBMVk1fSU5UMzIgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCkBAIC0zOSw1ICs1NCw2IEBACiAKICAgICByZXR1cm47CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKaW5kZXggMjYyOTdlNy4uMDJjOTA2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpAQCAtNzcsNCArNzcsNTggQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgKnNyY00sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgdGVtcCxtVmFsLHNWYWw7CisgICAgTFZNX0lOVDE2IGlpOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIG1WYWwgPSAoTFZNX0ZMT0FUKSpzcmNNOworICAgICAgICBzcmNNKys7CisKKyAgICAgICAgc1ZhbCA9IChMVk1fRkxPQVQpKnNyY1M7CisgICAgICAgIHNyY1MrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgLSBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwppbmRleCBmMjhmMzY2Li5lM2ZiNDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwpAQCAtNjQsNyArNjQsNDQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIHNyY3ZhbDsKKyAgICBMVk1fRkxPQVQgVGVtcCxkSW5WYWw7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbCA9ICpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgPSBzcmN2YWwgKiB2YWw7CisKKyAgICAgICAgZEluVmFsICA9IChMVk1fRkxPQVQpKmRzdDsKKyAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCA3M2MyNmVkLi4xNmUzNjdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTMyLDcgKzMyLDcxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQorICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgY29yZSBmdW5jdGlvbiB3b3VsZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfdCAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAqZHN0LApAQCAtOTEsNSArMTU1LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwppbmRleCBjYTg4YjA0Li44NjkyOTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0zNCw3ICszNCw2OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopc3JjLCAoTFZNX0ZMT0FUKilkc3QsIChMVk1fSU5UMTYpKG4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCBwSW5zdGFuY2UtPkN1cnJlbnQsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtOTEsNSArMTUyLDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCAyZTBhMDk5Li42ZmMxYjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCkBAIC0yNiw3ICsyNiw0NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKXBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKHZvaWQgKikmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCh2b2lkICopICZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOworICAgIH0KK30KKyNlbHNlCiB2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKQEAgLTYxLDUgKzk4LDYgQEAKICAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggcEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCmluZGV4IDYwNzA3M2MuLjAwZDU1ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKQEAgLTI2LDYgKzI2LDEwIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUIDAuMDAxMTUyIC8qIDAuMDEgZEIgb24gYSBmdWxsIHNjYWxlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwppbmRleCBjMDllYzBmLi43OTZhMTVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKQEAgLTQ1LDUgKzQ1LDI2IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBzcmMgKz0gKG4gLSAxKTsKKyAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworCisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjLS07CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKaW5kZXggYTVkYzUwZi4uYzc1ODU2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKQEAgLTQ3LDUgKzQ3LDIzIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTXVsdDNzX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgdGVtcDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICgqc3JjKSAqIHZhbDsKKyAgICAgICAgc3JjKys7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCmluZGV4IDczMzQzY2QuLjUxNTZlZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpAQCAtMTE0LDQgKzExNCw1NCBAQAogICAgIH0KIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCkKK3sKIAorICAgIExWTV9GTE9BVCAgICAgICAgICAgIFNhbXBsZTsgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICBTYW1wbGVObzsgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgVGVtcDsKKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcworICAgICAqLworICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47CisgICAgICAgIHBEYXRhSW4rKzsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBjb21wYW5kZXIsIHRoaXMgY29tcHJlc3NlcyB0aGUgc2lnbmFsIGF0IHRoZSBleHBlbnNlIG9mCisgICAgICAgICAqIGhhcm1vbmljIGRpc3RvcnRpb24uIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgY29udHJvbCBieSB0aGUKKyAgICAgICAgICogZ2FpbiBmYWN0b3IKKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOworICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2F2ZSB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAqcERhdGFPdXQgPSBTYW1wbGU7CisgICAgICAgIHBEYXRhT3V0Kys7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwppbmRleCBjOGMxNTI3Li45YzE3YTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDg4IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix5bkxPLHluUk8sdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoQTAgICogKHgobilMIC0geChuLTIpTCAgKSApKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCisgICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCisgICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gICogeW5SICkpICovCisgICAgICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5STz0oIHluUk8gKyB4KG4pUiAgKSovCisgICAgICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSB5bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE4LDQgKzIwMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwppbmRleCA2N2E1NzBiLi5mNzA1Y2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDcgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNiw0ICsxMTcsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDFkNjE0MmMuLjY1NDc1YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM1LDQgKzM1LDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiOWY2NGU2Li5hMzYzMzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNyw3ICsxNywyMyBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CiAKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gcENvZWYtPkc7Cit9CisjZWxzZQogdm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM0LDQgKzUwLDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBlMjA1MGUwLi4xZTMyMDYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMSw2ICsyMSwxNiBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GbG9hdF8KK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0Zsb2F0IDsKKyNlbmRpZgogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYwppbmRleCA4MzYzMjcwLi4yOGZlYTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKQEAgLTI0LDcgKzI0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjE2eHYxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgKmRzdCwKQEAgLTc3LDUgKzc3LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKaW5kZXggZmJkMTMyZS4uZmFjOWRlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0yNCw3ICsyNCw2MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICBpaSxpajsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CiAKKyAgICBpZih2YWwgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgdmFsOyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICogMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGVtcCA+IDEuMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMS4wOworICAgICAgICAgICAgaWYodGVtcCA8IC0xLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IC0xLjA7CisKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbCA8IDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisjZWxzZQogdm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LApAQCAtNzksNSArMTM0LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKaW5kZXggYWMwMzQzZi4uOWE3MjZmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0yOSw2ICsyOSw5IEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIAogI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NCw2ICs2NywxOCBAQAogI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CiAjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKK3sKKyAgICBMVk1fRkxPQVQgICAgZEJfRmxvYXQ7CisgICAgTFZNX0ZMT0FUICAgIExpbkZsb2F0OworCisgICAgZEJfRmxvYXQgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKWRiX2ZpeCAvIDE2LjBmKTsKKyAgICBMaW5GbG9hdCA9IHBvdygxMCwgZEJfRmxvYXQgLyAyMC4wKTsKKworICAgIHJldHVybiBMaW5GbG9hdDsKK30KKyNlbHNlCiBMVk1fSU5UMzIgICBkQl90b19MaW4zMihMVk1fSU5UMTYgICAgZGJfZml4KQogewogICAgIExWTV9JTlQzMiBMaW5fdmFsXzMyOwpAQCAtMTA2LDQgKzEyMSw0IEBACiAKICAgICByZXR1cm4gTGluX3ZhbF8zMjsgIC8qIGZvcm1hdCAxLjE2LjE1ICovCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggZGI2YWFiZS4uOGUwYjczOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0yMDAsNiArMjAwLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0CisjZW5kaWYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTIsNiArMjE2LDEwIEBACiAgICAgTFZFUU5CX0ZTXzMyMDAwID0gNiwKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKKyAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKIApAQCAtMjY4LDYgKzI3Niw3IEBACiB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJhbmRzOwpAQCAtNDYwLDExICs0NjksMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCmluZGV4IGZkZGVkYjkuLmZmNTJiN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpAQCAtMjIsNyArMjIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc3LDYgKzc5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCkBAIC0xNjgsNyArMTcxLDcgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA1LDcgKzIwOCw2NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZpY2llbnRzKQorewogCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfR2FpblRhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIC8qIEFzIG1lbnRpb25lZCBpbiBlZmZlY3RidW5kbGUuaCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgUUZhY3RvciAgICAgPSAoTFZNX0ZMT0FUKXBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yIC8gMTAwLjBmOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4gKyAxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyLEIxLEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIyID0gLTAuNSAqICgyICogUUZhY3RvciAtIEQgKiBUMCkgLyAoMiAqIFFGYWN0b3IgKyBEICogVDApOworICAgIEIxID0gKDAuNSAtIEIyKSAqIGNvcyhUMCk7CisgICAgQTAgPSAoMC41ICsgQjIpIC8gMi4wOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIC8qIGFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBtdWx0aXBsaWVkIHdpdGggMiB0byBtYWtlIHRoZW0gYWxpZ24gd2l0aCBmaXhlZCBwb2ludCB2YWx1ZXMqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gMiAqIEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gMiAqIEIxOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gMiAqIEIyOworICAgIHBDb2VmZmljaWVudHMtPkcgID0gTFZFUU5CX0dhaW5UYWJsZVtHYWluICsgMTVdOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKQpAQCAtMjk2LDMgKzM1OSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA5NTIxMmYyLi5mMGRlYjZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMjUsNyArMjUsMzkgQEAKIC8qIEdhaW4gdGFibGUgZm9yICgxMF4oR2Fpbi8yMCkgLSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjIxNzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MDA0NzRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NzYxMjhmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NDg4MTFmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MTgxNjJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42ODM3NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NDUxODdmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NTMzMTZmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTg4MTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40Mzc2NTlmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNjkwNDNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTIwNTRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDU2NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMDg3NDlmCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIExWRVFOQl9HYWluXzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIExWRVFOQl9HYWluXzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIExWRVFOQl9HYWluXzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfR0FJTlNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTY4NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgyMjE3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTYzOSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgwMDQ3NCAqLwpAQCAtNTgsMTQgKzkwLDMwIEBACiAjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjAxMTg3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3ODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDU3MGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI0ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzOTNmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjYyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxOTZmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE0MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgorI2VuZGlmCisKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9GUkVRU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA3ODUgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDU3MCAqLwpAQCAtNzYsMTQgKzEyNCwzMSBAQAogI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA1MEQgdGFibGUgZm9yIDUwIC8gKCAxICsgR2FpbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS42MjM0MTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy45ODEwNzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTgzODNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45OTUyNjJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40MTI1MzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDBmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfMTAwRFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzk5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuNjIzNDEzICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS4wMTE4NzIgKi8KQEAgLTEwMSw2ICsxNjYsNiBAQAogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjU4OTI1ICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4xMjIwMTggKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAqLwotCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKaW5kZXggMTBlN2Q3NC4uYzI5MGFlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpAQCAtMTQwLDggKzE0MCwxMiBAQAogdm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewotCisjaWZkZWYgSElHSEVSX0ZTCisgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbHNlCiAgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0xNTgsMTEgKzE2MiwxNSBAQAogICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2Vsc2UKICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyIHNldCB0aGUgdHlwZSBvZiBiaXF1YWQgcmVxdWlyZWQKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uOyAgICAgICAgIC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKICAgICAgICAgewogICAgICAgICAgICAgLyoKQEAgLTE3Nyw3ICsxODUsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKICAgICAgICAgfQotCisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBmb3Igb3V0IG9mIHJhbmdlIGZyZXF1ZW5jaWVzCkBAIC0yMzAsNiArMjM4LDI1IEBACiAgICAgICAgIEJpcXVhZFR5cGUgPSBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldOwogICAgICAgICBzd2l0Y2ggIChCaXF1YWRUeXBlKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbHNlCiAgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb246CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CkBAIC0yNjksNiArMjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODgsNyArMzE2LDcgQEAKIC8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQogewogICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CkBAIC0zMDUsOCArMzMzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwogICAgIH0KIH0KKyNlbHNlCit2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCit7CisgICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKIAorICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwogCisgICAgaWYgKE51bVRhcHMgIT0gMCkKKyAgICB7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIH0KK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIyLDkgKzQ2NiwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKICAgICAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAuMGYpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7Ci0KKyNlbmRpZgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICB9CkBAIC00MzIsMTUgKzQ4MCwxOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAxLjBmKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotCiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgICAgIH0KIApAQCAtNDcwLDggKzUyMSwxMyBAQAogICAgICAvKgogICAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAogICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyNlbHNlCiAgICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDB4MDAwMDAwMDApICYmCiAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworI2VuZGlmCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgICAgICBpZiAoQ2FsbEJhY2sgIT0gTFZNX05VTEwpewogICAgICAgICAgICAgQ2FsbEJhY2socEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwgQUxHT1JJVEhNX0VRTkJfSUR8TFZFUU5CX0VWRU5UX0FMR09GRik7CkBAIC00ODUsOSArNTQxLDMgQEAKIAogICAgIHJldHVybiAxOwogfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGUwMWMxYzUuLmRlMWJiYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTk3LDYgKzk3LDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkpOworICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7CisgICAgICAgIC8qIEJpcXVhZCB0eXBlcyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwpAQCAtMTA3LDYgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7ICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOyAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7CkBAIC0xMTcsMTIgKzEzMywyMiBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWRVFOQl9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfQ09FRjsKQEAgLTEzMyw4ICsxNTksMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CkBAIC0yNDgsOCArMjgwLDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAKIAogCkBAIC0yNTksOSArMjk4LDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyNlbHNlCiAgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwogICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisjZW5kaWYKICAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwpAQCAtMjc5LDggKzMyNCwxMyBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fSU5UMTYgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwpAQCAtMzA4LDE1ICszNTgsMjIgQEAKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKIAorCiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgMS4wZik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9NQVhJTlRfMTYpOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fRlNfODAwMCwyKTsKKyNlbmRpZgogCiAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgID0gTFZNX0ZBTFNFOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggOWRmOTgwYy4uNTZiMDJlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtNjAsNiArNjAsOSBAQAogLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0ID0gLTEsCisjZW5kaWYKICAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uID0gMCwKICAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uID0gMSwKICAgICBMVkVRTkJfT3V0T2ZSYW5nZSAgICAgID0gMiwKQEAgLTg0LDExICs4NywyMCBAQAogICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcEVRTkJfVGFwc19GbG9hdDsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQ7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZWxzZQogICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgICAgICAqcEVRTkJfVGFwczsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGU7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZW5kaWYKIAogICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwpAQCAtOTYsNyArMTA4LDEyIEBACiAgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgICAgICAgICAqcEJpcXVhZFR5cGU7ICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIAogICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICBCeXBhc3NNaXhlcjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB1c2VkIGluIHRyYW5zaXRpb25zICovCisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KIAogfSBMVkVRTkJfSW5zdGFuY2VfdDsKQEAgLTExNCw3ICsxMzEsMTEgQEAKIHZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlKTsKIAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICpwSW5zdGFuY2UpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CkBAIC0xMjIsNiArMTQzLDcgQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworI2VuZGlmCiAKIExWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkICpwR2VuZXJhbFB1cnBvc2UsIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDU4ZjU4ZWQuLjYzMjgxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTU3LDcgKzU3LDEyMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworCisKKyAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLworICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKKyAgICB9CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKworICAgIC8qCisgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKKyAgICAgICAgICovCisKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQorI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMTk4LDMgKzMxMiw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwppbmRleCA4ZTJlMGU4Li41NjMxODFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpAQCAtMzYsNiArMzYsMjAgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCit9OworI2Vsc2UKIGNvbnN0IExWTV9VSU5UMTYgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCkBAIC00NCw4ICs1OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAKK307CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01Niw2ICs3MSwyMiBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCkBAIC02NSwxMCArOTYsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMH07ICAgIC8qIDQ4a1MvcyAqLworI2VuZGlmCiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfR2FpblRhYmxlW10gPSB7TFZFUU5CX0dhaW5fTmVnMTVfZEIsICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMF9kQiwgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8zX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl82X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl85X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKQEAgLTEwMSwxMCArMTY2LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCi0KKyNlbmRpZgogLyoKICAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCkBAIC0xMjIsNyArMjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KIAotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCmluZGV4IDI4ZTMzNjkuLjljMmUyOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtMTA3LDggKzEwNywxNCBAQAogCiAgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbHNlCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFQ2MDsgICAgICAgICAgICAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQsIGluIG1zICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERlbnNpdHk7ICAgICAgICAgICAgICAgIC8qIEVjaG8gZGVuc2l0eSwgMCB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBkZW5zaXR5ICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERhbXBpbmc7ICAgICAgICAgICAgICAgIC8qIERhbXBpbmcgKi8KQEAgLTI5NywxMSArMzAzLDE3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwppbmRleCBhYzJlZjlkLi5lNzEwODQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCkBAIC00MSw2ICs0MSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSkKIHsKIApAQCAtNTkzLDggKzU5NCw1ODkgQEAKIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQorI2Vsc2UgLyogQlVJTERfRkxPQVQqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCit7CisKKyAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKKyAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOwogCiAKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fRk9fSFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgIENvZWZmcy5BMSA9IDA7CisgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7CisgICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKworICAgICAgICAgICAgICAgIFRlbXAxPShMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX1VJTlQzMikoVGVtcDEgKiBTY2FsZVRhYmxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKKyNlbHNlCisgICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyA0ODAwMDsKKyNlbmRpZgorICAgICAgICAgICAgcFByaXZhdGUtPkRlbGF5X0FQW2ldID0gcFByaXZhdGUtPlRbaV0gLSBUZW1wOworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIHRhcCBzZWxlY3Rpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEIgdG8gdGFwIEEgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDEuMGY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDE7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIExpbWl0IHRoZSBtYXhpbXVtIGJsb2NrIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7CisgICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EYW1waW5nKSAgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fSU5UMzIgICAgICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBpOworICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgICAgICAgICAgQ29lZmZzLkExID0gMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1tpXSwgJkNvZWZmcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIEFsbC1wYXNzIGZpbHRlciBtaXhlciB0aW1lIGNvbnN0YW50cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgIExWTV9GTE9BVCAgIEFscGhhOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKKworICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgQWxwaGFUYXAgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEFQX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSAgICAgICA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhICAgID0gQWxwaGE7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdbNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBHWzNdID0gMDsKKyAgICAgICAgICAgIEdbMl0gPSAwOworICAgICAgICAgICAgR1sxXSA9IDA7CisgICAgICAgICAgICBHWzBdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAxOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDI7CisgICAgICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOworICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcEc7CisgICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgICAgICBMVk1fRkxPQVQgSW5kZXhfRkxPQVQ7CisgICAgICAgIExWTV9JTlQzMiBpPTA7CisgICAgICAgIExWTV9GTE9BVCBHYWluPTA7CisgICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZT0wOworICAgICAgICBMVk1fRkxPQVQgVDYwOworICAgICAgICBMVk1fRkxPQVQgQ29lZnNbNV07CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplOworICAgICAgICB9CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRha2UgdGFibGUgdmFsdWVzIGlmIHRoZSByb29tIHNpemUgaXMgaW4gdGFibGUgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisgICAgICAgICAgICBHYWluID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLworCisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsR2FpbjI7CisgICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKKworICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKKworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKworICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworCisgICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisKKyAgICAgICAgICAgIC8qIExpbmVhciBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiAqLworICAgICAgICAgICAgR2FpbiA9IEdhaW4xICsgKCgoR2FpbjIgLSBHYWluMSkgKiBEaXN0KSAvIChUb3RfRGlzdCkpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQorICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKKyAgICAgICAgICovCisgICAgICAgIGlmKEdhaW4gPCAxKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgPSBiOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uVGFyZ2V0ID0gYjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50CisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpICAgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLworICAgICAgICBMVk1fRkxPQVQgICAgQWxwaGE7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uQWxwaGEgPSBBbHBoYTsKKworICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQllQQVNTTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCBOdW1DaGFubmVscyk7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKKyAgICB7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMC4wMzEyNWY7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCisgICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zOworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlOworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBmbGFnCisgICAgICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKKyAgICB9CisKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKaW5kZXggNmJiMWU4OC4uOTQ5MTAxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCkBAIC02MSwxNiArNjEsMjYgQEAKICAgICAgKiBDbGVhciBhbGwgZmlsdGVyIHRhcCBkYXRhLCBkZWxheS1saW5lcyBhbmQgb3RoZXIgc2lnbmFsIHJlbGF0ZWQgZGF0YQogICAgICAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgMik7CisjZWxzZQogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwotCisjZW5kaWYKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CkBAIC04MCwyNCArOTAsNDYgQEAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMl9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KIAogICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9CiAKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMSkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KLQogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYwppbmRleCBmZmE1MTM4Li4zMzY2YmNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKQEAgLTEwOCwxMSArMTA4LDI5IEBACiAgICAgLyoKICAgICAgKiBaZXJvIGFsbCBtZW1vcnkgcmVnaW9ucwogICAgICAqLwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworI2Vsc2UKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwpAQCAtMTQ2LDcgKzE2NCw3IEBACiAgICAgICogU2V0IHRoZSBkYXRhLCBjb2VmZmljaWVudCBhbmQgdGVtcG9yYXJ5IG1lbW9yeSBwb2ludGVycwogICAgICAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBkYXRhIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKQEAgLTE5MCw3ICsyMDgsNjcgQEAKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwogICAgIH0KKyNlbHNlCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKIAorICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKyNlbmRpZgogICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCiAgICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKICAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwpAQCAtMjAwLDEwICsyNzgsMTkgQEAKIAogCiAgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCiAgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLwogICAgIExvYWRDb25zdF8zMigwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplKjIpKTsKLQorI2Vsc2UKKyAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSAqIDIpKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKQEAgLTI1Miw5ICszMzksMTMgQEAKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAweDAzZmZmZmZmOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKLQorI2Vsc2UKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKQEAgLTI3Nyw3ICszNjgsMTEgQEAKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKKyNlbHNlCisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDE7CisjZW5kaWYKICAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYwppbmRleCAyMDEyNDMyLi5mNmQ0NDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKQEAgLTE2MSwyMSArMTYxLDM3IEBACiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7CkBAIC0xOTUsMTQgKzIxMSwyNSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBUZW1wb3JhcnkgZmFzdCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyKnNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwotCisjZWxzZQorICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTAsNyArMjM3LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxOCw3ICsyNTAsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTwxOyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZiZmE0MzcuLmZmNzQ3NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTQyLDE2ICs0MiwyNyBAQAogLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogR2VuZXJhbCAqLwogI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAgICAgICAgICAgICAgIDIzMTcwICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgMTcxNzk4NjkgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KICNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgODE5MiAgICAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAgICAgICAgICAgMTU4Mzc2OTE5MEwgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCiAjZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAgICAweDVBODIgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2Vsc2UKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAwLjcwNzEwN2YgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAgICAwLjAwOGYgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KKyNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgMC4yNWYgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLworI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgICAgICAgICAgMi45ZiAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgIDAuNzA3OTQ1N2YgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2VuZGlmCiAKIC8qIEludGVuYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgMzI3NjgKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgICA0MzEyNQogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgIDU2NzU1CkBAIC02MSwxNCArNzIsNDcgQEAKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgICAyNDg5OCAgICAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAgMTg5MTkgICAgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgIDE0Mzc1ICAgICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZWxzZS8qQlVJTERfRkxPQVQqLworI2RlZmluZSBMVlJFVl9UNjBfU0NBTEUgICAgICAgICAgICAgICAgMC4wMDAxNDJmICAgICAgICAgICAvKigxLzcwMDApICovCisKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAgICAgMS4wZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgMS4zMTYwNzRmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAxLjczMjA1MWYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAgICAgICAgIDIuMjc5NTA3ZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgICAgICAxLjBmICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgIDAuNzU5ODM2ZiAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAwLjU3NzM1MGYgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgMC40Mzg2OTFmICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAgMzMyNiAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICAgNDM3NyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAgMTY4NSAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAgMjIxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAgMzg0MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2Vsc2UKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAxMDEwOAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDEzMzA0CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgMTc1MDgKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAyMzA0MAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICA2NzQwCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDg4NzIKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAxMTY3MgorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDE1MzYwCisjZW5kaWYKKwogI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDICAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgZGVseSB0YXAgY2hhbmdlICovCkBAIC03Niw3ICsxMjAsMTIgQEAKICNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCAgICAgICAgICAgICAgNSAgICAgICAgICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLwogCiAvKiBQYXJhbWV0ZXIgbGltaXRzICovCisjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2Vsc2UKKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNlbmRpZgorCiAjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KICNkZWZpbmUgTFZSRVZfTUFYX0xFVkVMICAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBsZXZlbCwgMTAwJSAqLwogI2RlZmluZSBMVlJFVl9NSU5fTFBGX0NPUk5FUiAgICAgICAgICAgICAgIDUwICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCkBAIC05NSw2ICsxNDQsNyBAQAogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTE2MSw3ICsyMTEsODEgQEAKIAogfSBMVlJFVl9JbnN0YW5jZV9zdDsKIAorI2Vsc2UgLyogQlVJTERfRkxPQVQgKi8KIAorLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBIUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgTFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgUmV2TFBUYXBzWzRdOyAgICAgICAgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIHRhcHMgKi8KKworfSBMVlJFVl9GYXN0RGF0YV9zdDsKKworCisvKiBGYXN0IGNvZWZmaWNpZW50IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEhQQ29lZnM7ICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIExQQ29lZnM7ICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2TFBDb2Vmc1s0XTsgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIGNvZWZmaWNpZW50cyAqLworCit9IExWUkVWX0Zhc3RDb2VmX3N0OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiB0aW1lIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICBNZW1vcnlUYWJsZTsgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyBmcm9tIHRoZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIG5ldyBwYXJhbWV0ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUgKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRmlyc3RDb250cm9sOyAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1peCBsZXZlbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgUm9vbVNpemVJbm1zOyAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGZvciBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworCisgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KKyAgICBMVlJFVl9GYXN0RGF0YV9zdCAgICAgICAqcEZhc3REYXRhOyAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2hEZWxheUxpbmVbNF07ICAgIC8qIERlbGF5IGxpbmUgc2NyYXRjaCBtZW1vcnkgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbmcqLworCisgICAgLyogRmVlZGJhY2sgbWF0cml4ICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgRmVlZGJhY2tNaXhlcls0XTsgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCisKKworICAgIC8qIEFsbC1QYXNzIEZpbHRlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFRbNF07ICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byBkZWxheSBidWZmZXJzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgRGVsYXlfQVBbNF07ICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gQVAgZGVsYXkgYnVmZmVyIHN0YXJ0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQUJfU2VsZWN0aW9uOyAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBBIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQl9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBCIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRBWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQiBkZWxheSB0YXAgKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9BUFRhcHNbNF07ICAgICAgICAgIC8qIFNtb290aGVkIEFQIGRlbGF5IG1peGVyICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkYmFja1s0XTsgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgIC8qIFNtb290aGVkIEFQIGZlZWRmb3J3YXJkIGdhaW4gKi8KKworICAgIC8qIE91dHB1dCBnYWluICovCisgICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBEcnkvd2V0IG1peGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIHNpZ25hbCBwb3dlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEdhaW5NaXhlcjsgICAgICAgICAgICAgICAgLyogR2FpbiBzbW9vdGhpbmcgKi8KKworfSBMVlJFVl9JbnN0YW5jZV9zdDsKKworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjksMTIgKzI5MywxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExWUkVWX1JldHVyblN0YXR1c19lbiAgIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fSU5UMzIgICAgICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQgICAgICAgKnBDYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIEdlbmVyYWxQdXJwb3NlICk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNWM3YThhMC4uNTY2ZDg0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNDYsMTQgKzQ2LDI2IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2Vsc2UKIExWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2VuZGlmCiB7CiAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworI2Vsc2UKICAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fSU5UMzIgKilwSW5EYXRhOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisjZW5kaWYKICAgIExWTV9JTlQzMiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgIGZvcm1hdCA9IDE7CiAKQEAgLTEwNSw3ICsxMTcsNyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGNvbnZlcnQgdG8gc3RlcmVvIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKICAgICAgICAgICAgICAgICBNb25vVG8ySV8zMihwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTExMyw2ICsxMjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAyKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8peworICAgICAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTQzLDkgKzE2NCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgUmV2ZXJiQmxvY2socElucHV0LCBwT3V0cHV0LCBwTFZSRVZfUHJpdmF0ZSwgKExWTV9VSU5UMTYpU2FtcGxlc1RvUHJvY2Vzcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOworICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyNlbHNlCiAgICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CkBAIC0xNzUsNyArMjAwLDcgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBSZXZlcmJCbG9jayhMVk1fSU5UMzIgKnBJbnB1dCwgTFZNX0lOVDMyICpwT3V0cHV0LCBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKICAgICBMVk1fSU5UMTYgICBqLCBzaXplOwpAQCAtNDc5LDcgKzUwNCwzMjIgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbHNlCit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQoreworICAgIExWTV9JTlQxNiAgIGosIHNpemU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBJbjsKKyAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKKyAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgorICAgICAqIHRoZW4gYmUgbWl4ZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gY3JlYXRlIHRoZSBmaW5hbCBvdXRwdXQuICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogV2hlbiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQgdGhpcyBtdXN0IGJlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgICAgKgorICAgICAqIGhlbmNlIHRoaXMgaXMgdGhlIHdvcnN0IGNhc2UsIHNvIGZvciBzaW1wbGljaXR5IHRoaXMgd2lsbCBBTFdBWVMgYmUgc28gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bnRvdWNoZWQgdW50aWwgdGhlIG91dHB1dCBvZiB0aGUgbWl4ZXIgaWYgICAgKgorICAgICAqIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIHRlbXAgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE51bVNhbXBsZXMgaW4gc2l6ZSByZWdhcmRsZXNzIG9mIE1PTk8gb3IgICAgKgorICAgICAqIFNURVJFTyBpbnB1dC4gSW4gdGhlIGNhc2Ugb2Ygc3RlcmVvIGlucHV0IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gTU9OTyAgICoKKyAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBwSW4gPSBwVGVtcDsKKyAgICB9CisKKyAgICBNdWx0M3NfRmxvYXQocEluLAorICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAorICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgIC8qCisgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgCisgICAgLyoKKyAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKKyAgICAgKi8KKworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKyAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKKyAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCisgICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBBcHBseSByb3RhdGlvbiBtYXRyaXggYW5kIGRlbGF5IHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKKyAgICB7CisKKyAgICAgICAgQ29weV9GbG9hdChwVGVtcCwKKyAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworICAgICAgICAvKgorICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICBTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBEZWxheSBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICB9CiAKIAorICAgIC8qCisgICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0CisgICAgICovCisgICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCisgICAgeworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6CisKKyAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworCisgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKKyAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvKgorICAgICAqICBEcnkvd2V0IG1peGVyCisgICAgICovCisKKyAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKKyAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgLyogQXBwbHkgR2FpbiovCisKKyAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyogRW5kIG9mIGZpbGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKaW5kZXggZjU4OTVhNy4uYTcxOTA1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC02MSwxMCArNjEsMTUgQEAKICAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KICAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgICAgKAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8Ci0gICAgICAgICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCmluZGV4IDVhNmQ0M2QuLmIzZWRjNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiBMVk1fRnNUYWJsZVtdID0gewogICAgIDgwMDAgLAogICAgIDExMDI1LApAQCAtNDAsMTQgKzQxLDM3IEBACiAgICAgNDQxMDAsCiAgICAgNDgwMDAKIH07Ci0KKyNlbHNlCitjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7CisgICAgODAwMCAsCisgICAgMTEwMjUsCisgICAgMTIwMDAsCisgICAgMTYwMDAsCisgICAgMjIwNTAsCisgICAgMjQwMDAsCisgICAgMzIwMDAsCisgICAgNDQxMDAsCisgICAgNDgwMDAsCisgICAgOTYwMDAsCisgICAgMTkyMDAwCit9OworI2VuZGlmCiAvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiBMVk1fVUlOVDE2IExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CiAgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfNDgwMDApCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7CiB9CisjZWxzZQorTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKK30KKyNlbmRpZgogCiAvKiBJbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0YW50IGlucHV0IGFuZCBvdXQgcHV0IHNpZ25hbCBzdHJlbmd0aHMKICAgIG91dHB1dCBnYWluL2F0dGVudWF0aW9uIGlzIGFwcGxpZWQuIFRoaXMgZ2FpbiBkZXBlbmRzIG9uIFQ2MCBhbmQgUm9vbXMKQEAgLTY5LDYgKzkzLDcgQEAKICAgKi8KIAogLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxNzU0NzQzNCwxMjg4Njc0MzQsLTEyMDk4ODg5Niw1MDc2MTIyOCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxODI1Njg2OSwxNzI2NjY5MDIsLTE5MzE2OTI5Miw4ODM0NTc0NCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywxNjU5MTMxMSwxMzkyNTAxNTEsLTE0OTY2NzIzNCw2Njc3MDA1OSx9LApAQCAtOTQsNiArMTE5LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwxNjAwMzMyMiw0ODMyMzY2MSwtMzU2MDczNzgsMTMxNTM4NzIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwxNTk1NTIyMyw0ODU1ODIwMSwtMzM3MDY4NjUsMTE3MTU3OTIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQorI2Vsc2UKK2NvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMS4wNDU5MDlmLDcuNjgxMDk4ZiwtNy4yMTE1MDBmLDMuMDI1NjA1Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxLjA4ODE5NGYsMTAuMjkxNzQ5ZiwtMTEuNTEzNzg3Ziw1LjI2NTgxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMC45ODg5MTlmLDguMjk5OTU2ZiwtOC45MjA4NjJmLDMuOTc5ODA2Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxLjAzNTkyN2YsMTAuMTgyNTY3ZiwtMTAuMzQ2MTM0Ziw0LjU0NjUzM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUsMS4xMzAzMTNmLDEyLjUzODcyN2YsLTEzLjYyNzAyM2YsNi4xNjUyMDhmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LDEuMDYwNzQzZiw4LjA5MTcxM2YsLTguNTg4MDc5ZiwzLjgzNDIzMGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMS4wNDAzODFmLDEwLjQwNjU2NmYsLTExLjE3NjY1MGYsNS4wNzUxMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4LDEuMDI2OTQ0Ziw4LjM4NzMwMmYsLTguNjg5Nzk2ZiwzLjg5NTg2M2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMS4wMTMzMTJmLDkuNzI3MjM2ZiwtMTAuNTM0MTY1Ziw0Ljc0MjI3MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDAuOTk2MDk1Ziw4LjQ5MjI0OWYsLTcuOTQ3Njc3ZiwzLjQ3ODkxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEzLDEuMDc5MzQ2Ziw4Ljg5NDQyNWYsLTkuNjQxNzY4Ziw0LjQzNDQ0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE1LDAuOTk0MzI3Ziw3LjQ0MTMzNWYsLTguMDAzOTc5ZiwzLjU4MTE3N2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDAuOTkxMDY3Ziw3LjIwODM3M2YsLTcuMjU3ODU5ZiwzLjE2Nzc3NGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIwLDEuMDMzNDQ1Ziw3LjQ3NjM3MWYsLTcuNTQ2OTYwZiwzLjM2OTcwM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI1LDAuOTgyODMwZiw1LjkxMzg2N2YsLTUuNjM4NDQ4ZiwyLjQyMDkzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwLDAuOTI4NzgyZiw1LjAzNTM0M2YsLTQuNDkyMTA0ZiwxLjg0NDkwNGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDAuOTUzNzE0Ziw1LjA2MDIzMmYsLTQuNDcyMjA0ZiwxLjgyOTY0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUwLDAuODk5MjU4Ziw0LjI3MzM1N2YsLTMuNTM3NDkyZiwxLjM4NzU3NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYwLDAuOTQzNTg0Ziw0LjA5MzIyOGYsLTMuNDY5NjU4ZiwxLjQxMDkxMWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDAuOTI2MDIxZiwzLjk3MzEyNWYsLTMuMzMxOTg1ZiwxLjM0NDY5MGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezc1LDAuODk0ODUzZiwyLjg3MTc0N2YsLTEuNDM4NzU4ZiwwLjMxMTg1NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDAuOTM1MTIyZiwyLjk5MTg1N2YsLTIuMDM4ODgyZiwwLjY4NjM5NWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezkwLDAuOTUzODcyZiwyLjg4MDMxNWYsLTIuMTIyMzY1ZiwwLjc4NDAzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwwLjk1MTAwNWYsMi44OTQyOTRmLC0yLjAwOTA4NmYsMC42OTgzMTZmLH0sCit9OworI2VuZGlmCiAvKiBFbmQgb2YgZmlsZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCmluZGV4IDVmOTkzYmQuLjA2NTgxODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCkBAIC0zNywxMCArMzcsMTkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgSElHSEVSX0ZTCiBleHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKIGV4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOwotZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiBjb25zdCAgICBMVk1fVUlOVDMyICBMVk1fRnNUYWJsZVtdOworZXh0ZXJuICAgICAgICAgIExWTV9VSU5UMzIgIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiAgICAgICAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKaW5kZXggYTY3NWNiMi4uMjAzOGZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTIxNiwxMSArMjE2LDE3IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOworI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCmluZGV4IGNkNWY2OWMuLmY2YzRlYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsMTUgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKQEAgLTM5LDcgKzQ4LDcgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWZmaWNpZW50cyk7Ci0KKyNlbmRpZgogTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKIApAQCAtMTc5LDcgKzE4OCwxMSBAQAogICAgIExWTV9VSU5UMTYgRnJlcTsKICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisjZW5kaWYKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKIAogCkBAIC0yNjcsOCArMjgwLDExIEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKIHsKLQorI2lmbmRlZiBISUdIRVJfRlMKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZWxzZQorICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0zNDIsMjYgKzM1OCw0MiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKQEAgLTM3NCw5ICs0MDYsMjYgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQwOSwxOCArNDU4LDMxIEBACiB7CiAgICAgTFZNX1VJTlQxNiAgICAgaWk7CiAgICAgTFZNX0ZzX2VuICAgICAgRnMgPSBwUGFyYW1zLT5GczsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBRUERfQzMyX0NvZWZzICAqcENvZWZmaWNpZW50czsKICAgICBleHRlcm4gICAgICAgICBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXTsKIAotCiAgICAgcENvZWZmaWNpZW50cyA9ICZMVlBTQV9RUERfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CisjZWxzZQorICAgIFFQRF9GTE9BVF9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworI2VuZGlmCiAKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQogICAgIHsKLSAgICAgICAgICAgIExWUFNBX1FQRF9Jbml0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZWxzZQorICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZQU0FfT0spOwpAQCAtNDYwLDYgKzUyMiw4NyBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ09TX1QwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOworICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CisgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvcyArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNgorICAgICAqLworICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gVDAgOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDT1NfVDAgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiAgICA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgID0gKGZhY3RvciAqIHQwKSA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAgICAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMCAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCkBAIC01NDEsNyArNjg0LDcgQEAKIAogICAgIHJldHVybihMVlBTQV9PSyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTg0LDYgKzcyNyw5MCBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CisgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKKyAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgZXJyb3IgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0CisgICAgICovCisgICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICB0MCA9IFQwOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENvc0VyciArPSBmYWN0b3IgKiBjb2VmOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gQjEgKiBDb3NFcnIgOyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KKyAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKQpAQCAtNjY2LDcgKzg5Myw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5MCwxMSArOTE3LDE3IEBACiAKICAgICAvKiBCYW5kIFBhc3MgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cEJQX1RhcHM7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKyNlbHNlCiAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCk7IGkrKykKICAgICB7CiAgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKICAgICB9Ci0KKyNlbmRpZgogICAgIC8qIFF1YXNpLXBlYWsgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cFFQRF9UYXBzOwogICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCk7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCmluZGV4IDI3YTRiYzMuLjFjMjY4NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpAQCAtNDcsNyArNDcsMTEgQEAKICAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICAgKnBMVlBTQV9JbnN0OwogICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBlcnJvckNvZGUgICAgICAgPSBMVlBTQV9PSzsKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgaWk7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgICAgIExWUFNBX0dhaW5UYWJsZVtdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgICAgICAgICAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CisjZW5kaWYKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gMDsKIAogICAgIC8qIEludHNfQWxsb2MgaW5zdGFuY2VzLCBuZWVkZWQgZm9yIG1lbW9yeSBhbGlnbm1lbnQgbWFuYWdlbWVudCAqLwpAQCAtMTQxLDE5ICsxNDUsMzcgQEAKIAogCiAgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UMTYpICk7CisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7CiAgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOworICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOwogCisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOworI2VuZGlmCiAKICAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLwogICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKQEAgLTE2NCw3ICsxODYsMTIgQEAKICAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPShMVk1fVUlOVDE2KSBMVlBTQV9HYWluVGFibGVbcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiArIDE1XTsKKyNlbHNlCisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9IExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2Fpbl07CisjZW5kaWYKICAgICB9CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKaW5kZXggMDk4NGIxMC4uMDZhOGY5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwpAQCAtMTA2LDcgKzEwNiwxMSBAQAogICAgICAgICAgKi8KIAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworI2VuZGlmCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogCiAgICAgICAgIHsKQEAgLTEzNCw3ICsxMzgsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9JTlQxNikgKTsKKyNlbHNlCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE0Miw4ICsxNTAsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBjb2VmZmljaWVudHMgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1N0YXRlX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE1MSw4ICsxNjQsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBkYXRhIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkRhdGEpOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggMDM1MjJmYi4uYTc1MGJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC00Myw4ICs0MywxMSBAQAogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiovCisjZWxzZQorI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNlbmRpZgogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAjZGVmaW5lIExWUFNBX01BWEJVRkZFUkRVUkFUSU9OICAgICAgICAgIDQwMDAgICAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtcyBvZiB0aGUgbGV2ZWxzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05MywxMiArOTYsMjcgQEAKICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CiAKICAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqcEJQRmlsdGVyc1ByZWNpc2lvbjsgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgKi8KICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAqcEJQX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgKi8KICAgICBRUERfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgKi8KICAgICBRUERfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKyNlbHNlCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBCUF9UYXBzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgKi8KKyAgICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsKKyNlbmRpZgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisjZWxzZQorICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7CisjZW5kaWYKICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwppbmRleCA5ZTI5ZjY4Li5lYTVmNzRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKQEAgLTQzLDYgKzQzLDk2IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKKworeworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENIRUNLIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKKyAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQUk9DRVNTIFNBTVBMRVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCisgICAgQ29weV9GbG9hdChwTFZQU0FfSW5wdXRTYW1wbGVzLCBwU2NyYXRjaCwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgU2hpZnRfU2F0X0Zsb2F0KC0xLCBwU2NyYXRjaCwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICBzd2l0Y2gocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICAgKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWkpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBVUERBVEUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKEF1ZGlvVGltZSArIChMVk1fSU5UMzIpKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50KjEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KQorICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLApAQCAtMTMwLDcgKzIyMCw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKaW5kZXggODM2YmZkNy4uOTlkODQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApAQCAtMzEsNiArMzEsMTUgQEAKICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfVFQRF9GTE9BVF9TdGF0ZV90LCAqcFFQRF9GTE9BVF9TdGF0ZV90OworI2VuZGlmCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCkBAIC0zOCwxMiArNDcsMzAgQEAKIAogfSBRUERfQzMyX0NvZWZzLCAqUFFQRF9DMzJfQ29lZnM7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KKyAgICBMVk1fRkxPQVQgS007ICAgIC8qc2hvdWxkIHN0b3JlIGIyKi8KKworfSBRUERfRkxPQVRfQ29lZnMsICpQUVBEX0ZMT0FUX0NvZWZzOworI2VuZGlmCisKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsxXTsKIAogfSBRUERfVGFwc190LCAqcFFQRF9UYXBzX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsxXTsKKworfSBRUERfRkxPQVRfVGFwc190LCAqcFFQRF9GTE9BVF9UYXBzX3Q7CisKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNiArODksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgwLDggKzExMywxMiBAQAogdm9pZCBMVlBTQV9RUERfSW5pdCAoICAgUVBEX1N0YXRlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9UYXBzX3QgICAgICAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgICpwQ29lZiAgICAgKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAogCi0KK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAqcENvZWYgICAgICk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCmluZGV4IDUwZTBhODAuLjJjYzMyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC00MCwzICs0MCwxNCBAQAogICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9IHBDb2VmLT5LUDsKICAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSBwQ29lZi0+S007CiB9CisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgcFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgICpwQ29lZiAgICAgKQoreworICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LTSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKaW5kZXggNjcxOTdjMS4uZTIzMzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKQEAgLTM1LDEyICszNSwxNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBWYWx1ZSAgICk7CiAKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKTsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNiArNTgsNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLApAQCAtMTczLDcgKzE3OCwxMzEgQEAKICAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7CiAgICAgfQogfQorI2Vsc2UKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKK3sKIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfRkxPQVRfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfRkxPQVRfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOworCisgICAgLyogUG9pbnRlciB0byB0YXBzICovCisgICAgTFZNX0ZMT0FUKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7CisKKyAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgICBYMDsKKyAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOworICAgIExWTV9GTE9BVCAgIGFjY3U7CisgICAgTFZNX0ZMT0FUICAgWGcwOworICAgIExWTV9GTE9BVCAgIEQwOworICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CisKKyAgICAvKiBGaWx0ZXIncyBjb2VmICovCisgICAgTFZNX0ZMT0FUICAgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOworICAgIExWTV9GTE9BVCAgIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKKworICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKworICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBJTklUSUFMSVpBVElPTgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLworICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKKyAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKKworICAgIHdoaWxlIChpaSA+IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KKyAgICAgICAgLyogLSAxIHRvIGNvbXBlbnNhdGUgc2NhbGluZyBpbiBwcm9jZXNzIGZ1bmN0aW9uKi8KKyAgICAgICAgWDAgPSAoKnBJblNhbXBzKSAqIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW0JhbmRJbmRleF07CisgICAgICAgIHBJblNhbXBzID0gcEluU2FtcHMgKyBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgLyogU2F0dXJhdGUgYW5kIHRha2UgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgaWYoWDAgPCAwLjBmKQorICAgICAgICAgICAgWDAgPSAtWDA7CisgICAgICAgIGlmIChYMCA+IDEuMGYpCisgICAgICAgICAgICBYZzAgPSAxLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBYZzAgPVgwOworCisKKyAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgRDAgID0gWGcwIC0gVjA7CisKKyAgICAgICAgdGVtcDIgPSBEMDsKKworICAgICAgICBhY2N1ID0gdGVtcDIgKiBLcDsKKyAgICAgICAgRDAgICAgPSBEMCAvIDIuMGY7CisgICAgICAgIGlmIChEMCA8IDAuMGYpeworICAgICAgICAgICAgRDAgPSAtRDA7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wMiA9IEQwOworCisgICAgICAgIHRlbXAgPSBEMCAqIEttOworICAgICAgICBhY2N1ICs9IHRlbXAgKyBYZzA7CisKKyAgICAgICAgaWYgKGFjY3UgPiAxLjBmKQorICAgICAgICAgICAgYWNjdSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYoYWNjdSA8IDAuMGYpCisgICAgICAgICAgICBhY2N1ID0gMC4wZjsKKworICAgICAgICBWMCA9IGFjY3U7CisKKyAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOworCisgICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgLT0gcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlOworICAgICAgICAgICAgcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ID0gKExWTV9VSU5UMTYpKG51bVNhbXBsZXMgLSBpaSk7CisgICAgICAgIH0KKyAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ICs9IERvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gRG93blNhbXBsaW5nRmFjdG9yKTsKKworICAgIH0KKworICAgIC8qIFN0b3JlIGxhc3QgdGFwcyBpbiBtZW1vcnkgKi8KKyAgICAqcERlbGF5ID0gVjA7CisKKyAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGFmdGVyIGxhc3QgYmFuZCBwcm9jZXNzaW5nLAorICAgICAgIHVwZGF0ZSB0aGUgcGFyYW1ldGVycy4gKi8KKyAgICBpZihCYW5kSW5kZXggPT0gKHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzIC0gMSkpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCisgICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKKyAgICB9Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwOSw0ICszMzgsMjMgQEAKICAgICAqcHBXcml0ZSA9IHBXcml0ZTsKIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOwogCisgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSAqIDI1Nik7CisgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisgICAgfQorCisgICAgKnBwV3JpdGUgPSBwV3JpdGU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAyMWE1ZDhkLi4xMjg3NTAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKQEAgLTQzLDYgKzQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworI2Vsc2UKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw3ICs3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5fTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCiAKIApAQCAtODQsNyArMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTkyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzg0MCAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDIsNyArMTI2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAvKiAyNDAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAgICAgICAgICAgICAgICAgICAvKiAzMjAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyfTsgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyMiw4ICsxNTEsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyfTsgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW10gPSB7ICAwLjgwNDI4NDdmLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4MzYwNTRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MzYxNzk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDAyMTQyM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5MTc4NzRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjgxMDUxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjAxMDU1OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NTkwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMzQwMzcyZgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNjcwMTg2ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzM1MDkzZiAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyNlbmRpZgogLyoKICAqIEdhaW4gdGFibGUKICAqLwpAQCAtMTU5LDYgKzIxMCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NzZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4MSw3ICsyNjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAzOGYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA5ODZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxOTc3NWYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wODE1MTQ5ZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworI2VuZGlmCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgogICoKQEAgLTIwMSw3ICsyOTMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDgzMTFmLCAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwNjE3OTk5ZiwgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgICAgICAgICAgICAgICAgLyogYTMgKi8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM5LDMgKzMzNyw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdID0geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM1ODMzMzMyMTI4ODIzZiwwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMzY4NjYzMzU5NDMzNGYsMC4wMDY1MjIxNjcwMDgzNzAyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzA5NTgxMzUzMzI5MTIyZiwwLjIzMzE1NjgyMjYyMTgyMjRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCAwZDYyMjc0Li5lNzU2OTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMzc0LDEyICszNzQsMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwppbmRleCAzZTQ4YzdlLi4yOWUzYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCkBAIC03MCwxMSArNzAsMTcgQEAKIHsKIAogICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7CisjZW5kaWYKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX0J5cGFzc01peF90ICAgICpwQ29uZmlnICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudDsKKwogCiAKICAgICAvKgpAQCAtODUsNyArOTEsMTEgQEAKICAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KICAgICAgICAgKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IHBQYXJhbXMtPkVmZmVjdExldmVsOworI2Vsc2UKKyAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9ICgoTFZNX0ZMT0FUKXBQYXJhbXMtPkVmZmVjdExldmVsIC8gMzI3NjcpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMDIsMjMgKzExMiw0NiBAQAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKyNlbHNlCisgICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworI2VuZGlmCiAKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMHg3RkZGIC0gcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwogICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sKExWTV9JTlQzMikoR2FpbiA+PiAxNSksQ3VycmVudCk7CiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDEuMCAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOworICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKKyAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOwpAQCAtMTM0LDcgKzE2Nyw3IEBACiAgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCiAgICAgICovCiAgICAgewotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbkNvcnJlY3Q7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjE7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjI7CkBAIC0xNzIsNiArMjA1LDQzIEBACiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yPj4xNik7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW5Db3JyZWN0OworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4xOworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4yOworCisgICAgICAgIEdhaW4xID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgICAgICBHYWluMiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKKyAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZ2FpbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPk91dHB1dF9TaGlmdCA9IHBDb25maWctPk91dHB1dF9TaGlmdDsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sR2FpbjEpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CkBAIC0yMDYsOSArMjc2LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwVW5wcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQogewogCkBAIC0yMjMsNiArMjk5LDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFVucHJvY2Vzc2VkLApAQCAtMjM2LDYgKzMxMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZWxzZQorICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikgcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAorICAgICAgICAgKi8KKyAgICAgICAgU2hpZnRfU2F0X0Zsb2F0KChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCmluZGV4IGQxZWY3MGEuLmY2OWJhMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKQEAgLTQyLDEyICs0MiwxNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBNaXhlciBzZXR0aW5ncyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLworI2VuZGlmCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KIAogfSBMVkNTX0J5cGFzc01peF90OwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIE91dHB1dCBnYWluIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC01Niw4ICs2MCwxNSBAQAogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLwogfSBHYWluX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCit9IEdhaW5fdDsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY3LDEzICs3OCwxOSBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnVuUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnVuUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYwppbmRleCBjZTZkNDEwLi4zYmY2ZWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKQEAgLTEyMCwxMSArMTIwLDEzIEBACiAgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKICAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAgICAgICAgICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogTFZNX01BWElOVF8xNik7CkBAIC0xNDAsNyArMTQyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgR2FpbjsKKyAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MpOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2Fpbik7CiAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdhaW4gPSAoR2FpbiAqIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluKTsKKworICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCBHYWluKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgICAgIH0KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKaW5kZXggMjViMGQ4Ni4uZWM1MzEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpAQCAtNTMsNyArNTMsNzIgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDEgKyBMVk1fRlNfNDgwMDApKSk7CisgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMTIsNyArMTc3LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMiw3ICsxOTcsMzcgQEAKIC8qICAxLiAgQWx3YXlzIHByb2Nlc3NlcyBpbiBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCkBAIC0xNTcsNCArMjUyLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAppbmRleCBjZjk2ZjViLi4wZTc1NmU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCkBAIC0zMiw4ICszMiwxMSBAQAogLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIHZvaWQgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19FcXVhbGlzZXJfdDsKIAogCkBAIC00NSwxMiArNDgsMTUgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggM2U2NDBjYi4uNGY1MjIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0yNCw3ICsyNCw0NjMgQEAKIC8qIFRoZSBTdGVyZW8gRW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjEyNTggKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyNzcyMAorI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE1MTI1CisjZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkyMTg5OQorI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYxMTQ0MQorI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ0CisjZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMzEwOTcKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYyMjQ3MAorI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTMwNzU5CisjZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2Mjk0MyAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwODM4CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE1NTkKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTQzMDU2CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU3MzcyCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTE0OTAKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NTg4MQorI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODgwNjA4CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzIzOTcKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyOTkzMgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTQzNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0wLjk0NzYxNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU4Mzk4CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTIyMTEKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NjE4NworI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkyNTUwCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzI4NTYKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDYzOAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MjMyCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk2MDU1MAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC40OTk2OTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM1NTU0MworI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTQ0MTUyCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTA3ODgKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NDEwNAorI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDc4MSAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NzQ5CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQxMjgKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTcxMjYyCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDAxMTIKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjEwOTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNzkwMTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMTY3ODYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODI1MDcKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjE4ODIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwMzk1CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNjExNworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczNTczCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTQ3NzAKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg3MTgyCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEyNzU4OAorI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjk2NDgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgyMTc3CisjZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwMzIyICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg0MDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNTIxNAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC45ODAxMjYKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzY0NTc5CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDczNTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE1NzIyNAorI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjc0MjMxCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTI0OTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM1OTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzEyMjUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODU1NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yODQ1NzMKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yNTg5MTAKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMjU2NjIKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS41NzIyNDgKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41ODgzOTkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM0NDQ1CisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMyMjYxCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg2NzEzCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI3MjYwNgorI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNjY5NTIKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA1NjU0CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjYxNzE0MQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC42MzA0MDUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2lmZGVmIEhJR0hFUl9GUworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KKy8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjM0NDMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTkzMzM0CisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNworI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDE2NzI3CisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjc5MzM3MgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjI0MDY1NgorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTk2NjYxCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKy8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDg5OTEKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjg5MjUwOQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFJldmVyYiBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2ODE3OQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAtMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAtMC43NDkwOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgIC0wLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuODIwNjc5CisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjUxODUxMgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjI5MDk5MAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC40Nzk1NjUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC42Mzc3NDUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIC0wLjE5ODkxMgorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0OQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC45NTA4NzMKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDQ5MTI3CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjk3Mzg5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIwMDQyMworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTY1MjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI3ODY2MQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjI1NDk5MworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMzAzMzQ3CisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNpZmRlZiBISUdIRVJfRlMKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMTYwMjQ4OAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTg1NDEzCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjc3NjU3NjQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjZW5kaWYKKworCisvKiBSZXZlcmIgR2FpbiBTZXR0aW5ncyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gICAgICAgICAgICAgICAwLjgwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAgICAgICAgICAgICAgMS4wMDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4gICAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBQcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4gICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU5DT1JSRUNUICAgICAgICAgICAgIDEuMDA5MzQzICAgICAgICAgLyogRGVsYXkgbWl4ZXIgZ2FpbiBjb3JyZWN0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIEVxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjYzMzEyCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC42MDE3NDgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjI4MDY4MQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC45NDMzNTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMC40NDkzNDUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAtMC4yMDk1OTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAxLjEwMTE0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIDAuMTM5MDIwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC44NjQ0MjMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAwLjAyNDU0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuOTA4OTMwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAwLjk3NjA1OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAtMC42OTUzMjYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTAuMDkwODA5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgIC0wLjYxMDU5NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAtMC4zMTExNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDEuMjc2NjYxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0xLjAxNzUxOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wNDQxMjgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuNzI5NjE2CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0wLjIwNDUzMgorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgMS4wMDcwOTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgLTAuODcxOTEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAwLjAyMzIzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAtMC43NDU4NTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgLTAuMTg5MTcxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDMxMzc4IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcwMTY0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjgxNjI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuMDc1ODcyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDQxMzY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNzI1MjM5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMjI0MzU4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgMS4wODEwOTEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgIC0wLjg2NzE4MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgLTAuMDcwMjQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAtMC41MTUxMjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjQyNTg5MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjA0MTU3NiBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3Nzc3OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4zODg2MDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzA1Nzk5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjAzOTkyMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAtMC43MTk0OTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMjQzMjQ1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMjcyOTEwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzQxMDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMTY3NDYyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNjE0MjE5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMzQ1Mzg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDM0NDk1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcyNDkxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS40MDk4MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgIC0xLjQ1NjUwNgorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTUxNDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC44MDQyMDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC0wLjE2Mzc4MworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMjk5MTk4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAtMS40NTI0NDcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAwLjI0MDQ4OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjY5MzAzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAtMC4yOTQ5ODQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDQ1NTkgYW5kIENTRVggc2NhbGVkIHdpdGggMC43ODAwMDYgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS41NjA5ODgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMS44Nzc3MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4zODk3NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45MDc0MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4wNzA0ODkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAxLjc4NTA0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjMzNDk3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgMC41MjY0MzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjQ0NTkzOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuNTIyNDQ2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgIDEuNjIzOTkzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjcwNzQzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgIDAuNjg4ODI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgLTEuMTE3MTkwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIDAuMTMwMjA4CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDIuMDI4MzE1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgLTIuODgyNDU5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgIDAuOTA0NTM1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgLTAuNTkzMzA4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgLTAuMzg1ODE2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS42NDExNzcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgIC0yLjM2NDY4NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuNzU5OTEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS4xNjY3NzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjE3ODA3NAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgIDIuMDk5NjU1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAtMy4wNjUyMjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAxLjAxMDQxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjM0MDIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAtMC4zNDczMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjAwMTQzNQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuMjI4NDIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS40Nzc4MDQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjQ4MTM2OQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgIDIuNzU3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgLTQuNjcyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgIDEuOTMxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuOTcxNzE4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAtMC4wMjEyMTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjQ1NjE0MAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjU2OTg2NAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjcwMDc5OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjcwMTgyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgMy40MjczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgLTYuMjkzNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAyLjg3MjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAtMS4zMTA3NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgIDAuMzEzMTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZW5kaWYKKworCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMC44NDc3NzM1ICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgIDAuMjA4NzQ2NSAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAwLjU2OTIyNSAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgMC4wNzc5NDQyNSAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2Vsc2UKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjc3MjAgKi8KICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTcwNDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTUxMjUgKi8KQEAgLTM5NCw1ICs4NTAsNiBAQAogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgIDE4NjAwICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLwogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgNTEwOCAgICAgICAgICAgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0KICNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCmluZGV4IDE5MDRlNDYuLmQ0Yzc2MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwpAQCAtOTgsNyArOTgsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2Vsc2UKICAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZDU19TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOyAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xOTAsNiArMTk2LDcgQEAKICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKwogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBmM2FkYjhkLi5hOTdlNGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTk1LDEwICs5NSwxNyBAQAogLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgQ29tcEZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgQ29tcE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIEdhaW5GdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgR2Fpbk1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworI2VuZGlmCiB9IExWQ1NfVm9sQ29ycmVjdF90OwogCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KQEAgLTExMiw4ICsxMTksMTMgQEAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KICAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLwogICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFRyYW5zaXRpb25HYWluOyAgICAgLyogVHJhbnNpdGlvbiBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgQ29tcHJlc3NHYWluOyAgICAgICAvKiBMYXN0IHVzZWQgY29tcHJlc3NvciBnYWluKi8KKyNlbmRpZgogCiAgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCiAgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLwpAQCAtMTM0LDI0ICsxNDYsMzUgQEAKIC8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7CisjZWxzZQogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0NvZWZmaWNpZW50X3Q7CiAKIC8qIERhdGEgU3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7CiAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOwogICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0RhdGFfdDsKIAotCiB2b2lkIExWQ1NfVGltZXJDYWxsQmFjayAoICAgdm9pZCogaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwppbmRleCA1ZDk5NDYxLi4zOTU2ZDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKQEAgLTY2LDcgKzY2LDc3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKIAorICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCisgICAgICovCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCisgICAgICovCisgICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0xMzMsNyArMjAzLDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2MCw3ICsyMzAsMTcwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWQ1NfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsIENTIHByb2Nlc3MgZnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CisgICAgICAgICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKKworICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBHYWluU3RlcDsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcE91dFB0cjsKKworICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAorICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KKworICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ09NUEdBSU5GUkFNRSkgLyBOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKKyAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47CisgICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOworCisgICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShHYWluICsgR2FpblN0ZXApOworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTFZDU19DT01QR0FJTkZSQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyICs9ICgyICogTFZDU19DT01QR0FJTkZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IChMVk1fSU5UMTYpKFNhbXBsZVRvUHJvY2VzcyAtIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogU2FtcGxlVG9Qcm9jZXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3JlIGdhaW4gdmFsdWUqLworICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOworICAgICAgICB9CisKKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlLWluaXQgYnlwYXNzIG1peCB3aGVuIHRpbWVyIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTFZNX1RpbWVyICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMzIxLDEzICs1NTQsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCmluZGV4IGVlMjU3YjguLjEwODUxMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTU3LDcgKzU3LDk4IEBACiAvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6CisgICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCisgICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KKworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGRlbGF5CisgICAgICAgICAqLworICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKKworCisgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSAgICAgID0gKExWTV9JTlQxNikoMiAqIERlbGF5KTsKKyAgICAgICAgcENvbmZpZy0+RGVsYXlPZmZzZXQgICAgPSAwOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwQ29uZmlnLT5TdGVyZW9TYW1wbGVzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXJzCisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1JldmVyYkNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIyOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7CisgICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgICAgIFJldmVyYlBlcmNlbnRhZ2UgKj0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWw7ICAvLyBBY3R1YWwgUmV2ZXJiIExldmVsIGluIFEgMjMgZm9ybWF0CisgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsID0gKChMVk1fRkxPQVQpKFJldmVyYlBlcmNlbnRhZ2U+PjgpKSAvIDMyNzY3LjBmOworICAgIH0KKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQogewpAQCAtMTQwLDcgKzIzMSw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzksNyArMjcwLDkxIEBACiAvKiAgMi4gIFRoZSBHYWluIGlzIGNvbWJpbmVkIHdpdGggdGhlIExQRiBhbmQgaW5jb3Jwb3JhdGVkIGluIHRvIHRoZSBjb2VmZmljaWVudHMgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGluIG91dHBsYWNlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldmVyYiBub3QgcmVxdWlyZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgLyogRGlzYWJsZSB3aGVuIENTNE1TIGluIHN0ZXJlbyBtb2RlICovCisgICAgaWYgKCgocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19IRUFEUEhPTkUpIHx8IFwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gc2NyYXRjaCBtZW1vcnkgYW5kIGZpbHRlciBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgaW5wdXQgZGF0YSB0byB0aGUgc2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsdGVyIHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgTXVsdDNzX0Zsb2F0KCAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjU3LDggKzQzMiw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2ZTAyNmZmLi42OTg5MmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC01OCwxNCArNTgsMjAgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFByb2NHYWluOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBVbnByb2NHYWluOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syKkxWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFpdOwotCiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwotCiAgICAgLyogRmlsdGVyICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CisgICAgLyogRmlsdGVyICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKIAogCkBAIC03NywxMiArODMsMTcgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwppbmRleCBiOWI4YjA1Li4yOTkyYzM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpAQCAtNDksNyArNDksMTAzIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzU2lkZTsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwU0VTaWRlQ29lZnM7CisKKworICAgIHBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHVwZGF0ZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgKi8KKyAgICAgICAgLyogTWlkIGZpbHRlciAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fRkxPQVQpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSA9PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCAgPSBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgfQorCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlKTsKKyAgICAgICAgcFNFU2lkZUNvZWZzID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1NFU2lkZUNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBTaWRlIGZpbHRlciAqLworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc1NpZGUuQTAgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNTaWRlLkEyID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmc1NpZGUuQjEgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzU2lkZS5CMiA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIyOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMzgsNyArMjM0LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3Nyw3ICsyNzMsOTAgQEAKIC8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQorICAgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01TX0Zsb2F0KHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgZmlsdGVyIHRvIHRoZSBtaWRkbGUgc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNdWx0M3NfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKKyAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICovCisgICAgICAgIE1TVG8yaV9TYXRfRmxvYXQocFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNTQsNyArNDMzLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKaW5kZXggMTViYzQwNy4uNDEyNWYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKQEAgLTQzLDE4ICs0MywzMSBAQAogLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIC8qCiAgICAgICogTWlkZGxlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCiAgICAgLyoKICAgICAgKiBTaWRlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KKyNlbHNlCisgICAgLyoKKyAgICAgKiBNaWRkbGUgZmlsdGVyCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfTWlkKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwogCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KLQorICAgIC8qCisgICAgICogU2lkZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisjZW5kaWYKIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCiAKQEAgLTY3LDEyICs4MCwxNyBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAqcFBhcmFtcyk7CiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwppbmRleCA5NzRkZTIxLi5lMTU0ZTI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCkBAIC03MSw3ICs3MSwxOSBAQAogICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV80ODAwMF9BMSwKICAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfX07CisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV85NjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCisgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTkyMDAwX1NDQUxFfQorI2VuZGlmCisgICAgfTsKIAogLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLwogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdID0gewpAQCAtMTMwLDYgKzE0MiwyMSBAQAogICAgICBDU19TSURFXzQ4MDAwX0IxLAogICAgICBDU19TSURFXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgLAorICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzk2MDAwX0ExLAorICAgICBDU19TSURFXzk2MDAwX0EyLAorICAgICBDU19TSURFXzk2MDAwX0IxLAorICAgICBDU19TSURFXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCisgICAgIENTX1NJREVfMTkyMDAwX0EyLAorICAgICBDU19TSURFXzE5MjAwMF9CMSwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0xOTUsNiArMjIyLDIwIEBACiAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAorI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIEVYIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KICAgICB7Q1NFWF9FUVVBTElTRVJfODAwMF9BMCwgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yNTEsNiArMjkyLDIxIEBACiAgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMzM0LDYgKzM5MCwyMSBAQAogICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCiAgICAgIENTX1JFVkVSQl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTX1JFVkVSQl85NjAwMF9BMCwgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl85NjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0EyLAorICAgICBDU19SRVZFUkJfOTYwMDBfQjEsCisgICAgIENTX1JFVkVSQl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19SRVZFUkJfMTkyMDAwX0EwLCAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTIsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTM4NSw2ICs0NTYsMjQgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezAuNDMzMzYyZiwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHsxLjAwMDAwMGYsICAgICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0KKyNlbHNlCiAgICAgezE0MjAwLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCiAgICAgIDAsCiAgICAgIDQwOTYsCkBAIC00MDEsNiArNDkwLDcgQEAKICAgICAgMCwKICAgICAgNDA5NiwKICAgICAgNTc4Nn0KKyNlbmRpZgogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxOCw4ICs1MDgsMjUgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2VuZGlmCiAKLQorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxMV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyMjA1MCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0NDEwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxOTIwMDAKK307CisjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLApAQCAtNDI4LDE1ICs1MzUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwCit9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTFdID0gezgwMDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisJCQkJCQkJCQkJCSAgMTIwMDAsCisJCQkJCQkJCQkJCSAgMTYwMDAsCisJCQkJCQkJCQkJCSAgMjIwNTAsCisJCQkJCQkJCQkJCSAgMjQwMDAsCisJCQkJCQkJCQkJCSAgMzIwMDAsCisJCQkJCQkJCQkJCSAgNDQxMDAsCisJCQkJCQkJCQkJCSAgNDgwMDAsCisJCQkJCQkJCQkJCSAgOTYwMDAsCisJCQkJCQkJCQkJCSAgMTkyMDAwCit9OworI2Vsc2UKK2NvbnN0IExWTV9JTlQxNiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCkBAIC00NDQsNSArNTY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggZWZkMzBmYi4uZjEwNmFhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCUJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJidW5kbGV3cmFwcGVyCkBAIC00Myw3ICs0Myw3IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnJldmVyYndyYXBwZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDFmZGRmOWMuLmFhZTgwYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMTQsNyArMTQsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBMVk1fRkxPQVQKK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOworI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCkBAIC0yOTcsNyArMjk5LDEwIEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxICAgICA9IDA7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgICAgICAgICAgICAgPSBOVUxMOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICAgICAgICAgICAgPSBOVUxMOworI2VuZGlmCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICAgICAgfQpAQCAtNDY1LDYgKzQ3MCwxNCBAQAogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwogICAgICAgICB9CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAgICAgfQpAQCAtNzIxLDcgKzczNCw0NyBAQAogICAgIHJldHVybiAwOwogfSAgIC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQxNkxUT0ZMT0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG86IG5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgSW50MTZUb0Zsb2F0KGNvbnN0IExWTV9JTlQxNiAqc3JjLCBMVk1fRkxPQVQgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICpkc3QgPSAoKExWTV9GTE9BVCkoKExWTV9JTlQxNikqc3JjKSkgLyAzMjc2OC4wZjsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRkxPQVRUT0lOVDE2X1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvIDogTmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBGbG9hdFRvSW50MTZfU0FUKGNvbnN0IExWTV9GTE9BVCAqc3JjLCBMVk1fSU5UMTYgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CiAKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKKyAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKKyAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgeworICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTHZtQnVuZGxlX3Byb2Nlc3MoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MzksNyArNzkyLDk5IEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBCVUlMRF9GTE9BVAoraW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RDb250ZXh0ICAgICpwQ29udGV4dCl7CiAKKworICAgIC8vTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRUbXA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmOworCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSAoTFZNX0ZMT0FUICopbWFsbG9jKGZyYW1lQ291bnQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICB9CisKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBmbG9hdCBidWZmZXIncyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcElucHV0QnVmZiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcjsKKyAgICBwT3V0cHV0QnVmZiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXI7CisKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CisgICAgICAgIHBPdXRUbXAgPSBwT3V0OworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgIT0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICB9CisgICAgICAgIHBPdXRUbXAgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBpbnZhbGlkIGFjY2VzcyBtb2RlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAjZW5kaWYKKworICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCisgICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIDIpOworCisgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0QnVmZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZG8gVGltZSAqLworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9Qcm9jZXNzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCisgICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgcE91dFRtcCwgKExWTV9VSU5UMTYpZnJhbWVDb3VudCAqIDIpOworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAjZW5kaWYKKworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspeworICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilwT3V0W2ldICsgKExWTV9JTlQzMilwT3V0VG1wW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCisjZWxzZQogaW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKQEAgLTc5Nyw3ICs5NDIsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCi0KKyNlbmRpZgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcygpCkBAIC04NjYsOCArMTAxMSwxMiBAQAogICAgIGZsb2F0IGVuZXJneUJhc3NCb29zdCA9IDA7CiAgICAgZmxvYXQgY3Jvc3NDb3JyZWN0aW9uID0gMDsKIAorICAgIGJvb2wgZXFFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUU7CisgICAgYm9vbCBiYkVuYWJsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUU7CisgICAgYm9vbCB2aUVuYWJsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFOworCiAgICAgLy9FUSBjb250cmlidXRpb24KLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICBpZiAoZXFFbmFibGVkKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKICAgICAgICAgICAgIGZsb2F0IGJhbmRDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvZWZmaWNpZW50W2ldOwpAQCAtODkzLDM1ICsxMDQyLDM3IEBACiAgICAgICAgIH0KICAgICAgICAgYmFuZEZhY3RvclN1bSAtPSAxLjA7CiAgICAgICAgIGlmIChiYW5kRmFjdG9yU3VtID4gMCkKLSAgICAgICAgICAgIGNyb3NzQ29ycmVjdGlvbiA9IGJhbmRGYWN0b3JTdW0gKiAwLjc7CisgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uID0gYmFuZEZhY3RvclN1bSAqIDAuNzsKICAgICB9CiAKICAgICAvL0Jhc3NCb29zdCBjb250cmlidXRpb24KLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgaWYgKGJiRW5hYmxlZCkgewogICAgICAgICBmbG9hdCBib29zdEZhY3RvciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkvMTAwMC4wOwogICAgICAgICBmbG9hdCBib29zdENvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudDsKIAogICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gYm9vc3RGYWN0b3IgKiBib29zdENvZWZmaWNpZW50ICogYm9vc3RDb2VmZmljaWVudDsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kQ3Jvc3NDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKgorICAgICAgICBpZiAoZXFFbmFibGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOworICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRDcm9zc0NvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKgogICAgICAgICAgICAgICAgICAgICBiYW5kQ3Jvc3NDb2VmZmljaWVudDsKLSAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKLSAgICAgICAgICAgICAgICBlbmVyZ3lCYXNzQm9vc3QgKz0gYmFuZEVuZXJneTsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApCisgICAgICAgICAgICAgICAgICBlbmVyZ3lCYXNzQm9vc3QgKz0gYmFuZEVuZXJneTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8vVmlydHVhbGl6ZXIgY29udHJpYnV0aW9uCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICBpZiAodmlFbmFibGVkKSB7CiAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICoKICAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uOwogICAgIH0KIAogICAgIGRvdWJsZSB0b3RhbEVuZXJneUVzdGltYXRpb24gPSBzcXJ0KGVuZXJneUNvbnRyaWJ1dGlvbiArIGVuZXJneUNyb3NzICsgZW5lcmd5QmFzc0Jvb3N0KSAtCiAgICAgICAgICAgICBjcm9zc0NvcnJlY3Rpb247Ci0gICAgQUxPR1YoIiBUT1RBTCBlbmVyZ3kgZXN0aW1hdGlvbjogJTAuMmYiLCB0b3RhbEVuZXJneUVzdGltYXRpb24pOworICAgIEFMT0dWKCIgVE9UQUwgZW5lcmd5IGVzdGltYXRpb246ICUwLjJmIGRCIiwgdG90YWxFbmVyZ3lFc3RpbWF0aW9uKTsKIAogICAgIC8vcm91bmRvZmYKICAgICBpbnQgbWF4TGV2ZWxSb3VuZCA9IChpbnQpKHRvdGFsRW5lcmd5RXN0aW1hdGlvbiArIDAuOTkpOwpAQCAtOTM5LDYgKzEwOTAsOCBAQAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfbGltaXRMZXZlbCIpCisKKyAgICBBTE9HVigiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIHJldHVybjolZCIsIChpbnQpTHZtU3RhdHVzKTsKICAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3QgU2V0IC0+ICVkXG4iLAogICAgIC8vICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKIApAQCAtMTE1Miw2ICsxMzA1LDE2IEBACiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCiAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgOTYwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTExNzksNiArMTM0Miw4IEBACiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwogCisgICAgICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKKwogICAgIH1lbHNlewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CiAgICAgfQpAQCAtMzY2OSwxMCArMzgzNCwxMCBAQAogICAgICAgICAgICAgaWYocmlnaHRkQiA+IG1heGRCKXsKICAgICAgICAgICAgICAgICBtYXhkQiA9IHJpZ2h0ZEI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBTZXNzaW9uOiAlZCwgU2Vzc2lvbklEOiAlZCBWT0xVTUUgaXMgJWQgZEIgKCVkKSwgIgorICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgU2Vzc2lvbjogJWQsIFNlc3Npb25JRDogJWQgVk9MVU1FIGlzICVkIGRCLCAiCiAgICAgICAgICAgICAvLyAgICAgICJlZmZlY3QgaXMgJWQiLAogICAgICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCwKLSAgICAgICAgICAgIC8vKGludDMyX3QpbWF4ZEIsIG1heFZvbDw8NywgcENvbnRleHQtPkVmZmVjdFR5cGUpOworICAgICAgICAgICAgLy8oaW50MzJfdCltYXhkQiwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgaXMgJWQsIFJpZ2h0IGlzICVkIiwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgJWRkQiwgUmlnaHQgJWRkQiwgUG9zaXRpb24gJWRkQiIsCiAgICAgICAgICAgICAvLyAgICAgICAgbGVmdGRCLCByaWdodGRCLCBwYW5kQik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCmluZGV4IGVlNjA0ZWIuLjI5MTM4M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCkBAIC0xMDMsNiArMTAzLDEwIEBACiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtSW5QdHI7CiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtT3V0UHRyOwogICAgICNlbmRpZgorICAgICNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZmVyOworICAgICNlbmRpZgogfTsKIAogLyogU2Vzc2lvbkNvbnRleHQgOiBPbmUgc2Vzc2lvbiAqLwpAQCAtMjA5LDcgKzIxMyw3IEBACiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHsKICAgICAgICAgMjIxLjIxLCAyMDguMTAsIDI4LjE2LCAwLjAsIDAuMCB9OwogCi1zdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudCA9IDcuMTI7CitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudCA9IDkuMDA7CiAKIHN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uID0gMS45OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCA2ZDdkNGNkLi5lZTk0MDZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE0LDcgKzE0LDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KKyNpZm5kZWYgTFZNX0ZMT0FUCit0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKKyNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJSZXZlcmIiCiAjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMTUyLDYgKzE1NCw4IEBACiAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKkluRnJhbWVzMzI7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqT3V0RnJhbWVzMzI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplSW47CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplT3V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0OwogICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgY3VyUHJlc2V0OwpAQCAtMTcyLDggKzE3NiwxMSBAQAogCiAjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1BSRVNFVCBSRVZFUkJfUFJFU0VUX05PTkUKIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAwLjc1ZiAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZWxzZQogI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgICgweDBDMDApIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKKyNlbmRpZgogI2RlZmluZSBSRVZFUkJfVU5JVF9WT0xVTUUgICgweDEwMDApIC8vIDEuMCBpbiA0LjEyIGZvcm1hdAogCiAvLy0tLSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCkBAIC0yNzAsOCArMjc3LDE1IEBACiAKIAogICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCi0gICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7Ci0gICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47CisjZWxzZQorICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMjsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47CisjZW5kaWYKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwpAQCAtMjkzLDYgKzMwNyw4IEBACiAgICAgI2VuZGlmCiAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7CiAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSAwOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gMDsKICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CiAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgIHJldHVybiAwOwpAQCAtMzg5LDYgKzQwNSw0NiBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIElOVDE2TFRPRkxPQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbzogbmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBJbnQxNlRvRmxvYXQoY29uc3QgTFZNX0lOVDE2ICpzcmMsIExWTV9GTE9BVCAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgKmRzdCA9ICgoTFZNX0ZMT0FUKSgoTFZNX0lOVDE2KSpzcmMpKSAvIDMyNzY4LjBmOworICAgICAgICBzcmMtLTsKKyAgICAgICAgZHN0LS07CisgICAgfQorICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBGTE9BVFRPSU5UMTZfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG8gOiBOZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEZsb2F0VG9JbnQxNl9TQVQoY29uc3QgTFZNX0ZMT0FUICpzcmMsIExWTV9JTlQxNiAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBMVk1fSU5UMzIgdGVtcDsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IG47IGlpKyspIHsKKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKKyAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKKyAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgeworICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgc3JjKys7CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCiB7CiAgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKQEAgLTQyMiw4ICs0NzgsMzEgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxOwogICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgIExWTV9JTlQxNiAqT3V0RnJhbWVzMTY7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0QnVmZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmY7CisjZW5kaWYKIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBpZiAocENvbnRleHQtPkluRnJhbWVzMzIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA8IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMikgeworICAgICAgICBpZiAocENvbnRleHQtPkluRnJhbWVzMzIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPk91dEZyYW1lczMyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0IDwgZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzMzIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyOworICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKKyAgICB9CisgICAgcElucHV0QnVmZiA9IChmbG9hdCAqKXBDb250ZXh0LT5JbkZyYW1lczMyOworICAgIHBPdXRwdXRCdWZmID0gKGZsb2F0ICopcENvbnRleHQtPk91dEZyYW1lczMyOworI2VuZGlmCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgZWl0aGVyIG1vbm8gb3Igc3RlcmVvCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CiAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDI7CkBAIC00NDksNDkgKzUyOCw4NCBAQAogICAgICAgICBSZXZlcmJfTG9hZFByZXNldChwQ29udGV4dCk7CiAgICAgfQogCi0KLQogICAgIC8vIENvbnZlcnQgdG8gSW5wdXQgMzIgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZWxzZQogICAgICAgICBmb3IoaW50IGk9MDsgaTxmcmFtZUNvdW50KnNhbXBsZXNQZXJGcmFtZTsgaSsrKXsKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyW2ldID0gKExWTV9JTlQzMilwSW5baV08PDg7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGluc2VydCByZXZlcmIgaW5wdXQgaXMgYWx3YXlzIHN0ZXJlbwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippXSA9IChwSW5bMippXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMlsyKmkrMV0gPSAocEluWzIqaSsxXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCisjZWxzZQorICAgICAgICAgICAgcElucHV0QnVmZlsyICogaV0gPSAoTFZNX0ZMT0FUKXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworICAgICAgICAgICAgcElucHV0QnVmZlsyICogaSArIDFdID0gKExWTV9GTE9BVClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5jdXJQcmVzZXQgPT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgbWVtc2V0KHBPdXRwdXRCdWZmLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9GTE9BVCkgKiAyKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyNlbHNlCiAgICAgICAgIG1lbXNldChwQ29udGV4dC0+T3V0RnJhbWVzMzIsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorI2VuZGlmCiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBtZW1zZXQocElucHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbHNlCiAgICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzMzIsMCxmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiBzYW1wbGVzUGVyRnJhbWUpOworI2VuZGlmCiAgICAgICAgICAgICBBTE9HVigiXHRaZXJvaW5nICVkIHNhbXBsZXMgcGVyIGZyYW1lIGF0IHRoZSBlbmQgb2YgY2FsbCIsIHNhbXBsZXNQZXJGcmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzLCBwcm9kdWNpbmcgYSBzdGVyZW8gb3V0cHV0ICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0QnVmZiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworI2Vsc2UKICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyLCAgICAgLyogSW5wdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0gICAgfQorI2VuZGlmCisgICAgICAgIH0KIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9Qcm9jZXNzIiwgInByb2Nlc3MiKQogICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgIC8vIENvbnZlcnQgdG8gMTYgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOworI2Vsc2UKICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKICAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNihwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KSArIChMVk1fSU5UMzIpcEluW2ldKTsKLSAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIDI7IGkrKykgey8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAgICAgLy9wT3V0cHV0QnVmZiBhbmQgT3V0RnJhbWVzMTYgcG9pbnQgdG8gdGhlIHNhbWUgYnVmZmVyLCBzbyBiZXR0ZXIgdG8KKyAgICAgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gcElucHV0QnVmZiwgd2hpY2ggaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgcElucHV0QnVmZltpXSA9IHBPdXRwdXRCdWZmW2ldICsgKExWTV9GTE9BVClwSW5baV0gLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwSW5wdXRCdWZmLCBPdXRGcmFtZXMxNiwgKHNpemVfdClmcmFtZUNvdW50ICogMik7CisjZWxzZQorICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCkgKyAoTFZNX0lOVDMyKXBJbltpXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHdpdGggcmFtcCBpZiBuZWVkZWQKICAgICAgICAgaWYgKChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgfHwKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKQEAgLTY0NCw2ICs3NTgsMTQgQEAKICAgICBjYXNlIDQ4MDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDk2MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgIGJyZWFrOworI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlxyUmV2ZXJiX3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTEwMTEsNyArMTEzMyw3IEBACiAgICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIEFjdGl2ZVBhcmFtcy5MUEZMICVkLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOiAlZCwgIgogICAgIC8vICAgICAiY29udmVydGVkIGxldmVsOiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRiwgcENvbnRleHQtPlNhdmVkSGZMZXZlbCwgbGV2ZWwpOwogCi0gICAgaWYoQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7CisgICAgaWYoKGludDE2X3QpQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAogICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWE0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJoZWlmIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkhlaWZEZWNvZGVySW1wbC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogW10sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjEzMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIZWlmRGVjb2RlckltcGwiCisKKyNpbmNsdWRlICJIZWlmRGVjb2RlckltcGwuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK0hlaWZEZWNvZGVyKiBjcmVhdGVIZWlmRGVjb2RlcigpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkhlaWZEZWNvZGVySW1wbCgpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBIZWlmRGF0YVNvdXJjZQorICoKKyAqIFByb3hpZXMgZGF0YSByZXF1ZXN0cyBvdmVyIElEYXRhU291cmNlIGludGVyZmFjZSBmcm9tIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIKKyAqIHRvIHRoZSBIZWlmU3RyZWFtIGludGVyZmFjZSB3ZSByZWNlaXZlZCBmcm9tIHRoZSBoZWlmIGRlY29kZXIgY2xpZW50LgorICovCitjbGFzcyBIZWlmRGF0YVNvdXJjZSA6IHB1YmxpYyBCbkRhdGFTb3VyY2UgeworcHVibGljOgorICAgIC8qCisgICAgICogQ29uc3RydWN0cyBIZWlmRGF0YVNvdXJjZTsgd2lsbCB0YWtlIG93bmVyc2hpcCBvZiB8c3RyZWFtfC4KKyAgICAgKi8KKyAgICBIZWlmRGF0YVNvdXJjZShIZWlmU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIDogbVN0cmVhbShzdHJlYW0pLCBtRU9TKGZhbHNlKSwKKyAgICAgICAgICBtQ2FjaGVkT2Zmc2V0KDApLCBtQ2FjaGVkU2l6ZSgwKSwgbUNhY2hlQnVmZmVyU2l6ZSgwKSB7fQorCisgICAgfkhlaWZEYXRhU291cmNlKCkgb3ZlcnJpZGUge30KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZXMgaW50ZXJuYWwgcmVzb3VyY2VzLgorICAgICAqLworICAgIGJvb2wgaW5pdCgpOworCisgICAgc3A8SU1lbW9yeT4gZ2V0SU1lbW9yeSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1NZW1vcnk7IH0KKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSkgb3ZlcnJpZGUgOworICAgIHZvaWQgY2xvc2UoKSB7fQorICAgIHVpbnQzMl90IGdldEZsYWdzKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIFN0cmluZzggdG9TdHJpbmcoKSBvdmVycmlkZSB7IHJldHVybiBTdHJpbmc4KCJIZWlmRGF0YVNvdXJjZSIpOyB9CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICAvKgorICAgICAgICAgKiBCdWZmZXIgc2l6ZSBmb3IgcGFzc2luZyB0aGUgcmVhZCBkYXRhIHRvIG1lZGlhc2VydmVyLiBTZXQgdG8gNjRLCisgICAgICAgICAqICh3aGljaCBpcyB3aGF0IE1lZGlhRGF0YVNvdXJjZSBKYXZhIEFQSSdzIGpuaSBpbXBsZW1lbnRhdGlvbiB1c2VzKS4KKyAgICAgICAgICovCisgICAgICAgIGtCdWZmZXJTaXplID0gNjQgKiAxMDI0LAorICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsIGFuZCBtYXggY2FjaGUgYnVmZmVyIHNpemUuCisgICAgICAgICAqLworICAgICAgICBrSW5pdGlhbENhY2hlQnVmZmVyU2l6ZSA9IDQgKiAxMDI0ICogMTAyNCwKKyAgICAgICAga01heENhY2hlQnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsCisgICAgfTsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWlmU3RyZWFtPiBtU3RyZWFtOworICAgIGJvb2wgbUVPUzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUNhY2hlOworICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKKyAgICBzaXplX3QgbUNhY2hlZFNpemU7CisgICAgc2l6ZV90IG1DYWNoZUJ1ZmZlclNpemU7Cit9OworCitib29sIEhlaWZEYXRhU291cmNlOjppbml0KCkgeworICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KKyAgICAgICAgICAgIG5ldyBNZW1vcnlEZWFsZXIoa0J1ZmZlclNpemUsICJIZWlmRGF0YVNvdXJjZSIpOworICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGtCdWZmZXJTaXplKTsKKyAgICBpZiAobU1lbW9yeSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtQ2FjaGUucmVzZXQobmV3IHVpbnQ4X3Rba0luaXRpYWxDYWNoZUJ1ZmZlclNpemVdKTsKKyAgICBpZiAobUNhY2hlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIm1GYWlsZWQgdG8gYWxsb2NhdGUgY2FjaGUhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUNhY2hlQnVmZmVyU2l6ZSA9IGtJbml0aWFsQ2FjaGVCdWZmZXJTaXplOworICAgIHJldHVybiB0cnVlOworfQorCitzc2l6ZV90IEhlaWZEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoInJlYWRBdDogb2Zmc2V0PSVsbGQsIHNpemU9JXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKG9mZnNldCA8IG1DYWNoZWRPZmZzZXQpIHsKKyAgICAgICAgLy8gdHJ5IHNlZWssIHRoZW4gcmV3aW5kL3NraXAsIGZhaWwgaWYgbm9uZSB3b3JrZWQKKyAgICAgICAgaWYgKG1TdHJlYW0tPnNlZWsob2Zmc2V0KSkgeworICAgICAgICAgICAgQUxPR1YoInJlYWRBdDogc2VlayB0byBvZmZzZXQ9JWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgICAgIG1DYWNoZWRPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBtQ2FjaGVkU2l6ZSA9IDA7CisgICAgICAgICAgICBtRU9TID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVN0cmVhbS0+cmV3aW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkQXQ6IHJld2luZCB0byBvZmZzZXQ9MCIpOworICAgICAgICAgICAgbUNhY2hlZE9mZnNldCA9IDA7CisgICAgICAgICAgICBtQ2FjaGVkU2l6ZSA9IDA7CisgICAgICAgICAgICBtRU9TID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZEF0OiBjb3VsZG4ndCBzZWVrIG9yIHJld2luZCEiKTsKKyAgICAgICAgICAgIG1FT1MgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1FT1MgJiYgKG9mZnNldCA8IG1DYWNoZWRPZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0ID49IChvZmY2NF90KShtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUpKSkgeworICAgICAgICBBTE9HVigicmVhZEF0OiBFT1MiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgLy8gYXQgdGhpcyBwb2ludCwgb2Zmc2V0IG11c3QgYmUgPj0gbUNhY2hlZE9mZnNldCwgb3RoZXIgY2FzZXMgc2hvdWxkCisgICAgLy8gaGF2ZSBiZWVuIGNhdWdodCBhYm92ZS4KKyAgICBDSEVDSyhvZmZzZXQgPj0gbUNhY2hlZE9mZnNldCk7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIENhbiBvbmx5IHJlYWQgbWF4IG9mIGtCdWZmZXJTaXplCisgICAgaWYgKHNpemUgPiBrQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplID0ga0J1ZmZlclNpemU7CisgICAgfQorCisgICAgLy8gY29weSBmcm9tIGNhY2hlIGlmIHRoZSByZXF1ZXN0IGZhbGxzIGVudGlyZWx5IGluIGNhY2hlCisgICAgaWYgKG9mZnNldCArIHNpemUgPD0gbUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSB7CisgICAgICAgIG1lbWNweShtTWVtb3J5LT5wb2ludGVyKCksIG1DYWNoZS5nZXQoKSArIG9mZnNldCAtIG1DYWNoZWRPZmZzZXQsIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIGZldGNoIG1vcmUsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBjYWNoZSBidWZmZXIuCisgICAgaWYgKChvZmY2NF90KShvZmZzZXQgKyBzaXplKSA+IG1DYWNoZWRPZmZzZXQgKyBrTWF4Q2FjaGVCdWZmZXJTaXplKSB7CisgICAgICAgIC8vIGl0J3MgcmVhY2hpbmcgbWF4IGNhY2hlIGJ1ZmZlciBzaXplLCBuZWVkIHRvIHJvbGwgd2luZG93LCBhbmQgcG9zc2libHkKKyAgICAgICAgLy8gZXhwYW5kIHRoZSBjYWNoZSBidWZmZXIuCisgICAgICAgIHNpemVfdCBuZXdDYWNoZUJ1ZmZlclNpemUgPSBtQ2FjaGVCdWZmZXJTaXplOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbmV3Q2FjaGU7CisgICAgICAgIHVpbnQ4X3QqIGRzdCA9IG1DYWNoZS5nZXQoKTsKKyAgICAgICAgaWYgKG5ld0NhY2hlQnVmZmVyU2l6ZSA8IGtNYXhDYWNoZUJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG5ld0NhY2hlQnVmZmVyU2l6ZSA9IGtNYXhDYWNoZUJ1ZmZlclNpemU7CisgICAgICAgICAgICBuZXdDYWNoZS5yZXNldChuZXcgdWludDhfdFtuZXdDYWNoZUJ1ZmZlclNpemVdKTsKKyAgICAgICAgICAgIGRzdCA9IG5ld0NhY2hlLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2hlbiByb2xsaW5nIHRoZSBjYWNoZSB3aW5kb3csIHRyeSB0byBrZWVwIGFib3V0IGhhbGYgdGhlIG9sZCBieXRlcworICAgICAgICAvLyBpbiBjYXNlIHRoYXQgdGhlIGNsaWVudCBnb2VzIGJhY2suCisgICAgICAgIG9mZjY0X3QgbmV3Q2FjaGVkT2Zmc2V0ID0gb2Zmc2V0IC0gKG9mZjY0X3QpKG5ld0NhY2hlQnVmZmVyU2l6ZSAvIDIpOworICAgICAgICBpZiAobmV3Q2FjaGVkT2Zmc2V0IDwgbUNhY2hlZE9mZnNldCkgeworICAgICAgICAgICAgbmV3Q2FjaGVkT2Zmc2V0ID0gbUNhY2hlZE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgbmV3Q2FjaGVkU2l6ZSA9IChpbnQ2NF90KShtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUpIC0gbmV3Q2FjaGVkT2Zmc2V0OworICAgICAgICBpZiAobmV3Q2FjaGVkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgdGhlIG5ldyBjYWNoZSByZWdpb24gcGFydGlhbGx5IG92ZXJsb3AgdGhlIG9sZCBjYWNoZSwKKyAgICAgICAgICAgIC8vIG1vdmUgdGhlIHBvcnRpb24gb2YgdGhlIGNhY2hlIHdlIHdhbnQgdG8gc2F2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgICAgICAvLyB0aGUgY2FjaGUgYnVmZmVyLgorICAgICAgICAgICAgbWVtY3B5KGRzdCwgbUNhY2hlLmdldCgpICsgbmV3Q2FjaGVkT2Zmc2V0IC0gbUNhY2hlZE9mZnNldCwgbmV3Q2FjaGVkU2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobmV3Q2FjaGVkU2l6ZSA8IDApeworICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB0aGUgbmV3IGNhY2hlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXQgb2YgdGhlIG9sZCBjYWNoZSwKKyAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSBzZXF1ZW50aWFsIHJlYWQsIHdlIG5lZWQgdG8gc2tpcCBhIG51bWJlciBvZgorICAgICAgICAgICAgLy8gYnl0ZXMgYmVmb3JlIHJlYWRpbmcuCisgICAgICAgICAgICBzaXplX3QgYnl0ZXNUb1NraXAgPSAtbmV3Q2FjaGVkU2l6ZTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc1NraXBwZWQgPSBtU3RyZWFtLT5yZWFkKG51bGxwdHIsIGJ5dGVzVG9Ta2lwKTsKKyAgICAgICAgICAgIGlmIChieXRlc1NraXBwZWQgIT0gYnl0ZXNUb1NraXApIHsKKyAgICAgICAgICAgICAgICAvLyBieXRlc1NraXBwZWQgaXMgaW52YWxpZCwgdGhlcmUgaXMgbm90IGVub3VnaCBieXRlcyB0byByZWFjaAorICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0LgorICAgICAgICAgICAgICAgIEFMT0dFKCJyZWFkQXQ6IHNraXAgZmFpbGVkLCBFT1MiKTsKKworICAgICAgICAgICAgICAgIG1FT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIG1DYWNoZWRPZmZzZXQgPSBuZXdDYWNoZWRPZmZzZXQ7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUgdG8gMCwgc2luY2Ugd2UncmUgbm90IGtlZXBpbmcgYW55IG9sZCBjYWNoZQorICAgICAgICAgICAgbmV3Q2FjaGVkU2l6ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Q2FjaGUuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNhY2hlLnJlc2V0KG5ld0NhY2hlLnJlbGVhc2UoKSk7CisgICAgICAgICAgICBtQ2FjaGVCdWZmZXJTaXplID0gbmV3Q2FjaGVCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIG1DYWNoZWRPZmZzZXQgPSBuZXdDYWNoZWRPZmZzZXQ7CisgICAgICAgIG1DYWNoZWRTaXplID0gbmV3Q2FjaGVkU2l6ZTsKKworICAgICAgICBBTE9HVigicmVhZEF0OiByb2xsaW5nIGNhY2hlIHdpbmRvdyB0byAoJWxsZCwgJXp1KSwgY2FjaGUgYnVmZmVyIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1DYWNoZWRPZmZzZXQsIG1DYWNoZWRTaXplLCBtQ2FjaGVCdWZmZXJTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBleHBhbmQgY2FjaGUgYnVmZmVyLCBidXQgbm8gbmVlZCB0byByb2xsIHRoZSB3aW5kb3cKKyAgICAgICAgc2l6ZV90IG5ld0NhY2hlQnVmZmVyU2l6ZSA9IG1DYWNoZUJ1ZmZlclNpemU7CisgICAgICAgIHdoaWxlIChvZmZzZXQgKyBzaXplID4gbUNhY2hlZE9mZnNldCArIG5ld0NhY2hlQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0sobmV3Q2FjaGVCdWZmZXJTaXplIDw9IGtNYXhDYWNoZUJ1ZmZlclNpemUpOworICAgICAgICBpZiAobUNhY2hlQnVmZmVyU2l6ZSA8IG5ld0NhY2hlQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgdWludDhfdCogbmV3Q2FjaGUgPSBuZXcgdWludDhfdFtuZXdDYWNoZUJ1ZmZlclNpemVdOworICAgICAgICAgICAgbWVtY3B5KG5ld0NhY2hlLCBtQ2FjaGUuZ2V0KCksIG1DYWNoZWRTaXplKTsKKyAgICAgICAgICAgIG1DYWNoZS5yZXNldChuZXdDYWNoZSk7CisgICAgICAgICAgICBtQ2FjaGVCdWZmZXJTaXplID0gbmV3Q2FjaGVCdWZmZXJTaXplOworCisgICAgICAgICAgICBBTE9HVigicmVhZEF0OiBjdXJyZW50IGNhY2hlIHdpbmRvdyAoJWxsZCwgJXp1KSwgbmV3IGNhY2hlIGJ1ZmZlciBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1DYWNoZWRPZmZzZXQsIG1DYWNoZWRTaXplLCBtQ2FjaGVCdWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplX3QgYnl0ZXNUb1JlYWQgPSBvZmZzZXQgKyBzaXplIC0gbUNhY2hlZE9mZnNldCAtIG1DYWNoZWRTaXplOworICAgIHNpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1DYWNoZS5nZXQoKSArIG1DYWNoZWRTaXplLCBieXRlc1RvUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA+IGJ5dGVzVG9SZWFkIHx8IGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIGJ5dGVzUmVhZCBpcyBpbnZhbGlkCisgICAgICAgIG1FT1MgPSB0cnVlOworICAgICAgICBieXRlc1JlYWQgPSAwOworICAgIH0gZWxzZSBpZiAoYnl0ZXNSZWFkIDwgYnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgLy8gcmVhZCBzb21lIGJ5dGVzIGJ1dCBub3QgYWxsLCBzZXQgRU9TCisgICAgICAgIG1FT1MgPSB0cnVlOworICAgIH0KKyAgICBtQ2FjaGVkU2l6ZSArPSBieXRlc1JlYWQ7CisgICAgQUxPR1YoInJlYWRBdDogY3VycmVudCBjYWNoZSB3aW5kb3cgKCVsbGQsICV6dSkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbUNhY2hlZE9mZnNldCwgbUNhY2hlZFNpemUpOworCisgICAgLy8gaGVyZSBieXRlc0F2YWlsYWJsZSBjb3VsZCBiZSBuZWdhdGl2ZSBpZiBvZmZzZXQganVtcGVkIHBhc3QgRU9TLgorICAgIGludDY0X3QgYnl0ZXNBdmFpbGFibGUgPSBtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUgLSBvZmZzZXQ7CisgICAgaWYgKGJ5dGVzQXZhaWxhYmxlIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGlmIChieXRlc0F2YWlsYWJsZSA8IChpbnQ2NF90KXNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGJ5dGVzQXZhaWxhYmxlOworICAgIH0KKyAgICBtZW1jcHkobU1lbW9yeS0+cG9pbnRlcigpLCBtQ2FjaGUuZ2V0KCkgKyBvZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdHVzX3QgSGVpZkRhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCogc2l6ZSkgeworICAgIGlmICghbVN0cmVhbS0+aGFzTGVuZ3RoKCkpIHsKKyAgICAgICAgKnNpemUgPSAtMTsKKyAgICAgICAgQUxPR0UoImdldFNpemU6IG5vdCBzdXBwb3J0ZWQhIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRMZW5ndGgoKTsKKyAgICBBTE9HVigiZ2V0U2l6ZTogc2l6ZT0lbGxkIiwgKGxvbmcgbG9uZykqc2l6ZSk7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0hlaWZEZWNvZGVySW1wbDo6SGVpZkRlY29kZXJJbXBsKCkgOgorICAgIC8vIG91dHB1dCBjb2xvciBmb3JtYXQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdmlhIHNldE91dHB1dENvbG9yKCksIGluIGNhc2UKKyAgICAvLyBpdCdzIG5vdCwgZGVmYXVsdCB0byBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUuCisgICAgbU91dHB1dENvbG9yKEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSksCisgICAgbUN1clNjYW5saW5lKDApLAorICAgIG1GcmFtZURlY29kZWQoZmFsc2UpIHsKK30KKworSGVpZkRlY29kZXJJbXBsOjp+SGVpZkRlY29kZXJJbXBsKCkgeworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6aW5pdChIZWlmU3RyZWFtKiBzdHJlYW0sIEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgeworICAgIG1GcmFtZURlY29kZWQgPSBmYWxzZTsKKyAgICBzcDxIZWlmRGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG5ldyBIZWlmRGF0YVNvdXJjZShzdHJlYW0pOworICAgIGlmICghZGF0YVNvdXJjZS0+aW5pdCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOworCisgICAgbVJldHJpZXZlciA9IG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZSwgInZpZGVvL21wNCIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisKKyAgICAgICAgbVJldHJpZXZlci5jbGVhcigpOworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgc2V0IGRhdGEgc291cmNlLiIpOworCisgICAgY29uc3QgY2hhciogaGFzVmlkZW8gPSBtUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoTUVUQURBVEFfS0VZX0hBU19WSURFTyk7CisgICAgaWYgKCFoYXNWaWRlbyB8fCBzdHJjYXNlY21wKGhhc1ZpZGVvLCAieWVzIikpIHsKKyAgICAgICAgQUxPR0UoIm5vIHZpZGVvOiAlcyIsIGhhc1ZpZGVvID8gaGFzVmlkZW8gOiAibnVsbCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKKyAgICAgICAgICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIG1PdXRwdXRDb2xvciwgdHJ1ZSAvKm1ldGFPbmx5Ki8pOworICAgIGlmIChtRnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUF0VGltZTogdmlkZW9GcmFtZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4obUZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOworCisgICAgQUxPR1YoIk1ldGEgZGltZW5zaW9uICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBhbmdsZSAlZCwgaWNjU2l6ZSAlZCIsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tV2lkdGgsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVJvdGF0aW9uQW5nbGUsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSk7CisKKyAgICBpZiAoZnJhbWVJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgZnJhbWVJbmZvLT5zZXQoCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZSwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbCwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRJY2NEYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIZWlmRGVjb2RlckltcGw6OmdldEVuY29kZWRDb2xvcihIZWlmRW5jb2RlZENvbG9yKiAvKm91dENvbG9yKi8pIGNvbnN0IHsKKyAgICBBTE9HVygiZ2V0RW5jb2RlZENvbG9yOiBub3QgaW1wbGVtZW50ZWQhIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6c2V0T3V0cHV0Q29sb3IoSGVpZkNvbG9yRm9ybWF0IGhlaWZDb2xvcikgeworICAgIHN3aXRjaChoZWlmQ29sb3IpIHsKKyAgICAgICAgY2FzZSBrSGVpZkNvbG9yRm9ybWF0X1JHQjU2NToKKyAgICAgICAgeworICAgICAgICAgICAgbU91dHB1dENvbG9yID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfODg4ODoKKyAgICAgICAgeworICAgICAgICAgICAgbU91dHB1dENvbG9yID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4OgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBjb2xvciBmb3JtYXQgJWQiLCBoZWlmQ29sb3IpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBIZWlmRGVjb2RlckltcGw6OmRlY29kZShIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIHsKKyAgICAvLyByZXNldCBzY2FubGluZSBwb2ludGVyCisgICAgbUN1clNjYW5saW5lID0gMDsKKworICAgIGlmIChtRnJhbWVEZWNvZGVkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIG1GcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKDAsCisgICAgICAgICAgICBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsIG1PdXRwdXRDb2xvcik7CisgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIGlzIGEgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgaWYgKHZpZGVvRnJhbWUtPm1TaXplID09IDAgfHwKKyAgICAgICAgICAgIG1GcmFtZU1lbW9yeS0+c2l6ZSgpIDwgdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkU2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUF0VGltZTogdmlkZW9GcmFtZSBzaXplIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJEZWNvZGVkIGRpbWVuc2lvbiAlZHglZCwgZGlzcGxheSAlZHglZCwgYW5nbGUgJWQsIHJvd2J5dGVzICVkLCBzaXplICVkIiwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZSwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3dCeXRlcywKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1TaXplKTsKKworICAgIGlmIChmcmFtZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBmcmFtZUluZm8tPnNldCgKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSk7CisgICAgfQorICAgIG1GcmFtZURlY29kZWQgPSB0cnVlOworCisgICAgLy8gQWdncmVzc2l2ZSBjbGVhciB0byBhdm9pZCBob2xkaW5nIG9uIHRvIHJlc291cmNlcworICAgIG1SZXRyaWV2ZXIuY2xlYXIoKTsKKyAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6Z2V0U2NhbmxpbmUodWludDhfdCogZHN0KSB7CisgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBpZiAobUN1clNjYW5saW5lID49IHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgIEFMT0dFKCJubyBtb3JlIHNjYW5saW5lIGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVpbnQ4X3QqIHNyYyA9IHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSArIHZpZGVvRnJhbWUtPm1Sb3dCeXRlcyAqIG1DdXJTY2FubGluZSsrOworICAgIG1lbWNweShkc3QsIHNyYywgdmlkZW9GcmFtZS0+bUJ5dGVzUGVyUGl4ZWwgKiB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc2l6ZV90IEhlaWZEZWNvZGVySW1wbDo6c2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpIHsKKyAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7CisKKyAgICB1aW50MzJfdCBvbGRTY2FubGluZSA9IG1DdXJTY2FubGluZTsKKyAgICBtQ3VyU2NhbmxpbmUgKz0gY291bnQ7CisgICAgaWYgKG1DdXJTY2FubGluZSA+IHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgIG1DdXJTY2FubGluZSA9IHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0OworICAgIH0KKyAgICByZXR1cm4gKG1DdXJTY2FubGluZSA+IG9sZFNjYW5saW5lKSA/IChtQ3VyU2NhbmxpbmUgLSBvbGRTY2FubGluZSkgOiAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU0ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSEVJRl9ERUNPREVSX0lNUExfCisjZGVmaW5lIF9IRUlGX0RFQ09ERVJfSU1QTF8KKworI2luY2x1ZGUgImluY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSURhdGFTb3VyY2U7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKKworLyoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEhlaWZEZWNvZGVyIGJhc2VkIG9uIEFuZHJvaWQncyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLgorICovCitjbGFzcyBIZWlmRGVjb2RlckltcGwgOiBwdWJsaWMgSGVpZkRlY29kZXIgeworcHVibGljOgorCisgICAgSGVpZkRlY29kZXJJbXBsKCk7CisgICAgfkhlaWZEZWNvZGVySW1wbCgpIG92ZXJyaWRlOworCisgICAgYm9vbCBpbml0KEhlaWZTdHJlYW0qIHN0cmVhbSwgSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSBvdmVycmlkZTsKKworICAgIGJvb2wgZ2V0RW5jb2RlZENvbG9yKEhlaWZFbmNvZGVkQ29sb3IqIG91dENvbG9yKSBjb25zdCBvdmVycmlkZTsKKworICAgIGJvb2wgc2V0T3V0cHV0Q29sb3IoSGVpZkNvbG9yRm9ybWF0IGhlaWZDb2xvcikgb3ZlcnJpZGU7CisKKyAgICBib29sIGRlY29kZShIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIG92ZXJyaWRlOworCisgICAgYm9vbCBnZXRTY2FubGluZSh1aW50OF90KiBkc3QpIG92ZXJyaWRlOworCisgICAgc2l6ZV90IHNraXBTY2FubGluZXMoc2l6ZV90IGNvdW50KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzcDxJRGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcjsKKyAgICBzcDxJTWVtb3J5PiBtRnJhbWVNZW1vcnk7CisgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBtT3V0cHV0Q29sb3I7CisgICAgc2l6ZV90IG1DdXJTY2FubGluZTsKKyAgICBib29sIG1GcmFtZURlY29kZWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfSEVJRl9ERUNPREVSX0lNUExfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODNjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0hFSUZfREVDT0RFUl9BUElfCisjZGVmaW5lIF9IRUlGX0RFQ09ERVJfQVBJXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKgorICogVGhlIG91dHB1dCBjb2xvciBwaXhlbCBmb3JtYXQgb2YgaGVpZiBkZWNvZGVyLgorICovCit0eXBlZGVmIGVudW0geworICAgIGtIZWlmQ29sb3JGb3JtYXRfUkdCNTY1ICAgICA9IDAsCisgICAga0hlaWZDb2xvckZvcm1hdF9SR0JBXzg4ODggID0gMSwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X0JHUkFfODg4OCAgPSAyLAorfSBIZWlmQ29sb3JGb3JtYXQ7CisKKy8qCisgKiBUaGUgY29sb3Igc3BhY2VzIGVuY29kZWQgaW4gdGhlIGhlaWYgaW1hZ2UuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAga0hlaWZFbmNvZGVkQ29sb3JfUkdCID0gMCwKKyAgICBrSGVpZkVuY29kZWRDb2xvcl9ZVVYgPSAxLAorICAgIGtIZWlmRW5jb2RlZENvbG9yX0NNWUsgPSAyLAorfSBIZWlmRW5jb2RlZENvbG9yOworCisvKgorICogUmVwcmVzZW50cyBhIGNvbG9yIGNvbnZlcnRlZCAoUkdCLWJhc2VkKSB2aWRlbyBmcmFtZQorICovCitzdHJ1Y3QgSGVpZkZyYW1lSW5mbworeworICAgIEhlaWZGcmFtZUluZm8oKSA6CisgICAgICAgIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbVJvdGF0aW9uQW5nbGUoMCksIG1CeXRlc1BlclBpeGVsKDApLAorICAgICAgICBtSWNjU2l6ZSgwKSwgbUljY0RhdGEobnVsbHB0cikge30KKworICAgIC8vIHVwZGF0ZSB0aGUgZnJhbWUgaW5mbywgd2lsbCBtYWtlIGEgY29weSBvZiB8aWNjRGF0YXwgaW50ZXJuYWxseQorICAgIHZvaWQgc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludDMyX3Qgcm90YXRpb24sIHVpbnQzMl90IGJwcCwKKyAgICAgICAgICAgIHVpbnQzMl90IGljY1NpemUsIHVpbnQ4X3QqIGljY0RhdGEpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Sb3RhdGlvbkFuZ2xlID0gcm90YXRpb247CisgICAgICAgIG1CeXRlc1BlclBpeGVsID0gYnBwOworCisgICAgICAgIGlmIChtSWNjRGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSWNjRGF0YS5yZXNldChudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBtSWNjU2l6ZSA9IGljY1NpemU7CisgICAgICAgIGlmIChpY2NTaXplID4gMCkgeworICAgICAgICAgICAgbUljY0RhdGEucmVzZXQobmV3IHVpbnQ4X3RbaWNjU2l6ZV0pOworICAgICAgICAgICAgaWYgKG1JY2NEYXRhLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEuZ2V0KCksIGljY0RhdGEsIGljY1NpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSWNjU2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnRlbnRpb25hbCBwdWJsaWMgYWNjZXNzIG1vZGlmaWVyczoKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAorICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKKyAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQorICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKK307CisKKy8qCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgdG8gcHJvdmlkZSBkYXRhIHRvIEhlaWZEZWNvZGVyLgorICovCitzdHJ1Y3QgSGVpZlN0cmVhbSB7CisgICAgSGVpZlN0cmVhbSgpIHt9CisKKyAgICB2aXJ0dWFsIH5IZWlmU3RyZWFtKCkge30KKworICAgIC8qCisgICAgICogUmVhZHMgb3Igc2tpcHMgc2l6ZSBudW1iZXIgb2YgYnl0ZXMuIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CisgICAgICogcmVhZCBvciBza2lwcGVkLgorICAgICAqIElmIHxidWZmZXJ8ID09IE5VTEwsIHNraXAgc2l6ZSBieXRlcywgcmV0dXJuIGhvdyBtYW55IHdlcmUgc2tpcHBlZC4KKyAgICAgKiBJZiB8YnVmZmVyfCAhPSBOVUxMLCBjb3B5IHNpemUgYnl0ZXMgaW50byBidWZmZXIsIHJldHVybiBob3cgbWFueSB3ZXJlIGNvcGllZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCByZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8qCisgICAgICogUmV3aW5kcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGtub3duCisgICAgICogdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmV3aW5kKCkgPSAwOworCisgICAgLyoKKyAgICAgKiBTZWVrcyB0byBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLiBJZiB0aGlzIGNhbm5vdCBiZSBkb25lLCByZXR1cm5zIGZhbHNlLgorICAgICAqIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzZWVrIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCB0aGUgcG9zaXRpb24gd2lsbCBiZSBzZXQKKyAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNlZWsoc2l6ZV90IC8qcG9zaXRpb24qLykgPSAwOworCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0cmVhbSBjYW4gcmVwb3J0IGl0cyB0b3RhbCBsZW5ndGguICovCisgICAgdmlydHVhbCBib29sIGhhc0xlbmd0aCgpIGNvbnN0ID0gMDsKKworICAgIC8qKiBSZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHN0cmVhbS4gSWYgdGhpcyBjYW5ub3QgYmUgZG9uZSwgcmV0dXJucyAwLiAqLworICAgIHZpcnR1YWwgc2l6ZV90IGdldExlbmd0aCgpIGNvbnN0ID0gMDsKKworcHJpdmF0ZToKKyAgICBIZWlmU3RyZWFtKGNvbnN0IEhlaWZGcmFtZUluZm8mKSA9IGRlbGV0ZTsKKyAgICBIZWlmU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgSGVpZkZyYW1lSW5mbyYpID0gZGVsZXRlOworfTsKKworLyoKKyAqIEFic3RyYWN0IGludGVyZmFjZSB0byBkZWNvZGUgaGVpZiBpbWFnZXMgZnJvbSBhIEhlaWZTdHJlYW0gZGF0YSBzb3VyY2UuCisgKi8KK3N0cnVjdCBIZWlmRGVjb2RlciB7CisgICAgSGVpZkRlY29kZXIoKSB7fQorCisgICAgdmlydHVhbCB+SGVpZkRlY29kZXIoKSB7fQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgc3VjY2Vzc2Z1bGx5IHNldHMgb3V0Q29sb3IgdG8gdGhlIGVuY29kZWQgY29sb3IsCisgICAgICogYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RW5jb2RlZENvbG9yKEhlaWZFbmNvZGVkQ29sb3IqIG91dENvbG9yKSBjb25zdCA9IDA7CisKKyAgICAvKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZXNzZnVsbHkgc2V0cyB0aGUgb3V0cHV0IGNvbG9yIGZvcm1hdCB0byBjb2xvciwKKyAgICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgY29sb3IpID0gMDsKKworICAgIC8qCisgICAgICogUmV0dXJucyB0cnVlIGlmIGl0IHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplIGhlaWYgZGVjb2RlciB3aXRoIHNvdXJjZSwKKyAgICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiB8ZnJhbWVJbmZvfCB3aWxsIGJlIGZpbGxlZCB3aXRoIGluZm9ybWF0aW9uIG9mCisgICAgICogdGhlIHByaW1hcnkgcGljdHVyZSB1cG9uIHN1Y2Nlc3MgYW5kIHVubW9kaWZpZWQgdXBvbiBmYWlsdXJlLgorICAgICAqIFRha2VzIG93bmVyc2hpcCBvZiB8c3RyZWFtfCByZWdhcmRsZXNzIG9mIHJlc3VsdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdChIZWlmU3RyZWFtKiBzdHJlYW0sIEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgPSAwOworCisgICAgLyoKKyAgICAgKiBEZWNvZGUgdGhlIHBpY3R1cmUgaW50ZXJuYWxseSwgcmV0dXJuaW5nIHdoZXRoZXIgaXQgc3VjY2VlZGVkLiB8ZnJhbWVJbmZvfAorICAgICAqIHdpbGwgYmUgZmlsbGVkIHdpdGggaW5mb3JtYXRpb24gb2YgdGhlIHByaW1hcnkgcGljdHVyZSB1cG9uIHN1Y2Nlc3MgYW5kCisgICAgICogdW5tb2RpZmllZCB1cG9uIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBBZnRlciB0aGlzIHN1Y2NlZWRlZCwgZ2V0U2NhbmxpbmUgY2FuIGJlIGNhbGxlZCB0byByZWFkIHRoZSBzY2FubGluZXMKKyAgICAgKiB0aGF0IHdlcmUgZGVjb2RlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBuZXh0IHNjYW5saW5lIChpbiB0b3AtZG93biBvcmRlciksIHJldHVybnMgdHJ1ZSB1cG9uIHN1Y2Nlc3MKKyAgICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBnZXRTY2FubGluZSh1aW50OF90KiBkc3QpID0gMDsKKworICAgIC8qCisgICAgICogU2tpcCB0aGUgbmV4dCB8Y291bnR8IHNjYW5saW5lcywgcmV0dXJucyB0cnVlIHVwb24gc3VjY2VzcyBhbmQKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpID0gMDsKKworcHJpdmF0ZToKKyAgICBIZWlmRGVjb2Rlcihjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7CisgICAgSGVpZkRlY29kZXImIG9wZXJhdG9yPShjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7Cit9OworCisvKgorICogQ3JlYXRlcyBhIEhlaWZEZWNvZGVyLiBSZXR1cm5zIGEgSGVpZkRlY29kZXIgaW5zdGFuY2UgdXBvbiBzdWNjZXNzLCBvciBOVUxMCisgKiBpZiB0aGUgY3JlYXRpb24gaGFzIGZhaWxlZC4KKyAqLworSGVpZkRlY29kZXIqIGNyZWF0ZUhlaWZEZWNvZGVyKCk7CisKKyNlbmRpZiAvLyBfSEVJRl9ERUNPREVSX0FQSV8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IGJiZTk3ZWUuLmE0NjJmM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMiwxMSArMiwyMiBAQAogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKIH0KIAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhX2hlbHBlciIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKICAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCkBAIC0zNCw2ICs0NSw3IEBACiAgICAgICAgICJJTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIklNZWRpYUNvZGVjU2VydmljZS5jcHAiLAogICAgICAgICAiSU9NWC5jcHAiLAorICAgICAgICAiSU9NWFN0b3JlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjSW5mby5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCkBAIC02OSwxNCArODEsNiBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsIC8vIGZvciBtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLCAvLyBmb3IgbWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmgKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAotCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCkBAIC0xMjAsNiArMTI0LDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFfb214IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgZGVmYXVsdHM6IFsibGlibWVkaWFfb214X2RlZmF1bHRzIl0sCiB9CkBAIC0yMDIsNiArMjA5LDcgQEAKICAgICAgICAgImxpYmljdWkxOG4iLAogICAgICAgICAibGlic29uaXZveCIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiAKQEAgLTIxMCwxNSArMjE4LDEwIEBACiAgICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAppbmRleCAzMDIwMTM2Li45OTBkMjYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMTgsMTUgKzE4LDE1IEBACiAjZGVmaW5lIExPR19UQUcgIkNoYXJhY3RlckVuY29kaW5nRGVjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KICNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgiCiAKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL1N0cmluZ0FycmF5Lmg+CiAKLSNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgotI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNzZGV0Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91c3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODUsNiArODUsOCBAQAogICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICAgICAgVUNoYXJzZXREZXRlY3RvciAqY3NkID0gdWNzZGV0X29wZW4oJnN0YXR1cyk7CiAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2ggKnVjbTsKKyAgICAgICAgYm9vbCBnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICBpbnQgaGlnaGVzdCA9IDA7CiAKICAgICAgICAgLy8gdHJ5IGNvbWJpbmVkIGRldGVjdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgogICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKQEAgLTExNiw4ICsxMTgsNiBAQAogICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBidWYsIHN0cmxlbihidWYpLCAmc3RhdHVzKTsKICAgICAgICAgICAgIGludDMyX3QgbWF0Y2hlczsKICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIGJvb2wgZ29vZG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBoaWdoZXN0ID0gMDsKICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqIGJlc3RDb21iaW5lZE1hdGNoID0gZ2V0UHJlZmVycmVkKGJ1Ziwgc3RybGVuKGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2gsICZoaWdoZXN0KTsKIApAQCAtMTgwLDggKzE4MCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CiAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtIikgfHwKICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgZW5jb2RpbmcgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgotICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIGlmICghZ29vZG1hdGNoICYmIGhpZ2hlc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgaXQgb25lIG1vcmUgY2hhbmNlIGlmIHRoZXJlIGlzIG5vIGdvb2QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcnlpbmcgdG8gZGV0ZWN0ICVzIHNlcGFyYXRlbHkiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRjaGVzOworICAgICAgICAgICAgICAgICAgICBib29sIGdvb2RtYXRjaFNpbmdsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGludCBoaWdoZXN0U2luZ2xlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBzLCBpbnB1dExlbmd0aCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCogYmVzdFNpbmdsZU1hdGNoID0gZ2V0UHJlZmVycmVkKHMsIGlucHV0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2hTaW5nbGUsICZoaWdoZXN0U2luZ2xlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2RtYXRjaFNpbmdsZSB8fCBoaWdoZXN0U2luZ2xlID4gaGlnaGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYyA9IHVjc2RldF9nZXROYW1lKGJlc3RTaW5nbGVNYXRjaCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBlbmNvZGluZyBkZXRlcm1pbmVkIGZyb20gdGhlIGNvbWJpbmF0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCisgICAgICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkocywgaW5wdXRMZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcAppbmRleCAyZDYyNDE5Li5hZGZhOTNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAKQEAgLTI3LDcgKzI3LDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7Ci0gICAgR0VUX09NWCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04KKyAgICBHRVRfT01YID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBHRVRfT01YX1NUT1JFCiB9OwogCiBjbGFzcyBCcE1lZGlhQ29kZWNTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KQEAgLTQ1LDYgKzQ2LDEzIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJT01YPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3A8SU9NWFN0b3JlPiBnZXRPTVhTdG9yZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09NWF9TVE9SRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElPTVhTdG9yZT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhQ29kZWNTZXJ2aWNlIik7CkBAIC02Miw2ICs3MCwxMiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX09NWF9TVE9SRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU9NWFN0b3JlPiBvbXhTdG9yZSA9IGdldE9NWFN0b3JlKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214U3RvcmUpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBmMDhmYWJiLi4zYzQzYTcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KQEAgLTM5LDcgKzM4LDggQEAKICAgICBTRVRNRURJQUNBUywKICAgICBTRVRVSUQsCiAgICAgTkFNRSwKLSAgICBHRVRNRVRSSUNTCisgICAgR0VUTUVUUklDUywKKyAgICBSRUxFQVNFLAogfTsKIAogY2xhc3MgQnBNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3I+IHsKQEAgLTExNywxMiArMTE3LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJiBjYXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYXMpKTsKKyAgICAgICAgZGF0YS53cml0ZUJ5dGVWZWN0b3IoY2FzVG9rZW4pOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRNRURJQUNBUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtMTM5LDYgKzEzOSwxMyBAQAogICAgICAgICBBTE9HVigibmFtZSBOT1QgSU1QTEVNRU5URUQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFFeHRyYWN0b3I6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFLCBkYXRhLCAmcmVwbHkpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUV4dHJhY3RvciwgImFuZHJvaWQubWVkaWEuSU1lZGlhRXh0cmFjdG9yIik7CkBAIC0yMDYsMTUgKzIxMywyMCBAQAogICAgICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGNhc0JpbmRlcjsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZjYXNCaW5kZXIpOworICAgICAgICAgICAgSEludGVyZmFjZVRva2VuIGNhc1Rva2VuOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkQnl0ZVZlY3RvcigmY2FzVG9rZW4pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhcyBmcm9tIHBhcmNlbCIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhc1Rva2VuIGZyb20gcGFyY2VsIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPElDYXM+IGNhcyA9IGludGVyZmFjZV9jYXN0PElDYXM+KGNhc0JpbmRlcik7CiAKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhcykpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFDYXMoY2FzVG9rZW4pKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFJFTEVBU0U6IHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA3MDU4ZWU4Li41ZWEyZThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xMjcsMjIgKzEyNywzMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc291cmNlKSk7CisKKyAgICAgICAgaWYgKG1pbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobWltZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpCiAgICAgewotICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSwgb3B0aW9uKCVkKSwgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZVVzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG9wdGlvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb2xvckZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtZXRhT25seSk7CiAjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSwogICAgICAgICBzZW5kU2NoZWRQb2xpY3koZGF0YSk7CiAjZW5kaWYKQEAgLTI1OCw3ICsyNjgsMTIgQEAKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2Uoc291cmNlKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNNaW1lID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoaGFzTWltZSkgeworICAgICAgICAgICAgICAgICAgICBtaW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSwgbWltZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjY2LDExICsyODEsMTQgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50IG9wdGlvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBtZXRhT25seSA9IChkYXRhLnJlYWRJbnQzMigpICE9IDApOworICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpLCBvcHRpb24oJWQpLCBjb2xvckZvcm1hdCglZCksIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKICAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOwogI2VuZGlmCi0gICAgICAgICAgICBzcDxJTWVtb3J5PiBiaXRtYXAgPSBnZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBiaXRtYXAgPSBnZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYml0bWFwKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDQzMTMwZWIuLmEwNzMwODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAotI2luY2x1ZGUgPG9teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ4ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJT01YU3RvcmUiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitlbnVtIHsKKyAgICBDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUywKKyAgICBHRVRfTk9ERV9QUkVGSVgsCisgICAgTElTVF9ST0xFUywKKyAgICBHRVRfT01YLAorfTsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RkOjp2ZWN0b3I8VD4gPC0+IFBhcmNlbCBjb252ZXJzaW9uIGZ1bmNpdG9ucyB0aGF0CisvLyBkZXBlbmQgb24gd3JpdGVUb1BhcmNlbCgpIGFuZCByZWFkVG9QYXJjZWwoKSBmb3IgVCA8LT4gUGFyY2VsLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIFBhcmNlbCogcCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjp2ZWN0b3I8VD4qIHYsIGNvbnN0IFBhcmNlbCYgcCk7CisKKy8vIHN0ZDo6c3RyaW5nIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnN0cmluZyYgcywgUGFyY2VsKiBwKSB7CisgICAgaWYgKHMuc2l6ZSgpID4gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBwLT53cml0ZUJ5dGVBcnJheSgKKyAgICAgICAgICAgIHMuc2l6ZSgpLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzLmNfc3RyKCkpKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjpzdHJpbmcqIHMsIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIGludDMyX3QgbGVuOworICAgIHN0YXR1c190IHN0YXR1cyA9IHAucmVhZEludDMyKCZsZW4pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgaWYgKChsZW4gPCAwKSB8fCAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxlbikgPiBTSVpFX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcy0+cmVzaXplKGxlbik7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHAucmVhZChzdGF0aWNfY2FzdDx2b2lkKj4oJnMtPmZyb250KCkpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikpOworfQorCisvLyBJT01YU3RvcmU6OkF0dHJpYnV0ZSA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpBdHRyaWJ1dGUmIGEsIFBhcmNlbCogcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoYS5rZXksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwoYS52YWx1ZSwgcCk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6QXR0cmlidXRlKiBhLCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKGEtPmtleSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYoYS0+dmFsdWUpLCBwKTsKK30KKworLy8gSU9NWFN0b3JlOjpOb2RlSW5mbyA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpOb2RlSW5mbyYgbiwgUGFyY2VsKiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuLm5hbWUsIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuLm93bmVyLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKG4uYXR0cmlidXRlcywgcCk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6Tm9kZUluZm8qIG4sIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYobi0+bmFtZSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihuLT5vd25lciksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYobi0+YXR0cmlidXRlcyksIHApOworfQorCisvLyBJT01YU3RvcmU6OlJvbGVJbmZvIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6OlJvbGVJbmZvJiByLCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHIucm9sZSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHIudHlwZSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSBwLT53cml0ZUJvb2woci5pc0VuY29kZXIpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcC0+d3JpdGVCb29sKHIucHJlZmVyUGxhdGZvcm1Ob2Rlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChyLm5vZGVzLCBwKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpSb2xlSW5mbyogciwgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihyLT5yb2xlKSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKHItPnR5cGUpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAucmVhZEJvb2woJihyLT5pc0VuY29kZXIpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAucmVhZEJvb2woJihyLT5wcmVmZXJQbGF0Zm9ybU5vZGVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihyLT5ub2RlcyksIHApOworfQorCisvLyBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4gPC0+IFBhcmNlbAorLy8gc3RkOjp2ZWN0b3I8Um9sZUluZm8+IDwtPiBQYXJjZWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLT53cml0ZVZlY3RvclNpemUodik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IFQmIHggOiB2KSB7CisgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoeCwgcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6dmVjdG9yPFQ+KiB2LCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLnJlc2l6ZU91dFZlY3Rvcih2KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGZvciAoVCYgeCA6ICp2KSB7CisgICAgICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCZ4LCBwKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQnBPTVhTdG9yZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YU3RvcmU+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCcE9NWFN0b3JlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElPTVhTdG9yZT4oaW1wbCkgeworICAgIH0KKworICAgIHN0YXR1c190IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfU0VSVklDRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChhdHRyaWJ1dGVzLCByZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTk9ERV9QUkVGSVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKHByZWZpeCwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX1JPTEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChyb2xlTGlzdCwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG5hbWUsICZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09NWCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcihvbXgpOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE9NWFN0b3JlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YU3RvcmUiKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBDSEVDS19PTVhfSU5URVJGQUNFKGludGVyZmFjZSwgZGF0YSwgcmVwbHkpIFwKKyAgICAgICAgZG8geyBpZiAoIShkYXRhKS5lbmZvcmNlSW50ZXJmYWNlKGludGVyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKSkgeyBcCisgICAgICAgICAgICBBTE9HVygiQ2FsbCBpbmNvcnJlY3RseSByb3V0ZWQgdG8gIiAjaW50ZXJmYWNlKTsgXAorICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOyBcCisgICAgICAgIH0gfSB3aGlsZSAoMCkKKworc3RhdHVzX3QgQm5PTVhTdG9yZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgTElTVF9TRVJWSUNFX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygmYXR0cmlidXRlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RTZXJ2aWNlQXR0cmlidXRlcygpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChhdHRyaWJ1dGVzLCByZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RTZXJ2aWNlQXR0cmlidXRlcygpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTk9ERV9QUkVGSVg6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE5vZGVQcmVmaXgoJnByZWZpeCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE5vZGVQcmVmaXgoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwocHJlZml4LCByZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE5vZGVQcmVmaXgoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgTElTVF9ST0xFUzogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiByb2xlTGlzdDsKKworICAgICAgICAgICAgc3RhdHVzID0gbGlzdFJvbGVzKCZyb2xlTGlzdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RSb2xlcygpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyb2xlTGlzdCwgcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0Um9sZXMoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX09NWDogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgICAgICBzcDxJT01YPiBvbXg7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCZuYW1lLCBkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgdG8gcmV0cmlldmUgbmFtZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE9teChuYW1lLCAmb214KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDk1ZjdkMmUuLjk3MjRmYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiSVJlc291cmNlTWFuYWdlclNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAppbmRleCAxZjE4OGYzLi5hNTcwZmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCkBAIC0xMDEsMzYgKzEwMSw0NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzQnVpbGRlcjo6YWRkUHJvZmlsZUxldmVsKHVpbnQzMl90IHByb2ZpbGUsIHVpbnQzMl90IGxldmVsKSB7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZERldGFpbCgKKyAgICAgICAgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIG1DYXAtPm1EZXRhaWxzLT5zZXRTdHJpbmcoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkRGV0YWlsKAorICAgICAgICBjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpIHsKKyAgICBtQ2FwLT5tRGV0YWlscy0+c2V0SW50MzIoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkUHJvZmlsZUxldmVsKAorICAgICAgICB1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewogICAgIFByb2ZpbGVMZXZlbCBwcm9maWxlTGV2ZWw7CiAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gcHJvZmlsZTsKICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gbGV2ZWw7Ci0gICAgbVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgaWYgKG1DYXAtPm1Qcm9maWxlTGV2ZWxzU29ydGVkLmluZGV4T2YocHJvZmlsZUxldmVsKSA8IDApIHsKKyAgICAgICAgbUNhcC0+bVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgICAgIG1DYXAtPm1Qcm9maWxlTGV2ZWxzU29ydGVkLmFkZChwcm9maWxlTGV2ZWwpOworICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzQnVpbGRlcjo6YWRkQ29sb3JGb3JtYXQodWludDMyX3QgZm9ybWF0KSB7Ci0gICAgbUNvbG9yRm9ybWF0cy5wdXNoKGZvcm1hdCk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkgeworICAgIGlmIChtQ2FwLT5tQ29sb3JGb3JtYXRzU29ydGVkLmluZGV4T2YoZm9ybWF0KSA8IDApIHsKKyAgICAgICAgbUNhcC0+bUNvbG9yRm9ybWF0cy5wdXNoKGZvcm1hdCk7CisgICAgICAgIG1DYXAtPm1Db2xvckZvcm1hdHNTb3J0ZWQuYWRkKGZvcm1hdCk7CisgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyOjphZGRGbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIG1GbGFncyB8PSBmbGFnczsKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKKyAgICBtQ2FwLT5tRmxhZ3MgfD0gZmxhZ3M7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OkNhcGFiaWxpdGllc1dyaXRlcigKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcyogY2FwKSA6IG1DYXAoY2FwKSB7CiB9CiAKIGJvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUlzRW5jb2RlcjsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mbzo6aGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtUXVpcmtzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgaWYgKG1RdWlya3MuaXRlbUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7CiAgICAgbWltZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewpAQCAtMTUxLDIwICsxNjEsMjEgQEAKICAgICByZXR1cm4gbU5hbWUuY19zdHIoKTsKIH0KIAorY29uc3QgY2hhciAqTWVkaWFDb2RlY0luZm86OmdldE93bmVyTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU93bmVyLmNfc3RyKCk7Cit9CisKIC8vIHN0YXRpYwogc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgIEFTdHJpbmcgb3duZXIgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOwotICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGlzRW5jb2RlciwgTlVMTCk7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CisgICAgaW5mby0+bU5hbWUgPSBuYW1lOworICAgIGluZm8tPm1Pd25lciA9IG93bmVyOworICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQVN0cmluZyBxdWlyayA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bVF1aXJrcy5wdXNoX2JhY2socXVpcmspOwotICAgICAgICB9Ci0gICAgfQotICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkKQEAgLTE3OCwxMSArMTg5LDggQEAKIAogc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKICAgICBtTmFtZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgbU93bmVyLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1RdWlya3Muc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RdWlya3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVF1aXJrcy5pdGVtQXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIH0KICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKQEAgLTIwMiw4NiArMjEwLDQ2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpCi0gICAgOiBtTmFtZShuYW1lKSwKLSAgICAgIG1Jc0VuY29kZXIoZW5jb2RlciksCi0gICAgICBtSGFzU29sZU1pbWUoZmFsc2UpIHsKLSAgICBpZiAobWltZSAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZE1pbWUobWltZSk7Ci0gICAgICAgIG1IYXNTb2xlTWltZSA9IHRydWU7Ci0gICAgfQorTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkgewogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgaWYgKG1IYXNTb2xlTWltZSkgewotICAgICAgICBBTE9HRSgiQ29kZWMgJyVzJyBhbHJlYWR5IGhhZCBpdHMgdHlwZSBzcGVjaWZpZWQiLCBtTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBtSW5mby0+bU5hbWUgPSBuYW1lOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcikgeworICAgIG1JbmZvLT5tT3duZXIgPSBvd25lcjsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0RW5jb2Rlcihib29sIGlzRW5jb2RlcikgeworICAgIG1JbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwogICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgIG1DdXJyZW50Q2FwcyA9IG1DYXBzLnZhbHVlQXQoaXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DdXJyZW50Q2FwcyA9IG5ldyBDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgbUNhcHMuYWRkKEFTdHJpbmcobWltZSksIG1DdXJyZW50Q2Fwcyk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCisgICAgICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoCisgICAgICAgICAgICAgICAgbUluZm8tPm1DYXBzLnZhbHVlQXQoaXgpLmdldCgpKSk7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMoKTsKKyAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWltZSksIGNhcHMpOworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCisgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcihjYXBzLmdldCgpKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp1cGRhdGVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwotICAgIGlmIChpeCA8IDApIHsKLSAgICAgICAgQUxPR0UoInVwZGF0ZU1pbWUgbWltZSBub3QgZm91bmQgJXMiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRDYXBzID0gbUNhcHMudmFsdWVBdChpeCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CiAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgbUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7Ci0gICAgICAgIC8vIG1DdXJyZW50Q2FwcyB3aWxsIGJlIHJlbW92ZWQgd2hlbiBjb21wbGV0ZWQKKyAgICAgICAgbUluZm8tPm1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBzcDxDYXBhYmlsaXRpZXM+ICZjYXBzKSB7Ci0gICAgLy8gVFJJQ0tZOiBjb3B5IGRhdGEgdG8gbUN1cnJlbnRDYXBzIGFzIGl0IGlzIGEgcmVmZXJlbmNlIHRvCi0gICAgLy8gYW4gZWxlbWVudCBvZiB0aGUgY2FwYWJpbGl0ZXMgbWFwLgotICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5jbGVhcigpOwotICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5hcHBlbmRWZWN0b3IoY2Fwcy0+bUNvbG9yRm9ybWF0cyk7Ci0gICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5jbGVhcigpOwotICAgIG1DdXJyZW50Q2Fwcy0+bVByb2ZpbGVMZXZlbHMuYXBwZW5kVmVjdG9yKGNhcHMtPm1Qcm9maWxlTGV2ZWxzKTsKLSAgICBtQ3VycmVudENhcHMtPm1GbGFncyA9IGNhcHMtPm1GbGFnczsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzID0gY2Fwcy0+bURldGFpbHM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgaWYgKCFoYXNRdWlyayhuYW1lKSkgewotICAgICAgICBtUXVpcmtzLnB1c2gobmFtZSk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpjb21wbGV0ZSgpIHsKLSAgICBtQ3VycmVudENhcHMgPSBOVUxMOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgewotICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyhrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0luZm86OmFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOwotICAgIHRhZy5hcHBlbmQoa2V5KTsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRJbnQzMih0YWcuY19zdHIoKSwgdmFsdWUpOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKLSAgICBBU3RyaW5nIHRhZyA9ICJmZWF0dXJlLSI7Ci0gICAgdGFnLmFwcGVuZChrZXkpOwotICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyh0YWcuY19zdHIoKSwgdmFsdWUpOworTWVkaWFDb2RlY0luZm9Xcml0ZXI6Ok1lZGlhQ29kZWNJbmZvV3JpdGVyKE1lZGlhQ29kZWNJbmZvKiBpbmZvKSA6CisgICAgbUluZm8oaW5mbykgewogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggOWY4MDNjYi4uMDI4NjE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAotI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCIKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9TdHJpbmdBcnJheS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKaW5kZXggZGMyYmM4Mi4uYmNkYzNiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKQEAgLTI0LDYgKzI0LDggQEAKIAogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKIAorZXh0ZXJuICJDIiBzaXplX3QgX19jZmlfc2hhZG93X3NpemUoKTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB2b2lkIGxpbWl0UHJvY2Vzc01lbW9yeSgKQEAgLTYyLDYgKzY0LDE5IEBACiAgICAgaWYgKHByb3BWYWwgPiAwICYmIHVpbnQ2NF90KHByb3BWYWwpIDw9IFNJWkVfTUFYKSB7CiAgICAgICAgIG1heE1lbSA9IHByb3BWYWw7CiAgICAgfQorCisgICAgLy8gSW5jcmVhc2UgYnkgdGhlIHNpemUgb2YgdGhlIENGSSBzaGFkb3cgbWFwcGluZy4gTW9zdCBvZiB0aGUgc2hhZG93IGlzIG5vdAorICAgIC8vIGJhY2tlZCB3aXRoIHBoeXNpY2FsIHBhZ2VzLCBhbmQgaXQgaXMgcG9zc2libGUgZm9yIHRoZSByZXN1bHQgdG8gYmUKKyAgICAvLyBoaWdoZXIgdGhhbiB0b3RhbCBwaHlzaWNhbCBtZW1vcnkuIFRoaXMgaXMgZmluZSBmb3IgUkxJTUlUX0FTLgorICAgIHNpemVfdCBjZmlfc2l6ZSA9IF9fY2ZpX3NoYWRvd19zaXplKCk7CisgICAgaWYgKGNmaV9zaXplKSB7CisgICAgICBBTE9HVigiY2ZpIHNoYWRvdyBzaXplOiAlenUiLCBjZmlfc2l6ZSk7CisgICAgICBpZiAobWF4TWVtIDw9IFNJWkVfTUFYIC0gY2ZpX3NpemUpIHsKKyAgICAgICAgbWF4TWVtICs9IGNmaV9zaXplOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF4TWVtID0gU0laRV9NQVg7CisgICAgICB9CisgICAgfQogICAgIEFMT0dWKCJhY3R1YWwgbGltaXQ6ICV6dSIsIG1heE1lbSk7CiAKICAgICBzdHJ1Y3QgcmxpbWl0IGxpbWl0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwCmluZGV4IDAyZWZjNWYuLjc1ODhlMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJNaWRpRGV2aWNlSW5mbyIKIAotI2luY2x1ZGUgIk1pZGlEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSA8bWVkaWEvTWlkaURldmljZUluZm8uaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IGZhYWU5NTQuLjRlNWQ2N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCi0jaW5jbHVkZSAibWVkaWEvTWlkaUlvV3JhcHBlci5oIgorI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KIAogc3RhdGljIGludCByZWFkQXQodm9pZCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIGludCBwb3MsIGludCBzaXplKSB7CiAgICAgcmV0dXJuICgoYW5kcm9pZDo6TWlkaUlvV3JhcHBlciopaGFuZGxlKS0+cmVhZEF0KGJ1ZmZlciwgcG9zLCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcCBiL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcAppbmRleCBiMmU1OTA3Li43ODY4Yjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPG1lZGlhL1N0cmluZ0FycmF5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAppbmRleCBhNmViYTg2Li5lNmM4ZjljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcApAQCAtMzc1LDcgKzM3NSw3IEBACiBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxDaGFubmVscykKIHsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsczsKLSAgICBpZiAoIU91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykgfHwKKyAgICBpZiAoIU91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykgJiYKICAgICAgICAgICAgICFJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBlMDMxNzY1Li41ZDI1ZTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTM5LDYgKzM5LDExIEBACiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwogCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7CisgICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Cit9CisKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAogICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgewpAQCAtMTYxLDYgKzE2Niw5IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogCisgICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgogICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldApAQCAtMTc1LDYgKzE4MywxMSBAQAogCiAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGFycmF5KTsKIAorICAgIHZvaWQgcmVwb3J0TWV0cmljcygpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaAppbmRleCA2NTVmMzM3Li4zODU4Zjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRGF0YVNvdXJjZS5oCkBAIC0zNSw3ICszNSw5IEBACiAgICAgLy8gR2V0IHRoZSBtZW1vcnkgdGhhdCByZWFkQXQgd3JpdGVzIGludG8uCiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgPSAwOwogICAgIC8vIFJlYWQgdXAgdG8gfHNpemV8IGJ5dGVzIGludG8gdGhlIG1lbW9yeSByZXR1cm5lZCBieSBnZXRJTWVtb3J5KCkuIFJldHVybnMKLSAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGVycm9yLiB8c2l6ZXwgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4KKyAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIChlZy4KKyAgICAvLyBFUlJPUl9FTkRfT0ZfU1RSRUFNIGluZGljYXRpbmcgRU9TLiBUaGlzIGlzIG5lZWRlZCBieSBDYWxsYmFja0RhdGFTb3VyY2UKKyAgICAvLyB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGluZyBvZiBsYXN0IGNodW5rKS4gfHNpemV8IG11c3Qgbm90IGJlIGxhcmdlciB0aGFuCiAgICAgLy8gdGhlIGJ1ZmZlci4KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwogICAgIC8vIEdldCB0aGUgc2l6ZSwgb3IgLTEgaWYgdGhlIHNpemUgaXMgdW5rbm93bi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCmluZGV4IGRhM2M1YTAzLi41OWZiMWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsNiArMzIsNyBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY1NlcnZpY2UpOwogCiAgICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSA9IDA7CisgICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUNvZGVjU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGFiNDBmNTMuLjBhYzc2NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsMTQgKzIwLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1ldGFEYXRhOwotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBISW50ZXJmYWNlVG9rZW47CiAKIGNsYXNzIElNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKIHB1YmxpYzoKQEAgLTY1LDExICs2MywxMyBAQAogICAgIC8vIGZvciBEUk0KICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pICA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKSAgPSAwOwogCiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggYzkwZjI1NC4uZWE5NTE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMTksMTMgKzE5LDEyIEBACiAjZGVmaW5lIEFORFJPSURfSU1FRElBTUVUQURBVEFSRVRSSUVWRVJfSAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCitjbGFzcyBQYXJjZWw7CiBjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIApAQCAtNDEsOCArNDAsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0RnJhbWVBdFRpbWUoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggOWEwYWRhMS4uZTY5YzAyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTI5LDggKzI5LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KIAotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhkYjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YU3RvcmUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lPTVhTVE9SRV9IXworCisjZGVmaW5lIEFORFJPSURfSU9NWFNUT1JFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SU9teFN0b3JlOworCitjbGFzcyBJT01YU3RvcmUgOiBwdWJsaWMgSUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVhTdG9yZSk7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5OworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5vZGVJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3duZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKKyAgICB9OworCisgICAgc3RydWN0IFJvbGVJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcm9sZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7CisgICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Tm9kZUluZm8+IG5vZGVzOworICAgIH07CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgPSAwOworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBCbk9NWFN0b3JlIDogcHVibGljIEJuSW50ZXJmYWNlPElPTVhTdG9yZT4geworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSU9NWF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmluZGV4IDZiNTBmMjIuLmFiMmNkMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2RlZmluZSBNRURJQV9DT0RFQ19JTkZPX0hfCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTM2LDEyICszNywyMCBAQAogCiB0eXBlZGVmIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IENvZGVjU2V0dGluZ3M7CiAKK3N0cnVjdCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKKwogc3RydWN0IE1lZGlhQ29kZWNJbmZvIDogcHVibGljIFJlZkJhc2UgewogICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgewogICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKICAgICAgICAgdWludDMyX3QgbUxldmVsOworICAgICAgICBib29sIG9wZXJhdG9yIDwoY29uc3QgUHJvZmlsZUxldmVsICZvKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVByb2ZpbGUgPCBvLm1Qcm9maWxlIHx8IChtUHJvZmlsZSA9PSBvLm1Qcm9maWxlICYmIG1MZXZlbCA8IG8ubUxldmVsKTsKKyAgICAgICAgfQogICAgIH07CiAKKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOworCiAgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICAgICAgZW51bSB7CiAgICAgICAgICAgICAvLyBkZWNvZGVyIGZsYWdzCkBAIC02MSw3ICs3MCw5IEBACiAKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOworICAgICAgICBTb3J0ZWRWZWN0b3I8UHJvZmlsZUxldmVsPiBtUHJvZmlsZUxldmVsc1NvcnRlZDsKICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzOworICAgICAgICBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHNTb3J0ZWQ7CiAgICAgICAgIHVpbnQzMl90IG1GbGFnczsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1EZXRhaWxzOwogCkBAIC03Miw3MiArODMsMTkxIEBACiAgICAgICAgIHN0YXRpYyBzcDxDYXBhYmlsaXRpZXM+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKIAotICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXBhYmlsaXRpZXMpOworICAgICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2FwYWJpbGl0aWVzKTsKIAogICAgICAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNJbmZvOworICAgICAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNJbmZvV3JpdGVyOworICAgICAgICBmcmllbmQgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlcjsKICAgICB9OwogCi0gICAgLy8gVXNlIGEgc3ViY2xhc3MgdG8gYWxsb3cgc2V0dGluZyBmaWVsZHMgb24gY29uc3RydWN0aW9uIHdpdGhvdXQgYWxsb3dpbmcKLSAgICAvLyB0byBkbyB0aGUgc2FtZSB0aHJvdWdob3V0IHRoZSBmcmFtZXdvcmsuCi0gICAgc3RydWN0IENhcGFiaWxpdGllc0J1aWxkZXIgOiBwdWJsaWMgQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIG1vZGlmeWluZyBpbmZvcm1hdGlvbiBpbnNpZGUgYSBgQ2FwYWJpbGl0aWVzYAorICAgICAqIG9iamVjdC4gQW4gb2JqZWN0IG9mIHR5cGUgYENhcGFiaWxpdGllc1dyaXRlcmAgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoKWAgb3IKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnVwZGF0ZU1pbWUoKWAuCisgICAgICovCisgICAgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBrZXktdmFsdWUgcGFpciB0byB0aGUgbGlzdCBvZiBkZXRhaWxzLiBJZiB0aGUga2V5IGFscmVhZHkKKyAgICAgICAgICogZXhpc3RzLCB0aGUgb2xkIHZhbHVlIHdpbGwgYmUgcmVwbGFjZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEEgcGFpciBhZGRlZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYWNjZXNzaWJsZSBieQorICAgICAgICAgKiBgQ2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKClgLiBDYWxsIGBBTWVzc2FnZTo6Z2V0U3RyaW5nKClgIHdpdGggdGhlCisgICAgICAgICAqIHNhbWUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBhbHJlYWR5CisgICAgICAgICAqIGV4aXN0cywgdGhlIG9sZCB2YWx1ZSB3aWxsIGJlIHJlcGxhY2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBBIHBhaXIgYWRkZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGFjY2Vzc2libGUgYnkKKyAgICAgICAgICogYENhcGFiaWxpdGllczo6Z2V0RGV0YWlscygpYC4gQ2FsbCBgQU1lc3NhZ2U6OmdldEludDMyKClgIHdpdGggdGhlCisgICAgICAgICAqIHNhbWUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQzMl90YCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBwcm9maWxlLWxldmVsIHBhaXIuIElmIHRoaXMgcHJvZmlsZS1sZXZlbCBwYWlyIGFscmVhZHkgZXhpc3RzLAorICAgICAgICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSAicHJvZmlsZSIgY29tcG9uZW50LgorICAgICAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlICJsZXZlbCIgY29tcG9uZW50LgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRQcm9maWxlTGV2ZWwodWludDMyX3QgcHJvZmlsZSwgdWludDMyX3QgbGV2ZWwpOworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY29sb3IgZm9ybWF0LiBJZiB0aGlzIGNvbG9yIGZvcm1hdCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZQorICAgICAgICAgKiBpZ25vcmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBjb2xvciBmb3JtYXQuCisgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgZmxhZ3MuIFRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiBpcyBiaXR3aXNlLW9yLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICogYml0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBUaGUgYWRkaXRpb25hbCBmbGFncy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpOworICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBDYXBhYmlsaXRpZXMqIG1DYXA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgZm9yIHRoZSBnaXZlbiBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYXAgVGhlIGBDYXBhYmlsaXRpZXNgIG9iamVjdCB0byBiZSB3cml0dGVuIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgQ2FwYWJpbGl0aWVzV3JpdGVyKENhcGFiaWxpdGllcyogY2FwKTsKKworICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAogICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNRdWlyayhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKICAgICB2b2lkIGdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0OwogICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAorICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCisgICAgICoKKyAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgogICAgICAqLwogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjSW5mbz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgLy8gdmFyaWFibGUgc2V0IG9ubHkgaW4gY29uc3RydWN0b3IgLSB0aGVzZSBhcmUgYWNjZXNzZWQgYnkgTWVkaWFDb2RlY0xpc3QKLSAgICAvLyB0byBhdm9pZCBkdXBsaWNhdGlvbiBvZiBzYW1lIHZhcmlhYmxlcwogICAgIEFTdHJpbmcgbU5hbWU7CisgICAgQVN0cmluZyBtT3duZXI7CiAgICAgYm9vbCBtSXNFbmNvZGVyOwotICAgIGJvb2wgbUhhc1NvbGVNaW1lOyAvLyB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBtaW1lCi0KLSAgICBWZWN0b3I8QVN0cmluZz4gbVF1aXJrczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CiAKLSAgICBzcDxDYXBhYmlsaXRpZXM+IG1DdXJyZW50Q2FwczsgLy8gY3VycmVudGx5IGluaXRhbGl6ZWQgY2FwYWJpbGl0aWVzCi0KICAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdDsKIAotICAgIC8qIE1ldGhvZHMgdXNlZCBieSBNZWRpYUNvZGVjTGlzdCB0byBjb25zdHJ1Y3QgdGhlIGluZm8KLSAgICAgKiBvYmplY3QgZnJvbSBYTUwuCi0gICAgICoKLSAgICAgKiBBZnRlciBpbmZvIG9iamVjdCBpcyBjcmVhdGVkOgotICAgICAqIC0gYWRkaXRpb25hbCBxdWlya3MgY2FuIGJlIGFkZGVkCi0gICAgICogLSBhZGRpdGlvbmFsIG1pbWVzIGNhbiBiZSBhZGRlZAotICAgICAqICAgLSBPTVggY29kZWMgY2FwYWJpbGl0aWVzIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQotICAgICAqICAgLSBhIGNhcGFiaWxpdHkgZGV0YWlsIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQotICAgICAqICAgLSBhIGZlYXR1cmUgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCi0gICAgICogICAtIGluZm8gb2JqZWN0IGNhbiBiZSBjb21wbGV0ZWQgd2hlbiBwYXJzaW5nIG9mIGEgbWltZS10eXBlIGlzIGRvbmUKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuIEFmdGVyIHRoZSBjb25zdHJ1Y3Rpb24sIGl0cworICAgICAqIGluZm9ybWF0aW9uIGNhbiBiZSBzZXQgdmlhIGFuIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IG9idGFpbmVkIGZyb20KKyAgICAgKiBgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKClgLgogICAgICAqLwotICAgIE1lZGlhQ29kZWNJbmZvKEFTdHJpbmcgbmFtZSwgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKLSAgICB2b2lkIGFkZFF1aXJrKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHN0YXR1c190IGFkZE1pbWUoY29uc3QgY2hhciAqbWltZSk7Ci0gICAgc3RhdHVzX3QgdXBkYXRlTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBNZWRpYUNvZGVjSW5mbygpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBzcDxDYXBhYmlsaXRpZXM+ICZjYXBzKTsKLSAgICB2b2lkIGFkZERldGFpbChjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IEFTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKTsKLSAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0gICAgdm9pZCByZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOwotICAgIHZvaWQgY29tcGxldGUoKTsKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFDb2RlY0luZm8pOwogCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlY0luZm8pOwotCi0gICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0OworICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CisgICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvCisgKiBwb3B1bGF0ZSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCisgKgorICogVGhlIG9ubHkgcGxhY2Ugd2hlcmUgYW4gaW5zdGFuY2Ugb2YgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBjYW4gYmUgY29uc3RydWN0ZWQKKyAqIGlzIGBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkTWVkaWFDb2RlY0luZm8oKWAuIEEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgCisgKiBpbnN0YW5jZSBzaG91bGQgY2FsbCBgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKClgIG9uIHRoZSBnaXZlbgorICogYE1lZGlhQ29kZWNMaXN0V3JpdGVyYCBvYmplY3QgZ2l2ZW4gYXMgYW4gaW5wdXQgdG8KKyAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpidWlsZE1lZGlhQ29kZWNMaXN0KClgLgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0luZm9Xcml0ZXIgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUuCisgICAgICovCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3duZXIgbmFtZSBvZiB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBUaGlzICJvd25lciBuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgYElPbXhgIGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhpcworICAgICAqIGNvZGVjLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIFRoZSBuZXcgb3duZXIgbmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKTsKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlzRW5jb2RlciBXaGV0aGVyIHRoaXMgY29kZWMgaXMgYW4gZW5jb2RlciBvciBhIGRlY29kZXIuCisgICAgICovCisgICAgdm9pZCBzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyID0gdHJ1ZSk7CisgICAgLyoqCisgICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGlmeWluZyB0aGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYC4KKyAgICAgKgorICAgICAqIElmIHRoZSBtaW1lIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQorICAgICAqIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZSBUaGUgbmFtZSBvZiBhIG5ldyBtaW1lIHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIHdyaXRlciBUaGUgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0IGZvciBtb2RpZnlpbmcgdGhlCisgICAgICogYENhcGFiaWxpdGllc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW1lLiBgd3JpdGVyYCB3aWxsIGJlIHZhbGlkCisgICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBtaW1lYCBhbHJlYWR5IGV4aXN0cyBvciBub3QuCisgICAgICovCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1pbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtaW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0luZm9gLgorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvKiBtSW5mbzsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvIFRoZSB1bmRlcmx5aW5nIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKE1lZGlhQ29kZWNJbmZvKiBpbmZvKTsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZWRpYUNvZGVjSW5mb1dyaXRlcik7CisKKyAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0V3JpdGVyOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggYTVlMTM1MC4uMjU3MDAyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTQxLDggKzQxLDkgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKLSAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKKyAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgPSAwOwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCogZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSA9IDA7CiB9OwpAQCAtNTQsNyArNTUsOSBAQAogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UoKSB7fQogCiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IC8qdGltZVVzKi8sIGludCAvKm9wdGlvbiovKSB7IHJldHVybiBOVUxMOyB9CisgICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgLyp0aW1lVXMqLywgaW50IC8qb3B0aW9uKi8sIGludCAvKmNvbG9yRm9ybWF0Ki8sIGJvb2wgLyptZXRhT25seSovKQorICAgIHsgcmV0dXJuIE5VTEw7IH0KICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQqIGV4dHJhY3RBbGJ1bUFydCgpIHsgcmV0dXJuIE5VTEw7IH0KICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQgLyprZXlDb2RlKi8pIHsgcmV0dXJuIE5VTEw7IH0KIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWEzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2RlZmluZSBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHZlbmRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggOGVkMDdlZS4uNjVjMjY2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTc2LDggKzc2LDEwIEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwotICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sCisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsIGJvb2wgbWV0YU9ubHkgPSBmYWxzZSk7CiAgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKaW5kZXggODYzMjJkYS4uMDg2ZjY0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxPTVhGZW5jZVBhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214QnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9Cbk9NWEJ1ZmZlclNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDA4YTllNmEuLjdkMjdkNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC0xMzAsNyArMTMwLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpCisgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKElEYXRhU291cmNlKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMzgsMTggKzEzOCwyMCBAQAogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1pbWUpOwogfQogCi1zcDxJTWVtb3J5PiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKK3NwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIG9wdGlvbiglZCkgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogfQogCiBjb25zdCBjaGFyKiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNjhiYWZlMS4uMjhhNzc0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQW5hbHl0aWNzU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFTkVSQVRFX1VOSVFVRV9TRVNTSU9OSUQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCJiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIik7CisgICAgICAgICAgICBBTE9HVygiYmFkIHJlc3BvbnNlIGZyb20gc2VydmljZSBmb3IgZ2VuZXJhdGVTZXNzaW9uSWQsIGVycj0lZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOwogICAgICAgICB9CiAgICAgICAgIHNlc3Npb25pZCA9IHJlcGx5LnJlYWRJbnQ2NCgpOwpAQCAtOTQsNiArOTQsNyBAQAogCiAgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTVUJNSVRfSVRFTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coImJhZCByZXNwb25zZSBmcm9tIHNlcnZpY2UgZm9yIHN1Ym1pdCwgZXJyPSVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JREludmFsaWQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCA0Mzg4MWIzLi5mOTY4YzA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNTksNiArNTksNyBAQAogTWVkaWFBbmFseXRpY3NJdGVtOjpNZWRpYUFuYWx5dGljc0l0ZW0oKQogICAgIDogbVBpZCgtMSksCiAgICAgICBtVWlkKC0xKSwKKyAgICAgIG1Qa2dWZXJzaW9uQ29kZSgwKSwKICAgICAgIG1TZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSUROb25lKSwKICAgICAgIG1UaW1lc3RhbXAoMCksCiAgICAgICBtRmluYWxpemVkKDApLApAQCAtNzAsNiArNzEsNyBAQAogTWVkaWFBbmFseXRpY3NJdGVtOjpNZWRpYUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpLZXkga2V5KQogICAgIDogbVBpZCgtMSksCiAgICAgICBtVWlkKC0xKSwKKyAgICAgIG1Qa2dWZXJzaW9uQ29kZSgwKSwKICAgICAgIG1TZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSUROb25lKSwKICAgICAgIG1UaW1lc3RhbXAoMCksCiAgICAgICBtRmluYWxpemVkKDApLApAQCAtOTgsNyArMTAwLDcgQEAKIAogICAgIC8vIGNsZWFuIGF0dHJpYnV0ZXMKICAgICAvLyBjb250ZW50cyBvZiB0aGUgYXR0cmlidXRlcwotICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1Qcm9wU2l6ZTsgaSsrICkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1Qcm9wQ291bnQ7IGkrKyApIHsKICAgICAgICAgY2xlYXJQcm9wKCZtUHJvcHNbaV0pOwogICAgIH0KICAgICAvLyB0aGUgYXR0cmlidXRlIHJlY29yZHMgdGhlbXNlbHZlcwpAQCAtMTIwLDYgKzEyMiw4IEBACiAgICAgICAgIC8vIGtleSBhcyBwYXJ0IG9mIGNvbnN0cnVjdG9yCiAgICAgICAgIGRzdC0+bVBpZCA9IHRoaXMtPm1QaWQ7CiAgICAgICAgIGRzdC0+bVVpZCA9IHRoaXMtPm1VaWQ7CisgICAgICAgIGRzdC0+bVBrZ05hbWUgPSB0aGlzLT5tUGtnTmFtZTsKKyAgICAgICAgZHN0LT5tUGtnVmVyc2lvbkNvZGUgPSB0aGlzLT5tUGtnVmVyc2lvbkNvZGU7CiAgICAgICAgIGRzdC0+bVNlc3Npb25JRCA9IHRoaXMtPm1TZXNzaW9uSUQ7CiAgICAgICAgIGRzdC0+bVRpbWVzdGFtcCA9IHRoaXMtPm1UaW1lc3RhbXA7CiAgICAgICAgIGRzdC0+bUZpbmFsaXplZCA9IHRoaXMtPm1GaW5hbGl6ZWQ7CkBAIC0yMDEsNiArMjA1LDI0IEBACiAgICAgcmV0dXJuIG1VaWQ7CiB9CiAKK01lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRQa2dOYW1lKEFTdHJpbmcgcGtnTmFtZSkgeworICAgIG1Qa2dOYW1lID0gcGtnTmFtZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0FTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtUGtnTmFtZTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFBrZ1ZlcnNpb25Db2RlKGludDMyX3QgcGtnVmVyc2lvbkNvZGUpIHsKKyAgICBtUGtnVmVyc2lvbkNvZGUgPSBwa2dWZXJzaW9uQ29kZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBrZ1ZlcnNpb25Db2RlOworfQorCiAvLyB0aGlzIGtleSBpcyBmb3IgdGhlIG92ZXJhbGwgcmVjb3JkIC0tICJjb2RlYyIsICJwbGF5ZXIiLCAiZHJtIiwgZXRjCiBNZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0S2V5KE1lZGlhQW5hbHl0aWNzSXRlbTo6S2V5IGtleSkgewogICAgIG1LZXkgPSBrZXk7CkBAIC0yNjMsMTEgKzI4NSwzMCBAQAogICAgICAgICBpID0gbVByb3BDb3VudCsrOwogICAgICAgICBwcm9wID0gJm1Qcm9wc1tpXTsKICAgICAgICAgcHJvcC0+c2V0TmFtZShuYW1lLCBsZW4pOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlTm9uZTsgICAgICAgIC8vIG1ha2UgY2FsbGVyIHNldCB0eXBlIGluZm8KICAgICB9CiAKICAgICByZXR1cm4gcHJvcDsKIH0KIAorLy8gdXNlZCB3aXRoaW4gdGhlIHN1bW1hcml6ZXJzOyByZXR1cm4gd2hldGhlciBwcm9wZXJ0eSBleGlzdGVkCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6cmVtb3ZlUHJvcChjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzaXplX3QgaSA9IGZpbmRQcm9wSW5kZXgobmFtZSwgbGVuKTsKKyAgICBpZiAoaSA8IG1Qcm9wQ291bnQpIHsKKyAgICAgICAgUHJvcCAqcHJvcCA9ICZtUHJvcHNbaV07CisgICAgICAgIGNsZWFyUHJvcChwcm9wKTsKKyAgICAgICAgaWYgKGkgIT0gbVByb3BDb3VudC0xKSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgbWlkZGxlLCBicmluZyBsYXN0IG9uZSBkb3duIHRvIGZpbGwgZ2FwCisgICAgICAgICAgICBjb3B5UHJvcChwcm9wLCAmbVByb3BzW21Qcm9wQ291bnQtMV0pOworICAgICAgICAgICAgY2xlYXJQcm9wKCZtUHJvcHNbbVByb3BDb3VudC0xXSk7CisgICAgICAgIH0KKyAgICAgICAgbVByb3BDb3VudC0tOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBzZXQgdGhlIHZhbHVlcwogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OnNldEludDMyKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBpbnQzMl90IHZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKQEAgLTU2OCw2ICs2MDksMTAgQEAKICAgICAvLyBpbnRvICd0aGlzJyBvYmplY3QKICAgICAvLyAuLiB3ZSBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nIHRvIHB1dCBhd2F5LgogICAgIG1LZXkgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgbVBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbVVpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbVBrZ05hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgbVBrZ1ZlcnNpb25Db2RlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICBtU2Vzc2lvbklEID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICBtRmluYWxpemVkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICBtVGltZXN0YW1wID0gZGF0YS5yZWFkSW50NjQoKTsKQEAgLTYxMSw2ICs2NTYsMTAgQEAKIAogCiAgICAgZGF0YS0+d3JpdGVDU3RyaW5nKG1LZXkuY19zdHIoKSk7CisgICAgZGF0YS0+d3JpdGVJbnQzMihtUGlkKTsKKyAgICBkYXRhLT53cml0ZUludDMyKG1VaWQpOworICAgIGRhdGEtPndyaXRlQ1N0cmluZyhtUGtnTmFtZS5jX3N0cigpKTsKKyAgICBkYXRhLT53cml0ZUludDMyKG1Qa2dWZXJzaW9uQ29kZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQ2NChtU2Vzc2lvbklEKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1GaW5hbGl6ZWQpOwogICAgIGRhdGEtPndyaXRlSW50NjQobVRpbWVzdGFtcCk7CkBAIC02NTEsMjEgKzcwMCw1NCBAQAogCiAKIEFTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZygpIHsKKyAgIHJldHVybiB0b1N0cmluZygtMSk7Cit9CiAKLSAgICBBU3RyaW5nIHJlc3VsdCA9ICIoIjsKK0FTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZyhpbnQgdmVyc2lvbikgeworCisgICAgLy8gdjAgOiByZWxlYXNlZCB3aXRoICdvJworICAgIC8vIHYxIDogYnVnIGZpeCAobWlzc2luZyBwaWQvZmluYWxpemVkIHNlcGFyYXRvciksCisgICAgLy8gICAgICBhZGRzIGFwayBuYW1lLCBhcGsgdmVyc2lvbiBjb2RlCisKKyAgICBpZiAodmVyc2lvbiA8PSBQUk9UT19GSVJTVCkgeworICAgICAgICAvLyBkZWZhdWx0IHRvIG9yaWdpbmFsIHYwIGZvcm1hdCwgdW50aWwgcHJvcGVyIHBhcnNlcnMgYXJlIGluIHBsYWNlCisgICAgICAgIHZlcnNpb24gPSBQUk9UT19WMDsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPiBQUk9UT19MQVNUKSB7CisgICAgICAgIHZlcnNpb24gPSBQUk9UT19MQVNUOworICAgIH0KKworICAgIEFTdHJpbmcgcmVzdWx0OwogICAgIGNoYXIgYnVmZmVyWzUxMl07CiAKKyAgICBpZiAodmVyc2lvbiA9PSBQUk9UT19WMCkgeworICAgICAgICByZXN1bHQgPSAiKCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlslZDoiLCB2ZXJzaW9uKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKwogICAgIC8vIHNhbWUgb3JkZXIgYXMgd2Ugc3BpbGwgaW50byB0aGUgcGFyY2VsLCBhbHRob3VnaCBub3QgcmVxdWlyZWQKICAgICAvLyBrZXkrc2Vzc2lvbiBhcmUgb3VyIHByaW1hcnkgbWF0Y2hpbmcgY3JpdGVyaWEKLSAgICAvL1JCRSBBTE9HRCgibUtleS5jX3N0ciIpOwogICAgIHJlc3VsdC5hcHBlbmQobUtleS5jX3N0cigpKTsKLSAgICAvL1JCRSBBTE9HRCgicG9zdC1tS2V5LmNfc3RyIik7CiAgICAgcmVzdWx0LmFwcGVuZCgiOiIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlIiBQUklkNjQgIjoiLCBtU2Vzc2lvbklEKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICAvLyB3ZSBuZWVkIHRoZXNlIGludGVybmFsbHksIGJ1dCBkb24ndCB3YW50IHRvIHVwbG9hZCB0aGVtCi0gICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiVkIiwgbVVpZCwgbVBpZCk7CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIGlmICh2ZXJzaW9uID49IFBST1RPX1YxKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobVBrZ05hbWUpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiOiVkOiIsIG1Qa2dWZXJzaW9uQ29kZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICAvLyBpbiAnbycgKHYxKSAsIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBwaWQgYW5kIGZpbmFsaXplZCB3YXMgb21pdHRlZAorICAgIGlmICh2ZXJzaW9uIDw9IFBST1RPX1YwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIG1QaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZDoiLCBtUGlkKTsKKyAgICB9CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiIsIG1GaW5hbGl6ZWQpOwpAQCAtNzEzLDcgKzc5NSwxMSBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKKyAgICBpZiAodmVyc2lvbiA9PSBQUk9UT19WMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC03MzQsMTEgKzgyMCwxNiBAQAogICAgIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IHN2YyA9IGdldEluc3RhbmNlKCk7CiAKICAgICBpZiAoc3ZjICE9IE5VTEwpIHsKLSAgICAgICAgc3ZjLT5zdWJtaXQodGhpcywgZm9yY2VuZXcpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IG5ld2lkID0gc3ZjLT5zdWJtaXQodGhpcywgZm9yY2VuZXcpOworICAgICAgICBpZiAobmV3aWQgPT0gU2Vzc2lvbklESW52YWxpZCkgeworICAgICAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKLSAgICAgICAgQUxPR0QoIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKKyAgICAgICAgQUxPR1coIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KQEAgLTc0Nyw2ICs4MzgsNyBAQAogLy8gc3RhdGljCiBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBNZWRpYUFuYWx5dGljc0l0ZW06OnNBbmFseXRpY3NTZXJ2aWNlOwogc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CitzdGF0aWMgaW50IHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA9IFNWQ19UUklFUzsKIAogLy9zdGF0aWMKIGJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKSB7CkBAIC03NjQsMTAgKzg1NiwyOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisKKy8vIG1vbml0b3IgaGVhbHRoIG9mIG91ciBjb25uZWN0aW9uIHRvIHRoZSBtZXRyaWNzIHNlcnZpY2UKK2NsYXNzIE1lZGlhTWV0cmljc0RlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmKSB7CisgICAgICAgICAgICBBTE9HVygiUmVhY3F1aXJlIHNlcnZpY2UgY29ubmVjdGlvbiBvbiBuZXh0IHJlcXVlc3QiKTsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6ZHJvcEluc3RhbmNlKCk7CisgICAgICAgIH0KK307CisKK3N0YXRpYyBzcDxNZWRpYU1ldHJpY3NEZWF0aE5vdGlmaWVyPiBzTm90aWZpZXIgPSBOVUxMOworCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpkcm9wSW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNJbml0TXV0ZXgpOworICAgIHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA9IFNWQ19UUklFUzsKKyAgICBzQW5hbHl0aWNzU2VydmljZSA9IE5VTEw7Cit9CisKIC8vc3RhdGljCiBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBNZWRpYUFuYWx5dGljc0l0ZW06OmdldEluc3RhbmNlKCkgeworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlcnZpY2VuYW1lID0gIm1lZGlhLm1ldHJpY3MiOwotICAgIHN0YXRpYyBpbnQgdHJpZXNfcmVtYWluaW5nID0gU1ZDX1RSSUVTOwogICAgIGludCBlbmFibGVkID0gaXNFbmFibGVkKCk7CiAKICAgICBpZiAoZW5hYmxlZCA9PSBmYWxzZSkgewpAQCAtNzk5LDE1ICs5MDksMjAgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNJbml0TXV0ZXgpOwogICAgICAgICBjb25zdCBjaGFyICpiYWRuZXNzID0gIiI7CiAKLSAgICAgICAgLy8gdGhpbmsgb2YgdHJpZXNfcmVtYWluaW5nIGFzIHRlbGxpbmcgdXMgd2hldGhlciBzZXJ2aWNlPT1OVUxMIGJlY2F1c2UKKyAgICAgICAgLy8gdGhpbmsgb2YgcmVtYWluaW5nQmluZEF0dGVtcHRzIGFzIHRlbGxpbmcgdXMgd2hldGhlciBzZXJ2aWNlPT1OVUxMIGJlY2F1c2UKICAgICAgICAgLy8gKDEpIHdlIGhhdmVuJ3QgdHJpZWQgdG8gaW5pdGlhbGl6ZSBpdCB5ZXQKICAgICAgICAgLy8gKDIpIHdlJ3ZlIHRyaWVkIHRvIGluaXRpYWxpemUgaXQsIGJ1dCBmYWlsZWQuCi0gICAgICAgIGlmIChzQW5hbHl0aWNzU2VydmljZSA9PSBOVUxMICYmIHRyaWVzX3JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgaWYgKHNBbmFseXRpY3NTZXJ2aWNlID09IE5VTEwgJiYgcmVtYWluaW5nQmluZEF0dGVtcHRzID4gMCkgewogICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHNtICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihzZXJ2aWNlbmFtZSkpOwogICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBzQW5hbHl0aWNzU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUFuYWx5dGljc1NlcnZpY2U+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzTm90aWZpZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc05vdGlmaWVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzTm90aWZpZXIgPSBuZXcgTWVkaWFNZXRyaWNzRGVhdGhOb3RpZmllcigpOworICAgICAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNOb3RpZmllcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYmFkbmVzcyA9ICJkaWQgbm90IGZpbmQgc2VydmljZSI7CiAgICAgICAgICAgICAgICAgfQpAQCAtODE2LDggKzkzMSw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzQW5hbHl0aWNzU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyaWVzX3JlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJpZXNfcmVtYWluaW5nLS07CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQmluZEF0dGVtcHRzLS07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChERUJVR19TRVJWSUNFQUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmFibGUgdG8gYmluZCB0byBzZXJ2aWNlICVzOiAlcyIsIHNlcnZpY2VuYW1lLCBiYWRuZXNzKTsKQEAgLTgyOSw3ICs5NDQsNiBAQAogICAgIH0KIH0KIAotCiAvLyBtZXJnZSB0aGUgaW5mbyBmcm9tICdpbmNvbWluZycgaW50byB0aGlzIHJlY29yZC4KIC8vIHdlIGZpbmlzaCB3aXRoIGEgdW5pb24gb2YgdGhpcytpbmNvbWluZyBhbmQgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGlzaW9ucwogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06Om1lcmdlKE1lZGlhQW5hbHl0aWNzSXRlbSAqaW5jb21pbmcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggZGM1MDFiMi4uZGQ3NDUyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTQyLDYgKzQyLDcgQEAKICAgICBmcmllbmQgY2xhc3MgSU1lZGlhQW5hbHl0aWNzU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFNZXRyaWNzSk5JOwogICAgIGZyaWVuZCBjbGFzcyBNZXRyaWNzU3VtbWFyaXplcjsKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFNZXRyaWNzRGVhdGhOb3RpZmllcjsKIAogICAgIHB1YmxpYzoKIApAQCAtNzUsNiArNzYsMTQgQEAKICAgICAgICAgdHlwZWRlZiBjb25zdCBjaGFyICpBdHRyOwogCiAKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBQUk9UT19WMCA9IDAsCisgICAgICAgICAgICBQUk9UT19GSVJTVCA9IFBST1RPX1YwLAorICAgICAgICAgICAgUFJPVE9fVjEgPSAxLAorICAgICAgICAgICAgUFJPVE9fTEFTVCA9IFBST1RPX1YxLAorICAgICAgICB9OworCisKICAgICBwdWJsaWM6CiAKICAgICAgICAgLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCkBAIC0xNjEsMTEgKzE3MCwxOCBAQAogICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldFVpZCh1aWRfdCk7CiAgICAgICAgIHVpZF90IGdldFVpZCgpIGNvbnN0OwogCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0UGtnTmFtZShBU3RyaW5nKTsKKyAgICAgICAgQVN0cmluZyBnZXRQa2dOYW1lKCkgY29uc3Q7CisKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dWZXJzaW9uQ29kZShpbnQzMl90KTsKKyAgICAgICAgaW50MzJfdCBnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0OworCiAgICAgICAgIC8vIG91ciBzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGJpbmRlciBjYWxscwogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCiAgICAgICAgIEFTdHJpbmcgdG9TdHJpbmcoKTsKKyAgICAgICAgQVN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CiAKICAgICAgICAgLy8gYXJlIHdlIGNvbGxlY3RpbmcgYW5hbHl0aWNzIGRhdGEKICAgICAgICAgc3RhdGljIGJvb2wgaXNFbmFibGVkKCk7CkBAIC0xODgsMTAgKzIwNCwxMyBAQAogICAgICAgICAvLyB0byBoZWxwIHZhbGlkYXRlIHRoYXQgQSBkb2Vzbid0IG1lc3Mgd2l0aCBCJ3MgcmVjb3JkcwogICAgICAgICBwaWRfdCAgICAgbVBpZDsKICAgICAgICAgdWlkX3QgICAgIG1VaWQ7CisgICAgICAgIEFTdHJpbmcgICBtUGtnTmFtZTsKKyAgICAgICAgaW50MzJfdCAgIG1Qa2dWZXJzaW9uQ29kZTsKIAogICAgICAgICAvLyBsZXQncyByZXVzZSBhIGJpbmRlciBjb25uZWN0aW9uCiAgICAgICAgIHN0YXRpYyBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBzQW5hbHl0aWNzU2VydmljZTsKICAgICAgICAgc3RhdGljIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IGdldEluc3RhbmNlKCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGRyb3BJbnN0YW5jZSgpOwogCiAgICAgICAgIC8vIHRyYWNraW5nIGluZm9ybWF0aW9uCiAgICAgICAgIFNlc3Npb25JRF90IG1TZXNzaW9uSUQ7ICAgICAgICAgLy8gZ3JvdXBpbmcgc2ltaWxhciByZWNvcmRzCkBAIC0yMjgsNiArMjQ3LDcgQEAKICAgICAgICAgc2l6ZV90IGZpbmRQcm9wSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgICAgIFByb3AgKmZpbmRQcm9wKGNvbnN0IGNoYXIgKm5hbWUpOwogICAgICAgICBQcm9wICphbGxvY2F0ZVByb3AoY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgIGJvb2wgcmVtb3ZlUHJvcChjb25zdCBjaGFyICpuYW1lKTsKIAogICAgICAgICBzaXplX3QgbVByb3BDb3VudDsKICAgICAgICAgc2l6ZV90IG1Qcm9wU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggMGE5Zjc5MS4uNmRhMWVjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTI0NSw4ICsyNDUsMTIgQEAKICAgICBpZiAoc0luaXRDb21wbGV0ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgcmVnaXN0ZXJGYWN0b3J5X2wobmV3IE51UGxheWVyRmFjdG9yeSgpLCBOVV9QTEFZRVIpOwotICAgIHJlZ2lzdGVyRmFjdG9yeV9sKG5ldyBUZXN0UGxheWVyRmFjdG9yeSgpLCBURVNUX1BMQVlFUik7CisgICAgSUZhY3RvcnkqIGZhY3RvcnkgPSBuZXcgTnVQbGF5ZXJGYWN0b3J5KCk7CisgICAgaWYgKHJlZ2lzdGVyRmFjdG9yeV9sKGZhY3RvcnksIE5VX1BMQVlFUikgIT0gT0spCisgICAgICAgIGRlbGV0ZSBmYWN0b3J5OworICAgIGZhY3RvcnkgPSBuZXcgVGVzdFBsYXllckZhY3RvcnkoKTsKKyAgICBpZiAocmVnaXN0ZXJGYWN0b3J5X2woZmFjdG9yeSwgVEVTVF9QTEFZRVIpICE9IE9LKQorICAgICAgICBkZWxldGUgZmFjdG9yeTsKIAogICAgIHNJbml0Q29tcGxldGUgPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5NDJhOGZjLi40OTZkYjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKIAotI2luY2x1ZGUgPE9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KIAogI2luY2x1ZGUgIkhEQ1AuaCIKICNpbmNsdWRlICJIVFRQQmFzZS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNzkzZjQ3Ni4uNWE0NjhmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0xNzUsNyArMTc1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKQorICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xODYsMTYgKzE4NiwxOCBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1pbWUpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOwogICAgIHJldHVybiByZXQ7CiB9CiAKIE11dGV4IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzTG9jazsKIAotc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglbGxkIHVzKSBvcHRpb24oJWQpIiwgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKICAgICBtVGh1bWJuYWlsLmNsZWFyKCk7CkBAIC0yMDMsMTIgKzIwNSwxMyBAQAogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FwdHVyZSBhIHZpZGVvIGZyYW1lIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihWaWRlb0ZyYW1lKSArIGZyYW1lLT5tU2l6ZTsKKyAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCk7CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIiKTsKQEAgLTIyMiwxNiArMjI1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFZpZGVvRnJhbWUgKmZyYW1lQ29weSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUgKj4obVRodW1ibmFpbC0+cG9pbnRlcigpKTsKLSAgICBmcmFtZUNvcHktPm1XaWR0aCA9IGZyYW1lLT5tV2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tSGVpZ2h0ID0gZnJhbWUtPm1IZWlnaHQ7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheVdpZHRoID0gZnJhbWUtPm1EaXNwbGF5V2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheUhlaWdodCA9IGZyYW1lLT5tRGlzcGxheUhlaWdodDsKLSAgICBmcmFtZUNvcHktPm1TaXplID0gZnJhbWUtPm1TaXplOwotICAgIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUgPSBmcmFtZS0+bVJvdGF0aW9uQW5nbGU7Ci0gICAgQUxPR1YoInJvdGF0aW9uOiAlZCIsIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAodWludDhfdCAqKWZyYW1lQ29weSArIHNpemVvZihWaWRlb0ZyYW1lKTsKLSAgICBtZW1jcHkoZnJhbWVDb3B5LT5tRGF0YSwgZnJhbWUtPm1EYXRhLCBmcmFtZS0+bVNpemUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAwOworICAgIGZyYW1lQ29weS0+Y29weUZsYXR0ZW5lZCgqZnJhbWUpOwogICAgIGRlbGV0ZSBmcmFtZTsgIC8vIEZpeCBtZW1vcnkgbGVha2FnZQogICAgIHJldHVybiBtVGh1bWJuYWlsOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBmZTc1NDdjLi5jNzhjZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtNDksOCArNDksOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCA2YTA5MjI3Li5kZjM2MDQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN1cmZhY2UgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggOGZlMjU1Yi4uYWMxODdjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgICAgICAgICAgZm9ybWF0LCBtU3VyZmFjZSwgY3J5cHRvLCAwIC8qIGZsYWdzICovKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIFslc10gZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwogICAgICAgICBtQ29kZWMuY2xlYXIoKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgbUNvZGVjLmNsZWFyKCk7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CkBAIC00NjAsNiArNDYwLDEyIEBACiAgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CiAgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKICAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gb25SZXN1bWUgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Db2RlYy0+c3RhcnQoKTsKIH0KIApAQCAtNDgxLDcgKzQ4Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCBbJXNdIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgogICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KQEAgLTUzMCw3ICs1MzYsNyBAQAogICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KICAgICB9CkBAIC02MzEsMTAgKzYzNywxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXIpOwogCiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIsIGZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjk3LDExICs3MTAsMTggQEAKICAgICAgICAgc2l6ZV90IHNpemUsCiAgICAgICAgIGludDY0X3QgdGltZVVzLAogICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuT3V0cHV0QnVmZmVyIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogLy8gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyKTsKIAogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTQ5LDYgKzk2OSwxMiBAQAogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBvbklucHV0QnVmZmVyRmV0Y2hlZCB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgYnVmZmVySXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CiAgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKQEAgLTk3OSw3ICsxMDA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgJXMgKGVycj0lZCksIEVPUyAlcyBxdWV1ZWQiLAorICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgWyVzXSAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKICAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKQEAgLTEwNzMsNyArMTA5OSw3IEBACiAgICAgICAgIH0gLy8gbm8gY3J5cHRJbmZvCiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciAlcyAoZXJyPSVkLCAlcykiLAorICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciBbJXNdIChlcnI9JWQsICVzKSIsCiAgICAgICAgICAgICAgICAgICAgIChjcnlwdEluZm8gIT0gTlVMTCA/ICJTZWN1cmUiIDogIiIpLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIsIGVycm9yRGV0YWlsTXNnLmNfc3RyKCkpOwogICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTExMDIsNyArMTEyOCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBOT19JTklUOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgewogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOwogICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CkBAIC0xMTExLDcgKzExMzksNyBAQAogICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgpOwogICAgIH0KICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciBbJXNdIChlcnI9JWQpIiwKICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGFkNzg4ZjcuLmRjMjk3NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIocGlkKSksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCiAgICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKKyAgICAgIG1DbGllbnRVaWQoLTEpLAogICAgICAgbUF0RU9TKGZhbHNlKSwKICAgICAgIG1Mb29waW5nKGZhbHNlKSwKICAgICAgIG1BdXRvTG9vcChmYWxzZSkgewpAQCAtMTA5LDYgKzExMCwxMCBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VUlEKHVpZF90IHVpZCkgewogICAgIG1QbGF5ZXItPnNldFVJRCh1aWQpOworICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjAxLDYgKzYwNiw3IEBACiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOwpAQCAtNjM5LDExICs2NDUsNiBAQAogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOwogICAgIH0KIAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewotICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgIGR1bXAoLTEsIGFyZ3MpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtOTM1LDcgKzkzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IGM1ZGRjYjAuLmQwY2YxZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0xMzIsMTEgKzEzMiwxMyBAQAogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAogICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgdWlkX3QgbUNsaWVudFVpZDsKIAogICAgIGJvb2wgbUF0RU9TOwogICAgIGJvb2wgbUxvb3Bpbmc7CiAgICAgYm9vbCBtQXV0b0xvb3A7CiAKKwogICAgIHZvaWQgdXBkYXRlTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSk7CiAgICAgdm9pZCBsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDc1OGRiMWYuLmJkODY2Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewpAQCAtOTE3LDEwICs5MTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CiAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCiAgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOwotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKQEAgLTExNTIsNyArMTE1MiwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisKKyAgICBjb25zdCBpbnQ2NF90IGF1ZGlvU2lua1BsYXllZFVzID0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgaW50NjRfdCBwZW5kaW5nVXMgPSB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gYXVkaW9TaW5rUGxheWVkVXM7CisgICAgaWYgKHBlbmRpbmdVcyA8IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdGltZXN0YW1wIGlzIHN0YWxlLgorICAgICAgICBBTE9HVygiJXM6IHBlbmRpbmdVcyAlbGxkIDwgMCwgY2xhbXBpbmcgdG8gemVybywgcG90ZW50aWFsIHJlc3VtZSBhZnRlciBwYXVzZSAiCisgICAgICAgICAgICAgICAgIndyaXR0ZW5BdWRpb0R1cmF0aW9uVXM6ICVsbGQsIGF1ZGlvU2lua1BsYXllZFVzOiAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGxvbmcgbG9uZylwZW5kaW5nVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl3cml0dGVuQXVkaW9EdXJhdGlvblVzLCAobG9uZyBsb25nKWF1ZGlvU2lua1BsYXllZFVzKTsKKyAgICAgICAgcGVuZGluZ1VzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHBlbmRpbmdVczsKIH0KIAogaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgewpAQCAtMTQwOCw2ICsxNDE5LDExIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5RU9TX2woYXVkaW8sIGZpbmFsUmVzdWx0LCBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOwpAQCAtMTQyMCw2ICsxNDM2LDExIEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwogICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICAvLyBWaWRlbyBtaWdodCBvdXRsaXZlIGF1ZGlvLiBDbGVhciBhbmNob3IgdG8gZW5hYmxlIHZpZGVvIG9ubHkgY2FzZS4KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggZTY4NTBiNS4uZjU4Yjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yNzUsNiArMjc1LDcgQEAKICAgICB2b2lkIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKICAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgdm9pZCBub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKaW5kZXggZjUxMTg3Ni4uNDIyMGI3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCkBAIC0xLDE1ICsxLDUxIEBACisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibmJhaW9fbW9ub19kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAiTW9ub1BpcGUuY3BwIiwKKyAgICAgICAgIk1vbm9QaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJOQkFJTy5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfbW9ubyJdLAorfQorCisvLyBsaWJuYmFpb19tb25vIGlzIHRoZSBwYXJ0IG9mIGxpYm5iYWlvIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB2ZW5kb3JzIHRvIHVzZS4gVmVuZG9yIG1vZHVsZXMgY2FuJ3QKKy8vIGxpbmsgYWdhaW5zdCBsaWJuYmFpbyBhbmQgc3lzdGVtIG1vZHVsZXMgY2FuJ3QgbGluayBhZ2FpbnN0IGxpYm5iYWlvX21vbm8uIFRoZSByZXN0IG9mIGxpYm5iYWlvCisvLyBwdWxscyBpbiB0b28gbWFueSBvdGhlciBkZXBlbmRlbmNpZXMuCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm8iLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibmJhaW8iLAorICAgIGRlZmF1bHRzOiBbImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbUluU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbU91dFNpbmsuY3BwIiwKLSAgICAgICAgIk1vbm9QaXBlLmNwcCIsCi0gICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAotICAgICAgICAiTkJBSU8uY3BwIiwKICAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCiAgICAgICAgICJQaXBlLmNwcCIsCiAgICAgICAgICJQaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLAogICAgIF0sCiAKQEAgLTI0LDggKzYwLDggQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTM1LDcgKzcxLDUgQEAKIAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggY2JmZjg3ZC4uODU2NDg5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogCkBAIC04Miw4ICs4Myw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uNjQ7Ci0gICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0aW1lLnR2X25zZWM7CisgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCBlYmI5MGM4Li4yZjYzOWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0xOCwxNCArMTgsMTQgQEAKICogRG9jdW1lbnRhdGlvbjogV29ya2Zsb3cgc3VtbWFyeSBmb3IgaGlzdG9ncmFtIGRhdGEgcHJvY2Vzc2luZzoKICogRm9yIG1vcmUgZGV0YWlscyBvbiBGSUZPLCBwbGVhc2Ugc2VlIHN5c3RlbS9tZWRpYS9hdWRpb191dGlsczsgZG94eWdlbgogKiBUT0RPOiBhZGQgdGhpcyBkb2N1bWVudGF0aW9uIHRvIGRveHlnZW4gb25jZSBpdCBpcyBmdXJ0aGVyIGRldmVsb3BlZAotKiAxKSB3cml0aW5nIHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0qIG9uV29yaworKiAxKSBXcml0aW5nIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKyogb25Xb3JrKCkKICogICAgIENhbGxlZCBldmVyeSBwZXJpb2QgbGVuZ3RoIChlLmcuLCA0bXMpCiAqICAgICBDYWxscyBMT0dfSElTVF9UUwogKiBMT0dfSElTVF9UUwotKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUyBvbmNlCi0qIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUworKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKKyogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTIG9uY2UKKyogTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMKICogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyBvbiBoYXNoIGFuZCBjdXJyZW50IHRpbWVzdGFtcAogKiAgICAgdGltZSBpcyBpbiBDTE9DS19NT05PVE9OSUMgY29udmVydGVkIHRvIG5zCiAqIE5CTE9HOjpXcml0ZXI6OmxvZyhFdmVudCwgY29uc3Qgdm9pZCosIHNpemVfdCkKQEAgLTQ0LDYgKzQ0LDggQEAKICogc3NpemVfdCBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluCiAqICAgICBEZXRlcm1pbmVzIHJlYWRhYmxlIGJ1ZmZlciBzZWN0aW9uIHZpYSBwb2ludGVyIGFyaXRobWV0aWMgb24gcmVhZGVyCiAqICAgICBhbmQgd3JpdGVyIHBvaW50ZXJzCisqIFNpbWlsYXJseSwgTE9HX0FVRElPX1NUQVRFKCkgaXMgY2FsbGVkIGJ5IG9uU3RhdGVDaGFuZ2Ugd2hlbmV2ZXIgYXVkaW8gaXMKKyogdHVybmVkIG9uIG9yIG9mZiwgYW5kIHdyaXRlcyB0aGlzIG5vdGlmaWNhdGlvbiB0byB0aGUgRklGTy4KICoKICogMikgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkKICogVGhyZWFkOjp0aHJlYWRsb29wKCkKQEAgLTUxLDYgKzUzLDcgQEAKICogTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKICogICAgIGNhbGxzIE5CTG9nOjpNZXJnZXI6Om1lcmdlCiAqIE5CTG9nOjpNZXJnZXI6Om1lcmdlCisqICAgICBNZXJnZXMgc25hcHNob3RzIHNvcnRlZCBieSB0aW1lc3RhbXAKICogICAgIGZvciBlYWNoIHJlYWRlciBpbiB2ZWN0b3Igb2YgY2xhc3MgTmFtZWRSZWFkZXIsCiAqICAgICBjYWxsc05hbWVkUmVhZGVyOjpyZWFkZXIoKS0+Z2V0U25hcHNob3QKICogICAgIFRPRE86IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudApAQCAtNTksMTEgKzYyLDEyIEBACiAqICAgICBjYWxscyBtRmlmb1JlYWRlci0+b2J0YWluIHRvIGZpbmQgcmVhZGFibGUgZGF0YQogKiAgICAgc2V0cyBzbmFwc2hvdC5iZWdpbigpIGFuZCAuZW5kKCkgaXRlcmF0b3JzIHRvIGJvdW5kYXJpZXMgb2YgdmFsaWQgZW50cmllcwogKiAgICAgbW92ZXMgdGhlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIHRoZSBsYXN0IGVudHJ5IHJlYWQKLSogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoMyksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQorKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICg0KSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCiAqCiAqIDMpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBwcml2YXRlIGJ1ZmZlcgogKiBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAKLSogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KSBvbiBpbnN0YW5jZSBvZiBzdWJjbGFzcyBtZXJnZVJlYWRlcgorKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChDT05TT0xFKQorKiAgICAgVGhlIHByaXZhdGUgYnVmZmVyIGNvbnRhaW5zIGFsbCBsb2dzIGZvciBhbGwgcmVhZGVycyBpbiBzaGFyZWQgbWVtb3J5CiAqIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KQogKiAgICAgY2FsbHMgZ2V0U25hcHNob3Qgb24gdGhlIGN1cnJlbnQgcmVhZGVyCiAqICAgICBjYWxscyBkdW1wKGludCwgc2l6ZV90LCBTbmFwc2hvdCkKQEAgLTcyLDkgKzc2LDEwIEBACiAqICAgICAoc3RyaW5nLCB0aW1lc3RhbXAsIGV0Yy4uLikKICogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgYWRkcyBhIGxpc3Qgb2YgdGltZXN0YW1wIHNlcXVlbmNlcwogKiAgICAgKGhpc3RvZ3JhbSBlbnRyeSkgdG8gTkJMb2c6Om1IaXN0cwotKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0ZMVVNILCBjYWxscyBkcmF3SGlzdG9ncmFtIG9uIGVhY2ggZWxlbWVudCBpbgotKiAgICAgdGhlIGxpc3QgYW5kIGVyYXNlcyBpdAotKiAgICAgVE9ETzogd2hlbiBkbyB0aGVzZSBldmVudHMgb2NjdXI/CisqICAgICBUT0RPOiBhZGQgZXZlcnkgSElTVE9HUkFNX0VOVFJZX1RTIHRvIHR3bworKiAgICAgY2lyY3VsYXIgYnVmZmVyczogb25lIHNob3J0LXRlcm0gYW5kIG9uZSBsb25nLXRlcm0gKGNhbiBhZGQgZXZlbiBsb25nZXItdGVybQorKiAgICAgc3RydWN0dXJlcyBpbiB0aGUgZnV0dXJlKS4gV2hlbiBkdW1wIGlzIGNhbGxlZCwgcHJpbnQgZXZlcnl0aGluZyBjdXJyZW50bHkKKyogICAgIGluIHRoZSBidWZmZXIuCiAqIE5CTG9nOjpkcmF3SGlzdG9ncmFtCiAqICAgICBpbnB1dDogdGltZXN0YW1wIGFycmF5CiAqICAgICBidWNrZXRzIHRoaXMgdG8gYSBoaXN0b2dyYW0gYW5kIHByaW50cwpAQCAtODIsNyArODcsNyBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KQEAgLTEwMiw2ICsxMDcsOCBAQAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KIC8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMzQsNyArMTQxLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOgorICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTEzLDcgKzUyMCw3IEBACiAgICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwogfQogCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCiB7CiAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMjIgKzUyOSw3IEBACiAgICAgZGF0YS5oYXNoID0gaGFzaDsKICAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwogICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwogICAgIH0KQEAgLTc3MSwxNSArNzYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKIGNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRkxVU0h9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzg3LDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05MTEsNjEgKzg3MCwxNyBAQAogCiB9CiAKLS8vIHdyaXRlcyBzYW1wbGUgZGVsdGFzIHRvIGZpbGUsIGVpdGhlciB0cnVuY2F0aW5nIG9yIGFwcGVuZGluZwotaW5saW5lIHZvaWQgd3JpdGVIaXN0VG9GaWxlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLCBib29sIGFwcGVuZCkgewotICAgIC8vIG5hbWUgb2YgZmlsZSBvbiBhdWRpb3NlcnZlcgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTmFtZSA9IChjaGFyICopIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvc2FtcGxlX3Jlc3VsdHMudHh0IjsKLSAgICAvLyBzdG9yZXMgZGVsdGFzIGJldHdlZW4gdGhlIHNhbXBsZXMKLSAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnRlcnZhbHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludGVydmFscy5wdXNoX2JhY2soZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOwotICAgIH0KLSAgICBpZiAoaW50ZXJ2YWxzLmVtcHR5KCkpIHJldHVybjsKLSAgICAvLyBEZWxldGVzIG1heGltdW0gdmFsdWUgaW4gYSBoaXN0b2dyYW0uIFRlbXAgcXVpY2sgZml4LgotICAgIC8vIEZJWE1FOiBuZWVkIHRvIGZpbmQgcm9vdCBjYXVzZSBvZiBhcHByb3guIDM1dGggZWxlbWVudCBmcm9tIHRoZSBlbmQKLSAgICAvLyBjb25zaXN0ZW50bHkgYmVpbmcgYW4gb3V0bGllciBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIG9mIGEgZmx1c2gKLSAgICAvLyBBTE9HVygiJSIgUFJJZDY0ICJiZWZvcmUiLCAoaW50NjRfdCkgKihzdGQ6Om1heF9lbGVtZW50KGludGVydmFscy5iZWdpbigpLCBpbnRlcnZhbHMuZW5kKCkpKSk7Ci0gICAgaW50ZXJ2YWxzLmVyYXNlKHN0ZDo6bWF4X2VsZW1lbnQoaW50ZXJ2YWxzLmJlZ2luKCksIGludGVydmFscy5lbmQoKSkpOwotICAgIC8vIEFMT0dXKCIlIiBQUklkNjQgImFmdGVyIiwgKGludDY0X3QpICooc3RkOjptYXhfZWxlbWVudChpbnRlcnZhbHMuYmVnaW4oKSwgaW50ZXJ2YWxzLmVuZCgpKSkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzOwotICAgIG9mcy5vcGVuKGtOYW1lLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKLSAgICBpZiAoIW9mcykgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG9mcyA8PCBpbnRlcnZhbHNbaV0gPDwgIlxuIjsKLSAgICB9Ci0gICAgb2ZzLmNsb3NlKCk7Ci19Ci0KKy8vIFRPRE86IG1vdmUgdGhpcyB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisvLyBUT0RPOiBtYWtlIGNhbGwgdG8gZHVtcCBwZXJpb2RpYyBzbyB0aGF0IGRhdGEgaW4gc2hhcmVkIEZJRk8gZG9lcyBub3QgZ2V0IG92ZXJ3cml0dGVuCiB2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCiB7Ci0gIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7Ci0jaWYgMAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0aW1lX3QgbWF4U2VjID0gLTE7Ci0gICAgd2hpbGUgKGVudHJ5IC0gc3RhcnQgPj0gKGludCkgRW50cnk6OmtPdmVyaGVhZCkgewotICAgICAgICBpZiAocHJldkVudHJ5IC0gc3RhcnQgPCAwIHx8ICFwcmV2RW50cnkuaGFzQ29uc2lzdGVudExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldkVudHJ5LT50eXBlID09IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgaWYgKHByZXZFbnRyeS0+bGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29ycnVwdAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkVudHJ5LmNvcHlEYXRhKCh1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGlmICh0cy50dl9zZWMgPiBtYXhTZWMpIHsKLSAgICAgICAgICAgICAgICBtYXhTZWMgPSB0cy50dl9zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLS1lbnRyeTsKLSAgICAgICAgLS1wcmV2RW50cnk7Ci0gICAgfQotI2VuZGlmCiAgICAgbUZkID0gZmQ7CiAgICAgbUluZGVudCA9IGluZGVudDsKICAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhyZWFkIHNhZmUKKyAgICAvLyBUT0RPOiBuZWVkIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgcGVyZm9ybWFuY2VBbmFseXNpcyBmb3IgZWFjaCB0aHJlYWQKKyAgICAvLyB1c2VkIHRvIHN0b3JlIGRhdGEgYW5kIHRvIGNhbGwgYW5hbHlzaXMgZnVuY3Rpb25zCisgICAgc3RhdGljIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHlzaXM7CiAgICAgc2l6ZV90IGxvc3QgPSBzbmFwc2hvdC5sb3N0KCkgKyAoc25hcHNob3QuYmVnaW4oKSAtIEVudHJ5SXRlcmF0b3Ioc25hcHNob3QuZGF0YSgpKSk7CiAgICAgaWYgKGxvc3QgPiAwKSB7CiAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKQEAgLTk3Myw4NSArODg4LDkgQEAKICAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIGNvcHlFbnRyeURhdGFBdCgpLgogICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KLSNpZiAwCi0gICAgc2l6ZV90IHdpZHRoID0gMTsKLSAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIG1heFNlYyAvPSAxMDsKLSAgICB9Ci0gICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslKnNdIiwgKGludCkgd2lkdGggKyA0LCAiIik7Ci0gICAgfQotICAgIGJvb2wgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSNlbmRpZgogCiAgICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7CiAgICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSNpZiAwCi0gICAgICAgIGNhc2UgRVZFTlRfU1RSSU5HOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBlbnRyeS5sZW5ndGgoKSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RJTUVTVEFNUDogewotICAgICAgICAgICAgLy8gYWxyZWFkeSBjaGVja2VkIHRoYXQgbGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpOwotICAgICAgICAgICAgZW50cnkuY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHMpOwotICAgICAgICAgICAgbG9uZyBwcmV2TnNlYyA9IHRzLnR2X25zZWM7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWluID0gTE9OR19NQVg7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWF4ID0gLTE7Ci0gICAgICAgICAgICBsb25nIGRlbHRhVG90YWwgPSAwOwotICAgICAgICAgICAgYXV0byBhdXgoZW50cnkpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICsrYXV4OwotICAgICAgICAgICAgICAgIGlmIChlbmQgLSBhdXggPj0gMCB8fCBhdXgudHlwZSgpICE9IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzTmV4dDsKLSAgICAgICAgICAgICAgICBhdXguY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHNOZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAodHNOZXh0LnR2X3NlYyAhPSB0cy50dl9zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSB0c05leHQudHZfbnNlYyAtIHByZXZOc2VjOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IGRlbHRhTWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWluID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IGRlbHRhTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWF4ID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbHRhVG90YWwgKz0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBuID0gKGF1eCAtIGVudHJ5KSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMgLypFbnRyeTo6a092ZXJoZWFkPyovKTsKLSAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGF1eDsKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9JTlRFR0VSOgotICAgICAgICAgICAgYXBwZW5kSW50KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfRkxPQVQ6Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdCgmYm9keSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1BJRDoKLSAgICAgICAgICAgIGFwcGVuZFBJRCgmYm9keSwgZW50cnkuZGF0YSgpLCBlbnRyeS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgogICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDYzLDQwICs5MDIsMTIgQEAKICAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKICAgICAgICAgICAgIGludDY0X3QgdHM7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGxvZ19oYXNoX3QsIGludD4ga2V5KGhhc2gsIGRhdGEtPmF1dGhvcik7Ci0gICAgICAgICAgICAvLyBUT0RPIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIGV4Y2Vzc2l2ZWx5IGhpZ2ggb3V0bGllcnMsIHdoaWNoIGFyZSB1c3VhbGx5IGNhdXNlZAotICAgICAgICAgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KLSAgICAgICAgICAgIG1IaXN0c1trZXldLnB1c2hfYmFjayh0cyk7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmxvZ1RzRW50cnkodHMpOwogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRyYXdzIGhpc3RvZ3JhbXMgc3RvcmVkIGluIGdsb2JhbCBSZWFkZXI6Om1IaXN0cyBhbmQgZXJhc2VzIHRoZW0KLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6IHsKLSAgICAgICAgICAgIEhpc3RvZ3JhbUVudHJ5IGhpc3RFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAvLyBMb2cgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgY2FsbCB0byBkcmF3SGlzdG9ncmFtLCBub3Qgd2hlbiBhdWRpbyB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaGlzdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotICAgICAgICAgICAgLy8gTG9nIGhpc3RvZ3JhbXMKLSAgICAgICAgICAgIHNldEZpbmRHbGl0Y2godHJ1ZSk7Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiSGlzdG9ncmFtIGZsdXNoIC0gIik7Ci0gICAgICAgICAgICBoYW5kbGVBdXRob3IoaGlzdEVudHJ5LCAmYm9keSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaGlzdCA9IG1IaXN0cy5iZWdpbigpOyBoaXN0ICE9IG1IaXN0cy5lbmQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoaGlzdC0+Zmlyc3Quc2Vjb25kID09IGhpc3RFbnRyeS5hdXRob3IoKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJVgiLCAoaW50KWhpc3QtPmZpcnN0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRHbGl0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWZHbGl0Y2goaGlzdC0+c2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlsZSB0byBlbXB0eSBhbmQgd3JpdGUgZGF0YSBmb3IgYWxsIGhpc3RvZ3JhbXMgaW4gdGhpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVIaXN0VG9GaWxlKGhpc3QtPnNlY29uZCwgaGlzdCAhPSBtSGlzdHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdIaXN0b2dyYW0oJmJvZHksIGhpc3QtPnNlY29uZCwgdHJ1ZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGlzdCA9IG1IaXN0cy5lcmFzZShoaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2hpc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTAsMTAgKzkyMSwxMCBAQAogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgfQorICAgIH0KKyAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5KTsKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogfQogCkBAIC0xMTM5LDE2ICs5NTAsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMDg0LDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9PV05FUlMgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmRkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KKy8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKK1BlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7CisgICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKKyAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCisgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKKyAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Cit9CisKKy8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50CitzdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgeworICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07CisgICAgfQorICAgIHJldHVybiBidWNrZXRzOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisvLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCisvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCkgeworICAgIC8vIDEpIGFuYWx5emUgdGhlIHNlcmllcyB0byBzdG9yZSBhbGwgb3V0bGllcnMgYW5kIHRoZWlyIGV4YWN0IHRpbWVzdGFtcHM6CisgICAgc3RvcmVPdXRsaWVyRGF0YShtVGltZVN0YW1wU2VyaWVzKTsKKworICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKKyAgICBkZXRlY3RQZWFrcygpOworCisgICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdG8gbVJlY2VudEhpc3RzIGFuZCBjbGVhciB0aGUgdGltZSBzZXJpZXMKKyAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHRpbWVzdGFtcD4obVRpbWVTdGFtcFNlcmllc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllcykpOworICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQorICAgIC8vIEFMT0dEKCJtUmVjZW50SGlzdHMgc2l6ZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA+PSBrUmVjZW50SGlzdHNDYXBhY2l0eSkgeworICAgICAgICAvLyAgQUxPR0QoInBvcHBlZCBiYWNrIG1SZWNlbnRIaXN0cyIpOworICAgICAgICBtUmVjZW50SGlzdHMucG9wX2Zyb250KCk7CisgICAgfQorICAgIG1UaW1lU3RhbXBTZXJpZXMuY2xlYXIoKTsKK30KKworLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgeworICAgIEFMT0dEKCJoYW5kbGVTdGF0ZUNoYW5nZSIpOworICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIHJldHVybjsKK30KKworLy8gVGFrZXMgYSBzaW5nbGUgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgZW50cnkgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyBpdCBpbiBhCisvLyB0ZW1wb3Jhcnkgc2VyaWVzIG9mIHRpbWVzdGFtcHMuIE9uY2UgdGhlIHNlcmllcyBpcyBmdWxsLCB0aGUgZGF0YSBpcyBhbmFseXplZCwKKy8vIHN0b3JlZCwgYW5kIGVtcHRpZWQuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmxvZ1RzRW50cnkoaW50NjRfdCB0cykgeworICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCisgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KKyAgICAvLyBTdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQorICAgIC8vIGlzIGVub3VnaCBkYXRhLiBUaGVuLCB3cml0ZSB0byByZWNlbnRIaXN0cyBhcyBhIGhpc3RvZ3JhbS4KKyAgICBtVGltZVN0YW1wU2VyaWVzLnB1c2hfYmFjayh0cyk7CisgICAgLy8gaWYgbGVuZ3RoIG9mIHRoZSB0aW1lIHNlcmllcyBoYXMgcmVhY2hlZCBrU2hvcnRIaXN0U2l6ZSBzYW1wbGVzLAorICAgIC8vIGFuYWx5emUgdGhlIGRhdGEgYW5kIGZsdXNoIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5CisgICAgaWYgKG1UaW1lU3RhbXBTZXJpZXMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIH0KK30KKworLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAorLy8gbWVyZ2UgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmUgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cworLy8gY2xlYXJzIG1SZWNlbnRIaXN0cworLy8gVE9ETzogaGF2ZSBsb2dUc0VudHJ5IHdyaXRlIGRpcmVjdGx5IHRvIG1Mb25nVGVybUhpc3RzLCBkaXNjYXJkIG1SZWNlbnRIaXN0cywKKy8vIHN0YXJ0IGEgbmV3IGhpc3RvZ3JhbSB3aGVuIGEgcGVhayBvY2N1cnMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKSB7CisKKyAgICAvLyBCdWNrZXRzIGlzIHVzZWQgdG8gYWdncmVnYXRlIHNob3J0LXRlcm0gaGlzdG9ncmFtcy4KKyAgICBIaXN0b2dyYW0gYnVja2V0czsKKyAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1SZWNlbnRIaXN0c1swXS5maXJzdDsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRpbWUgYmV0d2VlbiBzdGFydGluZyBhbmQgZW5kaW5nIHRpbWVzdGFtcHMgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0sCisgICAgICAgIC8vIGFkZCB0aGUgY3VycmVudCBoaXN0b2dyYW0gKGJ1Y2tldHMpIHRvIHRoZSBsb25nLXRlcm0gaGlzdG9ncmFtIGJ1ZmZlciwKKyAgICAgICAgLy8gY2xlYXIgYnVja2V0cywgYW5kIHN0YXJ0IGEgbmV3IGxvbmctdGVybSBoaXN0b2dyYW0gYWdncmVnYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGRlbHRhTXMoc3RhcnRpbmdUcywgc2hvcnRIaXN0LmZpcnN0KSA+PSBrTWF4SGlzdFRpbWVzcGFuTXMpIHsKKyAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLmVtcGxhY2VfYmFjayhzdGFydGluZ1RzLCBzdGQ6Om1vdmUoYnVja2V0cykpOworICAgICAgICAgICAgYnVja2V0cy5jbGVhcigpOworICAgICAgICAgICAgc3RhcnRpbmdUcyA9IHNob3J0SGlzdC5maXJzdDsKKyAgICAgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCisgICAgICAgICAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKG1Mb25nVGVybUhpc3RzLnNpemUoKSA+PSBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgY3VycmVudCBoaXN0b2dyYW0gdG8gYnVja2V0cworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIG1SZWNlbnRIaXN0cy5jbGVhcigpOworICAgIC8vIFRPRE86IGRlY2lkZSB3aGVuL3doZXJlIHRvIGNhbGwgd3JpdGVUb0ZpbGUKKyAgICAvLyBUT0RPOiBhZGQgYSB0aHJlYWQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlIG5hbWUKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY29uc3QgY2hhciAqKSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci9zYW1wbGVfcmVzdWx0cy50eHQiOworICAgIHdyaXRlVG9GaWxlKG1PdXRsaWVyRGF0YSwgbUxvbmdUZXJtSGlzdHMsIGtOYW1lLCBmYWxzZSk7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIG91dGxpZXIgaW50ZXJ2YWxzIChtT3V0bGllciBkYXRhKSwKKy8vIGxvb2tzIGZvciBjaGFuZ2VzIGluIGRpc3RyaWJ1dGlvbiAocGVha3MpLCB3aGljaCBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcworLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKKy8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKKy8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmRldGVjdFBlYWtzKCkgeworICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCisgICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKKyAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKyAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOworCisgICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7CisgICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAorICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCisgICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgeworICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKKyAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICB9CisgICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07CisgICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKKyAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgorICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKKyAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCisgICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgorICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKKyAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7CisgICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047CisgICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCisgICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKKyAgICAgICAgfQorICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtQZWFrU2VyaWVzU2l6ZSkgeworICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ID0gaXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBDYWxsZWQgYnkgTG9nVHNFbnRyeS4gVGhlIGlucHV0IGlzIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCisvLyBGaW5kcyBvdXRsaWVycyBhbmQgd3JpdGVzIHRvIG1PdXRsaWVyZGF0YS4KKy8vIEVhY2ggdmFsdWUgaW4gbU91dGxpZXJkYXRhIGNvbnNpc3RzIG9mOiA8b3V0bGllciB0aW1lc3RhbXAsIHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyPi4KKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgeworICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBmaXJzdCBwYXNzOiBuZWVkIHRvIGluaXRpYWxpemUKKyAgICBpZiAobUVsYXBzZWQgPT0gMCkgeworICAgICAgICBtUHJldk5zID0gdGltZXN0YW1wc1swXTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZ0czogdGltZXN0YW1wcykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBkaWZmTXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVsdGFNcyhtUHJldk5zLCB0cykpOworICAgICAgICBpZiAoZGlmZk1zID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhtRWxhcHNlZCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1QcmV2TnMpKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCisgICAgICAgICAgICAvLyBGSVhNRTogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKKyAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCisgICAgICAgICAgICBpZiAobU91dGxpZXJEYXRhLnNpemUoKSA+PSBrT3V0bGllclNlcmllc1NpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0bGllckRhdGEucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxhcHNlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUVsYXBzZWQgKz0gZGlmZk1zOworICAgICAgICBtUHJldk5zID0gdHM7CisgICAgfQorfQorCisKKy8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKKyAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQorICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07CisgICAgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShrVGVtcFRlc3REYXRhKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorICAgIGRldGVjdFBlYWtzKCk7Cit9CisKKy8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5IC0tPiBpcyB0aGlzIHN0aWxsIHJlbGV2YW50PworLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAorLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCkgeworICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpIDwgMSkgeworICAgICAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IG1SZWNlbnRIaXN0cyBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogaGlzdHMgc2l6ZSAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOworICAgIC8vIFRPRE86IG1vcmUgZWxhYm9yYXRlIGRhdGEgYW5hbHlzaXMKKyAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworCisgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisKK30KKworCisvLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAorLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCisvLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKKy8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCisvLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKKy8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAorLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCisvLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5CisgICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7CisgICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCisgICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKKyAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1MGFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBhIGZpbGUuCisvLyBUT0RPOiBmb3JtYXQgdGhlIGRhdGEgZWZmaWNpZW50bHkgYW5kIHdyaXRlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIHRvIGRpZmZlcmVudCBmaWxlcwordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpIHsKKyAgICBBTE9HRCgid3JpdGluZyBwZXJmb3JtYW5jZSBkYXRhIHRvIGZpbGUiKTsKKyAgICBpZiAob3V0bGllckRhdGEuZW1wdHkoKSB8fCBoaXN0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9mc3RyZWFtIG9mczsKKyAgICBvZnMub3BlbihrTmFtZSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFvZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBrTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb2ZzIDw8ICJPdXRsaWVyIGRhdGE6IGludGVydmFsIGFuZCB0aW1lc3RhbXBcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyIDogb3V0bGllckRhdGEpIHsKKyAgICAgICAgb2ZzIDw8IG91dGxpZXIuZmlyc3QgPDwgIjogIiA8PCBvdXRsaWVyLnNlY29uZCA8PCAiXG4iOworICAgIH0KKyAgICBvZnMgPDwgIkhpc3RvZ3JhbSBkYXRhXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmaGlzdCA6IGhpc3RzKSB7CisgICAgICAgIG9mcyA8PCAiXHR0aW1lc3RhbXBcbiI7CisgICAgICAgIG9mcyA8PCBoaXN0LmZpcnN0IDw8ICJcbiI7CisgICAgICAgIG9mcyA8PCAiXHRidWNrZXRzIGFuZCBjb3VudHNcbiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYnVja2V0IDogaGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIG9mcyA8PCBidWNrZXQuZmlyc3QgPDwgIjogIiA8PCBidWNrZXQuc2Vjb25kIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgb2ZzLmNsb3NlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggNDc0N2RjZi4uNzExODJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggNTA4ZTBmZS4uOGEzZmZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDU2YTJhMzguLjM0OGI0ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKaW5kZXggOTdhNTdlMC4uNTM1ZTNmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU2luayB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1dSSVRFIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCmluZGV4IDRmYmRiNGIuLmJjNmFhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU291cmNlIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fUkVBRCBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNzg1YjljMi4uM2U0OGVlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNDMsOCArNDQsNiBAQAogY2xhc3MgV3JpdGVyOwogY2xhc3MgUmVhZGVyOwogCi1wcml2YXRlOgotCiBlbnVtIEV2ZW50IDogdWludDhfdCB7CiAgICAgRVZFTlRfUkVTRVJWRUQsCiAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCkBAIC01OSwxMiArNTgsMTMgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAogICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKIAogICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKIH07CiAKK3ByaXZhdGU6CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwpAQCAtMjQ4LDYgKzI0OCw4IEBACiAgICAgaW50IGF1dGhvcjsKIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAordXNpbmcgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciA9IEhpc3RUc0VudHJ5V2l0aEF1dGhvcjsKKwogc3RydWN0IEhpc3RJbnRFbnRyeSB7CiAgICAgbG9nX2hhc2hfdCBoYXNoOwogICAgIGludCB2YWx1ZTsKQEAgLTM0MSw4ICszNDMsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwogCiAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwogCkBAIC00MDcsNiArNDA4LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKICAgICBjbGFzcyBTbmFwc2hvdCB7CiAgICAgcHVibGljOgogICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CkBAIC00NDMsMjAgKzQ0NSwxNyBAQAogCiAgICAgdmlydHVhbCB+UmVhZGVyKCk7CiAKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpOwotCiAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwogICAgIC8vIGR1bXAgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAvLyBUT0RPOiBtb3ZlIGR1bXAgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4gTW9kZWwvdmlldy9jb250cm9sbGVyIGRlc2lnbgogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBTbmFwc2hvdCAmIHNuYXApOwogICAgIC8vIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIChjYWxsIGdldFNuYXBzaG90KCkgYW5kIHByZXZpb3VzIGR1bXAoKSkKICAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOwogICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0gICAgLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKLSAgICB2b2lkICAgICBzZXRGaW5kR2xpdGNoKGJvb2wgcyk7Ci0gICAgYm9vbCAgICAgaXNGaW5kR2xpdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CkBAIC00NjksMTAgKzQ2OCw2IEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAotICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKLSAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KLSAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0ODAsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJOQkxvZy5oIgorI2luY2x1ZGUgIlJlcG9ydFBlcmZvcm1hbmNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7CisgICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZworICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIE5lZWQgdG8gYWRkIGEgbXV0ZXguCisgICAgLy8gRklYTUU6IGNvbnRpbnVlIHRoaXMgd2F5IHVudGlsIGFuYWx5c2lzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFRoZW4sIHVzZQorICAgIC8vIHRoZSBmaWZvIHdyaXRlciB1dGlsaXRpZXMuCitwdWJsaWM6CisKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCk7CisKKyAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKKyAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gYXVkaW8gb24vb2ZmIGV2ZW50IGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLAorICAgIC8vIGUuZy4gRVZFTlRfQVVESU9fU1RBVEUuCisgICAgLy8gY2FsbHMgZmx1c2hUaW1lU3RhbXBTZXJpZXMgb24gdGhlIGRhdGEgdXAgdG8gdGhlIGV2ZW50LAorICAgIC8vIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgdGhlIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKworICAgIC8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKKyAgICAvLyBtZXJnZXMgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmVzIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCk7CisKKyAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgdGhyZWFkIHNhZmUuIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gaW5zdGFuY2UKKyAgICAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzLgorICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXBfcmF3IHRzKTsKKworICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgorICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCisgICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKKyAgICB2b2lkIGRldGVjdFBlYWtzKCk7CisKKyAgICAvLyBydW5zIGFuYWx5c2lzIG9uIHRpbWVzdGFtcCBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCB0byBhIGhpc3RvZ3JhbQorICAgIC8vIGZpbmRzIG91dGxpZXJzCisgICAgLy8gd3JpdGVzIHRvIG1PdXRsaWVyRGF0YSA8dGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXIsIG91dGxpZXIgdGltZXN0YW1wPgorICAgIHZvaWQgc3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmdGltZXN0YW1wcyk7CisKKyAgICAvLyBpbnB1dDogc2VyaWVzIG9mIHNob3J0IGhpc3RvZ3JhbXMuIEdlbmVyYXRlcyBhIHN0cmluZyBvZiBhbmFseXNpcyBvZiB0aGUgYnVmZmVyIHBlcmlvZHMKKyAgICAvLyBUT0RPOiBXSVAgd3JpdGUgbW9yZSBkZXRhaWxlZCBhbmFseXNpcworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgorICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCA9IDEwKTsKKworICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzLiB0ZW1wIGZvciB0ZXN0aW5nCisgICAgdm9pZCB0ZXN0RnVuY3Rpb24oKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgZ2xpdGNoZXMgaW4gYSB0aW1lIHNlcmllcworICAgIC8vIFRPRE8gaW5jb3Jwb3JhdGUgdGhpcyBpbnRvIHRoZSBhbmFseXNpcyAoY3VycmVudGx5IHVudXNlZCkKKyAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnNhbXBsZXMpOworCitwcml2YXRlOgorCisgICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6IDxlbGFwc2VkIHRpbWUgYmV0d2VlbiBvdXRsaWVycyBpbiBtcywgb3V0bGllciB0aW1lc3RhbXA+CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7CisKKyAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAorICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQorICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CisKKyAgICAvLyBUT0RPOiB0dXJuIHRoZXNlIGludG8gY2lyY3VsYXIgYnVmZmVycyBmb3IgYmV0dGVyIGRhdGEgZmxvdworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1SZWNlbnRIaXN0czsKKworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIGxvbmctdGVybSBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtTG9uZ1Rlcm1IaXN0czsKKworICAgIC8vIHZlY3RvciBvZiB0aW1lc3RhbXBzLCBjb2xsZWN0ZWQgZnJvbSBOQkxvZyBmb3IgYSAoVE9ETykgc3BlY2lmaWMgdGhyZWFkCisgICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmx1c2hlZAorICAgIHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+IG1UaW1lU3RhbXBTZXJpZXM7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7CisKKyAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKKyAgICAvLyBUT0RPOiBsZWFybiBzb21lIG9mIHRoZXNlIGZyb20gdGhlIGRhdGEsIGRlbGV0ZSB1bnVzZWQgb25lcworICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBtYWtlIGtQZXJpb2RNcyBzdGF0aWMuCisgICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQorICAgIGludCBrUGVyaW9kTXM7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyTXMgPSA3OyAvLyB2YWx1ZXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIGNhdXNlIGdsaXRjaGVzCisgICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKKyAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCisgICAgaW50IGtQZXJpb2RNc0NQVTsgLy8gY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KKworICAgIC8vIFBlYWsgZGV0ZWN0aW9uOiBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIG1lYW4gY29uc2lkZXJlZCBhIHNpZ25pZmljYW50IGNoYW5nZQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0ZGRldlRocmVzaG9sZCA9IDU7CisKKyAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gVE9ETzogYWRqdXN0IGFsbCBvZiB0aGVzZSB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtSZWNlbnRIaXN0c0NhcGFjaXR5ID0gMTAwOyAvLyBudW1iZXIgb2Ygc2hvcnQtdGVybSBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTaG9ydEhpc3RTaXplID0gNTA7IC8vIG51bWJlciBvZiBzYW1wbGVzIGluIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gb3V0bGllciBhcnJheQorICAgIHN0YXRpYyBjb25zdCBpbnQga1BlYWtTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5CisgICAgc3RhdGljIGNvbnN0IGludCBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5ID0gMjA7IC8vIG51bWJlciBvZiBsb25nLXRlcm0gaGlzdG9ncmFtIHN0b3JlZCBpbiBtZW1vcnkKKyAgICAvLyBtYXhpbXVtIGVsYXBzZWQgdGltZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpbWVzdGFtcCBvZiBhIGxvbmctdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0VGltZXNwYW5NcyA9IDUgKiBrTXNQZXJTZWM7CisKKyAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KKyAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAorICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOworICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKKyAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKKyAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7CisgICAgaW50NjRfdCBtUHJldk5zID0gLTE7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA1OGI5NzUwLi4wNDMxOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX1BJUEVfSAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyODEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCisvLyBUT0RPIG1vdmUgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24gdG8gUmVwb3J0UGVyZm9ybWFuY2UuY3BwCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCisvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZC4gdmFsdWU6IGNvdW50CisvLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKK3VzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwordXNpbmcgb3V0bGllckludGVydmFsID0gdWludDY0X3Q7CisvLyBpbnQ2NF90IHRpbWVzdGFtcHMgYXJlIGNvbnZlcnRlZCB0byB1aW50NjRfdCBpbiBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhLAorLy8gYW5kIGFsbCBhbmFseXNpcyBmdW5jdGlvbnMgdXNlIHVpbnQ2NF90LgordXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7Cit1c2luZyB0aW1lc3RhbXBfcmF3ID0gaW50NjRfdDsKKworLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCisvLyBUT0RPOiB0aGUgY29kZSBoYXMgYSBtaXggb2YgdHlwZWRlZiBhbmQgdXNpbmcuIFN0YW5kYXJkaXplIHRvIG9uZSBvciB0aGUgb3RoZXIuCit0eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lCisvLyBpbnRlcnZhbHMgdG8gYSBmaWxlLgordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpOworCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGFlNDk5MDMuLmNjMmQwMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAjZGVmaW5lIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggNjBhZTkyZS4uYzUxZDBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlUmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkFJTy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggMWY5OGU4ZC4uYzQ0ZTg2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC00OSwyMSArNDksMTggQEAKIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCi0jaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIgogI2luY2x1ZGUgImluY2x1ZGUvRGF0YUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJvbXgvT01YVXRpbHMuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg2NiwxNiArMTg2MywxNSBAQAogICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CiAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3dPblNodXRkb3duOwogICAgICAgICB9CisgICAgfQorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7CisgICAgICAgIC8vIHVzZSBuYXRpdmVfaGFuZGxlcyBmb3Igc2VjdXJlIGlucHV0IGJ1ZmZlcnMKKyAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBJT01YOjprUG9ydE1vZGVQcmVzZXRTZWN1cmVCdWZmZXIpOwogCi0gICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbmF0aXZlX2hhbmRsZXMgZm9yIHNlY3VyZSBpbnB1dCBidWZmZXJzCi0gICAgICAgICAgICBlcnIgPSBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldFNlY3VyZUJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZmFsbGluZyBiYWNrIHRvIG5vbi1uYXRpdmVfaGFuZGxlcyIpOwotICAgICAgICAgICAgICAgIHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJmYWxsaW5nIGJhY2sgdG8gbm9uLW5hdGl2ZV9oYW5kbGVzIik7CisgICAgICAgICAgICBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpOworICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKQEAgLTQxNzQsMTEgKzQxNzAsMTIgQEAKIC8vIHN0YXRpYwogaW50IC8qIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKi8gQUNvZGVjOjpnZXRBVkNMZXZlbEZvcigKICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCi0gICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlKSB7CisgICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFRVhUVFlQRSBwcm9maWxlKSB7CiAgICAgLy8gY29udmVydCBiaXRyYXRlIHRvIG1haW4vYmFzZWxpbmUgcHJvZmlsZSBrYnBzIGVxdWl2YWxlbnQKLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKCh1aW50MzJfdClwcm9maWxlKSB7CiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTA6CiAgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMzAwMCk7IGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOgogICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKICAgICAgICAgICAgIGJpdHJhdGUgPSBkaXZVcChiaXRyYXRlLCAxMjUwKTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MzIyLDkgKzQzMTksMTQgQEAKICAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAyOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcworICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOworCiAgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgaDI2NHR5cGUubkJGcmFtZXMpOwogICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9Ci0gICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCB8IE9NWF9WSURFT19QaWN0dXJlVHlwZUI7CisgICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDExQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9UUlVFOwpAQCAtNDg0Myw5ICs0ODQ1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoID4gdmlkZW9EZWYtPm5GcmFtZVdpZHRoIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0ID4gdmlkZW9EZWYtPm5GcmFtZUhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjcm9wcGVkIHJlY3QgKCVkLCAlZCkgLSAoJXUsICV1KSB2cy4gZnJhbWUgKCV1LCAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjcm9wcGVkIHJlY3QgKCVkLCAlZCwgJXUsICV1KSB2cy4gZnJhbWUgKCV1LCAldSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLCByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCwgcmVjdC5uSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPm5GcmFtZVdpZHRoLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjMzOSwxOSArNjM0MSwxMCBAQAogCiAgICAgQ0hFQ0sobUNvZGVjLT5tT01YTm9kZSA9PSBOVUxMKTsKIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgYm9vbCB0cmVibGVGbGFnOwotICAgIGlmIChjbGllbnQuY29ubmVjdCgmdHJlYmxlRmxhZykgIT0gT0spIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1Db2RlYy0+c2V0VHJlYmxlRmxhZyh0cmVibGVGbGFnKTsKLQotICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOwogCiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgIFZlY3RvcjxBU3RyaW5nPiBvd25lcnM7CiAKICAgICBBU3RyaW5nIG1pbWU7CiAKQEAgLTYzNTksOSArNjM1MiwzMSBAQAogICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChsaXN0ICE9IE5VTEwgJiYgbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUuY19zdHIoKSkgPj0gMCkgewotICAgICAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGNvbXBvbmVudE5hbWUpOworICAgICAgICBpZiAobGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9idGFpbiBNZWRpYUNvZGVjTGlzdCB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGNyZWF0ZSBjb2RlYyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBsaXN0LT5maW5kQ29kZWNCeU5hbWUoY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvckludmFsaWRDb21wb25lbnQsIE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7CisgICAgICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGVycm9yIChpbmRleCBvdXQtb2YtYm91bmQpIHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgInJldHJpZXZpbmcgaW5mb3JtYXRpb24gZm9yIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgb3duZXJzLmFkZChpbmZvLT5nZXRPd25lck5hbWUoKSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICAgICAiZGVmYXVsdCIgOiBpbmZvLT5nZXRPd25lck5hbWUoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIApAQCAtNjM3MywxMCArNjM4OCwxMiBAQAogICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBlbmNvZGVyLCAvLyBjcmVhdGVFbmNvZGVyCiAgICAgICAgICAgICAgICAgMCwgICAgICAgLy8gZmxhZ3MKLSAgICAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOworICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcywKKyAgICAgICAgICAgICAgICAmb3duZXJzKTsKICAgICB9CiAKICAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIAogICAgIHN0YXR1c190IGVyciA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtNjM4NCw2ICs2NDAxLDE0IEBACiAgICAgICAgICAgICArK21hdGNoSW5kZXgpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW21hdGNoSW5kZXhdOwogCisgICAgICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgICAgIGJvb2wgdHJlYmxlRmxhZzsKKyAgICAgICAgaWYgKGNsaWVudC5jb25uZWN0KG93bmVyc1ttYXRjaEluZGV4XS5jX3N0cigpLCAmdHJlYmxlRmxhZykgIT0gT0spIHsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7CisKICAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKQEAgLTYzOTEsNiArNjQxNiw3IEBACiAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvZGVjLT5zZXRUcmVibGVGbGFnKHRyZWJsZUZsYWcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtODIxNCwxNiArODI0MCwxNSBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMpIHsKLSAgICAoKmNhcHMpLmNsZWFyKCk7Ci0gICAgY29uc3QgY2hhciAqcm9sZSA9IEdldENvbXBvbmVudFJvbGUoaXNFbmNvZGVyLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBjb25zdCBjaGFyKiBvd25lciwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKKyAgICBjb25zdCBjaGFyICpyb2xlID0gR2V0Q29tcG9uZW50Um9sZShpc0VuY29kZXIsIG1pbWUpOwogICAgIGlmIChyb2xlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7CisgICAgc3RhdHVzX3QgZXJyID0gY2xpZW50LmNvbm5lY3Qob3duZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC04MjMyLDcgKzgyNTcsNyBAQAogICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKLSAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmb214Tm9kZSk7CisgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZvbXhOb2RlKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC04MjQ1LDggKzgyNzAsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyPiBidWlsZGVyID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyKCk7Ci0gICAgYm9vbCBpc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7CisgICAgYm9vbCBpc1ZpZGVvID0gc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpID09IDA7CiAKICAgICBpZiAoaXNWaWRlbykgewogICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbTsKQEAgLTgyNjEsMTEgKzgyODUsMjIgQEAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKworICAgICAgICAgICAgLy8gQVZDIGNvbXBvbmVudHMgbWF5IG5vdCBsaXN0IHRoZSBjb25zdHJhaW5lZCBwcm9maWxlcyBleHBsaWNpdGx5LCBidXQKKyAgICAgICAgICAgIC8vIGRlY29kZXJzIHRoYXQgc3VwcG9ydCBhIHByb2ZpbGUgYWxzbyBzdXBwb3J0IGl0cyBjb25zdHJhaW5lZCB2ZXJzaW9uLgorICAgICAgICAgICAgLy8gRW5jb2RlcnMgbXVzdCBleHBsaWNpdGx5IHN1cHBvcnQgY29uc3RyYWluZWQgcHJvZmlsZXMuCisgICAgICAgICAgICBpZiAoIWlzRW5jb2RlciAmJiBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIHByb2ZpbGVzIGFmdGVyICV1OiAleC8leCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODI3Niw3ICs4MzExLDYgQEAKICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOwogICAgICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICBWZWN0b3I8dWludDMyX3Q+IHN1cHBvcnRlZENvbG9yczsgLy8gc2hhZG93IGNvcHkgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKICAgICAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsgaW5kZXggPD0ga01heEluZGljZXNUb0NoZWNrOyArK2luZGV4KSB7CiAgICAgICAgICAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKApAQCAtODI5MCwyOCArODMyNCwxNyBAQAogICAgICAgICAgICAgaWYgKElzRmxleGlibGVDb2xvckZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgb214Tm9kZSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQsIGZhbHNlIC8qIHVzaW5nTmF0aXZlV2luZG93ICovLAogICAgICAgICAgICAgICAgICAgICAmZmxleGlibGVFcXVpdmFsZW50KSkgewotICAgICAgICAgICAgICAgIGJvb2wgbWFya2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRDb2xvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZENvbG9yc1tpXSA9PSBmbGV4aWJsZUVxdWl2YWxlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1hcmtlZCkgewotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvcnMucHVzaChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JzLnB1c2gocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgYnVpbGRlci0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogCiAgICAgICAgICAgICBpZiAoaW5kZXggPT0ga01heEluZGljZXNUb0NoZWNrKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RvcHBpbmcgY2hlY2tpbmcgZm9ybWF0cyBhZnRlciAldTogJXMoJXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtaW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpID09IDApIHsKICAgICAgICAgLy8gTW9yZSBhdWRpbyBjb2RlY3MgaWYgdGhleSBoYXZlIHByb2ZpbGVzLgogICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9QUk9GSUxFVFlQRSBwYXJhbTsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW0pOwpAQCAtODMyNSwxMSArODM0OCwxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRm9yIGF1ZGlvLCBsZXZlbCBpcyBpZ25vcmVkLgotICAgICAgICAgICAgYnVpbGRlci0+YWRkUHJvZmlsZUxldmVsKHBhcmFtLmVQcm9maWxlLCAwIC8qIGxldmVsICovKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgMCAvKiBsZXZlbCAqLyk7CiAKICAgICAgICAgICAgIGlmIChpbmRleCA9PSBrTWF4SW5kaWNlc1RvQ2hlY2spIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdG9wcGluZyBjaGVja2luZyBwcm9maWxlcyBhZnRlciAldTogJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZVByb2ZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MzM3LDcgKzgzNjAsNyBAQAogICAgICAgICAvLyBOT1RFOiBXaXRob3V0IEFuZHJvaWQgZXh0ZW5zaW9ucywgT01YIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVlcnkKICAgICAgICAgLy8gQUFDIHByb2ZpbGUgc3VwcG9ydAogICAgICAgICBpZiAocGFyYW0ublByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzQ2LDE0ICs4MzY5LDE0IEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIDAsICZzaWRlYmFuZEhhbmRsZSkgPT0gT0spIHsKICAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGluY2x1ZGVzIGFkYXB0aXZlIHBsYXliYWNrCi0gICAgICAgICAgICBidWlsZGVyLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjaworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKICAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7CiAgICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKICAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgYnVpbGRlci0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzY1LDExICs4Mzg4LDEwIEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqY2FwcyA9IGJ1aWxkZXI7CiAgICAgb214Tm9kZS0+ZnJlZU5vZGUoKTsKICAgICBjbGllbnQuZGlzY29ubmVjdCgpOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggMGQ5Njk2Zi4uM2M3YWUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG51bWVyaWM+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCw4ICszNCwxMSBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiB1c2luZyBCdWZmZXJJbmZvID0gQUNvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVySW5mbzsKIHVzaW5nIEJ1ZmZlckluZm9JdGVyYXRvciA9IHN0ZDo6dmVjdG9yPGNvbnN0IEJ1ZmZlckluZm8+Ojpjb25zdF9pdGVyYXRvcjsKIApAQCAtMTE0LDc0ICsxMTcsOTcgQEAKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQogCi0gICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgbmF0aXZlX2hhbmRsZV90ICpzZWN1cmVIYW5kbGUgPSBOVUxMOwogICAgIGlmIChzZWN1cmUpIHsKICAgICAgICAgc3A8U2VjdXJlQnVmZmVyPiBzZWN1cmVEYXRhID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN1cmVCdWZmZXIgKj4oaXQtPm1Db2RlY0J1ZmZlci5nZXQoKSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCk7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CisgICAgICAgIGlmIChzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblR5cGUoKSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OwotICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgc2VjdXJlSGFuZGxlID0gc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uUG9pbnRlcigpKTsKICAgICB9Ci0KLSAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOwotICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgc291cmNlLm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Ci0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPSBzZWN1cmVIYW5kbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7CisgICAgICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOworCiAgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoa2V5LCBpdiwgbW9kZSwgcGF0dGVybiwKICAgICAgICAgICAgICAgICBzb3VyY2UsIGl0LT5tQ2xpZW50QnVmZmVyLT5vZmZzZXQoKSwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5kc3RUeXBlID0gZGVzdGluYXRpb24ubVR5cGUgPT0KLSAgICAgICAgICAgICAgICBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5ID8KLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNjcmFtYmxpbmdDb250cm9sID0ga2V5ICE9IE5VTEwgPwotICAgICAgICAgICAgICAgIChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdIDoKLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlclBsdWdpbjo6a1NjcmFtYmxpbmdfVW5zY3JhbWJsZWQ7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLm51bVN1YlNhbXBsZXMgPSBudW1TdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zdWJTYW1wbGVzID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKilzdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zcmNNZW0gPSBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0UHRyID0gTlVMTDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICBpbnQzMl90IGRlc2NyYW1ibGVSZXN1bHQgPSAtMTsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZShkZXNjcmFtYmxlSW5mbywgJmRlc2NyYW1ibGVSZXN1bHQpOwotCi0gICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBkZXNjcmFtYmxlUmVzdWx0OwotICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgZXhjZXB0aW9uQ29kZT0lZCwgZXJyPSVkLCByZXN1bHQ9JXpkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSwgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgcmVzdWx0PSV6ZCIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJlc3VsdCA+IDAgJiYgZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXIgPSB7CisgICAgICAgICAgICAgICAgLmhlYXBCYXNlID0gbUhpZGxNZW1vcnksCisgICAgICAgICAgICAgICAgLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0LAorICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZQorICAgICAgICB9OworCisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICAgICAgICAgICAgZHN0QnVmZmVyLnNlY3VyZU1lbW9yeSA9IGhpZGxfaGFuZGxlKHNlY3VyZUhhbmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCwgcmVzdWx0PSV6ZCIsCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgcmVzdWx0KTsKKworICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgICAgICAgbWVtY3B5KGl0LT5tQ29kZWNCdWZmZXItPmJhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5wb2ludGVyKCksIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7Ci0gICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKLSAgICB9Ci0KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCkBAIC0yNzUsMTAgKzMwMSwyMSBAQAogICAgICAgICBpbnQzMl90IHNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAoZGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOwogICAgICAgICBpZiAoc2VxTnVtID49IDApIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gc2VxTnVtOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CisgICAgICAgICAgICBBTE9HVigic2V0SGVhcCByZXR1cm5lZCBtSGVhcFNlcU51bT0lZCIsIG1IZWFwU2VxTnVtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7Ci0gICAgICAgICAgICBBTE9HRCgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRIZWFwIGZhaWxlZCwgc2V0dGluZyBtSGVhcFNlcU51bT0tMSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgICAgICBpZiAobmF0aXZlSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOworICAgICAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgICAgICAgICBtSGlkbE1lbW9yeSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLCBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZWQgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBoaWRsX21lbW9yeSBmb3IgZGVzY3JhbWJsZXIiKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGVhbGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggNmNjMWFjZS4uYzhkNGU0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKKyAgICAgICAgIkNvZGVjQmFzZS5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLApAQCAtMjksNiArMzAsNyBAQAogICAgICAgICAiRnJhbWVSZW5kZXJUcmFja2VyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgICAgICJJdGVtVGFibGUuY3BwIiwKICAgICAgICAgIkpQRUdTb3VyY2UuY3BwIiwKICAgICAgICAgIk1QM0V4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTVBFRzJUU1dyaXRlci5jcHAiLApAQCAtNDksNiArNTEsNyBAQAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKKyAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJPZ2dFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCiAgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLApAQCAtNjcsMTEgKzcwLDYgQEAKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKQEAgLTk2LDE2ICs5NCwyMCBAQAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKIAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xMTQsNyArMTE2LDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FhY2VuYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogICAgICAgICAibGlidnB4IiwKQEAgLTEyNCw5ICsxMjUsMTIgQEAKICAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCiAKLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYm1lZGlhIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgIF0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICIuIiwKICAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKQEAgLTE3Myw0ICsxNzcsNSBAQAogICAgICJ0aW1lZHRleHQiLAogICAgICJ3ZWJtIiwKICAgICAid2lmaS1kaXNwbGF5IiwKKyAgICAieG1scGFyc2VyIiwKIF0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCmluZGV4IDQzMDkzNzIuLjZkZmUyZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApAQCAtMTI3LDEwICsxMjcsNiBAQAogfQogCiBzc2l6ZV90IFRpbnlDYWNoZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID49IGtDYWNoZVNpemUpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZSBzYXRpc2ZpZXMgdGhlIHJlYWQuCiAgICAgaWYgKG1DYWNoZWRPZmZzZXQgPD0gb2Zmc2V0CiAgICAgICAgICAgICAmJiBvZmZzZXQgPCAob2ZmNjRfdCkgKG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkpIHsKQEAgLTE1NCw2ICsxNTAsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHNpemUgPj0ga0NhY2hlU2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQogCiAgICAgLy8gRmlsbCB0aGUgY2FjaGUgYW5kIGNvcHkgdG8gdGhlIGNhbGxlci4KICAgICBjb25zdCBzc2l6ZV90IG51bVJlYWQgPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtQ2FjaGUsIGtDYWNoZVNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MTBiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlY0Jhc2UiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEJ1ZmZlckNoYW5uZWxCYXNlOjpzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgeworICAgIG1DcnlwdG8gPSBjcnlwdG87Cit9CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7CisgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggYTU3NjBkMS4uYzIyMDUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTkyLDYgKzkyLDQ4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICB1aW50OF90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgfQorICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2U6OmdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICByZXR1cm4gZ2V0VUludDY0KG9mZnNldCwgeCk7CisgICAgfQorICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBzdGF0dXNfdCBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKICAgICAqc2l6ZSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCmluZGV4IDkxNzg3MGYuLjFhYTNiYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApAQCAtODgsNyArODgsOSBAQAogCiBzdGF0dXNfdCBGcmFtZVJlbmRlclRyYWNrZXI6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKICAgICAvLyBlbnN1cmUgbW9ub3RvbmljIHRpbWVzdGFtcHMKLSAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPj0gc3lzdGVtTmFubykgeworICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+IHN5c3RlbU5hbm8gfHwKKyAgICAgICAgLy8gRU9TIGlzIG5vcm1hbGx5IG1hcmtlZCBvbiB0aGUgbGFzdCBmcmFtZQorICAgICAgICAobUxhc3RSZW5kZXJUaW1lTnMgPT0gc3lzdGVtTmFubyAmJiBtZWRpYVRpbWVVcyAhPSBJTlQ2NF9NQVgpKSB7CiAgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIG91dCBvZiBvcmRlci9zdGFsZSBzeXN0ZW0gbmFubyAlbGxkIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSXRlbVRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM0ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSXRlbVRhYmxlLmNwcApAQCAtMCwwICsxLDE1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKKworI2luY2x1ZGUgPGluY2x1ZGUvSXRlbVRhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBoZWlmIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIHN0cnVjdCB0byBrZWVwIHRyYWNrIG9mIG9uZSBpbWFnZSBpdGVtCisvLworCitzdHJ1Y3QgSW1hZ2VJdGVtIHsKKyAgICBmcmllbmQgc3RydWN0IEl0ZW1SZWZlcmVuY2U7CisgICAgZnJpZW5kIHN0cnVjdCBJdGVtUHJvcGVydHk7CisKKyAgICBJbWFnZUl0ZW0oKSA6IEltYWdlSXRlbSgwKSB7fQorICAgIEltYWdlSXRlbSh1aW50MzJfdCBfdHlwZSkgOiB0eXBlKF90eXBlKSwKKyAgICAgICAgICAgIHJvd3MoMCksIGNvbHVtbnMoMCksIHdpZHRoKDApLCBoZWlnaHQoMCksIHJvdGF0aW9uKDApLAorICAgICAgICAgICAgb2Zmc2V0KDApLCBzaXplKDApLCBuZXh0VGlsZUluZGV4KDApIHt9CisKKyAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJyk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TmV4dFRpbGVJdGVtSWQodWludDMyX3QgKm5leHRUaWxlSXRlbUlkLCBib29sIHJlc2V0KSB7CisgICAgICAgIGlmIChyZXNldCkgeworICAgICAgICAgICAgbmV4dFRpbGVJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5leHRUaWxlSW5kZXggPj0gZGltZ1JlZnMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICAqbmV4dFRpbGVJdGVtSWQgPSBkaW1nUmVmc1tuZXh0VGlsZUluZGV4KytdOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpbnQzMl90IHJvd3M7CisgICAgaW50MzJfdCBjb2x1bW5zOworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCByb3RhdGlvbjsKKyAgICBvZmY2NF90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBodmNjOworICAgIHNwPEFCdWZmZXI+IGljYzsKKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGh1bWJuYWlsczsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGRpbWdSZWZzOworICAgIHNpemVfdCBuZXh0VGlsZUluZGV4OworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSVNPIGJveGVzCisvLworCitzdHJ1Y3QgQm94IHsKK3Byb3RlY3RlZDoKKyAgICBCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9CisKKyAgICB2aXJ0dWFsIH5Cb3goKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNodW5rRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IC8qdHlwZSovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorCisgICAgaW5saW5lIHNwPERhdGFTb3VyY2U+IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CisKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHVpbnQzMl90IG1UeXBlOworfTsKKworc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgeworICAgIGlmICgqb2Zmc2V0IDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGJlIHRvcCBsZXZlbAorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplIDAgZm9yIG5vbi10b3AgbGV2ZWwgYm94Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7CisKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG9uQ2h1bmtEYXRhKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7CisgICAgd2hpbGUgKG9mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggeworcHJvdGVjdGVkOgorICAgIEZ1bGxCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CisKKyAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KKworICAgIGlubGluZSB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgc3RhdHVzX3QgcGFyc2VGdWxsQm94SGVhZGVyKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKKworcHJpdmF0ZToKKyAgICB1aW50OF90IG1WZXJzaW9uOworICAgIHVpbnQzMl90IG1GbGFnczsKK307CisKK3N0YXR1c190IEZ1bGxCb3g6OnBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICgqc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KCpvZmZzZXQsICZtVmVyc2lvbiwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MjQoKm9mZnNldCArIDEsICZtRmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgKm9mZnNldCArPSA0OworICAgICpzaXplIC09IDQ7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUHJpbWFyeUltYWdlIGJveAorLy8KKworc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgUGl0bUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7Cit9OworCitzdGF0dXNfdCBQaXRtQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDApID8gMiA6IDQ7CisgICAgaWYgKHNpemUgPCBpdGVtSWRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGl0ZW1JZDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByaW1hcnkgaWQgJWQiLCBpdGVtSWQpOworICAgICpwcmltYXJ5SXRlbUlkID0gaXRlbUlkOworCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSXRlbUxvY2F0aW9uIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBFeHRlbnRFbnRyeSB7CisgICAgdWludDY0X3QgZXh0ZW50SW5kZXg7CisgICAgdWludDY0X3QgZXh0ZW50T2Zmc2V0OworICAgIHVpbnQ2NF90IGV4dGVudExlbmd0aDsKK307CisKK3N0cnVjdCBJdGVtTG9jIHsKKyAgICBJdGVtTG9jKCkgOiBJdGVtTG9jKDAsIDAsIDAsIDApIHt9CisgICAgSXRlbUxvYyh1aW50MzJfdCBpdGVtX2lkLCB1aW50MTZfdCBjb25zdHJ1Y3Rpb25fbWV0aG9kLAorICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXgsIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0KSA6CisgICAgICAgIGl0ZW1JZChpdGVtX2lkKSwKKyAgICAgICAgY29uc3RydWN0aW9uTWV0aG9kKGNvbnN0cnVjdGlvbl9tZXRob2QpLAorICAgICAgICBkYXRhUmVmZXJlbmNlSW5kZXgoZGF0YV9yZWZlcmVuY2VfaW5kZXgpLAorICAgICAgICBiYXNlT2Zmc2V0KGJhc2Vfb2Zmc2V0KSB7fQorCisgICAgdm9pZCBhZGRFeHRlbnQoY29uc3QgRXh0ZW50RW50cnkmIGV4dGVudCkgeworICAgICAgICBleHRlbnRzLnB1c2hfYmFjayhleHRlbnQpOworICAgIH0KKworICAgIHN0YXR1c190IGdldExvYyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwKKyAgICAgICAgICAgIG9mZjY0X3QgaWRhdE9mZnNldCwgc2l6ZV90IGlkYXRTaXplKSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGZpeCBleHRlbnQgaGFuZGxpbmcsIGZpeCBjb25zdHJ1Y3Rpb25NZXRob2QgPSAyCisgICAgICAgIENIRUNLKGV4dGVudHMuc2l6ZSgpID09IDEpOworICAgICAgICBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDApIHsKKyAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQ7CisgICAgICAgICAgICAqc2l6ZSA9IGV4dGVudHNbMF0uZXh0ZW50TGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdGlvbk1ldGhvZCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgPiBpZGF0U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ID0gYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgaWRhdE9mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIHBhcnNlZCBpbmZvCisgICAgdWludDMyX3QgaXRlbUlkOworICAgIHVpbnQxNl90IGNvbnN0cnVjdGlvbk1ldGhvZDsKKyAgICB1aW50MTZfdCBkYXRhUmVmZXJlbmNlSW5kZXg7CisgICAgb2ZmNjRfdCBiYXNlT2Zmc2V0OworICAgIFZlY3RvcjxFeHRlbnRFbnRyeT4gZXh0ZW50czsKK307CisKK3N0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElsb2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCisgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzQ29uc3RydWN0TWV0aG9kMSgpIHsgcmV0dXJuIG1IYXNDb25zdHJ1Y3RNZXRob2QxOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgaXNTaXplRmllbGRWYWxpZCh1aW50MzJfdCBvZmZzZXRfc2l6ZSkgeworICAgICAgICByZXR1cm4gb2Zmc2V0X3NpemUgPT0gMCB8fCBvZmZzZXRfc2l6ZSA9PSA0IHx8IG9mZnNldF9zaXplID09IDg7CisgICAgfQorICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqbUl0ZW1Mb2NzOworICAgIGJvb2wgbUhhc0NvbnN0cnVjdE1ldGhvZDE7Cit9OworCitzdGF0dXNfdCBJbG9jQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHZlcnNpb24oKSA+IDIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmb2Zmc2V0X3NpemUsIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDhfdCBsZW5ndGhfc2l6ZSA9IChvZmZzZXRfc2l6ZSAmIDB4Rik7CisgICAgb2Zmc2V0X3NpemUgPj49IDQ7CisKKyAgICB1aW50OF90IGJhc2Vfb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmYmFzZV9vZmZzZXRfc2l6ZSwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50OF90IGluZGV4X3NpemUgPSAwOworICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICBpbmRleF9zaXplID0gKGJhc2Vfb2Zmc2V0X3NpemUgJiAweEYpOworICAgIH0KKyAgICBiYXNlX29mZnNldF9zaXplID4+PSA0OworICAgIHNpemUgLT0gMjsKKworICAgIGlmICghaXNTaXplRmllbGRWYWxpZChvZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGxlbmd0aF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoYmFzZV9vZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKChpbmRleF9zaXplKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBvZmZzZXQgc2l6ZSBub3QgdmFsaWQ6ICVkLCAlZCwgJWQsICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG9mZnNldF9zaXplLCBsZW5ndGhfc2l6ZSwgYmFzZV9vZmZzZXRfc2l6ZSwgaW5kZXhfc2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgaXRlbV9jb3VudDsKKyAgICBzaXplX3QgaXRlbUZpZWxkU2l6ZSA9IHZlcnNpb24oKSA8IDIgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1GaWVsZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1fY291bnQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigiaXRlbV9jb3VudCAlbGxkIiwgKGxvbmcgbG9uZykgaXRlbV9jb3VudCk7CisgICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7CisgICAgc2l6ZSAtPSBpdGVtRmllbGRTaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1bJXp1XTogaWQgJWxsZCIsIGksIChsb25nIGxvbmcpaXRlbV9pZCk7CisgICAgICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOworCisgICAgICAgIHVpbnQ4X3QgY29uc3RydWN0aW9uX21ldGhvZCA9IDA7CisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICAgICAgdWludDhfdCBidWZbMl07CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBidWYsIDIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RydWN0aW9uX21ldGhvZCA9IChidWZbMV0gJiAweEYpOworICAgICAgICAgICAgQUxPR1YoImNvbnN0cnVjdGlvbl9tZXRob2QgJWQiLCBjb25zdHJ1Y3Rpb25fbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25fbWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgICAgICBtSGFzQ29uc3RydWN0TWV0aG9kMSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXg7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZkYXRhX3JlZmVyZW5jZV9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGF0YV9yZWZlcmVuY2VfaW5kZXggJWQiLCBkYXRhX3JlZmVyZW5jZV9pbmRleCk7CisgICAgICAgIGlmIChkYXRhX3JlZmVyZW5jZV9pbmRleCAhPSAwKSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHJlZmVyZW5jZSB0byBvdGhlciBmaWxlcworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0X3NpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmJhc2Vfb2Zmc2V0LCBiYXNlX29mZnNldF9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBiYXNlX29mZnNldF9zaXplOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJiYXNlX29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZykgYmFzZV9vZmZzZXQpOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUxvY3MtPmFkZChpdGVtX2lkLCBJdGVtTG9jKAorICAgICAgICAgICAgICAgIGl0ZW1faWQsIGNvbnN0cnVjdGlvbl9tZXRob2QsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBiYXNlX29mZnNldCkpOworICAgICAgICBJdGVtTG9jICZpdGVtID0gbUl0ZW1Mb2NzLT5lZGl0VmFsdWVBdChpbmRleCk7CisKKyAgICAgICAgdWludDE2X3QgZXh0ZW50X2NvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZXh0ZW50X2NvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJleHRlbnRfY291bnQgJWQiLCBleHRlbnRfY291bnQpOworCisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxICYmIChvZmZzZXRfc2l6ZSA9PSAwIHx8IGxlbmd0aF9zaXplID09IDApKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBkaXZpZGVjIGludG8gbW9yZSB0aGFuIG9uZSBleHRlbnRzLCBvZmZzZXQgYW5kCisgICAgICAgICAgICAvLyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGV4dGVudF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfaW5kZXggPSAxOyAvLyBkZWZhdWx0PTEKKyAgICAgICAgICAgIGlmICgodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpICYmIChpbmRleF9zaXplID4gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2luZGV4LCBpbmRleF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGlzIG1vZGUKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW5kZXhfc2l6ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXh0ZW50X2luZGV4ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9vZmZzZXQgPSAwOyAvLyBkZWZhdWx0PTAKKyAgICAgICAgICAgIGlmIChvZmZzZXRfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X29mZnNldCwgb2Zmc2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImV4dGVudF9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X29mZnNldCk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9sZW5ndGggPSAwOyAvLyB0aGlzIGluZGljYXRlcyBmdWxsIGxlbmd0aCBvZiBmaWxlCisgICAgICAgICAgICBpZiAobGVuZ3RoX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9sZW5ndGgsIGxlbmd0aF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfbGVuZ3RoICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9sZW5ndGgpOworCisgICAgICAgICAgICBpdGVtLmFkZEV4dGVudCh7IGV4dGVudF9pbmRleCwgZXh0ZW50X29mZnNldCwgZXh0ZW50X2xlbmd0aCB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtUmVmZXJlbmNlIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgeworICAgIEl0ZW1SZWZlcmVuY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgdWludDMyX3QgaXRlbUlkKCkgeyByZXR1cm4gbUl0ZW1JZDsgfQorCisgICAgdm9pZCBhcHBseShLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JbWFnZU1hcCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBpdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJhdHRhY2ggcmVmZXJlbmNlIHR5cGUgMHgleCB0byBpdGVtIGlkICVkKSIsIHR5cGUoKSwgbUl0ZW1JZCk7CisKKyAgICAgICAgaWYgKHR5cGUoKSA9PSBGT1VSQ0MoJ2QnLCAnaScsICdtJywgJ2cnKSkgeworICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBpZiAoIWltYWdlLmRpbWdSZWZzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZGltZ1JlZnMgaWYgbm90IGNsZWFuISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2UuZGltZ1JlZnMuYXBwZW5kVmVjdG9yKG1SZWZzKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlKCkgPT0gRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJykpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbWFnZUluZGV4ID0gaXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1SZWZzW2ldKTsKKworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJJbWFnZSBpdGVtIGlkICVkIHVzZXMgdGh1bWJuYWlsIGl0ZW0gaWQgJWQiLCBtUmVmc1tpXSwgbUl0ZW1JZCk7CisgICAgICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFpbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHJlZiB0eXBlIDB4JXgiLCB0eXBlKCkpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1JdGVtSWQ7CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IG1SZWZzOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVJlZmVyZW5jZSk7Cit9OworCitzdGF0dXNfdCBJdGVtUmVmZXJlbmNlOjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IG1SZWZJZFNpemUgKyAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZtSXRlbUlkLCBtUmVmSWRTaXplKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSBtUmVmSWRTaXplOworCisgICAgdWludDE2X3QgY291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJmNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSAyOworICAgIHNpemUgLT0gKG1SZWZJZFNpemUgKyAyKTsKKworICAgIGlmIChzaXplIDwgY291bnQgKiBtUmVmSWRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IHJlZkl0ZW1JZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJnJlZkl0ZW1JZCwgbVJlZklkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gbVJlZklkU2l6ZTsKKyAgICAgICAgbVJlZnMucHVzaF9iYWNrKHJlZkl0ZW1JZCk7CisgICAgICAgIEFMT0dWKCJpdGVtIGlkICVkOiByZWZlcmVuY2luZyBpdGVtIGlkICVkIiwgbUl0ZW1JZCwgcmVmSXRlbUlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElyZWZCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqbUl0ZW1SZWZzOworfTsKKworc3RhdHVzX3QgSXJlZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtUmVmSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcmVmQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUmVmZXJlbmNlPiBpdGVtUmVmID0gbmV3IEl0ZW1SZWZlcmVuY2Uoc291cmNlKCksIHR5cGUsIG1SZWZJZFNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVJlZi0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtUmVmcy0+cHVzaF9iYWNrKGl0ZW1SZWYpOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1Qcm9wZXJ0eSByZWxhdGVkIGJveGVzCisvLworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeSB7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgZXNzZW50aWFsOworICAgIHVpbnQxNl90IGluZGV4OworfTsKKworc3RydWN0IEl0ZW1Qcm9wZXJ0eSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBJdGVtUHJvcGVydHkoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmLyppbWFnZSovKSBjb25zdCB7CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZShvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVByb3BlcnR5KTsKK307CisKK3N0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIElzcGVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS53aWR0aCA9IG1XaWR0aDsKKyAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7Cit9OworCitzdGF0dXNfdCBJc3BlQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZtV2lkdGgpCisgICAgICAgICAgICB8fCAhc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmbUhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBBTE9HVigicHJvcGVydHkgaXNwZTogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIEh2Y2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS5odmNjID0gbUhWQ0M7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEFCdWZmZXI+IG1IVkNDOworfTsKKworc3RhdHVzX3QgSHZjY0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIG1IVkNDID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisKKyAgICBpZiAobUhWQ0MtPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSFZDQy0+ZGF0YSgpLCBzaXplKSA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIEFMT0dWKCJwcm9wZXJ0eSBodmNDIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcm90Qm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7CisgICAgSXJvdEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uucm90YXRpb24gPSBtQW5nbGUgKiA5MDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtQW5nbGU7Cit9OworCitzdGF0dXNfdCBJcm90Qm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJm1BbmdsZSwgMSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG1BbmdsZSAmPSAweDM7CisgICAgQUxPR1YoInByb3BlcnR5IGlyb3Q6ICVkIiwgbUFuZ2xlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBDb2xyQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2MnLCAnbycsICdsJywgJ3InKSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2UuaWNjID0gbUlDQ0RhdGE7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEFCdWZmZXI+IG1JQ0NEYXRhOworfTsKKworc3RhdHVzX3QgQ29sckJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBjb2xvdXJfdHlwZTsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmY29sb3VyX3R5cGUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICAgIGlmIChjb2xvdXJfdHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGlmICgoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdyJywgJ0knLCAnQycsICdDJykpICYmCisgICAgICAgIChjb2xvdXJfdHlwZSAhPSBGT1VSQ0MoJ3AnLCAncicsICdvJywgJ2YnKSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtSUNDRGF0YSA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIGlmIChtSUNDRGF0YS0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1JQ0NEYXRhLT5kYXRhKCksIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIEFMT0dWKCJwcm9wZXJ0eSBDb2xyOiBzaXplICV6ZCIsIHNpemUpOworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwbWFCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSXBtYUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKK3ByaXZhdGU6CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOworfTsKKworc3RhdHVzX3QgSXBtYUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGVudHJ5Q291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmVudHJ5Q291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgc2l6ZSAtPSA0OworCisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBlbnRyeUNvdW50OyArK2spIHsKKyAgICAgICAgdWludDMyX3QgaXRlbUlkID0gMDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpIDwgMSkgPyAyIDogNDsKKworICAgICAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUgKyAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1JZCwgaXRlbUlkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gaXRlbUlkU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplOworCisgICAgICAgIHVpbnQ4X3QgYXNzb2NpYXRpb25Db3VudDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJmFzc29jaWF0aW9uQ291bnQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIHNpemUtLTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFzc29jaWF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc2l6ZV90IHByb3BJbmRleFNpemUgPSAoZmxhZ3MoKSAmIDEpID8gMiA6IDE7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHByb3BJbmRleFNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDE2X3QgcHJvcEluZGV4OworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2VmFyKG9mZnNldCwgJnByb3BJbmRleCwgcHJvcEluZGV4U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gcHJvcEluZGV4U2l6ZTsKKyAgICAgICAgICAgIHNpemUgLT0gcHJvcEluZGV4U2l6ZTsKKyAgICAgICAgICAgIHVpbnQxNl90IGJpdG1hc2sgPSAoMSA8PCAoOCAqIHByb3BJbmRleFNpemUgLSAxKSk7CisgICAgICAgICAgICBBc3NvY2lhdGlvbkVudHJ5IGVudHJ5ID0geworICAgICAgICAgICAgICAgICAgICAuaXRlbUlkID0gaXRlbUlkLAorICAgICAgICAgICAgICAgICAgICAuZXNzZW50aWFsID0gISEocHJvcEluZGV4ICYgYml0bWFzayksCisgICAgICAgICAgICAgICAgICAgIC5pbmRleCA9ICh1aW50MTZfdCkgKHByb3BJbmRleCAmIH5iaXRtYXNrKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSAlZCAoZXNzZW50aWFsICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCwgZW50cnkuaW5kZXgsIGVudHJ5LmVzc2VudGlhbCk7CisKKyAgICAgICAgICAgIG1Bc3NvY2lhdGlvbnMtPnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7CisgICAgSXBjb0JveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptSXRlbVByb3BlcnRpZXM7Cit9OworCitzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcGNvQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUHJvcGVydHk+IGl0ZW1Qcm9wZXJ0eTsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSHZjY0JveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXNwZUJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXJvdEJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleAorICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEl0ZW1Qcm9wZXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVByb3BlcnR5LT5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2soaXRlbVByb3BlcnR5KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7CisgICAgSXBycEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsCisgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLAorICAgICAgICBtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqbVByb3BlcnRpZXM7CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOworfTsKKworc3RhdHVzX3QgSXBycEJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IElwcnBCb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIElwY29Cb3ggaXBjb0JveChzb3VyY2UoKSwgbVByb3BlcnRpZXMpOworICAgICAgICAgICAgcmV0dXJuIGlwY29Cb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpOgorICAgICAgICB7CisgICAgICAgICAgICBJcG1hQm94IGlwbWFCb3goc291cmNlKCksIG1Bc3NvY2lhdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGlwbWFCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIGJveC4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1JbmZvIHJlbGF0ZWQgYm94ZXMKKy8vCitzdHJ1Y3QgSXRlbUluZm8geworICAgIHVpbnQzMl90IGl0ZW1JZDsKKyAgICB1aW50MzJfdCBpdGVtVHlwZTsKK307CisKK3N0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIEluZmVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCk7Cit9OworCitib29sIEluZmVCb3g6OnBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBTdHJpbmc4ICpvdXQpIHsKKyAgICBjaGFyIHRtcFsyNTZdOworICAgIHNpemVfdCBsZW4gPSAwOworICAgIG9mZjY0X3QgbmV3T2Zmc2V0ID0gKm9mZnNldDsKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSAqb2Zmc2V0ICsgKnNpemU7CisgICAgd2hpbGUgKG5ld09mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG5ld09mZnNldCsrLCAmdG1wW2xlbl0sIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFtsZW5dID09IDApIHsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKHRtcCwgbGVuKTsKKworICAgICAgICAgICAgKm9mZnNldCA9IG5ld09mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gc3RvcE9mZnNldCAtIG5ld09mZnNldDsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrbGVuID49IHNpemVvZih0bXApKSB7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCh0bXAsIGxlbik7CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgSW5mZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbigpID09IDAgfHwgdmVyc2lvbigpID09IDEpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVpbnQxNl90IGl0ZW1faWQ7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZpdGVtX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJpdGVtX2lkICVkIiwgaXRlbV9pZCk7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCArIDIsICZpdGVtX3Byb3RlY3Rpb25faW5kZXgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKworICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOworICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X3R5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCBjb250ZW50X2VuY29kaW5nOworICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSkgeworICAgICAgICAgICAgdWludDMyX3QgZXh0ZW5zaW9uX3R5cGU7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZXh0ZW5zaW9uX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlCisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyB2ZXJzaW9uID49IDIKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDIpID8gMiA6IDQ7CisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKKyAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9wcm90ZWN0aW9uX2luZGV4ICVkIiwgaXRlbV9wcm90ZWN0aW9uX2luZGV4KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIHVpbnQzMl90IGl0ZW1fdHlwZTsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJml0ZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW1JbmZvLT5pdGVtSWQgPSBpdGVtX2lkOworICAgICAgICBpdGVtSW5mby0+aXRlbVR5cGUgPSBpdGVtX3R5cGU7CisKKyAgICAgICAgY2hhciBpdGVtVHlwZVN0cmluZ1s1XTsKKyAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhpdGVtX3R5cGUsIGl0ZW1UeXBlU3RyaW5nKTsKKyAgICAgICAgQUxPR1YoIml0ZW1fdHlwZSAlcyIsIGl0ZW1UeXBlU3RyaW5nKTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gaXRlbUlkU2l6ZSArIDY7CisKKyAgICAgICAgU3RyaW5nOCBpdGVtX25hbWU7CisgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1fbmFtZSAlcyIsIGl0ZW1fbmFtZS5jX3N0cigpKTsKKworICAgICAgICBpZiAoaXRlbV90eXBlID09IEZPVVJDQygnbScsICdpJywgJ20nLCAnZScpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfdHlwZTsKKyAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbV90eXBlID09IEZPVVJDQygndScsICdyJywgJ2knLCAnICcpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGl0ZW1fdXJpX3R5cGU7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX3VyaV90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJaW5mQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKSksCisgICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzR3JpZHMoKSB7IHJldHVybiBtSGFzR3JpZHM7IH0KKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPEl0ZW1JbmZvPiAqbUl0ZW1JbmZvczsKKyAgICBib29sIG1IYXNHcmlkczsKK307CisKK3N0YXR1c190IElpbmZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgZW50cnlDb3VudFNpemUgPSB2ZXJzaW9uKCkgPT0gMCA/IDIgOiA0OworICAgIGlmIChzaXplIDwgZW50cnlDb3VudFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZW50cnlfY291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJmVudHJ5X2NvdW50LCBlbnRyeUNvdW50U2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBBTE9HVigiZW50cnlfY291bnQgJWQiLCBlbnRyeV9jb3VudCk7CisKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOworICAgIG9mZnNldCArPSBlbnRyeUNvdW50U2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5X2NvdW50ICYmIG9mZnNldCA8IHN0b3BPZmZzZXQ7IGkrKykgeworICAgICAgICBBTE9HVigiZW50cnkgJXp1IiwgaSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9mZnNldCAhPSBzdG9wT2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJaW5mQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAodHlwZSAhPSBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgSW5mZUJveCBpbmZlQm94KHNvdXJjZSgpKTsKKyAgICBJdGVtSW5mbyBpdGVtSW5mbzsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbmZlQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJml0ZW1JbmZvKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtSW5mb3MtPnB1c2hfYmFjayhpdGVtSW5mbyk7CisgICAgbUhhc0dyaWRzIHw9IChpdGVtSW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKSk7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSXRlbVRhYmxlOjpJdGVtVGFibGUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtUHJpbWFyeUl0ZW1JZCgwKSwKKyAgICAgIG1JZGF0T2Zmc2V0KDApLAorICAgICAgbUlkYXRTaXplKDApLAorICAgICAgbUltYWdlSXRlbXNWYWxpZChmYWxzZSksCisgICAgICBtQ3VycmVudEltYWdlSW5kZXgoMCkgeworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXBycCcpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWxvYycpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgncGl0bScpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWluZicpOworfQorCitJdGVtVGFibGU6On5JdGVtVGFibGUoKSB7fQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bnJlY29nbml6ZWQgYm94IHR5cGU6IDB4JXgiLCB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElsb2NCb3ggaWxvY0JveChtRGF0YVNvdXJjZSwgJm1JdGVtTG9jcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaWxvY0JveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaWxvY0JveC5oYXNDb25zdHJ1Y3RNZXRob2QxKCkpIHsKKyAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpZGF0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lsb2MnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElpbmZCb3ggaWluZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtSW5mb3MpOworICAgIHN0YXR1c190IGVyciA9IGlpbmZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgeworICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWluZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgUGl0bUJveCBwaXRtQm94KG1EYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwaXRtQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJm1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ3BpdG0nKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElwcnBCb3ggaXBycEJveChtRGF0YVNvdXJjZSwgJm1JdGVtUHJvcGVydGllcywgJm1Bc3NvY2lhdGlvbnMpOworICAgIHN0YXR1c190IGVyciA9IGlwcnBCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lwcnAnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBpZGF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgLy8gb25seSByZW1lbWJlciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIGlkYXQgYm94IGZvciBsYXRlciB1c2UKKyAgICBtSWRhdE9mZnNldCA9IG9mZnNldDsKKyAgICBtSWRhdFNpemUgPSBzaXplOworCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lkYXQnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElyZWZCb3ggaXJlZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtUmVmZXJlbmNlcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaXJlZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXJlZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSkgeworICAgIGlmIChtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtQm94ZXNTZWVuLmluc2VydCh0eXBlKTsKKworICAgIC8vIG5lZWQgYXQgbGVhc3QgJ2lwcnAnLCAnaWxvYycsICdwaXRtJywgJ2lpbmYnOworICAgIC8vIG5lZWQgJ2lkYXQnIGlmIGFueSBpdGVtcyB1c2VkIGNvbnN0cnVjdGlvbl9tZXRob2Qgb2YgMjsKKyAgICAvLyBuZWVkICdpcmVmJyBpZiB0aGVyZSBhcmUgZ3JpZHMuCisgICAgaWYgKCFzdGQ6OmluY2x1ZGVzKAorICAgICAgICAgICAgbUJveGVzU2Vlbi5iZWdpbigpLCBtQm94ZXNTZWVuLmVuZCgpLAorICAgICAgICAgICAgbVJlcXVpcmVkQm94ZXMuYmVnaW4oKSwgbVJlcXVpcmVkQm94ZXMuZW5kKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigiYnVpbGRpbmcgaW1hZ2UgdGFibGUuLi4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1JbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBJdGVtSW5mbyAmaW5mbyA9IG1JdGVtSW5mb3NbaV07CisKKworICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaW1hZ2VJbmRleCA+PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZHVwbGljYXRlIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaWxvY0luZGV4ID0gbUl0ZW1Mb2NzLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaWxvY0luZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImlsb2MgbWlzc2luZyBmb3IgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEl0ZW1Mb2MgJmlsb2MgPSBtSXRlbUxvY3NbaWxvY0luZGV4XTsKKworICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChpbG9jLmdldExvYygmb2Zmc2V0LCAmc2l6ZSwgbUlkYXRPZmZzZXQsIG1JZGF0U2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBJbWFnZUl0ZW0gaW1hZ2UoaW5mby5pdGVtVHlwZSk7CisKKyAgICAgICAgQUxPR1YoImFkZGluZyAlczogaXRlbUlkICVkIiwgaW1hZ2UuaXNHcmlkKCkgPyAiZ3JpZCIgOiAiaW1hZ2UiLCBpbmZvLml0ZW1JZCk7CisKKyAgICAgICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDEyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzEyXTsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltYWdlLnJvd3MgPSBidWZbMl0gKyAxOworICAgICAgICAgICAgaW1hZ2UuY29sdW1ucyA9IGJ1ZlszXSArIDE7CisKKyAgICAgICAgICAgIEFMT0dWKCJyb3dzICVkLCBjb2x1bWFucyAlZCIsIGltYWdlLnJvd3MsIGltYWdlLmNvbHVtbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW1hZ2Uub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgaW1hZ2Uuc2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUl0ZW1JZFRvSW1hZ2VNYXAuYWRkKGluZm8uaXRlbUlkLCBpbWFnZSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXNzb2NpYXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF0dGFjaFByb3BlcnR5KG1Bc3NvY2lhdGlvbnNbaV0pOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1SZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JdGVtUmVmZXJlbmNlc1tpXS0+YXBwbHkobUl0ZW1JZFRvSW1hZ2VNYXApOworICAgIH0KKworICAgIG1JbWFnZUl0ZW1zVmFsaWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBJdGVtVGFibGU6OmF0dGFjaFByb3BlcnR5KGNvbnN0IEFzc29jaWF0aW9uRW50cnkgJmFzc29jaWF0aW9uKSB7CisgICAgc3NpemVfdCBpbWFnZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShhc3NvY2lhdGlvbi5pdGVtSWQpOworCisgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgIGlmIChpbWFnZUluZGV4IDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDE2X3QgcHJvcGVydHlJbmRleCA9IGFzc29jaWF0aW9uLmluZGV4OworICAgIGlmIChwcm9wZXJ0eUluZGV4ID49IG1JdGVtUHJvcGVydGllcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR1coIklnbm9yaW5nIGludmFsaWQgcHJvcGVydHkgaW5kZXggJWQiLCBwcm9wZXJ0eUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJhdHRhY2ggcHJvcGVydHkgJWQgdG8gaXRlbSBpZCAlZCkiLAorICAgICAgICAgICAgcHJvcGVydHlJbmRleCwgYXNzb2NpYXRpb24uaXRlbUlkKTsKKworICAgIG1JdGVtUHJvcGVydGllc1twcm9wZXJ0eUluZGV4XS0+YXR0YWNoVG8oCisgICAgICAgICAgICBtSXRlbUlkVG9JbWFnZU1hcC5lZGl0VmFsdWVBdChpbWFnZUluZGV4KSk7Cit9CisKK3NwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YSgpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3NpemVfdCBpbWFnZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShtUHJpbWFyeUl0ZW1JZCk7CisgICAgaWYgKGltYWdlSW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJQcmltYXJ5IGl0ZW0gaWQgJWQgbm90IGZvdW5kISIsIG1QcmltYXJ5SXRlbUlkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQUxPR1YoInByaW1hcnkgaW1hZ2UgaW5kZXggJXp1IiwgaW1hZ2VJbmRleCk7CisKKyAgICBjb25zdCBJbWFnZUl0ZW0gKmltYWdlID0gJm1JdGVtSWRUb0ltYWdlTWFwW2ltYWdlSW5kZXhdOworCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworCisgICAgQUxPR1YoInNldHRpbmcgaW1hZ2Ugc2l6ZSAlZHglZCIsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBpbWFnZS0+d2lkdGgpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGltYWdlLT5oZWlnaHQpOworICAgIGlmIChpbWFnZS0+cm90YXRpb24gIT0gMCkgeworICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSBpbiBIRUlGIGlzIENDVywgY29udmVydCB0byBDVyBoZXJlIHRvIGJlCisgICAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgbWVkaWEgZm9ybWF0cy4KKyAgICAgICAgc3dpdGNoKGltYWdlLT5yb3RhdGlvbikgeworICAgICAgICAgICAgY2FzZSA5MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAyNzApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDE4MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgOTApOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAorICAgICAgICB9CisgICAgfQorICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworCisgICAgaWYgKCFpbWFnZS0+dGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgIHNzaXplX3QgdGh1bWJuYWlsSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KGltYWdlLT50aHVtYm5haWxzWzBdKTsKKyAgICAgICAgaWYgKHRodW1ibmFpbEluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGNvbnN0IEltYWdlSXRlbSAmdGh1bWJuYWlsID0gbUl0ZW1JZFRvSW1hZ2VNYXBbdGh1bWJuYWlsSW5kZXhdOworCisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigidGh1bWJuYWlsIG1ldGE6ICVkeCVkLCBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwud2lkdGgsIHRodW1ibmFpbC5oZWlnaHQsIHRodW1ibmFpbEluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJSZWZlcmVuY2VkIHRodW1ibmFpbCBkb2VzIG5vdCBleGlzdCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbWFnZS0+aXNHcmlkKCkpIHsKKyAgICAgICAgc3NpemVfdCB0aWxlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KGltYWdlLT5kaW1nUmVmc1swXSk7CisgICAgICAgIGlmICh0aWxlSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB0aWxlcywgKGtLZXlXaWR0aCwga0tleUhlaWdodCkgaXMgdGhlIGZ1bGwgdGlsZWQgYXJlYSwKKyAgICAgICAgLy8gYW5kIChrS2V5RGlzcGxheVdpZHRoLCBrS2V5RGlzcGxheUhlaWdodCkgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGF0LgorICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCBpbWFnZS0+d2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIGludDMyX3QgZ3JpZFJvd3MgPSBpbWFnZS0+cm93cywgZ3JpZENvbHMgPSBpbWFnZS0+Y29sdW1uczsKKworICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCisgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KHRpbGVJbmRleCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgaW1hZ2UtPndpZHRoICogZ3JpZENvbHMpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBpbWFnZS0+aGVpZ2h0ICogZ3JpZFJvd3MpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZFdpZHRoLCBpbWFnZS0+d2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZEhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIH0KKworICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJodmNjIGlzIG1pc3NpbmchIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGltYWdlLT5odmNjLT5kYXRhKCksIGltYWdlLT5odmNjLT5zaXplKCkpOworCisgICAgaWYgKGltYWdlLT5pY2MgIT0gTlVMTCkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlJY2NQcm9maWxlLCAwLCBpbWFnZS0+aWNjLT5kYXRhKCksIGltYWdlLT5pY2MtPnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBtZXRhOworfQorCit1aW50MzJfdCBJdGVtVGFibGU6OmNvdW50SW1hZ2VzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkID8gbUl0ZW1JZFRvSW1hZ2VNYXAuc2l6ZSgpIDogMDsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpmaW5kUHJpbWFyeUltYWdlKHVpbnQzMl90ICppbWFnZUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShtUHJpbWFyeUl0ZW1JZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICppbWFnZUluZGV4ID0gaW5kZXg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmZpbmRUaHVtYm5haWwodWludDMyX3QgKmltYWdlSW5kZXgpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNzaXplX3QgcHJpbWFyeUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShtUHJpbWFyeUl0ZW1JZCk7CisgICAgaWYgKHByaW1hcnlJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlByaW1hcnkgaXRlbSBpZCAlZCBub3QgZm91bmQhIiwgbVByaW1hcnlJdGVtSWQpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IEltYWdlSXRlbSAmcHJpbWFyeUltYWdlID0gbUl0ZW1JZFRvSW1hZ2VNYXBbcHJpbWFyeUluZGV4XTsKKyAgICBpZiAocHJpbWFyeUltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiVXNpbmcgcHJpbWFyeSBpbiBwbGFjZSBvZiB0aHVtYm5haWwuIik7CisgICAgICAgICppbWFnZUluZGV4ID0gcHJpbWFyeUluZGV4OworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3NpemVfdCB0aHVtYm5haWxJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwcmltYXJ5SW1hZ2UudGh1bWJuYWlsc1swXSk7CisgICAgaWYgKHRodW1ibmFpbEluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiVGh1bWJuYWlsIGl0ZW0gaWQgJWQgbm90IGZvdW5kISIsIHByaW1hcnlJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqaW1hZ2VJbmRleCA9IHRodW1ibmFpbEluZGV4OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpnZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgIHVpbnQzMl90ICppbWFnZUluZGV4LCBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGltYWdlSW5kZXggIT0gTlVMTCkgeworICAgICAgICBpZiAoKmltYWdlSW5kZXggPj0gbUl0ZW1JZFRvSW1hZ2VNYXAuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQmFkIGltYWdlIGluZGV4ISIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEltYWdlSW5kZXggPSAqaW1hZ2VJbmRleDsKKyAgICB9CisKKyAgICBJbWFnZUl0ZW0gJmltYWdlID0gbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQobUN1cnJlbnRJbWFnZUluZGV4KTsKKyAgICBpZiAoaW1hZ2UuaXNHcmlkKCkpIHsKKyAgICAgICAgdWludDMyX3QgdGlsZUl0ZW1JZDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gaW1hZ2UuZ2V0TmV4dFRpbGVJdGVtSWQoJnRpbGVJdGVtSWQsIGltYWdlSW5kZXggIT0gTlVMTCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc3NpemVfdCB0aWxlSW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkodGlsZUl0ZW1JZCk7CisgICAgICAgIGlmICh0aWxlSW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgICpvZmZzZXQgPSBtSXRlbUlkVG9JbWFnZU1hcFt0aWxlSW1hZ2VJbmRleF0ub2Zmc2V0OworICAgICAgICAqc2l6ZSA9IG1JdGVtSWRUb0ltYWdlTWFwW3RpbGVJbWFnZUluZGV4XS5zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbWFnZUluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIEZvciBzaW5nbGUgaW1hZ2VzLCB3ZSBvbmx5IGFsbG93IGl0IHRvIGJlIHJlYWQgb25jZSwgYWZ0ZXIgdGhhdAorICAgICAgICAgICAgLy8gaXQncyBFT1MuICBOZXcgaW1hZ2UgaW5kZXggbXVzdCBiZSByZXF1ZXN0ZWQgZWFjaCB0aW1lLgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgKm9mZnNldCA9IG1JdGVtSWRUb0ltYWdlTWFwW21DdXJyZW50SW1hZ2VJbmRleF0ub2Zmc2V0OworICAgICAgICAqc2l6ZSA9IG1JdGVtSWRUb0ltYWdlTWFwW21DdXJyZW50SW1hZ2VJbmRleF0uc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGhlaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAzNjA4YmFkLi45Yzc3N2IzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjcsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0l0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CkBAIC0zNSw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC03MSw3ICs3NCw4IEBACiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAotICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CkBAIC0xMzMsNiArMTM3LDkgQEAKIAogICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7CiAKKyAgICBib29sIG1Jc0hFSUY7CisgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOworCiAgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwpAQCAtMjg0LDQ1ICsyOTEsNiBAQAogCiBzdGF0aWMgY29uc3QgYm9vbCBrVXNlSGV4RHVtcCA9IGZhbHNlOwogCi1zdGF0aWMgdm9pZCBoZXhkdW1wKGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKLQotICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7Ci0gICAgICAgIGlmIChuID4gMTYpIHsKLSAgICAgICAgICAgIG4gPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgICAgICAgaWYgKGkgPT0gOCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgaSA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgZGF0YVtvZmZzZXQgKyBpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludGYoIiAiKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgaWYgKGlzcHJpbnQoZGF0YVtvZmZzZXQgKyBpXSkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgZGF0YVtvZmZzZXQgKyBpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50ZigiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotCi0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICB9Ci19Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpGb3VyQ0MyTUlNRSh1aW50MzJfdCBmb3VyY2MpIHsKICAgICBzd2l0Y2ggKGZvdXJjYykgewogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgpAQCAtMzc3LDYgKzM0NSw3IEBACiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhlYWRlclRpbWVzY2FsZSgwKSwKICAgICAgIG1Jc1FUKGZhbHNlKSwKKyAgICAgIG1Jc0hFSUYoZmFsc2UpLAogICAgICAgbUZpcnN0VHJhY2soTlVMTCksCiAgICAgICBtTGFzdFRyYWNrKE5VTEwpLAogICAgICAgbUZpbGVNZXRhRGF0YShuZXcgTWV0YURhdGEpLApAQCAtMzg1LDYgKzM1NCwxMCBAQAogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgeworICAgIHJlbGVhc2UoKTsKK30KKwordm9pZCBNUEVHNEV4dHJhY3Rvcjo6cmVsZWFzZSgpIHsKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKQEAgLTQwNiw2ICszNzksMTIgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qc3NoLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGRlbGV0ZSBbXSBtUHNzaFtpXS5kYXRhOwogICAgIH0KKyAgICBtUHNzaC5jbGVhcigpOworCisgICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKCk7CisgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgfQogfQogCiB1aW50MzJfdCBNUEVHNEV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC01MTEsMTQgKzQ5MCw2IEBACiAgICAgcmV0dXJuIHRyYWNrLT5tZXRhOwogfQogCi1zdGF0aWMgdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKLSAgICBzWzBdID0geCA+PiAyNDsKLSAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKLSAgICBzWzJdID0gKHggPj4gOCkgJiAweGZmOwotICAgIHNbM10gPSB4ICYgMHhmZjsKLSAgICBzWzRdID0gJ1wwJzsKLX0KLQogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19JTklUKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwpAQCAtNTI4LDcgKzQ5OSw4IEBACiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGJvb2wgc2F3TW9vdk9yU2lkeCA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCEoc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkpIHsKKyAgICB3aGlsZSAoISgoc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkgfHwKKyAgICAgICAgICAgIChtSXNIRUlGICYmIChtSXRlbVRhYmxlICE9IE5VTEwpICYmIG1JdGVtVGFibGUtPmlzVmFsaWQoKSkpKSB7CiAgICAgICAgIG9mZjY0X3Qgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCk7CiAKQEAgLTU4MCw2ICs1NTIsMjkgQEAKICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RGF0YShrS2V5UHNzaCwgJ3Bzc2gnLCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KKworICAgIGlmIChtSXNIRUlGKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKCk7CisgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBUcmFjayAqdHJhY2sgPSBtTGFzdFRyYWNrOworICAgICAgICBpZiAodHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coInRyYWNrIGlzIHNldCBiZWZvcmUgbWV0YWRhdGEgaXMgZnVsbHkgcHJvY2Vzc2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFjayA9IG5ldyBUcmFjazsKKyAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIG1GaXJzdFRyYWNrID0gbUxhc3RUcmFjayA9IHRyYWNrOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSUQsIDApOworICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKKyAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7CisgICAgfQorCiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKQEAgLTk2Niw4ICs5NjEsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPSBuZXcgU2FtcGxlVGFibGUobURhdGFTb3VyY2UpOwogICAgICAgICAgICAgfQpAQCAtMTEzOSw4ICsxMTM1LDkgQEAKICAgICAgICAgICAgIG9yaWdpbmFsX2ZvdXJjYyA9IG50b2hsKG9yaWdpbmFsX2ZvdXJjYyk7CiAgICAgICAgICAgICBBTE9HVigicmVhZCBvcmlnaW5hbCBmb3JtYXQ6ICVkIiwgb3JpZ2luYWxfZm91cmNjKTsKIAotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwpAQCAtMTU4MCw4ICsxNTc3LDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKQEAgLTE2MTcsOCArMTYxNSw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKQEAgLTE2NzcsNiArMTY3Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvLiBVc2UgY29tcHJlc3Npb24gcmF0aW8gb2YgMS4KICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIDMgLyAyOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgorICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQogCkBAIC0xNzc2LDM1ICsxNzc4LDQ5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAotICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIlx4QTl4eXoiIGJveAotICAgICAgICAgICAgLy8gd291bGQgYmUgOCwgZm9yIGluc3RhbmNlICJceEE5eHl6IiArICJceDAwXHgwNFx4MTVceGM3IiArICIwKzAvIiwKLSAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNCIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNCwKLSAgICAgICAgICAgIC8vICJcMHgxNVx4YzciIGlzIHRoZSBsYW5ndWFnZSBjb2RlID0gZW4sIGFuZCAiMCswIiBpcyBhCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94IHdvdWxkCisgICAgICAgICAgICAvLyBiZSA5LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA1XHgxNVx4YzciICsgIiswKzAvIiwKKyAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNSIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNSwKKyAgICAgICAgICAgIC8vICJcMHgxNVx4YzciIGlzIHRoZSBsYW5ndWFnZSBjb2RlID0gZW4sIGFuZCAiKzArMC8iIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgZGV2aWNlcyBlbmNvdW50ZXJlZCBpbiB0aGUgd2lsZCBvbWl0IHRoZSB0cmFpbGluZworICAgICAgICAgICAgLy8gc2xhc2gsIHdlJ2xsIGFsbG93IHRoYXQuCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeyAvLyA4IGluc3RlYWQgb2YgOSB0byBhbGxvdyBmb3IgbWlzc2luZyAvCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gV29yc3QgY2FzZSB0aGUgbG9jYXRpb24gc3RyaW5nIGxlbmd0aCB3b3VsZCBiZSAxOCwKLSAgICAgICAgICAgIC8vIGZvciBpbnN0YW5jZSArOTAuMDAwMC0xODAuMDAwMCwgd2l0aG91dCB0aGUgdHJhaWxpbmcgIi8iIGFuZAotICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBsZW5ndGggKyBsYW5ndWFnZSBjb2RlLCBhbmQgc29tZSBkZXZpY2VzIGluY2x1ZGUKLSAgICAgICAgICAgIC8vIGFuIGFkZGl0aW9uYWwgOCBieXRlcyBvZiBhbHRpdHVkZSwgZS5nLiArMDA3LjE4NgotICAgICAgICAgICAgY2hhciBidWZmZXJbMTggKyA4XTsKLQotICAgICAgICAgICAgLy8gU3Vic3RyYWN0aW5nIDUgZnJvbSB0aGUgZGF0YSBzaXplIGlzIGJlY2F1c2UgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCArCi0gICAgICAgICAgICAvLyBsYW5ndWFnZSBjb2RlIHRha2VzIDQgYnl0ZXMsIGFuZCB0aGUgdHJhaWxpbmcgc2xhc2ggIi8iIHRha2VzIDEgYnl0ZS4KLSAgICAgICAgICAgIG9mZjY0X3QgbG9jYXRpb25fbGVuZ3RoID0gY2h1bmtfZGF0YV9zaXplIC0gNTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbl9sZW5ndGggPj0gKG9mZjY0X3QpIHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDQsIGJ1ZmZlciwgbG9jYXRpb25fbGVuZ3RoKSA8IGxvY2F0aW9uX2xlbmd0aCkgeworICAgICAgICAgICAgdWludDE2X3QgbGVuOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRhdGFfb2Zmc2V0LCAmbGVuKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnVmZmVyW2xvY2F0aW9uX2xlbmd0aF0gPSAnXDAnOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sIGJ1ZmZlcik7CisgICAgICAgICAgICAvLyBhbGxvdyAiKzArMCIgd2l0aG91dCB0cmFpbGluZyBzbGFzaAorICAgICAgICAgICAgaWYgKGxlbiA8IDQgfHwgbGVuID4gY2h1bmtfZGF0YV9zaXplIC0gNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgbG9jYXRpb24gc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFuZ3VhZ2UgY29kZSBpcyBmb3JtYXR0ZWQKKyAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBJU08gNjcwOToyMDA4IChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNjcwOSkuCisgICAgICAgICAgICAvLyBBbGxvY2F0ZSAyIGV4dHJhIGJ5dGVzLCBpbiBjYXNlIHdlIG5lZWQgdG8gYWRkIGEgdHJhaWxpbmcgc2xhc2gsCisgICAgICAgICAgICAvLyBhbmQgdG8gYWRkIGEgdGVybWluYXRpbmcgMC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGJ1ZmZlcihuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltsZW4rMl0oKSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA0LCAmYnVmZmVyWzBdLCBsZW4pIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBpZiAobGVuIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgYSB0cmFpbGluZyBzbGFzaCBpZiB0aGVyZSB3YXNuJ3Qgb25lLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcltsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbbGVuXSA9ICcvJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIwMjAsNiArMjAzNiwyOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUlzSEVJRikgeworICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUl0ZW1UYWJsZSA9IG5ldyBJdGVtVGFibGUobURhdGFTb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSXRlbVRhYmxlLT5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CkBAIC0yMzY3LDYgKzI0MDUsNyBAQAogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGNodW5rX2RhdGFfc2l6ZSAtIDgpIC8gNDsKKyAgICAgICAgICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBicmFuZFNldDsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29tcGF0aWJsZUJyYW5kcyArIDI7ICsraSkgewogICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGluZGV4LCBpdCByZWZlcnMgdG8gdGhlIG1pbm9yVmVyc2lvbiwKQEAgLTIzODAsMTAgKzI0MTksMTUgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBicmFuZCA9IG50b2hsKGJyYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoYnJhbmQgPT0gRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJykpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJhbmRTZXQuaW5zZXJ0KGJyYW5kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtSXNRVCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygnbScsICdpJywgJ2YnLCAnMScpKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgYnJhbmRTZXQuY291bnQoRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJykpID4gMCkgeworICAgICAgICAgICAgICAgIG1Jc0hFSUYgPSB0cnVlOworICAgICAgICAgICAgICAgIEFMT0dWKCJpZGVudGlmaWVkIEhFSUYgaW1hZ2UiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OwpAQCAtMzMzMiw3ICszMzc2LDcgQEAKIAogICAgIHNwPE1QRUc0U291cmNlPiBzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKHRoaXMsCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQpOworICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgbUl0ZW1UYWJsZSk7CiAgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTM3MjEsNyArMzc2NSw4IEBACiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAotICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCkKKyAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKICAgICA6IG1Pd25lcihvd25lciksCiAgICAgICBtRm9ybWF0KGZvcm1hdCksCiAgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKQEAgLTM3NDYsNyArMzc5MSw5IEBACiAgICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAogICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKLSAgICAgIG1TcmNCdWZmZXIoTlVMTCkgeworICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKKyAgICAgIG1Jc0hFSUYoaXRlbVRhYmxlICE9IE5VTEwpLAorICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKIAogICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CiAKQEAgLTQ1MjEsNzcgKzQ1NjgsOTMgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKLSAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6Ci0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6Ci0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQWZ0ZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKLSAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBpZiAobUlzSEVJRikgeworICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKIAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIDEwMDAwMDAsIG1UaW1lc2NhbGUsCi0gICAgICAgICAgICAgICAgJnNhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwotCi0gICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbG9zZXN0IHNhbXBsZSBhbHJlYWR5LCBub3cgd2Ugd2FudCB0aGUgc3luYwotICAgICAgICAgICAgLy8gc2FtcGxlIHByZWNlZGluZyBpdCAob3IgdGhlIHNhbXBsZSBpdHNlbGYgb2YgY291cnNlKSwgZXZlbgotICAgICAgICAgICAgLy8gaWYgdGhlIHN1YnNlcXVlbnQgc3luYyBzYW1wbGUgaXMgY2xvc2VyLgotICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZUluZGV4OwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTeW5jU2FtcGxlTmVhcigKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKLSAgICAgICAgICAgICAgICAvLyBBbiBhdHRlbXB0IHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd291bGQKLSAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBjYXVzZSB0aGlzIEVSUk9SX09VVF9PRl9SQU5HRSBlcnJvci4gUHJvcGFnYXRpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAotICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCi0gICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFByaW1hcnlJbWFnZSgmbUN1cnJlbnRTYW1wbGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWwoJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQWZ0ZXI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQ2xvc2VzdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgY2xvc2VzdCBzYW1wbGUgYWxyZWFkeSwgbm93IHdlIHdhbnQgdGhlIHN5bmMKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGUgcHJlY2VkaW5nIGl0IChvciB0aGUgc2FtcGxlIGl0c2VsZiBvZiBjb3Vyc2UpLCBldmVuCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN1YnNlcXVlbnQgc3luYyBzYW1wbGUgaXMgY2xvc2VyLgorICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc2FtcGxlVGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbiBhdHRlbXB0IHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd291bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHkgY2F1c2UgdGhpcyBFUlJPUl9PVVRfT0ZfUkFOR0UgZXJyb3IuIFByb3BhZ2F0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCisgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KIAogI2lmIDAKLSAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZVRpbWU7Ci0gICAgICAgIENIRUNLX0VRKE9LLCBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOworICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZVRpbWU7CisgICAgICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnN5bmNTYW1wbGVUaW1lKSk7CiAKLSAgICAgICAgQUxPR0koInNlZWsgdG8gdGltZSAlbGxkIHVzID0+IHNhbXBsZSBhdCB0aW1lICVsbGQgdXMsICIKLSAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICBzZWVrVGltZVVzLAotICAgICAgICAgICAgIHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwgLyBtVGltZXNjYWxlLAotICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTE9HSSgic2VlayB0byB0aW1lICVsbGQgdXMgPT4gc2FtcGxlIGF0IHRpbWUgJWxsZCB1cywgIgorICAgICAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUsCisgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CiAjZW5kaWYKIAotICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwpAQCAtNDYwOCw5ICs0NjcxLDE5IEBACiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmICghbUlzSEVJRikgeworICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1DdXJyZW50U2FtcGxlSW5kZXggOiBOVUxMLCAmb2Zmc2V0LCAmc2l6ZSk7CisKKyAgICAgICAgICAgIGN0cyA9IHN0dHMgPSAwOworICAgICAgICAgICAgaXNTeW5jU2FtcGxlID0gMDsKKyAgICAgICAgICAgIEFMT0dWKCJpbWFnZSBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNTE2OCw2ICs1MjQxLDcgQEAKIAogdm9pZCBNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzKCkgewogICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzIik7CisgICAgLy8gd3JpdGUgaW50byBtQW5hbHl0aWNzSXRlbQogfQogCiBzdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KApAQCAtNTE4NCw3ICs1MjU4LDggQEAKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dlNiIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnZzYiLCA4KQogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBpc29tIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWICIsIDgpCiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00QSAiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBmNHYgIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwa2RkaSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00VlAiLCA4KSkgeworICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1pZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZWljIiwgOCkpIHsKICAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwogICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKIApAQCAtNTIxMyw2ICs1Mjg4LDggQEAKIAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCiAgICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAorICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDkzZDRmNTcuLjc3ODZjNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTQzMiw3ICs0MzIsNyBAQAogfTsKIAogTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGludCBmZCkgewotICAgIGluaXRJbnRlcm5hbChmZCk7CisgICAgaW5pdEludGVybmFsKGZkLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00NTEsMTkgKzQ1MSwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCkgewordm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbikgewogICAgIEFMT0dWKCJpbml0SW50ZXJuYWwiKTsKICAgICBtRmQgPSBkdXAoZmQpOwogICAgIG1OZXh0RmQgPSAtMTsKICAgICBtSW5pdENoZWNrID0gbUZkIDwgMD8gTk9fSU5JVDogT0s7Ci0gICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcgPSB0cnVlOwotICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCA9IHRydWU7Ci0gICAgbVVzZTMyQml0T2Zmc2V0ID0gdHJ1ZTsKLSAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IGZhbHNlOworCisgICAgbUludGVybGVhdmVEdXJhdGlvblVzID0gMTAwMDAwMDsKKworICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFsbDsKKyAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAtMTsKICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZCA9IGZhbHNlOwogICAgIG1TZW5kTm90aWZ5ID0gZmFsc2U7CisKKyAgICAvLyBSZXNldCBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBhbGwgdGhlIHNlc3Npb25zIGFuZCB0aGV5IHdpbGwgYmUKKyAgICAvLyBpbml0aWFsaXplZCBpbiBzdGFydChNZXRhRGF0YSAqcGFyYW0pLgorICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gdHJ1ZTsKKyAgICBtVXNlNEJ5dGVOYWxMZW5ndGggPSB0cnVlOworICAgIG1Vc2UzMkJpdE9mZnNldCA9IHRydWU7CiAgICAgbU9mZnNldCA9IDA7CiAgICAgbU1kYXRPZmZzZXQgPSAwOwogICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKQEAgLTQ3MiwxNyArNDc5LDIxIEBACiAgICAgbUZyZWVCb3hPZmZzZXQgPSAwOwogICAgIG1TdHJlYW1hYmxlRmlsZSA9IGZhbHNlOwogICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA9IDA7Ci0gICAgbU1vb3ZFeHRyYVNpemUgPSAwOwotICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDEwMDAwMDA7CiAgICAgbVRpbWVTY2FsZSA9IC0xOwotICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFsbDsKLSAgICBtTGF0aXR1ZGV4MTAwMDAgPSAwOwotICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAwOwotICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7Ci0gICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtTWV0YUtleXMgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICBhZGREZXZpY2VNZXRhKCk7CisKKyAgICAvLyBGb2xsb3dpbmcgdmFyaWFibGVzIG9ubHkgbmVlZCB0byBiZSBzZXQgZm9yIHRoZSBmaXJzdCByZWNvcmRpbmcgc2Vzc2lvbi4KKyAgICAvLyBBbmQgdGhleSB3aWxsIHN0YXkgdGhlIHNhbWUgZm9yIGFsbCB0aGUgcmVjb3JkaW5nIHNlc3Npb25zLgorICAgIGlmIChpc0ZpcnN0U2Vzc2lvbikgeworICAgICAgICBtTW9vdkV4dHJhU2l6ZSA9IDA7CisgICAgICAgIG1NZXRhS2V5cyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBhZGREZXZpY2VNZXRhKCk7CisgICAgICAgIG1MYXRpdHVkZXgxMDAwMCA9IDA7CisgICAgICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAwOworICAgICAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IGZhbHNlOworICAgIH0KKwogICAgIC8vIFZlcmlmeSBtRmQgaXMgc2Vla2FibGUKICAgICBvZmY2NF90IG9mZiA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX1NFVCk7CiAgICAgaWYgKG9mZiA8IDApIHsKQEAgLTg3MywxOSArODg0LDggQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnBhdXNlKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCppdCktPnBhdXNlKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIEFMT0dXKCJNUEVHNFdyaXRlcjogcGF1c2UgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6c3RvcFdyaXRlclRocmVhZCgpIHsKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAgICAgICAgICAgICBpbnQgZmQgPSBtTmV4dEZkOwogICAgICAgICAgICAgbU5leHRGZCA9IC0xOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBpbml0SW50ZXJuYWwoZmQpOworICAgICAgICAgICAgaW5pdEludGVybmFsKGZkLCBmYWxzZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogICAgICAgICAgICAgc3RhcnQobVN0YXJ0TWV0YS5nZXQoKSk7CiAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTkVYVF9PVVRQVVRfRklMRV9TVEFSVEVELCAwKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggYmQ3MTYzMi4uNzU5ZTQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTIzLDcgKzIzLDggQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC03Miw2ICs3MywxMyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NyeXB0byA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY3J5cHRvIjsgICAvKiAwLDEgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFbmNvZGVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsgLyogMCwxICovCiAKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNCeXRlc0luID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5ieXRlc2luIjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQcm9maWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcm9maWxlIjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMZXZlbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGV2ZWwiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01heFdpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXh3aWR0aCI7ICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTWF4SGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXhoZWlnaHQiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0Vycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJjb2RlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFcnJvclN0YXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSI7CiAKIAogc3RhdGljIGludDY0X3QgZ2V0SWQoY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gJmNsaWVudCkgewpAQCAtNDI4LDIyICs0MzYsNiBAQAogfQogCiAvLyBzdGF0aWMKLXN0YXR1c190IE1lZGlhQ29kZWM6OlF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMgLyogbm9ubnVsbCAqLykgewotICAgIC8vIFRSSUNLWTogdGhpcyBtZXRob2QgaXMgdXNlZCBieSBNZWRpYUNvZGVjTGlzdC9JbmZvIGR1cmluZyBpdHMKLSAgICAvLyBpbml0aWFsaXphdGlvbi4gQXMgc3VjaCwgd2UgY2Fubm90IGNyZWF0ZSBhIE1lZGlhQ29kZWMgaW5zdGFuY2UKLSAgICAvLyBiZWNhdXNlIHRoYXQgcmVxdWlyZXMgYW4gaW5pdGlhbGl6ZWQgTWVkaWFDb2RlY0xpc3QuCi0KLSAgICBzcDxDb2RlY0Jhc2U+IGNvZGVjID0gR2V0Q29kZWNCYXNlKG5hbWUpOwotICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKG5hbWUsIG1pbWUsIGlzRW5jb2RlciwgY2Fwcyk7Ci19Ci0KLS8vIHN0YXRpYwogc3A8UGVyc2lzdGVudFN1cmZhY2U+IE1lZGlhQ29kZWM6OkNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKSB7CiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBpZiAoY2xpZW50LmNvbm5lY3QoKSAhPSBPSykgewpAQCAtNDc1LDYgKzQ2Nyw3IEBACiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtU3RpY2t5RXJyb3IoT0spLAogICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKKyAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAogICAgICAgbVJlc291cmNlTWFuYWdlckNsaWVudChuZXcgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KHRoaXMpKSwKICAgICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkocGlkKSksCiAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZChmYWxzZSksCkBAIC00OTMsNiArNDg2LDE4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVVpZCA9IHVpZDsKICAgICB9CisgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKK30KKworTWVkaWFDb2RlYzo6fk1lZGlhQ29kZWMoKSB7CisgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOworCisgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7CisgICAgQ0hFQ0sobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCk7CiAgICAgLy8gc2V0IHVwIG91ciBuZXcgcmVjb3JkLCBnZXQgYSBzZXNzaW9uSUQsIHB1dCBpdCBpbnRvIHRoZSBpbi1wcm9ncmVzcyBsaXN0CiAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOwogICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CkBAIC01MDIsMTEgKzUwNyw5IEBACiAgICAgfQogfQogCi1NZWRpYUNvZGVjOjp+TWVkaWFDb2RlYygpIHsKLSAgICBDSEVDS19FUShtU3RhdGUsIFVOSU5JVElBTElaRUQpOwotICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShnZXRJZChtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KSk7Ci0KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCApIHsKK3ZvaWQgTWVkaWFDb2RlYzo6Zmx1c2hBbmFseXRpY3NJdGVtKCkgeworICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwpAQCAtNjk5LDEwICs3MDIsMjEgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKIAorICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IDA7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1Byb2ZpbGUsIHByb2ZpbGUpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgbGV2ZWwgPSAwOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0xldmVsLCBsZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobUlzVmlkZW8pIHsKICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJm1WaWRlb1dpZHRoKTsKICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZtVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKGtDb2RlY1JvdGF0aW9uLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZtUm90YXRpb25EZWdyZWVzKSkgewogICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgICAgIH0KIApAQCAtNzEwLDYgKzcyNCwxNCBAQAogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1dpZHRoLCBtVmlkZW9XaWR0aCk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjSGVpZ2h0LCBtVmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1JvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY01heFdpZHRoLCBtYXhXaWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IG1heEhlaWdodCA9IDA7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNNYXhIZWlnaHQsIG1heEhlaWdodCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgpAQCAtMTQxNiw2ICsxNDM4LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE0MjMsNiArMTQ1MSwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBDT05GSUdVUkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE0NTksNiArMTQ5MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSgKQEAgLTE0ODcsNiArMTUyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTU5MSw2ICsxNjM0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGF1Z21lbnQgb3VyIG1lZGlhIG1ldHJpY3MgaW5mbywgbm93IHRoYXQgd2Uga25vdyBtb3JlIHRoaW5ncworICAgICAgICAgICAgICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29uZmlndXJlTXNnICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlTXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IGluY2x1ZGVzOiBtaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI4MTYsNiArMjg3Miw5IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAgICAgICAgIGluZm8tPm1EYXRhLmNsZWFyKCk7CisgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+YWRkSW50NjQoa0NvZGVjQnl0ZXNJbiwgc2l6ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDFkY2JhMjkuLjQ2NTI1OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTI0LDE3ICsyNCwxNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTQyLDIwICs0MiwyMCBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZXhwYXQuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgTXV0ZXggc0luaXRNdXRleDsKK25hbWVzcGFjZSB7CiAKLXN0YXRpYyBib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyICpzKSB7Ci0gICAgaWYgKCFzdHJjYXNlY21wKHMsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAocywgInllcyIpIHx8ICFzdHJjYXNlY21wKHMsICJ5IikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNoYXIgKmVuZDsKLSAgICB1bnNpZ25lZCBsb25nIHJlcyA9IHN0cnRvdWwocywgJmVuZCwgMTApOwotICAgIHJldHVybiAqcyAhPSAnXDAnICYmICplbmQgPT0gJ1wwJyAmJiByZXMgPiAwOwotfQorTXV0ZXggc0luaXRNdXRleDsKIAotc3RhdGljIGJvb2wgaXNQcm9maWxpbmdOZWVkZWQoKSB7CitNdXRleCBzUmVtb3RlSW5pdE11dGV4OworCitjb25zdGV4cHIgY29uc3QgY2hhcioga1Byb2ZpbGluZ1Jlc3VsdHMgPQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoOworCitib29sIGlzUHJvZmlsaW5nTmVlZGVkKCkgewogICAgIGludDhfdCB2YWx1ZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5wcm9maWxlY29kZWMiLCAwKTsKICAgICBpZiAodmFsdWUgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03OCw2ICs3OCwxMCBAQAogICAgIHJldHVybiBwcm9maWxpbmdOZWVkZWQ7CiB9CiAKK09teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKwogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0OwogCkBAIC04Niw0MiArOTAsNDIgQEAKICAgICBBTE9HVigiRW50ZXIgcHJvZmlsZXJUaHJlYWRXcmFwcGVyLiIpOwogICAgIHJlbW92ZShrUHJvZmlsaW5nUmVzdWx0cyk7ICAvLyByZW1vdmUgcHJldmlvdXMgcmVzdWx0IHNvIHRoYXQgaXQgd29uJ3QgYmUgbG9hZGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgTWVkaWFDb2RlY0xpc3QKLSAgICBNZWRpYUNvZGVjTGlzdCAqY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCk7CisgICAgc3A8TWVkaWFDb2RlY0xpc3Q+IGNvZGVjTGlzdChuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcikpOwogICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNMaXN0LCBza2lwcGluZyBjb2RlYyBwcm9maWxpbmcuIik7Ci0gICAgICAgIGRlbGV0ZSBjb2RlY0xpc3Q7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBpbmZvczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjTGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7Ci0gICAgICAgIGluZm9zLnB1c2hfYmFjayhjb2RlY0xpc3QtPmdldENvZGVjSW5mbyhpKSk7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8mIGluZm9zID0gY29kZWNMaXN0LT5tQ29kZWNJbmZvczsKICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIHN0YXJ0ZWQuIik7Ci0gICAgcHJvZmlsZUNvZGVjcyhpbmZvcyk7CisgICAgcHJvZmlsZUNvZGVjcyhpbmZvcywga1Byb2ZpbGluZ1Jlc3VsdHMpOwogICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgY29tcGxldGVkLiIpOwotICAgIGNvZGVjTGlzdC0+cGFyc2VUb3BMZXZlbFhNTEZpbGUoa1Byb2ZpbGluZ1Jlc3VsdHMsIHRydWUgLyogaWdub3JlX2Vycm9ycyAqLyk7CisgICAgY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpOworICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcGFyc2UgcHJvZmlsaW5nIHJlc3VsdHMuIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOwogICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKIAotICAgIGlmIChzQ29kZWNMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgTWVkaWFDb2RlY0xpc3QgKmNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICBpZiAoc0NvZGVjTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcik7CiAgICAgICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CiAgICAgICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogCiAgICAgICAgICAgICBpZiAoaXNQcm9maWxpbmdOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgbmVlZGVkLCB3aWxsIGJlIHJ1biBpbiBzZXBhcmF0ZWQgdGhyZWFkLiIpOwogICAgICAgICAgICAgICAgIHB0aHJlYWRfdCBwcm9maWxlcjsKLSAgICAgICAgICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnByb2ZpbGVyLCBOVUxMLCBwcm9maWxlclRocmVhZFdyYXBwZXIsIE5VTEwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnByb2ZpbGVyLCBudWxscHRyLCBwcm9maWxlclRocmVhZFdyYXBwZXIsIG51bGxwdHIpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIGZvciBjb2RlYyBwcm9maWxpbmcuIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTM0LDggKzEzOCw2IEBACiAgICAgcmV0dXJuIHNDb2RlY0xpc3Q7CiB9CiAKLXN0YXRpYyBNdXRleCBzUmVtb3RlSW5pdE11dGV4OwotCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzUmVtb3RlTGlzdDsKIAogc3A8TWVkaWFDb2RlY0xpc3Q6OkJpbmRlckRlYXRoT2JzZXJ2ZXI+IE1lZGlhQ29kZWNMaXN0OjpzQmluZGVyRGVhdGhPYnNlcnZlcjsKQEAgLTE0OSwxOSArMTUxLDE5IEBACiAvLyBzdGF0aWMKIHNwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChzUmVtb3RlSW5pdE11dGV4KTsKLSAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgIGlmIChzUmVtb3RlTGlzdCA9PSBudWxscHRyKSB7CiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CiAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOwogICAgICAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgc1JlbW90ZUxpc3QgPSBzZXJ2aWNlLT5nZXRDb2RlY0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzUmVtb3RlTGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc1JlbW90ZUxpc3QgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNCaW5kZXJEZWF0aE9ic2VydmVyID0gbmV3IEJpbmRlckRlYXRoT2JzZXJ2ZXIoKTsKICAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNCaW5kZXJEZWF0aE9ic2VydmVyLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gaWYgZmFpbGVkIHRvIGdldCByZW1vdGUgbGlzdCwgY3JlYXRlIGxvY2FsIGxpc3QKICAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gZ2V0TG9jYWxJbnN0YW5jZSgpOwogICAgICAgICB9CkBAIC0xNjksMTc1ICsxNzEsMTEgQEAKICAgICByZXR1cm4gc1JlbW90ZUxpc3Q7CiB9CiAKLS8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KLXN0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQotICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMifTsKLXN0YXRpYyBjb25zdCBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDEyOAotCi1zdGF0aWMgYm9vbCBmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjaGFyICpvdXRfcGF0aCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgewotICAgICAgICBzbnByaW50ZihvdXRfcGF0aCwKLSAgICAgICAgICAgICAgICAgTUVESUFfQ09ERUNTX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgIiVzLyVzIiwKLSAgICAgICAgICAgICAgICAga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgZmlsZV9uYW1lKTsKLSAgICAgICAgc3RydWN0IHN0YXQgZmlsZV9zdGF0OwotICAgICAgICBpZiAoc3RhdChvdXRfcGF0aCwgJmZpbGVfc3RhdCkgPT0gMCAmJiBTX0lTUkVHKGZpbGVfc3RhdC5zdF9tb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1NZWRpYUNvZGVjTGlzdDo6TWVkaWFDb2RlY0xpc3QoKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1VcGRhdGUoZmFsc2UpLAotICAgICAgbUdsb2JhbFNldHRpbmdzKG5ldyBBTWVzc2FnZSgpKSB7Ci0gICAgY2hhciBjb25maWdfZmlsZV9wYXRoW01FRElBX0NPREVDU19DT05GSUdfRklMRV9QQVRIX01BWF9MRU5HVEhdOwotICAgIGlmIChmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoIm1lZGlhX2NvZGVjcy54bWwiLCBjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoKTsKLSAgICB9Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoLCB0cnVlLyogaWdub3JlX2Vycm9ycyAqLyk7Ci0gICAgfQotICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlLyogaWdub3JlX2Vycm9ycyAqLyk7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKmNvZGVjc194bWwsIGJvb2wgaWdub3JlX2Vycm9ycykgewotICAgIC8vIGdldCBocmVmX2Jhc2UKLSAgICBjb25zdCBjaGFyICpocmVmX2Jhc2VfZW5kID0gc3RycmNocihjb2RlY3NfeG1sLCAnLycpOwotICAgIGlmIChocmVmX2Jhc2VfZW5kICE9IE5VTEwpIHsKLSAgICAgICAgbUhyZWZCYXNlID0gQVN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KLQotICAgIG1Jbml0Q2hlY2sgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQotICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgbURlcHRoID0gMDsKLQotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgbUluaXRDaGVjayA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOyAgLy8gdGhpcyBtYXkgZmFpbCBpZiBJTWVkaWFQbGF5ZXJTZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgfQotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiBwb2xpY2llczsKLSAgICBBU3RyaW5nIHZhbHVlOwotICAgIGlmIChtR2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoa1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MsICZ2YWx1ZSkpIHsKLSAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgodmFsdWUuY19zdHIoKSkpKTsKLSAgICB9Ci0gICAgaWYgKG1HbG9iYWxTZXR0aW5ncy0+ZmluZFN0cmluZyhrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMsICZ2YWx1ZSkpIHsKLSAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlLmNfc3RyKCkpKSk7Ci0gICAgfQotICAgIGlmIChwb2xpY2llcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7Ci0gICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNZWRpYUNvZGVjTGlzdDogZmFpbGVkIHRvIGdldCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLT5jb25maWcocG9saWNpZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOwotICAgICAgICBpZiAoaW5mby5tQ2Fwcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gTm8gdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50Pz8/Ci0gICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUgb2YgbWVkaWE/IiwKLSAgICAgICAgICAgICAgICAgIGluZm8ubU5hbWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIG1Db2RlY0luZm9zLnJlbW92ZUF0KGkpOwotI2lmIExPR19OREVCVUcgPT0gMAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChzaXplX3QgdHlwZV9peCA9IDA7IHR5cGVfaXggPCBpbmZvLm1DYXBzLnNpemUoKTsgKyt0eXBlX2l4KSB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lID0gaW5mby5tQ2Fwcy5rZXlBdCh0eXBlX2l4KTsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiAmY2FwcyA9IGluZm8ubUNhcHMudmFsdWVBdCh0eXBlX2l4KTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBjb2RlYyBpbmZvIGZvciAlczogJXMiLCBpbmZvLm1OYW1lLmNfc3RyKCksIG1pbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiICAgIGZsYWdzPSVkIiwgY2Fwcy0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNvbG9yRm9ybWF0czsKLSAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvckZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG5pY2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb2xvckZvcm1hdHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChjb2xvckZvcm1hdHMuaXRlbUF0KGl4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBjb2xvcnM9WyVzXSIsIG5pY2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOwotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG5pY2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwcm9maWxlTGV2ZWxzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcGwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbHMuaXRlbUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKHBsLm1Qcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChwbC5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgbGV2ZWxzPVslc10iLCBuaWNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcXVpcmtzOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaW5mby5tUXVpcmtzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXJrcy5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWlya3MuYXBwZW5kKGluZm8ubVF1aXJrc1tpeF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgcXVpcmtzPVslc10iLCBxdWlya3MuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiAwCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lID0gaW5mby5tTmFtZTsKLSAgICAgICAgbGluZS5hcHBlbmQoIiBzdXBwb3J0cyAiKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtVHlwZXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gbVR5cGVzLnZhbHVlQXQoaik7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvLm1UeXBlcyAmICgxdWwgPDwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbGluZS5hcHBlbmQobVR5cGVzLmtleUF0KGopKTsKLSAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKLSAgICB9Ci0jZW5kaWYKK01lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKiBidWlsZGVyKSB7CisgICAgbUdsb2JhbFNldHRpbmdzID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlciB3cml0ZXIodGhpcyk7CisgICAgbUluaXRDaGVjayA9IGJ1aWxkZXItPmJ1aWxkTWVkaWFDb2RlY0xpc3QoJndyaXRlcik7CiB9CiAKIE1lZGlhQ29kZWNMaXN0Ojp+TWVkaWFDb2RlY0xpc3QoKSB7CkBAIC0zNDcsNTMxICsxODUsMjEgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKLQotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOwotICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKLSAgICBDSEVDSyhwYXJzZXIgIT0gTlVMTCk7Ci0KLSAgICA6OlhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHRoaXMpOwotICAgIDo6WE1MX1NldEVsZW1lbnRIYW5kbGVyKAotICAgICAgICAgICAgcGFyc2VyLCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlciwgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKTsKLQotICAgIGNvbnN0IGludCBCVUZGX1NJWkUgPSA1MTI7Ci0gICAgd2hpbGUgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgdm9pZCAqYnVmZiA9IDo6WE1MX0dldEJ1ZmZlcihwYXJzZXIsIEJVRkZfU0laRSk7Ci0gICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX0lPOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxfU3RhdHVzIHN0YXR1cyA9IDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBYTUxfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICA6OlhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Ci0KLSAgICBmY2xvc2UoZmlsZSk7Ci0gICAgZmlsZSA9IE5VTEw7CitNZWRpYUNvZGVjTGlzdFdyaXRlcjo6TWVkaWFDb2RlY0xpc3RXcml0ZXIoTWVkaWFDb2RlY0xpc3QqIGxpc3QpIDoKKyAgICBtTGlzdChsaXN0KSB7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjTGlzdDo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjTGlzdCAqPihtZSktPnN0YXJ0RWxlbWVudEhhbmRsZXIobmFtZSwgYXR0cnMpOwordm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIG1MaXN0LT5tR2xvYmFsU2V0dGluZ3MtPnNldFN0cmluZyhrZXksIHZhbHVlKTsKIH0KIAotLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjTGlzdCAqPihtZSktPmVuZEVsZW1lbnRIYW5kbGVyKG5hbWUpOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqaHJlZiA9IE5VTEw7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAiaHJlZiIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhyZWYgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMgYW5kIGZvciBzaW1wbGljaXR5LCBmaWxlIG5hbWVzIGNhbiBvbmx5IGNvbnRhaW4KLSAgICAvLyBbYS16QS1aMC05Xy5dIGFuZCBtdXN0IHN0YXJ0IHdpdGggIG1lZGlhX2NvZGVjc18gYW5kIGVuZCB3aXRoIC54bWwKLSAgICBmb3IgKGkgPSAwOyBocmVmW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICBpZiAoaHJlZltpXSA9PSAnLicgfHwgaHJlZltpXSA9PSAnXycgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnMCcgJiYgaHJlZltpXSA8PSAnOScpIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ0EnICYmIGhyZWZbaV0gPD0gJ1onKSB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdhJyAmJiBocmVmW2ldIDw9ICd6JykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIGZpbGVuYW1lID0gaHJlZjsKLSAgICBpZiAoIWZpbGVuYW1lLnN0YXJ0c1dpdGgoIm1lZGlhX2NvZGVjc18iKSB8fAotICAgICAgICAhZmlsZW5hbWUuZW5kc1dpdGgoIi54bWwiKSkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGZpbGVuYW1lLmluc2VydChtSHJlZkJhc2UsIDApOwotCi0gICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpzdGFydEVsZW1lbnRIYW5kbGVyKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBpblR5cGUgPSB0cnVlOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBtSW5pdENoZWNrID0gaW5jbHVkZVhNTEZpbGUoYXR0cnMpOwotICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wdXNoKG1DdXJyZW50U2VjdGlvbik7Ci0gICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7Ci0gICAgICAgIH0KLSAgICAgICAgKyttRGVwdGg7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fVE9QTEVWRUw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5nIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPQotICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXModHJ1ZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1aXJrIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkUXVpcmsoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5UeXBlID0gZmFsc2U7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKLSAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYgIW1DdXJyZW50SW5mby0+bUhhc1NvbGVNaW1lOwotICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikgfHwgIXN0cmNtcChuYW1lLCAiRmVhdHVyZSIpKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiTGltaXQiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRMaW1pdChhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRGZWF0dXJlKGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgICsrbURlcHRoOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7OwotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7Ci0gICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC0tbURlcHRoOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBpZiAobVVwZGF0ZSAhPSBtR2xvYmFsU2V0dGluZ3MtPmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1HbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKG5hbWUsIHZhbHVlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OnNldEN1cnJlbnRDb2RlY0luZm8oYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoQVN0cmluZyhuYW1lKSA9PSBtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCkpIHsKLSAgICAgICAgICAgIGlmIChtQ29kZWNJbmZvc1tpXS0+Z2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3ZlcnJpZGVzIHdpdGggYW4gdW5leHBlY3RlZCBtaW1lICVzIiwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIChidXQgZG9uJ3QgYWRkIGl0IHRvIG1Db2RlY0luZm9zKSB0byBob2xkIHRoZQotICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB3ZSBkb24ndCB3YW50LgotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUodHlwZSk7ICAvLyB0byBzZXQgdGhlIGN1cnJlbnQgY2FwCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOwotICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKLSAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgotICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZwotICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCi0gICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKLSAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidHlwZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gTlVMTCkgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7Ci0gICAgc3NpemVfdCBpbmRleCA9IC0xOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKEFTdHJpbmcobmFtZSkgPT0gbUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1VcGRhdGUgIT0gKGluZGV4ID49IDApKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIGV4aXN0aW5nIGNvZGVjCi0gICAgICAgIG1DdXJyZW50SW5mbyA9IG1Db2RlY0luZm9zLmVkaXRJdGVtQXQoaW5kZXgpOwotICAgICAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBleGlzdGluZyB0eXBlCi0gICAgICAgICAgICBpZiAobUNvZGVjSW5mb3NbaW5kZXhdLT5nZXRDYXBhYmlsaXRpZXNGb3IodHlwZSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT51cGRhdGVNaW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbmV3IGNvZGVjCi0gICAgICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQotICAgICAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgotICAgICAgICAvLyBIb3dldmVyLCBrZWVwIG1DdXJyZW50SW5mbyBvYmplY3QgYXJvdW5kIHVudGlsIHBhcnNpbmcKLSAgICAgICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KLSAgICAgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKLSAgICAgICAgICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhtQ3VycmVudEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQUxPR1YoImluaXRpYWxpemVDYXBhYmlsaXRpZXMgJXM6JXMiLAotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLCB0eXBlKTsKLQotICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHM7Ci0gICAgc3RhdHVzX3QgZXJyID0gTWVkaWFDb2RlYzo6UXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLAotICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bUlzRW5jb2RlciwKLSAgICAgICAgICAgICZjYXBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIGlmIChjYXBzID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIk1lZGlhQ29kZWM6OlF1ZXJ5Q2FwYWJpbGl0aWVzIHJldHVybmVkIE9LIGJ1dCBubyBjYXBhYmlsaXRpZXMgZm9yICclcyc6JyVzJzonJXMnIiwKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLmNfc3RyKCksIHR5cGUsCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tSXNFbmNvZGVyID8gImVuY29kZXIiIDogImRlY29kZXIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1DdXJyZW50SW5mby0+aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjYXBzKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1DdXJyZW50SW5mby0+YWRkUXVpcmsobmFtZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBib29sIGlzRXhpc3RpbmdUeXBlID0gKG1DdXJyZW50SW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG5hbWUpICE9IE5VTEwpOwotICAgIGlmIChtVXBkYXRlICE9IGlzRXhpc3RpbmdUeXBlKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0YXR1c190IHJldDsKLSAgICBpZiAobVVwZGF0ZSkgewotICAgICAgICByZXQgPSBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUN1cnJlbnRJbmZvLT5hZGRNaW1lKG5hbWUpOwotICAgIH0KLQotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5Ci0gICAgLy8gZmFpbC4gIEhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgKGJ5IG5vdCByZXBvcnRpbmcgc3VjaCBtaW1lKS4KLSAgICBpZiAoIW1VcGRhdGUgJiYgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgewotICAgICAgICBtQ3VycmVudEluZm8tPnJlbW92ZU1pbWUobmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKK3N0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKCkgeworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKCk7CisgICAgbUxpc3QtPm1Db2RlY0luZm9zLnB1c2hfYmFjayhpbmZvKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPigKKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CiB9CiAKIC8vIGxlZ2FjeSBtZXRob2QgZm9yIG5vbi1hZHZhbmNlZCBjb2RlY3MKQEAgLTg4MiwxNSArMjEwLDE1IEBACiAgICAgICAgICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwKICAgICB9OwogCi0gICAgc2l6ZV90IG51bUNvZGVjcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKLSAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjczsgKytzdGFydEluZGV4KSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KS5nZXQoKTsKKyAgICBzaXplX3QgbnVtQ29kZWNJbmZvcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKKyAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjSW5mb3M7ICsrc3RhcnRJbmRleCkgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvc1tzdGFydEluZGV4XTsKIAogICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSAhPSBlbmNvZGVyKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBhYmlsaXRpZXMgPSBpbmZvLmdldENhcGFiaWxpdGllc0Zvcih0eXBlKTsKLSAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZkZXRhaWxzID0gY2FwYWJpbGl0aWVzLT5nZXREZXRhaWxzKCk7CkBAIC05MTMsMjIzICsyNDEsOSBAQAogICAgIHJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGJvb2wgZm91bmQgPSB0cnVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCAlcyclcycgYXR0cmlidXRlIiwgbmFtZS5jX3N0cigpLAotICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgbGltaXRFcnJvcihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUuY19zdHIoKSwgbXNnKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIGF0dHIsIHZhbHVlLmNfc3RyKCkpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCi0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImRlZmF1bHQiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJpbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1heCIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1pbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2VzIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAic2NhbGUiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZyhhdHRyc1tpXSwgYXR0cnNbaSArIDFdKTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIG5hbWU7Ci0gICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm5hbWUiLCAmbmFtZSkpIHsKLSAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCi0gICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCi0gICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQotICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAotICAgIGJvb2wgZm91bmQ7Ci0KLSAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIiB8fCBuYW1lID09ICJiaXRyYXRlIiB8fCBuYW1lID09ICJibG9jay1jb3VudCIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gImJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lID09ICJjb21wbGV4aXR5IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiZnJhbWUtcmF0ZSIgfHwgbmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAic2l6ZSIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lLnN0YXJ0c1dpdGgoIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKLSAgICAgICAgQVN0cmluZyBtaW4sIG1heDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZygibWluIiwgJm1pbikgJiYgbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkgewotICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOwotICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikgfHwgbXNnLT5jb250YWlucygidmFsdWUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgJ21pbicgYW5kICdtYXgnIGFzIHdlbGwgYXMgJ3JhbmdlJyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpIHx8IG1zZy0+Y29udGFpbnMoIm1heCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIG9ubHkgJ21pbicgb3IgJ21heCcgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZtYXgpKSB7Ci0gICAgICAgICAgICBtaW4gPSBtYXg7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7Ci0gICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgYm90aCAncmFuZ2UnIGFuZCAndmFsdWUnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIHJhbmdlLCBzY2FsZSA9ICJsaW5lYXIiLCBkZWYsIGluXzsKLSAgICAgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoInJhbmdlIiwgJnJhbmdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgIndpdGggbm8gJ3JhbmdlJywgJ3ZhbHVlJyBvciAnbWluJy8nbWF4JyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJkZWZhdWx0IiwgJmRlZikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0IiwgZm91bmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lICE9ICJxdWFsaXR5IiAmJiBtc2ctPmZpbmRTdHJpbmcoInNjYWxlIiwgJnNjYWxlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIF4gKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJpbiIsICZpbl8pKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgewotICAgICAgICAgICAgaWYgKCEoaW5fID09ICJwaXhlbHMiKSAmJiAhKGluXyA9PSAiYmxvY2tzIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRJbnZhbGlkQXR0cihuYW1lLCAiaW4iLCBpbl8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5fLmVyYXNlKDUsIDEpOyAvLyAocGl4ZWx8YmxvY2spLWFzcGVjdC1yYXRpbwotICAgICAgICAgICAgaW5fLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgaW5fLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG5hbWUgPSBpbl87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCgicXVhbGl0eS1zY2FsZSIsIHNjYWxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQoIi1kZWZhdWx0Iik7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIGRlZik7Ci0gICAgICAgIH0KLSAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2UiKTsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCByYW5nZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVN0cmluZyBtYXgsIHZhbHVlLCByYW5nZXM7Ci0gICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJpbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJjaGFubmVsLWNvdW50IiB8fCBuYW1lID09ICJjb25jdXJyZW50LWluc3RhbmNlcyIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtaW4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZSIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJzYW1wbGUtcmF0ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInJhbmdlcyIsICZyYW5nZXMpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2VzIiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInNjYWxlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImFsaWdubWVudCIgfHwgbmFtZSA9PSAiYmxvY2stc2l6ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJnZhbHVlKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInZhbHVlIiwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heC5zaXplKCkpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gIm1heC0iOwotICAgICAgICAgICAgdGFnLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgbWF4KTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChyYW5nZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2VzIik7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0ICclcyciLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGludDMyX3Qgb3B0aW9uYWwgPSAtMTsKLSAgICBpbnQzMl90IHJlcXVpcmVkID0gLTE7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOwotCi0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpcGFyc2VCb29sZWFuKGF0dHJzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25hbCA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkICYmIG9wdGlvbmFsICE9IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoKG9wdGlvbmFsICE9IC0xIHx8IHJlcXVpcmVkICE9IC0xKSAmJiAodmFsdWUgIT0gTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBoYXMgYm90aCBhIHZhbHVlIGFuZCBvcHRpb25hbC9yZXF1aXJlZCBhdHRyaWJ1dGUiLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGRGZWF0dXJlKG5hbWUsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ3VycmVudEluZm8tPmFkZEZlYXR1cmUobmFtZSwgKHJlcXVpcmVkID09IDEpIHx8IChvcHRpb25hbCA9PSAwKSk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQogc3NpemVfdCBNZWRpYUNvZGVjTGlzdDo6ZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKLQotICAgICAgICBpZiAoaW5mby5tTmFtZSA9PSBuYW1lKSB7CisgICAgICAgIGlmIChzdHJjbXAobUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQogICAgIH0KQEAgLTExNjcsMTEgKzI4MSwxNSBAQAogCiAvL3N0YXRpYwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHVpbnQzMl90IGZsYWdzLCBWZWN0b3I8QVN0cmluZz4gKm1hdGNoZXMpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGVzLCBWZWN0b3I8QVN0cmluZz4gKm93bmVycykgewogICAgIG1hdGNoZXMtPmNsZWFyKCk7CisgICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7CisgICAgICAgIG93bmVycy0+Y2xlYXIoKTsKKyAgICB9CiAKICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBnZXRJbnN0YW5jZSgpOwotICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICBpZiAobGlzdCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTExODcsNDUgKzMwNSwyNyBAQAogICAgICAgICBpbmRleCA9IG1hdGNoSW5kZXggKyAxOwogCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKG1hdGNoSW5kZXgpOwotICAgICAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICAgICBDSEVDSyhpbmZvICE9IG51bGxwdHIpOwogICAgICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKIAogICAgICAgICBpZiAoKGZsYWdzICYga0hhcmR3YXJlQ29kZWNzT25seSkgJiYgaXNTb2Z0d2FyZUNvZGVjKGNvbXBvbmVudE5hbWUpKSB7CiAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgU1cgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtYXRjaGVzLT5wdXNoKGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgb3duZXJzLT5wdXNoKEFTdHJpbmcoaW5mby0+Z2V0T3duZXJOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmbGFncyAmIGtQcmVmZXJTb2Z0d2FyZUNvZGVjcyB8fCBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuc3djb2RlYyIsIGZhbHNlKSkgeworICAgIGlmIChmbGFncyAmIGtQcmVmZXJTb2Z0d2FyZUNvZGVjcyB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LnN3Y29kZWMiLCBmYWxzZSkpIHsKICAgICAgICAgbWF0Y2hlcy0+c29ydChjb21wYXJlU29mdHdhcmVDb2RlY3NGaXJzdCk7CiAgICAgfQogfQogCi0vLyBzdGF0aWMKLXVpbnQzMl90IE1lZGlhQ29kZWNMaXN0OjpnZXRRdWlya3NGb3IoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewotICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IGdldEluc3RhbmNlKCk7Ci0gICAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGl4ID0gbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChpeCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaXgpOwotCi0gICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKLSAgICAgICAgcXVpcmtzIHw9IEFDb2RlYzo6a1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7Ci0gICAgfQotICAgIGlmIChpbmZvLT5oYXNRdWlyaygicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikpIHsKLSAgICAgICAgcXVpcmtzIHw9IEFDb2RlYzo6a1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwotICAgIH0KLQotICAgIHJldHVybiBxdWlya3M7CitNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjp+TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSgpIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAppbmRleCAwOTVmYzZhLi42OTIwZTUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0zMyw4ICszMyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHMgPSAiL2RhdGEvbWlzYy9tZWRpYS9tZWRpYV9jb2RlY3NfcHJvZmlsaW5nX3Jlc3VsdHMueG1sIjsKLQogQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCkgewogICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaWYgKHByb3BlcnR5X2dldCgicm8uYnVpbGQuZGlzcGxheS5pZCIsIHZhbCwgTlVMTCkgJiYgKHN0cmxlbih2YWwpID4gMCkpIHsKQEAgLTIwNSwyNCArMjAzLDI0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MpIHsKK3ZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0cykgewogICAgIENvZGVjU2V0dGluZ3MgZ2xvYmFsX3Jlc3VsdHM7CiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZW5jb2Rlcl9yZXN1bHRzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRlY29kZXJfcmVzdWx0czsKICAgICBwcm9maWxlQ29kZWNzKGluZm9zLCAmZ2xvYmFsX3Jlc3VsdHMsICZlbmNvZGVyX3Jlc3VsdHMsICZkZWNvZGVyX3Jlc3VsdHMpOwotICAgIGV4cG9ydFJlc3VsdHNUb1hNTChrUHJvZmlsaW5nUmVzdWx0cywgZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cywgZGVjb2Rlcl9yZXN1bHRzKTsKKyAgICBleHBvcnRSZXN1bHRzVG9YTUwocHJvZmlsaW5nUmVzdWx0cywgZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cywgZGVjb2Rlcl9yZXN1bHRzKTsKIH0KIAogdm9pZCBwcm9maWxlQ29kZWNzKAotICAgICAgICBjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAogICAgICAgICBDb2RlY1NldHRpbmdzICpnbG9iYWxfcmVzdWx0cywKICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmVuY29kZXJfcmVzdWx0cywKICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmRlY29kZXJfcmVzdWx0cywKICAgICAgICAgYm9vbCBmb3JjZVRvTWVhc3VyZSkgewogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+PiBjb2RlY3NOZWVkTWVhc3VyZTsKICAgICBBU3RyaW5nIHN1cHBvcnRNdWx0aXBsZVNlY3VyZUNvZGVjcyA9ICJ0cnVlIjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gaW5mb3NbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBpbmZvIDogaW5mb3MpIHsKICAgICAgICAgQVN0cmluZyBuYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIikgfHwKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWVuYWJsZSBiZWxvdyBjb2RlY3Mgb25jZSBmaXhlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKaW5kZXggZDRiYjIyNS4uNGY4YzJmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCkBAIC0yMywxMiArMjMsMTAgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1leHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1ZlcnNpb25TdHJpbmc7Ci1leHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHM7Ci0KIHN0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIAogQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCk7CkBAIC0zNiwxMSArMzQsMTIgQEAKIGJvb2wgc3BsaXRTdHJpbmcoY29uc3QgQVN0cmluZyAmcywgY29uc3QgQVN0cmluZyAmZGVsaW1pdGVyLCBBU3RyaW5nICpzMSwgQVN0cmluZyAqczIpOwogCiAvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIHhtbCBmaWxlIG5hbWVkIGtQcm9maWxpbmdSZXN1bHRzLgotdm9pZCBwcm9maWxlQ29kZWNzKGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcyk7Cit2b2lkIHByb2ZpbGVDb2RlY3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHMpOwogCiAvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIGdsb2JhbF9yZXN1bHRzLCBlbmNvZGVyX3Jlc3VsdHMgYW5kIGRlY29kZXJfcmVzdWx0cy4KIHZvaWQgcHJvZmlsZUNvZGVjcygKLSAgICAgICAgY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKICAgICAgICAgQ29kZWNTZXR0aW5ncyAqZ2xvYmFsX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICplbmNvZGVyX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICpkZWNvZGVyX3Jlc3VsdHMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDUxZjFiYTMuLjY0MGNiODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdU1lZGlhRXh0cmFjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODMsOCArODIsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTExOSw4ICsxMTgsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTE0OSw4ICsxNDgsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTE2MSwyNCArMTYwLDM2IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhczogY2FzPSVwIiwgY2FzLmdldCgpKTsKK3N0YXRpYyBTdHJpbmc4IGFycmF5VG9TdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFycmF5KSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4ICIsIGFycmF5W2ldKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKKyAgICBBTE9HVigic2V0TWVkaWFDYXM6IGNhc1Rva2VuPXslc30iLCBhcnJheVRvU3RyaW5nKGNhc1Rva2VuKS5jX3N0cigpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAoY2FzID09IE5VTEwpIHsKKyAgICBpZiAoY2FzVG9rZW4uZW1wdHkoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIG1DYXNUb2tlbiA9IGNhc1Rva2VuOworCiAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKGNhcyk7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhjYXNUb2tlbik7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUNhcyA9IGNhczsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IDVmOWFhMDEuLjVmNTBlNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtMzgsNyArMzgsNyBAQAogfQogCiBzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3QoKSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobnVsbHB0cik7CisgICAgcmV0dXJuIGNvbm5lY3QoImRlZmF1bHQiLCBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGJvb2wqIHRyZWJsZUZsYWcpIHsKQEAgLTU0LDYgKzU0LDE5IEBACiAgICAgcmV0dXJuIGNvbm5lY3RMZWdhY3koKTsKIH0KIAorc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcpIHsKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7CisgICAgICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICp0cmVibGVGbGFnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29ubmVjdFRyZWJsZShuYW1lKTsKKyAgICB9CisgICAgaWYgKHRyZWJsZUZsYWcgIT0gbnVsbHB0cikgeworICAgICAgICAqdHJlYmxlRmxhZyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY29ubmVjdExlZ2FjeSgpOworfQorCiBzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3RMZWdhY3koKSB7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHNwPElCaW5kZXI+IGNvZGVjYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOwpAQCAtNzMsOSArODYsMTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdFRyZWJsZSgpIHsKK3N0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdFRyZWJsZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoImRlZmF1bHQiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIG5hbWUgPSAiZGVmYXVsdCI7CisgICAgfQorICAgIHNwPElPbXg+IHRPbXggPSBJT214OjpnZXRTZXJ2aWNlKG5hbWUpOwogICAgIGlmICh0T214LmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gVHJlYmxlIElPbXguIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTdhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9teEluZm9CdWlsZGVyIgorCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICBjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgeworICAgIHNwPEFDb2RlYz4gY29kZWMgPSBuZXcgQUNvZGVjKCk7CisgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWltZSwgaXNFbmNvZGVyLCBjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAorICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgorICAgICAgICBpZiAoKGF0dHJpYnV0ZS5rZXkuY29tcGFyZSgwLCA4LCAiZmVhdHVyZS0iKSA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChhdHRyaWJ1dGUua2V5LmNvbXBhcmUoOCwgMTUsICJiaXRyYXRlLW1vZGVzIikKKyAgICAgICAgICAgICAgICAgIT0gMCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlLmtleSBpcyBhIGZlYXR1cmUgdGhhdCBpcyBub3QgYSBiaXRyYXRlCisgICAgICAgICAgICAvLyBjb250cm9sLCBhZGQgYW4gaW50MzIgdmFsdWUuCisgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID09ICIxIiA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vbi1mZWF0dXJlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbCgKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLCBhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitPbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoKSB7Cit9CisKK3N0YXR1c190IE9teEluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICBib29sIHRyZWJsZTsKKyAgICBzcDxJT01YPiBvbXg7CisgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpSb2xlSW5mbz4gcm9sZXM7CisKKyAgICB0cmVibGUgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSk7CisgICAgaWYgKHRyZWJsZSkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisgICAgICAgIC8vIE9idGFpbiBJT214U3RvcmUKKyAgICAgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IElPbXhTdG9yZTo6Z2V0U2VydmljZSgpOworICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25uZWN0IHRvIGFuIElPbXhTdG9yZSBpbnN0YW5jZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGlzdCBzZXJ2aWNlIGF0dHJpYnV0ZXMgKGdsb2JhbCBzZXR0aW5ncykKKyAgICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgICAgaGlkbF92ZWM8SU9teFN0b3JlOjpTZXJ2aWNlQXR0cmlidXRlPiBzZXJ2aWNlQXR0cmlidXRlczsKKyAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG9teFN0b3JlLT5saXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzZXJ2aWNlQXR0cmlidXRlc10KKyAgICAgICAgICAgICAgICAoU3RhdHVzIGluU3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxJT214U3RvcmU6OlNlcnZpY2VBdHRyaWJ1dGU+JgorICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQXR0cmlidXRlcyA9IGluQXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBnbG9iYWwgc2V0dGluZ3MgZnJvbSBJT214U3RvcmUuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJJT214U3RvcmUgcmVwb3J0cyBwYXJzaW5nIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwIDogc2VydmljZUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgcC5rZXkuY19zdHIoKSwgcC52YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgcm9sZXMgYW5kIGNvbnZlcnQgdG8gSU9NWFN0b3JlJ3MgZm9ybWF0CisgICAgICAgIHRyYW5zU3RhdHVzID0gb214U3RvcmUtPmxpc3RSb2xlcygKKyAgICAgICAgICAgICAgICBbJnJvbGVzXQorICAgICAgICAgICAgICAgIChjb25zdCBoaWRsX3ZlYzxJT214U3RvcmU6OlJvbGVJbmZvPiYgaW5Sb2xlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICByb2xlcy5yZXNlcnZlKGluUm9sZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpblJvbGUgOiBpblJvbGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJT01YU3RvcmU6OlJvbGVJbmZvIHJvbGU7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnJvbGUgPSBpblJvbGUucm9sZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUudHlwZSA9IGluUm9sZS50eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5pc0VuY29kZXIgPSBpblJvbGUuaXNFbmNvZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gaW5Sb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJT01YU3RvcmU6Ok5vZGVJbmZvPiYgbm9kZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLm5vZGVzOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVzZXJ2ZShpblJvbGUubm9kZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Ob2RlIDogaW5Sb2xlLm5vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9NWFN0b3JlOjpOb2RlSW5mbyBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IGluTm9kZS5uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUub3duZXIgPSBpbk5vZGUub3duZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpBdHRyaWJ1dGU+JiBhdHRyaWJ1dGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnJlc2VydmUoaW5Ob2RlLmF0dHJpYnV0ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluQXR0ciA6IGluTm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTVhTdG9yZTo6QXR0cmlidXRlIGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIua2V5ID0gaW5BdHRyLmtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IGluQXR0ci52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShub2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHJvbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGNvZGVjIHJvbGVzIGZyb20gSU9teFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBPYnRhaW4gSU9NWFN0b3JlCisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHNtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIHRoZSBkZWZhdWx0IHNlcnZpY2UgbWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIHNwPElCaW5kZXI+IGNvZGVjQmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOworICAgICAgICBpZiAoY29kZWNCaW5kZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gdGhlIG1lZGlhIGNvZGVjIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBzcDxJTWVkaWFDb2RlY1NlcnZpY2U+IGNvZGVjU2VydmljZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ29kZWNTZXJ2aWNlPihjb2RlY0JpbmRlcik7CisgICAgICAgIGlmIChjb2RlY1NlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIHR5cGUgb2YgbWVkaWEgY29kZWMgc2VydmljZSBvYnRhaW5lZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIG9teCA9IGNvZGVjU2VydmljZS0+Z2V0T01YKCk7CisgICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25uZWN0IHRvIGFuIElPTVggaW5zdGFuY2UuIik7CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWFN0b3JlPiBvbXhTdG9yZSA9IGNvZGVjU2VydmljZS0+Z2V0T01YU3RvcmUoKTsKKyAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT01YU3RvcmUgaW5zdGFuY2UuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgc2VydmljZSBhdHRyaWJ1dGVzIChnbG9iYWwgc2V0dGluZ3MpCisgICAgICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6QXR0cmlidXRlPiBzZXJ2aWNlQXR0cmlidXRlczsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb214U3RvcmUtPmxpc3RTZXJ2aWNlQXR0cmlidXRlcygmc2VydmljZUF0dHJpYnV0ZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gZ2xvYmFsIHNldHRpbmdzIGZyb20gSU9NWFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwIDogc2VydmljZUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgcC5rZXkuY19zdHIoKSwgcC52YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgcm9sZXMKKyAgICAgICAgc3RhdHVzID0gb214U3RvcmUtPmxpc3RSb2xlcygmcm9sZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gY29kZWMgcm9sZXMgZnJvbSBJT01YU3RvcmUuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnZlcnQgcm9sZXMgdG8gbGlzdHMgb2YgY29kZWNzCisKKyAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gc3dDb2RlY3MKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiA+CisgICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvOworICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBod0NvZGVjcworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+ID4KKyAgICAgICAgICAgIGh3Q29kZWNOYW1lMkluZm87CisgICAgLy8gb3duZXIgbmFtZSAtPiBNZWRpYUNvZGVjSW5mbworICAgIC8vIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgSU9teCBzZXJ2aWNlKHMpIG5lZWRlZCBmb3IKKyAgICAvLyBjcmVhdGluZyBJT214Tm9kZSBpbnN0YW5jZXMgYW5kIHF1ZXJ5aW5nIGNhcGFiaWxpdGllcy4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gPgorICAgICAgICAgICAgb3duZXIyQ29kZWNJbmZvOworCisgICAgZm9yIChjb25zdCBhdXRvJiByb2xlIDogcm9sZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byYgdHlwZU5hbWUgPSByb2xlLnR5cGU7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyID0gcm9sZS5pc0VuY29kZXI7CisgICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlczsKKyAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCBoYXJkd2FyZSBub2RlcyBtdXN0IGJlIGFkZGVkIGFmdGVyCisgICAgICAgIC8vIHBsYXRmb3JtIChzb2Z0d2FyZSkgbm9kZXMuIGh3Q29kZWNzIGlzIHVzZWQgdG8gaG9sZCBoYXJkd2FyZSBub2RlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgYWZ0ZXIgc29mdHdhcmUgbm9kZXMgZm9yIHRoZSBzYW1lIHJvbGUuCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElPTVhTdG9yZTo6Tm9kZUluZm8qPiBod0NvZGVjczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogcm9sZS5ub2RlcykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisgICAgICAgICAgICBib29sIGlzU29mdHdhcmUgPSBub2RlTmFtZS5jb21wYXJlKDAsIDEwLCAiT01YLmdvb2dsZSIpID09IDA7CisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgIGlmIChpc1NvZnR3YXJlKSB7CisgICAgICAgICAgICAgICAgYXV0byBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gc3dDb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCisgICAgICAgICAgICAgICAgICAgIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZlclBsYXRmb3JtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgdGhpcyBub2RlIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkIGFmdGVyIGFsbCBzb2Z0d2FyZSBub2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGh3Q29kZWNzLnB1c2hfYmFjaygmbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgICAgICBub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCisgICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQorICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgorICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogaHdDb2RlY3MpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBub2RlTmFtZSA9IG5vZGUtPm5hbWU7CisgICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCisgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLT5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgKm5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgc29mdHdhcmUgY29kZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGYwYzI3YWMuLjRmZjJiZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTg1LDcgKzg1LDggQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICAvLyBjb3VsZG4ndCBvcGVuIGl0IGxvY2FsbHksIG1heWJlIHRoZSBtZWRpYSBzZXJ2ZXIgY2FuPwotICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpOworICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbnVsbFNlcnZpY2U7CisgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobnVsbFNlcnZpY2UsIHBhdGgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmQsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmTCk7CiAgICAgICAgIGNsb3NlKGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMDNkYzlkZi4uMTAzZGE5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTYwLDYgKzYwLDEyIEBACiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjp+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIHsKICAgICBBTE9HVigiflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwogICAgIGNsZWFyTWV0YWRhdGEoKTsKKyAgICAvLyBFeHBsaWNpdGx5IHJlbGVhc2UgZXh0cmFjdG9yIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhlIGRlc3RydWN0b3IsCisgICAgLy8gc29tZSBleHRyYWN0b3JzIG1pZ2h0IG5lZWQgdG8gY2FsbGJhY2sgdG8gY2xvc2Ugb2ZmIHRoZSBEYXRhU291cmNlCisgICAgLy8gYW5kIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0J3Mgc3RpbGwgdGhlcmUuCisgICAgaWYgKG1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBtRXh0cmFjdG9yLT5yZWxlYXNlKCk7CisgICAgfQogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+Y2xvc2UoKTsKICAgICB9CkBAIC0xMjEsMTIgKzEyNywxMiBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKSB7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShEYXRhU291cmNlKSIpOwogCiAgICAgY2xlYXJNZXRhZGF0YSgpOwogICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSk7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSwgbWltZSk7CiAKICAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgYSBNZWRpYUV4dHJhY3Rvci4iKTsKQEAgLTEzNywxNyArMTQzLDE3MyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdGljIFZpZGVvRnJhbWUgKmFsbG9jVmlkZW9GcmFtZSgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGJwcCwgYm9vbCBtZXRhT25seSkgeworICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKKyAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CisgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmljY0RhdGE7CisgICAgc2l6ZV90IGljY1NpemU7CisgICAgaWYgKCF0cmFja01ldGEtPmZpbmREYXRhKGtLZXlJY2NQcm9maWxlLCAmdHlwZSwgJmljY0RhdGEsICZpY2NTaXplKSl7CisgICAgICAgIGljY0RhdGEgPSBOVUxMOworICAgICAgICBpY2NTaXplID0gMDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnNhckhlaWdodCkKKyAgICAgICAgICAgICYmIHNhckhlaWdodCAhPSAwKSB7CisgICAgICAgIGRpc3BsYXlXaWR0aCA9ICh3aWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIGRpc3BsYXlXaWR0aCA+IDAgJiYgZGlzcGxheUhlaWdodCA+IDAKKyAgICAgICAgICAgICAgICAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICBBTE9HVigiZm91bmQgZGlzcGxheSBzaXplICVkeCVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFZpZGVvRnJhbWUod2lkdGgsIGhlaWdodCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgcm90YXRpb25BbmdsZSwgYnBwLCAhbWV0YU9ubHksIGljY0RhdGEsIGljY1NpemUpOworfQorCitzdGF0aWMgYm9vbCBnZXREc3RDb2xvckZvcm1hdChhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGNvbG9yRm9ybWF0LAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAqb214Q29sb3JGb3JtYXQsIGludDMyX3QgKmJwcCkgeworICAgIHN3aXRjaCAoY29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKKyAgICAgICAgICAgICpicHAgPSAyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICAgICAgeworICAgICAgICAgICAgKm9teENvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisgICAgICAgICAgICAqYnBwID0gNDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgICAgICAgICAgKmJwcCA9IDQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0OiAlZCIsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIFZpZGVvRnJhbWUgKmV4dHJhY3RWaWRlb0ZyYW1lKAogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLAogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLAotICAgICAgICBpbnQgc2Vla01vZGUpIHsKLQorICAgICAgICBpbnQgc2Vla01vZGUsCisgICAgICAgIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgYm9vbCBtZXRhT25seSkgewogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwogCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU+KHNlZWtNb2RlKTsKKyAgICBpZiAoc2Vla01vZGUgPCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyB8fAorICAgICAgICBzZWVrTW9kZSA+IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHNlZWsgbW9kZTogJWQiLCBzZWVrTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgZHN0QnBwOworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdDsKKyAgICBpZiAoIWdldERzdENvbG9yRm9ybWF0KAorICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QpY29sb3JGb3JtYXQsICZkc3RGb3JtYXQsICZkc3RCcHApKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtZXRhT25seSkgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICAgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIGRzdEJwcCwgdHJ1ZSk7CisgICAgfQorCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgc3A8TWV0YURhdGE+IG92ZXJyaWRlTWV0YTsKKyAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWU7CisgICAgICAgIGludDMyX3QgdGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbEhlaWdodDsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RhbmQtYWxvbmUgdGh1bWJuYWlsLCBzZXQgdXAgdGhlIG92ZXJyaWRlIG1ldGEsCisgICAgICAgIC8vIGFuZCBzZXQgc2Vla1RvIHRpbWUgdG8gLTEuCisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsICZ0aHVtYm5haWxXaWR0aCkKKyAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsICZ0aHVtYm5haWxIZWlnaHQpCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSl7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+cmVtb3ZlKGtLZXlEaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB0aHVtYm5haWxXaWR0aCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIHRodW1ibmFpbEhlaWdodCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldERhdGEoa0tleUhWQ0MsIHR5cGUsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgdGh1bWJOYWlsVGltZSA9IC0xbGw7CisgICAgICAgICAgICBBTE9HVigidGh1bWJuYWlsOiAlZHglZCIsIHRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWxIZWlnaHQpOworICAgICAgICB9IGVsc2UgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCisgICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKKyAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGh1bWJOYWlsVGltZSwgbW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1vZGUpOworICAgIH0KKworICAgIGludDMyX3QgZ3JpZFJvd3MgPSAxLCBncmlkQ29scyA9IDE7CisgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRpbGVkIGhlaWYKKyAgICAgICAgaW50MzJfdCBncmlkV2lkdGgsIGdyaWRIZWlnaHQ7CisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFdpZHRoLCAmZ3JpZFdpZHRoKSAmJiBncmlkV2lkdGggPiAwCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZEhlaWdodCwgJmdyaWRIZWlnaHQpICYmIGdyaWRIZWlnaHQgPiAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKKyAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKSk7CisgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgJmRpc3BsYXlIZWlnaHQpKTsKKworICAgICAgICAgICAgaWYgKHdpZHRoID49IGRpc3BsYXlXaWR0aCAmJiBoZWlnaHQgPj0gZGlzcGxheUhlaWdodAorICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggJSBncmlkV2lkdGggPT0gMCkgJiYgKGhlaWdodCAlIGdyaWRIZWlnaHQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ3JpZCBjb25maWc6ICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBncmlkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGdyaWRXaWR0aCk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBncmlkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBncmlkQ29scyA9IHdpZHRoIC8gZ3JpZFdpZHRoOworICAgICAgICAgICAgICAgIGdyaWRSb3dzID0gaGVpZ2h0IC8gZ3JpZEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBncmlkIGNvbmZpZzogJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGdyaWQgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LCBncmlkV2lkdGgsIGdyaWRIZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhID0gdHJhY2tNZXRhOworICAgICAgICB9CisgICAgfQorICAgIGludDMyX3QgbnVtVGlsZXMgPSBncmlkUm93cyAqIGdyaWRDb2xzOworCiAgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0OwotICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhLCAmdmlkZW9Gb3JtYXQpICE9IE9LKSB7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShvdmVycmlkZU1ldGEsICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjb252ZXJ0IG1ldGEgZGF0YSB0byBtZXNzYWdlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTYwLDcgKzMyMiw4IEBACiAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBwb3J0cywgaWYgc2Vla2luZyB0byBhIHN5bmMgZnJhbWUuIE5PVEU6IFRoaXMgcmVxdWVzdCBtYXkKICAgICAvLyBmYWlsIGlmIGNvbXBvbmVudCByZXF1aXJlcyBtb3JlIHRoYW4gdGhhdCBmb3IgZGVjb2RpbmcuCiAgICAgYm9vbCBpc1NlZWtpbmdDbG9zZXN0ID0gKHNlZWtNb2RlID09IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKLSAgICBpZiAoIWlzU2Vla2luZ0Nsb3Nlc3QpIHsKKyAgICBib29sIGRlY29kZVNpbmdsZUZyYW1lID0gIWlzU2Vla2luZ0Nsb3Nlc3QgJiYgKG51bVRpbGVzID09IDEpOworICAgIGlmIChkZWNvZGVTaW5nbGVGcmFtZSkgewogICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1pbnB1dC1idWZmZXJzIiwgMSk7CiAgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLW91dHB1dC1idWZmZXJzIiwgMSk7CiAgICAgfQpAQCAtMTkwLDMwICszNTMsNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICBpZiAoc2Vla01vZGUgPCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyB8fAotICAgICAgICBzZWVrTW9kZSA+IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0KLSAgICAgICAgQUxPR0UoIlVua25vd24gc2VlayBtb2RlOiAlZCIsIHNlZWtNb2RlKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZT4oc2Vla01vZGUpOwotCi0gICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOwotICAgIGlmIChmcmFtZVRpbWVVcyA8IDApIHsKLSAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCi0gICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKLSAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRodW1iTmFpbFRpbWUsIG1vZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRodW1iTmFpbFRpbWUgPSAtMTsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1vZGUpOwotICAgIH0KLQogICAgIGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dXKCJzb3VyY2UgZmFpbGVkIHRvIHN0YXJ0OiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKQEAgLTI1OCw2ICszOTcsOSBAQAogICAgIGJvb2wgZmlyc3RTYW1wbGUgPSB0cnVlOwogICAgIGludDY0X3QgdGFyZ2V0VGltZVVzID0gLTFsbDsKIAorICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gTlVMTDsKKyAgICBpbnQzMl90IHRpbGVzRGVjb2RlZCA9IDA7CisKICAgICBkbyB7CiAgICAgICAgIHNpemVfdCBpbnB1dEluZGV4ID0gLTE7CiAgICAgICAgIGludDY0X3QgcHRzVXMgPSAwbGw7CkBAIC0yODIsNiArNDI0LDkgQEAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgRXJyb3Igb3IgRU9TIik7CiAgICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZpcnN0U2FtcGxlICYmIGlzU2Vla2luZ0Nsb3Nlc3QpIHsKQEAgLTI5Myw2ICs0MzgsNyBAQAogICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBzaXplICglenUpIHRvbyBsYXJnZSBmb3IgY29kZWMgaW5wdXQgc2l6ZSAoJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC0zMDEsMTkgKzQ0NywyMCBAQAogICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1lZGlhQnVmZmVyLT5kYXRhKCkgKyBtZWRpYUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGlmIChpc0F2Y09ySGV2YyAmJiBJc0lEUihjb2RlY0J1ZmZlcikgJiYgIWlzU2Vla2luZ0Nsb3Nlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGRlY29kZSBvbmUgSURSIGZyYW1lLCB1bmxlc3Mgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1QKLSAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWN0dWFsbHkgZGVjb2RlIHRvIHRhcmdldFRpbWVVcy4KLSAgICAgICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBpbnB1dEluZGV4IDwgaW5wdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICBpZiAoaGF2ZU1vcmVJbnB1dHMgJiYgaW5wdXRJbmRleCA8IGlucHV0QnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0F2Y09ySGV2YyAmJiBJc0lEUihjb2RlY0J1ZmZlcikgJiYgZGVjb2RlU2luZ2xlRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gZGVjb2RlIG9uZSBJRFIgZnJhbWUsIHVubGVzcyB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVAorICAgICAgICAgICAgICAgIC8vIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRlY29kZSB0byB0YXJnZXRUaW1lVXMuCisgICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEFMT0dWKCJRdWV1ZUlucHV0OiBzaXplPSV6dSB0cz0lIiBQUklkNjQgIiB1cyBmbGFncz0leCIsCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksIHB0c1VzLCBmbGFncyk7CiAgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKApAQCAtMzUyLDExICs0OTksNzAgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVCBvcHRpb24gYW5kIG9idGFpbmVkIGEgdmFsaWQgdGFyZ2V0VGltZVVzCiAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4dHJhY3RvciwgZGVjb2RlIHRvIHRoZSBzcGVjaWZpZWQgZnJhbWUuIE90aGVyd2lzZSB3ZSdyZSBkb25lLgotICAgICAgICAgICAgICAgICAgICBkb25lID0gKHRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSB0YXJnZXRUaW1lVXMpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgYW4gb3V0cHV0IGJ1ZmZlciwgdGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXIgPSBvdXRwdXRCdWZmZXJzLml0ZW1BdChpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207CisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfbGVmdCA9IGNyb3BfdG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfcmlnaHQgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBhbGxvY1ZpZGVvRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BfcmlnaHQgLSBjcm9wX2xlZnQgKyAxKSAqIGdyaWRDb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JvcF9ib3R0b20gLSBjcm9wX3RvcCArIDEpICogZ3JpZFJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyptZXRhT25seSovKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGlsZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCA9IGNyb3BfbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRvcCA9IGNyb3BfdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmlnaHQgPSBjcm9wX3JpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZHN0Qm90dG9tID0gY3JvcF9ib3R0b207CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RMZWZ0ID0gdGlsZXNEZWNvZGVkICUgZ3JpZENvbHMgKiB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRvcCA9IHRpbGVzRGVjb2RlZCAvIGdyaWRDb2xzICogaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmlnaHQgPSBkc3RMZWZ0ICsgd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0Qm90dG9tID0gZHN0VG9wICsgaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBjb252ZXJ0ZXIuY29udmVydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjb252ZXJ0IGZyb20gZm9ybWF0IDB4JTA4eCB0byAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGb3JtYXQsIGRzdEZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9ICh0YXJnZXRUaW1lVXMgPCAwbGwpIHx8ICh0aW1lVXMgPj0gdGFyZ2V0VGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRpbGVzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZXNEZWNvZGVkKys7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lICY9ICh0aWxlc0RlY29kZWQgPj0gbnVtVGlsZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBlcnJvciAlZCAoJXMpIGluc3RlYWQgb2Ygb3V0cHV0IiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CkBAIC0zNjYsMTAyICs1NzIsMTEgQEAKICAgICAgICAgfQogICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhZG9uZSk7CiAKLSAgICBpZiAoZXJyICE9IE9LIHx8IHNpemUgPD0gMCB8fCBvdXRwdXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSB0aHVtYm5haWwgZnJhbWUiKTsKLSAgICAgICAgc291cmNlLT5zdG9wKCk7Ci0gICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBkZWNvZGVkIHZpZGVvIGZyYW1lLiIpOwotICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXIgPSBvdXRwdXRCdWZmZXJzLml0ZW1BdChpbmRleCk7Ci0KLSAgICBpZiAodGh1bWJOYWlsVGltZSA+PSAwKSB7Ci0gICAgICAgIGlmICh0aW1lVXMgIT0gdGh1bWJOYWlsVGltZSkgewotICAgICAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzLCBtaW1lID0gJXMiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRodW1iTmFpbFRpbWUsIChsb25nIGxvbmcpdGltZVVzLCBtaW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwotICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKLSAgICAgICAgY3JvcF9sZWZ0ID0gY3JvcF90b3AgPSAwOwotICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOwotICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7Ci0gICAgfQotCi0gICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOwotICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKLSAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgotICAgIH0KLQotICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gbmV3IFZpZGVvRnJhbWU7Ci0gICAgZnJhbWUtPm1XaWR0aCA9IGNyb3BfcmlnaHQgLSBjcm9wX2xlZnQgKyAxOwotICAgIGZyYW1lLT5tSGVpZ2h0ID0gY3JvcF9ib3R0b20gLSBjcm9wX3RvcCArIDE7Ci0gICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPSBmcmFtZS0+bVdpZHRoOwotICAgIGZyYW1lLT5tRGlzcGxheUhlaWdodCA9IGZyYW1lLT5tSGVpZ2h0OwotICAgIGZyYW1lLT5tU2l6ZSA9IGZyYW1lLT5tV2lkdGggKiBmcmFtZS0+bUhlaWdodCAqIDI7Ci0gICAgZnJhbWUtPm1EYXRhID0gbmV3IHVpbnQ4X3RbZnJhbWUtPm1TaXplXTsKLSAgICBmcmFtZS0+bVJvdGF0aW9uQW5nbGUgPSByb3RhdGlvbkFuZ2xlOwotCi0gICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSV2lkdGgsICZzYXJXaWR0aCkKLSAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJIZWlnaHQsICZzYXJIZWlnaHQpCi0gICAgICAgICAgICAmJiBzYXJIZWlnaHQgIT0gMCkgewotICAgICAgICBmcmFtZS0+bURpc3BsYXlXaWR0aCA9IChmcmFtZS0+bURpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmd2lkdGgpCi0gICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZoZWlnaHQpCi0gICAgICAgICAgICAgICAgJiYgZnJhbWUtPm1EaXNwbGF5V2lkdGggPiAwICYmIGZyYW1lLT5tRGlzcGxheUhlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaWYgKGZyYW1lLT5tRGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0ID4gKGludDY0X3QpZnJhbWUtPm1EaXNwbGF5V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBmcmFtZS0+bURpc3BsYXlIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGhlaWdodCAqIChpbnQ2NF90KWZyYW1lLT5tRGlzcGxheVdpZHRoIC8gd2lkdGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcmFtZS0+bURpc3BsYXlXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ICogKGludDY0X3Qpd2lkdGggLyBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBvdmVycmlkZGVuIHRvICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bURpc3BsYXlXaWR0aCwgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KLSAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKLQotICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7Ci0gICAgICAgIGVyciA9IGNvbnZlcnRlci5jb252ZXJ0KAotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1EYXRhLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCi0gICAgICAgICAgICAgICAgMCwgMCwgZnJhbWUtPm1XaWR0aCAtIDEsIGZyYW1lLT5tSGVpZ2h0IC0gMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjb252ZXJ0IGZyb20gZm9ybWF0IDB4JTA4eCB0byBSR0I1NjUiLCBzcmNGb3JtYXQpOwotCi0gICAgICAgIGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHZpZGVvRnJhbWVCdWZmZXIuY2xlYXIoKTsKICAgICBzb3VyY2UtPnN0b3AoKTsKLSAgICBkZWNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4KTsKICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJDb2xvcmNvbnZlcnRlciBmYWlsZWQgdG8gY29udmVydCBmcmFtZS4iKTsKLQorICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCB2aWRlbyBmcmFtZSAoZXJyICVkKSIsIGVycik7CiAgICAgICAgIGRlbGV0ZSBmcmFtZTsKICAgICAgICAgZnJhbWUgPSBOVUxMOwogICAgIH0KQEAgLTQ3MCw5ICs1ODUsMTAgQEAKIH0KIAogVmlkZW9GcmFtZSAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCi0gICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKIAotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJSIgUFJJZDY0ICIgdXMgb3B0aW9uOiAlZCIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQgY29sb3JGb3JtYXQ6ICVkLCBtZXRhT25seTogJWQiLAorICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAKICAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJubyBleHRyYWN0b3IuIik7CkBAIC01NDAsOCArNjU2LDggQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9Ci0gICAgICAgICAgICBleHRyYWN0VmlkZW9GcmFtZShjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSwgdGltZVVzLCBvcHRpb24pOworICAgICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9IGV4dHJhY3RWaWRlb0ZyYW1lKAorICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlLCB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKIAogICAgICAgICBpZiAoZnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGZyYW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDBhZWE4ZTEuLjNlZjhmMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTIzNyw2ICsyMzcsMTEgQEAKICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwogICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgY29kZWNMZXZlbDsKICAgICBpZiAocHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CisgICAgICAgIGlmIChwcm9maWxlID09IDY2ICYmIChjb25zdHJhaW50cyAmIDB4NDApKSB7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IDEwMCAmJiAoY29uc3RyYWludHMgJiAweDBDKSA9PSAweDBDKSB7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOworICAgICAgICB9CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBjb2RlY1Byb2ZpbGUpOwogICAgICAgICBpZiAobGV2ZWxzLm1hcChsZXZlbCwgJmNvZGVjTGV2ZWwpKSB7CiAgICAgICAgICAgICAvLyBmb3IgOSAmJiAxMSBkZWNpZGUgbGV2ZWwgYmFzZWQgb24gcHJvZmlsZSBhbmQgY29uc3RyYWludF9zZXQzIGZsYWcKQEAgLTE4NzQsNSArMTg3OSwxMyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3ZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKSB7CisgICAgc1swXSA9IHggPj4gMjQ7CisgICAgc1sxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisgICAgc1syXSA9ICh4ID4+IDgpICYgMHhmZjsKKyAgICBzWzNdID0geCAmIDB4ZmY7CisgICAgc1s0XSA9ICdcMCc7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAppbmRleCA2ZTA0YzFlLi4yMWMwMGExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRBQUMyLmNwcCIsCkBAIC0zMyw0ICszNyw1IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDlmYmRiNzIuLmUwYzBjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0yMTgsNiArMjE4LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRBQUMyOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChPTVhfVTMyKSBpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0FBQyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CkBAIC0zNDIsNiArMzY2LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nQUFDKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCmluZGV4IGExY2YyODUuLjczYTM5NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgU09GVF9BQUNfMl9IXwogI2RlZmluZSBTT0ZUX0FBQ18yX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCiAjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKaW5kZXggMWE3ZmZjYS4uZmIzNjhjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYWFjZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAiYmFzaWNfb3AvYmFzaWNvcDIuYyIsCkBAIC0xMTEsNiArMTEyLDEwIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRBQUNFbmNvZGVyMi5jcHAiXSwKIApAQCAtMTQwLDYgKzE0NSw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oCmluZGV4IDk4MWNiYmIuLmU2NGMxYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FBQ19FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOwogc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCmluZGV4IDEyM2ZkMjUuLjY4MWRjZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQUFDX0VOQ09ERVJfMl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJhYWNlbmNfbGliLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAppbmRleCBjNWFjNTU4Li41MTc3NTkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggOTk2MTgzYi4uZDI2NmRjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYV9yZWZsLmNwcCIsCkBAIC01NSwxMyArNTYsMjAgQEAKICAgICAvLyAgICBdLAogICAgIC8vfSwKIAotICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIApAQCAtOTYsNiArMTA0LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAppbmRleCA3NTUzMTUzLi5iN2U4NGVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKQEAgLTE0Myw2ICsxNDMsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEFNUjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0FNUiA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KQEAgLTIzNiw2ICsyNjAsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdBTVIpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYWFjUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKaW5kZXggNzU4ZDZhYy4uODY5YjgxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FNUl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCmluZGV4IGFmMGY4YzIuLjZkYzJkYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLApAQCAtODMsNiArODQsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Ftcm5iZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0QU1STkJFbmNvZGVyLmNwcCJdLAogCkBAIC0xMTAsNiArMTE1LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCmluZGV4IDUwMTc4YzQuLmM3M2U0ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BTVJOQl9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCmluZGV4IGUyNjFjMDQuLmI5MzJjY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCA1YzVhMTIyLi44OTY4OTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCkBAIC0xNDQsNiArMTQ1LDEwIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEFNUldCRW5jb2Rlci5jcHAiXSwKIApAQCAtMTczLDYgKzE3OCw3IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5oCmluZGV4IGQwYzFkYWIuLjg5NTBhOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQU1SV0JfRU5DT0RFUl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJ2b0FNUldCLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAppbmRleCA2Yjk5NmE3Li4xZjQzODAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEFWQ0RlYy5jcHAiXSwKQEAgLTEyLDcgKzE2LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zMCw0ICszNCw1IEBACiAgICAgfSwKIAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKaW5kZXggMjQ4YWI2ZC4uYzM0MmI2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCkBAIC00OCwxMCArNDgsMTQgQEAKICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAogCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAogCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisKICAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCmluZGV4IDE4Yjc1NTYuLjY3OWVkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9IMjY0X0RFQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCmluZGV4IDQ5MDIxYTkuLjY2NTA3YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCiAgICAgc3JjczogWyJTb2Z0QVZDRW5jLmNwcCJdLApAQCAtMTMsNyArMTcsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMzAsNCArMzQsNSBAQAogICAgIH0sCiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IGIxYWYxN2IuLjM1OGM3NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogCkBAIC03NSwzMyArNzQsMTEgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKIAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC02MjksOCArNjA2LDEwIEBACiAgICAgICAgIGxldmVsID0gMzA7CiAgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgewogICAgICAgICBsZXZlbCA9IDIxOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTc2ICogMTQ0KSkgewogICAgICAgICBsZXZlbCA9IDIwOworICAgIH0gZWxzZSB7CisgICAgICAgIGxldmVsID0gMTA7CiAgICAgfQogICAgIG1BVkNFbmNMZXZlbCA9IE1BWChsZXZlbCwgbUFWQ0VuY0xldmVsKTsKIApAQCAtOTYzLDcgKzk0Miw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7CisgICAgICAgICAgICAvLyBUT0RPOiBtYWludGFpbiBwcm9maWxlCisgICAgICAgICAgICBhdmNQYXJhbXMtPmVQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmVMZXZlbCA9IG9teExldmVsOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmRnJhbWVzID0gMTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IDgxOGU0YTEuLmE0M2NkZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDAyMWU2YWYuLjM3MjY5MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiY21uTWVtb3J5LmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA2YWMyNjRkLi41OTVjZmRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdEZsYWNEZWNvZGVyLmNwcCIsCkBAIC0zMyw0ICszNyw1IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IGNmZjRhMzMuLjRhYjFhYjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC0xMjYsNiArMTI2LDI5IEBACiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgQUxPR1YoImludGVybmFsR2V0UGFyYW1ldGVyOiBpbmRleCgleCkiLCBpbmRleCk7CiAgICAgc3dpdGNoICgoT01YX1UzMilpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0ZMQUMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9GbGFjOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgKmZsYWNQYXJhbXMgPQpAQCAtMjE5LDYgKzI0MiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0ZMQUMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0yNTYsMTAgKzMwMiwyNyBAQAogICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKICAgICAgICAgdWludDhfdCogaW5CdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogICAgICAgICBib29sIGVuZE9mSW5wdXQgPSAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gMDsKIAorICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgaWYgKGVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogZW1wdHlJbnB1dEJ1ZmZlciByZWNlaXZlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgewogICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IGZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBzZXQiKTsKICAgICAgICAgICAgIGluSGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CkBAIC0yOTcsOCArMzYwLDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAgICAgICAgIHNob3J0ICpvdXRCdWZmZXIgPQogICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKICAgICAgICAgc2l6ZV90IG91dEJ1ZmZlclNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCBjMDkwODFkLi40YTIxYzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIFNPRlRfRkxBQ19ERUNPREVSX0gKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAppbmRleCBkMTQxM2Y2Li4wNjY5MTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icApAQCAtMjIsNyArMjIsNyBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTMyLDUgKzMyLDEwIEBACiAgICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAogCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2VuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IGNhY2VkYTkuLjU2ZDJkNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0xNTQsNiArMTU0LDMwIEBACiAgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXg9MHgleCkiLCBpbmRleCk7CiAKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nUENNIDogT01YX0FVRElPX0NvZGluZ0ZMQUM7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNjMsNyArMTg3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIApAQCAtMTg5LDYgKzIxMywxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChmbGFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ29tcHJlc3Npb25MZXZlbCA9IG1Db21wcmVzc2lvbkxldmVsOwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTIwMyw2ICsyMzEsMjkgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0ZMQUMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JbmRleFBhcmFtQXVkaW9QY20pIik7CkBAIC0yMTIsNyArMjYzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDAgJiYgcGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJTb2Z0RmxhY0VuY29kZXI6OmludGVybmFsU2V0UGFyYW1ldGVyKCkgRXJyb3IgIzEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMjU4LDYgKzMwOSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChmbGFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtQ29tcHJlc3Npb25MZXZlbCA9IGZsYWNQYXJhbXMtPm5Db21wcmVzc2lvbkxldmVsOyAvLyByYW5nZSBjbGFtcGluZyBkb25lIGluc2lkZSBlbmNvZGVyCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDYwMjdmNzYuLmY0ZjA2NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0ZMQUNfRU5DX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2VuY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCBiNzhiNjg5Li5mZmY3MmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9nNzExZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0RzcxMS5jcHAiXSwKIApAQCAtOSw3ICsxMyw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0yNyw0ICszMSw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggZjdjMDQyOS4uN2E0Y2NhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHNzExOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nRzcxMSA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNzMsNiArMTk3LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nRzcxMSkKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaAppbmRleCAxNmI2MzQwLi4zZWNlMjQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfRzcxMV9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKaW5kZXggOGU4NmFkNi4uNzUzZWVlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2dzbWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEdTTS5jcHAiXSwKIApAQCAtMjMsMTEgKzI3LDEyIEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmdzbSJdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDExOTk5YjQuLmQ3NzcyMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHU006OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdHU01GUiA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNjQsNiArMTg4LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nR1NNRlIpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAppbmRleCAwMzAzZGVhLi5lZjg2OTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9HU01fSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBleHRlcm4gIkMiIHsKICNpbmNsdWRlICJnc20uaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IGNkNzVjOTcuLjdmYTc0ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEhFVkMuY3BwIl0sCkBAIC0yMiw3ICsyNiw3IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMzMsNCArMzcsNSBAQAogICAgIC8vIHJlcXVpcmVzIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmVsb2MgUl9BUk1fUkVMMzI7IHJlY29tcGlsZSB3aXRoIC1mUElDCiAgICAgLy8gQnVnOiAxNjg1MzI5MQogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKaW5kZXggZTdjMjEyNy4uNTgwMDQ5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9IRVZDX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKaW5kZXggMDRlYTA3NS4uMTIxNmFlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcCIsCkBAIC02Niw2ICs2OCwxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNC5jcHAiXSwKIApAQCAtODcsNyArOTMsNyBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMTAzLDQgKzEwOSw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IDQxMWEyNTEuLjM5YjY3YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTMxLDIwICszMSwxMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga000VlByb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMCB9LAotICAgIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiB9LAotICAgIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxIH0sCi0gICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDIgfSwKICAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMyB9LAogfTsKIAogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtIMjYzUHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwxMCB9LAotICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwyMCB9LAogICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwzMCB9LAogICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw0NSB9LAotICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsICAgIE9NWF9WSURFT19IMjYzTGV2ZWwxMCB9LAotICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsICAgIE9NWF9WSURFT19IMjYzTGV2ZWwyMCB9LAogICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsICAgIE9NWF9WSURFT19IMjYzTGV2ZWwzMCB9LAogICAgIHsgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0NSB9LAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCmluZGV4IDQxMTRlN2QuLmUzOTlhYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfTVBFRzRfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCmluZGV4IGRhNWIxNjIuLjY0MDcxOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYml0c3RyZWFtX2lvLmNwcCIsCkBAIC01Miw2ICs1MywxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNEVuY29kZXIuY3BwIl0sCiAKQEAgLTc1LDcgKzgwLDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtOTAsNiArOTUsNyBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCA2ZDRjYjY5Li43YjkwYTAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgIlNvZnRNUEVHNEVuY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCBhZThjYjZmLi4wMGYyZGQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAppbmRleCAwZDBhMmM2Li4yNzNmYTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvcHZtcDNfbm9ybWFsaXplLmNwcCIsCkBAIC03Nyw2ICs3OCwxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXAzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0TVAzLmNwcCJdLAogCkBAIC0xMDIsNyArMTA3LDcgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0xMTAsNiArMTE1LDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCAzZGVmMWYwLi4yMzY0Njg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTEzNCw2ICsxMzQsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdE1QMzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ01QMyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0yMDgsNiArMjMyLDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nTVAzKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaAppbmRleCAzYmZhNmM3Li45NzZmZDAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfTVAzX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCAwMTQ0NTgxLi4xNWZkZGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0TVBFRzIuY3BwIl0sCkBAIC0xMiw3ICsxNiw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMzAsNCArMzQsNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKaW5kZXggOWE2OTIyNi4uOWQ1ZjM0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKQEAgLTc4OSw3ICs3ODksNyBAQAogCiAgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICBzc2l6ZV90IHRpbWVTdGFtcElkeDsKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOwogCiAgICAgICAgICAgICAgICAgdGltZVN0YW1wSWR4ID0gZ2V0TWluVGltZXN0YW1wSWR4KG1UaW1lU3RhbXBzLCBtVGltZVN0YW1wc1ZhbGlkKTsKICAgICAgICAgICAgICAgICBpZiAodGltZVN0YW1wSWR4IDwgMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCmluZGV4IDY3MjlhNTQuLjMzOGZjMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX01QRUcyX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAppbmRleCBjNDI0MmMyLi41OWMxZjVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0VlBYLmNwcCJdLAogCkBAIC0xMSw3ICsxNSw3IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTMwLDQgKzM0LDUgQEAKICAgICAgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKaW5kZXggODRjZjc5Yy4uZDZiYjkwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVlBYX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgogI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCmluZGV4IDExNGMxYmUuLjc0MTc3NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0VlBYRW5jb2Rlci5jcHAiLApAQCAtMjYsMTAgKzMwLDExIEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKaW5kZXggODZkZmFkNy4uZGQ4NmQzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9WUFhfRU5DT0RFUl9IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCmluZGV4IGI4YzE4MDcuLmZhZDk4OGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQVZDX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogCiAjaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDVkOWM0YzguLjg4ZDZlYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X29wdXNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRPcHVzLmNwcCJdLAogCkBAIC0xMCwxMyArMTQsMTUgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJvcHVzIiwKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0yNyw0ICszMyw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKaW5kZXggMmFjNmNlMC4uODEzMDA0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC02Miw2ICs2Miw3IEBACiAgICAgICBtU2Vla1ByZVJvbGwoMCksCiAgICAgICBtQW5jaG9yVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1IYXZlRU9TKGZhbHNlKSwKICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgewogICAgIGluaXRQb3J0cygpOwogICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CkBAIC0xMjksNiArMTMwLDMxIEBACiBPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVMgOgorICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CkBAIC0yMTIsNiArMjM4LDMwIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQpAQCAtMzM1LDcgKzM4NSwzMSBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIGtSYXRlIC8gMTAwMDAwMDAwMDsKIH0KIAotdm9pZCBTb2Z0T3B1czo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0T3B1czo6aGFuZGxlRU9TKCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworICAgIENIRUNLKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpOworCisgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgbUhhdmVFT1MgPSB0cnVlOworCisgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisKKyAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIApAQCAtMzQzLDEwNCArNDE3LDEwOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgewotICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKLSAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKLSAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNpbmcgT3B1cyBIZWFkZXIgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07Ci0gICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOwotICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9jb3VwbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPQotICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXItPmdhaW5fZGIpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cz0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaGVhZGVyLT5wQnVmZmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7Ci0gICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5PZmZzZXQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7Ci0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7Ci0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIHdoaWxlICghbUhhdmVFT1MgJiYgIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOworICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzaW5nIE9wdXMgSGVhZGVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXItPmdhaW5fZGIpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaW5IZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihpbkhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA+PSAzICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogCiAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIGhhbmRsZUVPUygpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTQ5MCw3ICs1NjgsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci0+Y2hhbm5lbHM7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtQW5jaG9yVGltZVVzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8KQEAgLTQ5OSwyMiArNTc2LDIwIEBACiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOwogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIG1IYXZlRU9TID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIH0KIAorICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8gPSBOVUxMOwogICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwotCi0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgfQogfQogCkBAIC01MjYsNiArNjAxLDcgQEAKICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CiAgICAgICAgIG1BbmNob3JUaW1lVXMgPSAwOwogICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1TZWVrUHJlUm9sbDsKKyAgICAgICAgbUhhdmVFT1MgPSBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTU0Miw2ICs2MTgsNyBAQAogICAgIH0KIAogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgIG1IYXZlRU9TID0gZmFsc2U7CiB9CiAKIHZvaWQgU29mdE9wdXM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCmluZGV4IDk3ZjY1NjEuLjkxY2FmYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCkBAIC0yMyw3ICsyMyw3IEBACiAKICNkZWZpbmUgU09GVF9PUFVTX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IE9wdXNNU0RlY29kZXI7CiAKQEAgLTc1LDYgKzc1LDcgQEAKICAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisgICAgYm9vbCBtSGF2ZUVPUzsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApAQCAtODUsNiArODYsNyBAQAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworICAgIHZvaWQgaGFuZGxlRU9TKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0T3B1cyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCmluZGV4IGM2NDAyN2IuLmYyMWQ0NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfcmF3ZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0UmF3LmNwcCJdLAogCkBAIC0yNyw0ICszMSw1IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCmluZGV4IGFjYjJiMzcuLjFhNTI3YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSAzMiAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDMyICogMTAyNDsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpAQCAtMTAwLDYgKzEwMCwyOCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0UmF3OjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTUzLDYgKzE3NSwyNiBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaAppbmRleCA4MDkwNmI0Li5lYmMyNzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfUkFXX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHRQVk1QNEF1ZGlvRGVjb2RlckV4dGVybmFsOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCAxYTRkZTYwLi42MjhiMzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0Vm9yYmlzLmNwcCJdLAogCkBAIC0xMCw3ICsxNCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidm9yYmlzaWRlYyIsCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjUsNCArMjksNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMTRkZDI1MC4uODkxMmY4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTEyOSw2ICsxMjksMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1ZPUkJJUyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTIyMSw2ICsyNDUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdWT1JCSVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTI2Miw3ICszMDksMzMgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7CiB9CiAKLXZvaWQgU29mdFZvcmJpczo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0Vm9yYmlzOjpoYW5kbGVFT1MoKSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICBDSEVDSyghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKTsKKworICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworCisgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKK30KKwordm9pZCBTb2Z0Vm9yYmlzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKQEAgLTI3MCw2OSArMzQzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDIpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgaW5wdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBzaXplKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7Ci0KLSAgICAgICAgbWFrZUJpdFJlYWRlcigKLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywKLSAgICAgICAgICAgICAgICAmYnVmLCAmcmVmLCAmYml0cyk7Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1WaSA9PSBOVUxMKTsKLSAgICAgICAgICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mbzsKLSAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKLQotICAgICAgICAgICAgaW50IHJldCA9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cyk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCByZXQgPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCByZXQsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gTlVMTCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZTsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsIHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpOwotCi0gICAgICAgICAgICBpZiAobVZpLT5yYXRlICE9IGtEZWZhdWx0U2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1WaS0+Y2hhbm5lbHMgIT0ga0RlZmF1bHRDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidm9yYmlzOiByYXRlL2NoYW5uZWxzIGNoYW5nZWQ6ICVsZC8lZCIsIG1WaS0+cmF0ZSwgbVZpLT5jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKLQotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgKG1TYXdJbnB1dEVvcyAmJiAhbVNpZ25hbGxlZE91dHB1dEVvcykpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgd2hpbGUgKCFtU2lnbmFsbGVkT3V0cHV0RW9zICYmICghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVvcykgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gTlVMTDsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gTlVMTDsKICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKQEAgLTM0Niw2ICszNTcsNzMgQEAKICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlcyA9IDA7CiAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgaW5wdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgICAgICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOworCisgICAgICAgICAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVZpID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtVmkgPSBuZXcgdm9yYmlzX2luZm87CisgICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfaW5mbyhtVmksICZiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfYm9va3MobVZpLCAmYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIHJldCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgdm9yYmlzX2RzcF9pbml0KG1TdGF0ZSwgbVZpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBrRGVmYXVsdFNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaS0+Y2hhbm5lbHMgIT0ga0RlZmF1bHRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0zNTksOCArNDM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewpAQCAtMzk5LDYgKzQ3NiwxNCBAQAogICAgICAgICBpbnQgbnVtRnJhbWVzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBudWxscHRyIHx8IG1WaSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkLCBpbnB1dCBkb2VzIG5vdCBoYXZlIENTRCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgaW50IGVyciA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgICAgIC8vIEZJWE1FIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBsb2cgc3BhbQpAQCAtNDQ4LDE4ICs1MzMsMTMgQEAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7CiAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKICAgICAgICAgfQogCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8gPSBOVUxMOwogICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwotCi0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKaW5kZXggMzBkMTM3Yi4uNWZmOGVhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVk9SQklTX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHZvcmJpc19kc3Bfc3RhdGU7CiBzdHJ1Y3Qgdm9yYmlzX2luZm87CkBAIC03Miw2ICs3Miw3IEBACiAgICAgdm9pZCBpbml0UG9ydHMoKTsKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBoYW5kbGVFT1MoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWb3JiaXMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDNjYTdjYzAuLjA5ODIwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCisjaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgogCiAjZGVmaW5lIFVTRV9MSUJZVVYKIApAQCAtNDEsMTcgKzQyLDE3IEBACiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgaWYgKG1Ec3RGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG1TcmNGb3JtYXQpIHsKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKwogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02MiwxNCArNjMsNDMgQEAKICAgICAgICAgdm9pZCAqYml0cywKICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAotICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSkKKyAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KQogICAgIDogbUJpdHMoYml0cyksCisgICAgICBtQ29sb3JGb3JtYXQoY29sb3JGcm9tYXQpLAogICAgICAgbVdpZHRoKHdpZHRoKSwKICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKICAgICAgIG1Dcm9wTGVmdChjcm9wTGVmdCksCiAgICAgICBtQ3JvcFRvcChjcm9wVG9wKSwKICAgICAgIG1Dcm9wUmlnaHQoY3JvcFJpZ2h0KSwKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKKyAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIG1CcHAgPSAyOworICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgIG1CcHAgPSA0OworICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgorICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgIG1CcHAgPSAxOworICAgICAgICBtU3RyaWRlID0gbVdpZHRoOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb2xvciBmb3JtYXQgJWQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICBtQnBwID0gMTsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtODksMTkgKzExOSwxNSBAQAogICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7Ci0gICAgaWYgKG1Ec3RGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KICAgICBCaXRtYXBQYXJhbXMgc3JjKAogICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KHNyY0JpdHMpLAogICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwKLSAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20pOworICAgICAgICAgICAgc3JjQ3JvcExlZnQsIHNyY0Nyb3BUb3AsIHNyY0Nyb3BSaWdodCwgc3JjQ3JvcEJvdHRvbSwgbVNyY0Zvcm1hdCk7CiAKICAgICBCaXRtYXBQYXJhbXMgZHN0KAogICAgICAgICAgICAgZHN0Qml0cywKICAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsCi0gICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tKTsKKyAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgc3RhdHVzX3QgZXJyOwogCkBAIC0yMTIsMjYgKzIzOCwxMDQgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogKHNyYy5tV2lkdGggLyAyKSArIHNyYy5tQ3JvcExlZnQgLyAyOworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiAoc3JjLm1TdHJpZGUgLyAyKSArIChzcmMubUNyb3BMZWZ0IC8gMik7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9Ci0gICAgICAgIHNyY191ICsgKHNyYy5tV2lkdGggLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOworICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKKyAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICAgICAgbGlieXV2OjpJNDIwVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKIAotICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVdpZHRoLCBzcmNfdSwgc3JjLm1XaWR0aCAvIDIsIHNyY192LCBzcmMubVdpZHRoIC8gMiwKLSAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tV2lkdGggKiAyLCBkc3QubVdpZHRoLCBkc3QubUhlaWdodCk7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FCR1IpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6CisgICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjp3cml0ZVRvRHN0KAorICAgICAgICB2b2lkICpkc3RfcHRyLCB1aW50OF90ICprQWRqdXN0ZWRDbGlwLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgeworICAgIHN3aXRjaCAobURzdEZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmdiMSA9CisgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKKworICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KKyAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOworCisgICAgICAgICAgICAqKHVpbnQzMl90ICopZHN0X3B0ciA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgeworICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQorICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IxXSkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQorICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworCisgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9CisgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IyXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgIHsKKyAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KKyAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMV0pCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IxXSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKworICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQorICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMl0pCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjJdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMApAQCAtMjQyLDE4ICszNDYsMTggQEAKIAogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogc3JjLm1IZWlnaHQKLSAgICAgICAgKyBzcmMubUNyb3BUb3AgKiAoc3JjLm1XaWR0aCAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9Ci0gICAgICAgIHNyY191ICsgKHNyYy5tV2lkdGggLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOworICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC0yOTYsMzEgKzQwMCwxOSBAQAogICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwogCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IxID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdID4+IDMpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOwotCi0gICAgICAgICAgICBpZiAoeCArIDEgPCBzcmMuY3JvcFdpZHRoKCkpIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopKCZkc3RfcHRyW3hdKSA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRzdF9wdHJbeF0gPSByZ2IxOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB1bmNyb3BwZWQgPSB4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKTsKKyAgICAgICAgICAgICh2b2lkKXdyaXRlVG9Ec3QoZHN0X3B0ciArIHggKiBkc3QubUJwcCwKKyAgICAgICAgICAgICAgICAgICAga0FkanVzdGVkQ2xpcCwgdW5jcm9wcGVkLCByMSwgZzEsIGIxLCByMiwgZzIsIGIyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwogCiAgICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBzcmMubVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IHNyYy5tU3RyaWRlIC8gMjsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciArPSBkc3QubVN0cmlkZTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbAppbmRleCBjZTE2NGEyLi44MjlmNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTM0LDIwICszNCwyMSBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+Ci0gICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNDEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzI3NjgiIC8+IDwhLS0gbWF4IDQwOTZ4MjA0OCBlcXVpdmFsZW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xOTY2MDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQ4MDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTM5MjY0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xOTY2MDgiIC8+IDwhLS0gbWF4IDQwOTZ4MzA3MiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNTYsNiArNTcsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNjQsNiArNjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNTAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CkBAIC03OSwxMCArODIsMTEgQEAKICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ0ODAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NTc2MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KQEAgLTk4LDYgKzEwMiw5IEBACiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIDIwMTYgZGV2aWNlcyBjYW4gZW5jb2RlIGF0IGFib3V0IDEwZnBzIGF0IHRoaXMgYmxvY2sgY291bnQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KQEAgLTEwNSw2ICsxMTIsOSBAQAogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPCEtLSAyMDE2IGRldmljZXMgY2FuIGVuY29kZSBhdCBhYm91dCA4ZnBzIGF0IHRoaXMgYmxvY2sgY291bnQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+IDwhLS0gbWF4IDEyODB4NzIwIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlb19sZS54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW9fbGUueG1sCmluZGV4IDAzNGEwMzguLmQ3YzY1NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlb19sZS54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvX2xlLnhtbApAQCAtMzQsMjIgKzM0LDIyIEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNTEgLS0+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxNjAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ4OTYwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ5MTUyMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDMyMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS02NTUzNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDkxNTIwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTUwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgpAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTYwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTA4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTUwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KQEAgLTgxLDEyICs4MSwxNCBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMiAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9Ijg5Nng4OTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxODA4eDE4MDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2MjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQwNTAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KQEAgLTEwMCw3ICsxMDIsOCBAQAogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAyODRjMjVmLi4xYjlmZTBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGTEFDRGVjb2Rlci5jcHAiLApAQCAtMzEsNCArMzUsNSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJtZWRpYV9oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggOTE0NjJjOC4uMjIxYWYxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMSw3ICsxLDE1IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLQorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLApAQCAtMTEsMTIgKzE5LDEzIEBACiAgICAgICAgICJpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IGNjODkwNjQuLjhmMzI1ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpIHsKICAgICBzaXplX3QgbiA9IHMuc2l6ZSgpOworCiAgICAgaWYgKChuICUgNCkgIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00NSw3ICs0Niw2IEBACiAgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKIAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7Ci0KICAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKICAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02MSw5ICs2MSw5IEBACiAgICAgICAgICAgICB2YWx1ZSA9IDI2ICsgYyAtICdhJzsKICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgewogICAgICAgICAgICAgdmFsdWUgPSA1MiArIGMgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKycpIHsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJyB8fCBjID09ICctJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MjsKLSAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IDYzOwogICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE0NCw0ICsxNDQsMjYgQEAKICAgICB9CiB9CiAKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKAorICAgICAgICBjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCkgeworICAgIGVuY29kZUJhc2U2NChfZGF0YSwgc2l6ZSwgb3V0KTsKKworICAgIGlmICgoLTEgIT0gb3V0LT5maW5kKCIrIikpIHx8ICgtMSAhPSBvdXQtPmZpbmQoIi8iKSkpIHsKKyAgICAgICAgc2l6ZV90IG91dExlbiA9IG91dC0+c2l6ZSgpOworICAgICAgICBjaGFyICpiYXNlNjR1cmwgPSBuZXcgY2hhcltvdXRMZW5dOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dExlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAob3V0LT5jX3N0cigpW2ldID09ICcrJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnLSc7CisgICAgICAgICAgICBlbHNlIGlmIChvdXQtPmNfc3RyKClbaV0gPT0gJy8nKQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9ICdfJzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSBvdXQtPmNfc3RyKClbaV07CisgICAgICAgIH0KKworICAgICAgICBvdXQtPnNldFRvKGJhc2U2NHVybCwgb3V0TGVuKTsKKyAgICAgICAgZGVsZXRlW10gYmFzZTY0dXJsOworICAgIH0KK30KKworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBlMzQwYjg5Li5hYmM5NWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjgsNiArMjgsOCBAQAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOwogdm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CiAKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEJBU0VfNjRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5tawppbmRleCBkNzQxYzZmLi5hOWUzYzc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLm1rCkBAIC05LDExICs5LDEzIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJQURhdGFfdGVzdC5jcHAgXAorCUJhc2U2NF90ZXN0LmNwcCBcCiAJRmxhZ2dlZF90ZXN0LmNwcCBcCiAJVHlwZVRyYWl0c190ZXN0LmNwcCBcCiAJVXRpbHNfdGVzdC5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJsb2cgXAogCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogCWxpYnV0aWxzIFwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9CYXNlNjRfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0Jhc2U2NF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQyODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9CYXNlNjRfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZ1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEJhc2U2NFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgdmVyaWZ5RGVjb2RlKGNvbnN0IEFTdHJpbmcqIGV4cGVjdGVkLCBjb25zdCBBU3RyaW5nKiBpbikgeworICAgIHNpemVfdCBudW1UZXN0cyA9IDA7CisgICAgd2hpbGUgKCFleHBlY3RlZFtudW1UZXN0c10uZW1wdHkoKSkKKyAgICAgICAgKytudW1UZXN0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVGVzdHM7ICsraSkgeworICAgICAgICAvLyBTaW5jZSBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgICAgIC8vIGFkZCB0aGVtIHNvIGxlbmd0aCBvZiBlbmNvZGVkIHRleHQgaXMgZXhhY3RseSBhIG11bHRpcGxlIG9mIDQuCisgICAgICAgIGludCByZW1haW5kZXIgPSBpbltpXS5zaXplKCkgJSA0OworICAgICAgICBTdHJpbmc4IHBhZGRlZFRleHQoaW5baV0uY19zdHIoKSk7CisgICAgICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgLSByZW1haW5kZXI7ICsraSkgeworICAgICAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiByZXN1bHQgPSBkZWNvZGVCYXNlNjQoQVN0cmluZyhwYWRkZWRUZXh0LnN0cmluZygpKSk7CisKKyAgICAgICAgQVNTRVJUX0VRKEFTdHJpbmdVdGlsczo6Q29tcGFyZShleHBlY3RlZFtpXS5jX3N0cigpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHJlc3VsdC0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpXS5zaXplKCksIGZhbHNlKSwgMCk7CisgICAgfQorfQorCit2b2lkIHZlcmlmeUVuY29kZShjb25zdCBBU3RyaW5nKiBleHBlY3RlZCwgY29uc3QgQVN0cmluZyogaW4pIHsKKyAgICBzaXplX3QgbnVtVGVzdHMgPSAwOworICAgIHdoaWxlICghZXhwZWN0ZWRbbnVtVGVzdHNdLmVtcHR5KCkpCisgICAgICAgICsrbnVtVGVzdHM7CisKKyAgICBBU3RyaW5nIG91dCA9IEFTdHJpbmcoIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVGVzdHM7ICsraSkgeworICAgICAgICBlbmNvZGVCYXNlNjRVcmwoaW5baV0uY19zdHIoKSwgaW5baV0uc2l6ZSgpLCAmb3V0KTsKKworICAgICAgICBBU1NFUlRfRVEoQVN0cmluZ1V0aWxzOjpDb21wYXJlKGV4cGVjdGVkW2ldLmNfc3RyKCksIG91dC5jX3N0cigpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldLnNpemUoKSwgZmFsc2UpLCAwKTsKKyAgICB9Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RGVjb2RlQmFzZTY0KSB7CisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lRIiksCisgICAgICAgIEFTdHJpbmcoIlIyOXZaQ0JrWVhraCIpLAorICAgICAgICBBU3RyaW5nKCIiKSAgLy8gc3RyaW5nIHRvIHNpZ25hbCBlbmQgb2YgYXJyYXkKKyAgICB9OworCisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kISIpLAorICAgICAgICBBU3RyaW5nKCJHb29kIGRheSEiKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RGVjb2RlKGNsZWFyVGV4dCwgYmFzZTY0KTsKK30KKworVEVTVF9GKEJhc2U2NFRlc3QsIFRlc3REZWNvZGVCYXNlNjRVcmwpIHsKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3IiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUm5KcFpXNWtJQ0VfIiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIGNvbnN0IEFTdHJpbmcgY2xlYXJUZXh0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCAhPj8iKSwKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kICE/IiksCisgICAgICAgIEFTdHJpbmcoIkhlbGxvID8+PiBGcmllbmQgPz4iKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RGVjb2RlKGNsZWFyVGV4dCwgYmFzZTY0VXJsKTsKK30KKworVEVTVF9GKEJhc2U2NFRlc3QsIFRlc3REZWNvZGVNYWxmb3JtZWRCYXNlNjQpIHsKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCIxP0dhd2dndUZ5R3JXS2F2N0FYNFZLVWciKSwgIC8vIGZhaWwgb24gcGFyc2luZworICAgICAgICBBU3RyaW5nKCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/IiksICAgIC8vIGZhaWwgb24gbGVuZ3RoIG5vdCBtdWx0aXBsZSBvZiA0CisgICAgICAgIEFTdHJpbmcoIkdhd2dndUZ5R3JXS2F2N0FYNFZLVWciKSwgICAgLy8gZGl0dG8KKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gcmVzdWx0ID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoYmFzZTY0VXJsW2ldKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlc3VsdCA9PSBudWxscHRyKTsKKyAgICB9Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RW5jb2RlQmFzZTY0KSB7CisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kISIpLAorICAgICAgICBBU3RyaW5nKCJHb29kIGRheSEiKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lRPT0iKSwKKyAgICAgICAgQVN0cmluZygiUjI5dlpDQmtZWGtoIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIHZlcmlmeUVuY29kZShiYXNlNjQsIGNsZWFyVGV4dCk7Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RW5jb2RlQmFzZTY0VXJsKSB7CisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kICE+PyIpLAorICAgICAgICBBU3RyaW5nKCJIZWxsbyBGcmllbmQgIT8iKSwKKyAgICAgICAgQVN0cmluZygiSGVsbG8gPz4+IEZyaWVuZCA/PiIpLAorICAgICAgICBBU3RyaW5nKCIiKQorICAgIH07CisKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3PT0iKSwKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lDRV8iKSwKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdQejQtSUVaeWFXVnVaQ0FfUGciKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RW5jb2RlKGJhc2U2NFVybCwgY2xlYXJUZXh0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCAwZGEyZTgxLi5mMjUzYTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKKwogLyoqCiAgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUNvZGVjLgogICovCkBAIC0xMTcsNiArMTE5LDcgQEAKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKICAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworICAgIGhpZGxfbWVtb3J5IG1IaWRsTWVtb3J5OwogCiAgICAgLy8gVGhlc2Ugc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHN0ZDo6YXRvbWljXyogZnVuY3Rpb25zLgogICAgIC8vCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0l0ZW1UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZhZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJVEVNX1RBQkxFX0hfCisjZGVmaW5lIElURU1fVEFCTEVfSF8KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIE1ldGFEYXRhOworCituYW1lc3BhY2UgaGVpZiB7CisKK3N0cnVjdCBBc3NvY2lhdGlvbkVudHJ5Oworc3RydWN0IEltYWdlSXRlbTsKK3N0cnVjdCBJdGVtTG9jOworc3RydWN0IEl0ZW1JbmZvOworc3RydWN0IEl0ZW1Qcm9wZXJ0eTsKK3N0cnVjdCBJdGVtUmVmZXJlbmNlOworCisvKgorICogSXRlbVRhYmxlIGtlZXBzIHRyYWNrIG9mIGFsbCBpbWFnZSBpdGVtcyAoaW5jbHVkaW5nIGNvZGVkIGltYWdlcywgZ3JpZHMgYW5kCisgKiB0aWxlcykgaW5zaWRlIGEgSEVJRiBzdGlsbCBpbWFnZSAoSVNPL0lFQyBGRElTIDIzMDA4LTEyLjI6MjAxNyhFKSkuCisgKi8KKworY2xhc3MgSXRlbVRhYmxlIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IHBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkOyB9CisgICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YSgpOworICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZmluZFByaW1hcnlJbWFnZSh1aW50MzJfdCAqaW1hZ2VJbmRleCk7CisgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbCh1aW50MzJfdCAqdGh1bWJuYWlsSW5kZXgpOworICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgICAgIHVpbnQzMl90ICppbWFnZUluZGV4LCBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICB+SXRlbVRhYmxlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOworICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gbUFzc29jaWF0aW9uczsKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+IG1JdGVtUHJvcGVydGllczsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiBtSXRlbVJlZmVyZW5jZXM7CisKKyAgICB1aW50MzJfdCBtUHJpbWFyeUl0ZW1JZDsKKyAgICBvZmY2NF90IG1JZGF0T2Zmc2V0OworICAgIHNpemVfdCBtSWRhdFNpemU7CisKKyAgICBzdGQ6OnNldDx1aW50MzJfdD4gbVJlcXVpcmVkQm94ZXM7CisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1Cb3hlc1NlZW47CisKKyAgICBib29sIG1JbWFnZUl0ZW1zVmFsaWQ7CisgICAgdWludDMyX3QgbUN1cnJlbnRJbWFnZUluZGV4OworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbWFnZUl0ZW0+IG1JdGVtSWRUb0ltYWdlTWFwOworCisgICAgc3RhdHVzX3QgcGFyc2VJbG9jQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJaW5mQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VQaXRtQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJcHJwQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJZGF0Qm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJcmVmQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGF0dGFjaFByb3BlcnR5KGNvbnN0IEFzc29jaWF0aW9uRW50cnkgJmFzc29jaWF0aW9uKTsKKyAgICBzdGF0dXNfdCBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKHVpbnQzMl90IHR5cGUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVRhYmxlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGhlaWYKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJVEVNX1RBQkxFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IDJhNzUyOTguLmFjOTNiNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC00NSw3ICs0NSw3IEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCBmODQ3MTE5Li5jOWQ3ZGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC0yOCwxMSArMjgsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFNhbXBsZVRhYmxlOwogY2xhc3MgU3RyaW5nODsKK25hbWVzcGFjZSBoZWlmIHsKK2NsYXNzIEl0ZW1UYWJsZTsKK30KK3VzaW5nIGhlaWY6Okl0ZW1UYWJsZTsKIAogc3RydWN0IFNpZHhFbnRyeSB7CiAgICAgc2l6ZV90IG1TaXplOwpAQCAtNTksNiArNjIsNyBAQAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzRFeHRyYWN0b3IiOyB9CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKTsKIAogICAgIC8vIGZvciBEUk0KICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pOwpAQCAtOTcsNiArMTAxLDcgQEAKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIHVpbnQzMl90IG1IZWFkZXJUaW1lc2NhbGU7CiAgICAgYm9vbCBtSXNRVDsKKyAgICBib29sIG1Jc0hFSUY7CiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwogCkBAIC0xMzQsNiArMTM5LDggQEAKICAgICBTSU5GICptRmlyc3RTSU5GOwogCiAgICAgYm9vbCBtSXNEcm07CisgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOworCiAgICAgc3RhdHVzX3QgcGFyc2VEcm1TSU5GKG9mZjY0X3QgKm9mZnNldCwgb2ZmNjRfdCBkYXRhX29mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZVRyYWNrSGVhZGVyKG9mZjY0X3QgZGF0YV9vZmZzZXQsIG9mZjY0X3QgZGF0YV9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggYjdhYzcxOC4uMjc3ZWIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTM4LDkgKzM4LDkgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgVmlkZW9GcmFtZSAqZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOworICAgIHZpcnR1YWwgVmlkZW9GcmFtZSAqZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0ICpleHRyYWN0QWxidW1BcnQoKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IGQwNDlkZjUuLjQyNDI0NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgpAQCAtMzAsNiArMzEsOCBAQAogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KICNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogCiAjZGVmaW5lIFRSQUNLX0JVRkZFUl9USU1JTkcgICAgIDAKIApAQCAtNDIsMjAgKzQ1LDYgQEAKIHN0cnVjdCBEZXNjcmliZUNvbG9yRm9ybWF0MlBhcmFtczsKIHN0cnVjdCBEYXRhQ29udmVydGVyOwogCi0vLyBUcmVibGUgc2hhcmVkIG1lbW9yeQotbmFtZXNwYWNlIGhpZGwgewotbmFtZXNwYWNlIGFsbG9jYXRvciB7Ci1uYW1lc3BhY2UgVjFfMCB7Ci1zdHJ1Y3QgSUFsbG9jYXRvcjsKLX0gLy8gVjFfMAotfSAvLyBhbGxvY2F0b3IKLW5hbWVzcGFjZSBtZW1vcnkgewotbmFtZXNwYWNlIFYxXzAgewotc3RydWN0IElNZW1vcnk7Ci19IC8vIFYxXzAKLX0gLy8gbWVtb3J5Ci19IC8vIGhpZGwKLQogdHlwZWRlZiBoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3IgVEFsbG9jYXRvcjsKIHR5cGVkZWYgaGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5IFRNZW1vcnk7CiAKQEAgLTcyLDkgKzYxLDEwIEBACiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgQVN0cmluZyAmbWltZSwgYm9vbCBpc0VuY29kZXIsCi0gICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiAqY2Fwcyk7CisgICAgc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAorICAgICAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2Fwcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogCkBAIC05NCw3ICs4NCw4IEBACiAgICAgLy8gc29tZSBPTVggY29tcG9uZW50cyBhcyBhdXRvIGxldmVsLCBhbmQgYnkgb3RoZXJzIGFzIGludmFsaWQgbGV2ZWwuCiAgICAgc3RhdGljIGludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIGdldEFWQ0xldmVsRm9yKAogICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCi0gICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworICAgICAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVFWFRUWVBFIHByb2ZpbGUgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fQVZDUFJPRklMRUVYVFRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSk7CiAKICAgICAvLyBRdWlyayBzdGlsbCBzdXBwb3J0ZWQsIGV2ZW4gdGhvdWdoIGRlcHJlY2F0ZWQKICAgICBlbnVtIFF1aXJrcyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAppbmRleCAyYWFhODg0Li5kNjE0OWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKaW5kZXggMGRkNzdiYS4uOTE5N2Y3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCkBAIC0yNCwyNyArMjQsMzEgQEAKIAogI2RlZmluZSBTVFJJTkdJRllfRU5VTVMKIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogY2xhc3MgQnVmZmVyQ2hhbm5lbEJhc2U7CiBzdHJ1Y3QgQnVmZmVyUHJvZHVjZXJXcmFwcGVyOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKIHN0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIHN0cnVjdCBSZW5kZXJlZEZyYW1lSW5mbzsKIGNsYXNzIFN1cmZhY2U7CitzdHJ1Y3QgSUNyeXB0bzsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgQ29kZWNCYXNlIDogcHVibGljIEFIYW5kbGVyLCAvKiBzdGF0aWMgKi8gQ29sb3JVdGlscyB7CiAgICAgLyoqCkBAIC0yMDksMTAgKzIxMyw2IEBACiAgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBjb25zdCBBU3RyaW5nJiAvKm5hbWUqLywgY29uc3QgQVN0cmluZyYgLyptaW1lKi8sIGJvb2wgLyppc0VuY29kZXIqLywKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+KiAvKmNhcHMqLyAvKiBub25udWxsICovKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiAvKnN1cmZhY2UqLykgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpID0gMDsKQEAgLTI1NiwxMyArMjU2LDkgQEAKICAgICAgICAgbUNhbGxiYWNrID0gc3RkOjptb3ZlKGNhbGxiYWNrKTsKICAgICB9CiAKLSAgICBpbmxpbmUgdm9pZCBzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgewotICAgICAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIH0KKyAgICB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKTsKIAotICAgIGlubGluZSB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7Ci0gICAgICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOwotICAgIH0KKyAgICB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKTsKIAogICAgIC8qKgogICAgICAqIFF1ZXVlIGFuIGlucHV0IGJ1ZmZlciBpbnRvIHRoZSBidWZmZXIgY2hhbm5lbC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCAyNzBjODA5Li43YWM5YjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC00OSwxNCArNDksMTcgQEAKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAogICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAotICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKKyAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CiAKICAgICAgICAgc2l6ZV90IGNyb3BXaWR0aCgpIGNvbnN0OwogICAgICAgICBzaXplX3QgY3JvcEhlaWdodCgpIGNvbnN0OwogCiAgICAgICAgIHZvaWQgKm1CaXRzOworICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtQ29sb3JGb3JtYXQ7CiAgICAgICAgIHNpemVfdCBtV2lkdGgsIG1IZWlnaHQ7CiAgICAgICAgIHNpemVfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKKyAgICAgICAgc2l6ZV90IG1CcHAsIG1TdHJpZGU7CiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CkBAIC04Miw2ICs4NSwxMCBAQAogICAgIHN0YXR1c190IGNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgdm9pZCB3cml0ZVRvRHN0KHZvaWQgKmRzdF9wdHIsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAsIGJvb2wgdW5jcm9wcGVkLAorICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpOworCiAgICAgQ29sb3JDb252ZXJ0ZXIoY29uc3QgQ29sb3JDb252ZXJ0ZXIgJik7CiAgICAgQ29sb3JDb252ZXJ0ZXIgJm9wZXJhdG9yPShjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IDYzZWNjZWEuLmJkODYzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC03Myw2ICs3MywxMSBAQAogICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7CiAgICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KTsKIAorICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KKyAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKTsKKyAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKTsKKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKTsKKwogICAgIC8vIFJlYWRzIGluICJjb3VudCIgZW50cmllcyBvZiB0eXBlIFQgaW50byB2ZWN0b3IgKnguCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmICJjb3VudCIgZW50cmllcyBjYW4gYmUgcmVhZC4KICAgICAvLyBJZiBmZXdlciB0aGFuICJjb3VudCIgZW50cmllcyBjYW4gYmUgcmVhZCwgcmV0dXJuIGZhbHNlLiBJbiB0aGlzIGNhc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaAppbmRleCAwNDQ2OTljLi5jMTQ3NTVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmgKQEAgLTIzLDYgKzIzLDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAKICNpbmNsdWRlIDxsaXN0PgogCkBAIC0zMCw5ICszMiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRmVuY2U7Ci1jbGFzcyBHcmFwaGljQnVmZmVyOwotCiAvLyBUcmFja3MgdGhlIHJlbmRlciBpbmZvcm1hdGlvbiBhYm91dCBhIGZyYW1lLiBGcmFtZXMgZ28gdGhyb3VnaCBzZXZlcmFsIHN0YXRlcyB3aGlsZQogLy8gdGhlIHJlbmRlciBpbmZvcm1hdGlvbiBpcyB0cmFja2VkOgogLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCBkZDM1N2NjLi4xYzdiNGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0yMDQsNyArMjA0LDEwIEBACiAgICAgdm9pZCBsb2NrKCk7CiAgICAgdm9pZCB1bmxvY2soKTsKIAotICAgIHZvaWQgaW5pdEludGVybmFsKGludCBmZCk7CisgICAgLy8gSW5pdCBhbGwgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgZWFjaCByZWNvcmRpbmcgc2Vzc2lvbi4gU29tZSB2YXJpYWJsZXMKKyAgICAvLyB3aWxsIG9ubHkgbmVlZCB0byBiZSBzZXQgZm9yIHRoZSBmaXJzdCByZWNvcmRpbmcgc2Vzc2lvbiBhbmQgdGhleSB3aWxsIHN0YXkKKyAgICAvLyB0aGUgc2FtZSBhY3Jvc3MgYWxsIHRoZSByZWNvcmRpbmcgc2Vzc2lvbnMuCisgICAgdm9pZCBpbml0SW50ZXJuYWwoaW50IGZkLCBib29sIGlzRmlyc3RTZXNzaW9uKTsKIAogICAgIC8vIEFjcXVpcmUgbG9jayBiZWZvcmUgY2FsbGluZyB0aGVzZSBtZXRob2RzCiAgICAgb2ZmNjRfdCBhZGRTYW1wbGVfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggNDE0MDI2Ni4uMTAzMDQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTQ3LDEwICs0NywxMyBAQAogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKIGNsYXNzIFN1cmZhY2U7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgTWVkaWFDb2RlYyA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBDb25maWd1cmVGbGFncyB7CkBAIC04NCwxMSArODcsNiBAQAogCiAgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKCk7CiAKLSAgICAvLyB1dGlsaXR5IG1ldGhvZCB0byBxdWVyeSBjYXBhYmlsaXRpZXMKLSAgICBzdGF0aWMgc3RhdHVzX3QgUXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICpjYXBzIC8qIG5vbm51bGwgKi8pOwotCiAgICAgc3RhdHVzX3QgY29uZmlndXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmbmF0aXZlV2luZG93LApAQCAtMzE2LDYgKzMxNCw4IEBACiAgICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKIAogICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgdm9pZCBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgIHZvaWQgZmx1c2hBbmFseXRpY3NJdGVtKCk7CiAKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCmluZGV4IDQzMGJjMTYuLmYyYmQ0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTM2LDYgKzM1LDggQEAKIAogc3RydWN0IEFNZXNzYWdlOwogCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTsKKwogc3RydWN0IE1lZGlhQ29kZWNMaXN0IDogcHVibGljIEJuTWVkaWFDb2RlY0xpc3QgewogICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldEluc3RhbmNlKCk7CiAKQEAgLTUxLDcgKzUyLDcgQEAKICAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQ1MTI3Iik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1Db2RlY0luZm9zW2luZGV4XTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGNvbnN0IHNwPEFNZXNzYWdlPiBnZXRHbG9iYWxTZXR0aW5ncygpIGNvbnN0OwpAQCAtNjIsOSArNjMsNiBAQAogICAgIC8vIG9ubHkgdG8gYmUgdXNlZCBieSBnZXRMb2NhbEluc3RhbmNlCiAgICAgc3RhdGljIHZvaWQgKnByb2ZpbGVyVGhyZWFkV3JhcHBlcih2b2lkICogLyphcmcqLyk7CiAKLSAgICAvLyBvbmx5IHRvIGJlIHVzZWQgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlCi0gICAgdm9pZCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7Ci0KICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAga1ByZWZlclNvZnR3YXJlQ29kZWNzICAgPSAxLAogICAgICAgICBrSGFyZHdhcmVDb2RlY3NPbmx5ICAgICA9IDIsCkBAIC03NCwxMyArNzIsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsCiAgICAgICAgICAgICBib29sIGNyZWF0ZUVuY29kZXIsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hpbmcpOwotCi0gICAgc3RhdGljIHVpbnQzMl90IGdldFF1aXJrc0Zvcihjb25zdCBjaGFyICptQ29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoaW5nQ29kZWNzLAorICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICpvd25lcnMgPSBudWxscHRyKTsKIAogICAgIHN0YXRpYyBib29sIGlzU29mdHdhcmVDb2RlYyhjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKTsKIAotCiBwcml2YXRlOgogICAgIGNsYXNzIEJpbmRlckRlYXRoT2JzZXJ2ZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgICAgICB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyBfX3VudXNlZCk7CkBAIC04OCw2NCArODQsODYgQEAKIAogICAgIHN0YXRpYyBzcDxCaW5kZXJEZWF0aE9ic2VydmVyPiBzQmluZGVyRGVhdGhPYnNlcnZlcjsKIAotICAgIGVudW0gU2VjdGlvbiB7Ci0gICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCi0gICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUiwKLSAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fSU5DTFVERSwKLSAgICB9OwotCiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247Ci0gICAgYm9vbCBtVXBkYXRlOwotICAgIFZlY3RvcjxTZWN0aW9uPiBtUGFzdFNlY3Rpb25zOwotICAgIGludDMyX3QgbURlcHRoOwotICAgIEFTdHJpbmcgbUhyZWZCYXNlOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1HbG9iYWxTZXR0aW5nczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBtT3ZlcnJpZGVzOworICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPiA+IG1Db2RlY0luZm9zOwogCi0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPiA+IG1Db2RlY0luZm9zOwotICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBtQ3VycmVudEluZm87CisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciB3aWxsIGNhbGwgYGJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAgZnJvbSB0aGUgZ2l2ZW4KKyAgICAgKiBgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZWAgb2JqZWN0LgorICAgICAqLworICAgIE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UqIGJ1aWxkZXIpOwogCi0gICAgTWVkaWFDb2RlY0xpc3QoKTsKICAgICB+TWVkaWFDb2RlY0xpc3QoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogCi0gICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBNZWRpYUNvZGVjTGlzdChjb25zdCBNZWRpYUNvZGVjTGlzdCYpID0gZGVsZXRlOworICAgIE1lZGlhQ29kZWNMaXN0JiBvcGVyYXRvcj0oY29uc3QgTWVkaWFDb2RlY0xpc3QmKSA9IGRlbGV0ZTsKIAotICAgIHN0YXRpYyB2b2lkIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSk7CisgICAgZnJpZW5kIE1lZGlhQ29kZWNMaXN0V3JpdGVyOworfTsKIAotICAgIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSk7CisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgdXNlZCBieSBhIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBpbnN0YW5jZSB0byBhZGQKKyAqIGluZm9ybWF0aW9uIHRvIHRoZSBhc3NvY2lhdGVkIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0LgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RXcml0ZXIgeworICAgIC8qKgorICAgICAqIEFkZCBhIGtleS12YWx1ZSBwYWlyIHRvIGEgYE1lZGlhQ29kZWNMaXN0YCdzIGdsb2JhbCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5LgorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZS4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEdsb2JhbFNldHRpbmcoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGFkZCBhIG5ldyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCB0byBhIGBNZWRpYUNvZGVjTGlzdGAsIGFuZAorICAgICAqIHJldHVybiBhIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3bHkgYWRkZWQKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9gLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseQorICAgICAqIGFkZGVkIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgorICAgICAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYWRkTWVkaWFDb2RlY0luZm8oKTsKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogVGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCisgICAgICovCisgICAgTWVkaWFDb2RlY0xpc3QqIG1MaXN0OwogCi0gICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhpcyB3cml0ZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYE1lZGlhQ29kZWNMaXN0YAorICAgICAqIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0IFRoZSAiYmFzZSIgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCisgICAgICovCisgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXIoTWVkaWFDb2RlY0xpc3QqIGxpc3QpOwogCi0gICAgdm9pZCBzZXRDdXJyZW50Q29kZWNJbmZvKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSk7CisgICAgZnJpZW5kIE1lZGlhQ29kZWNMaXN0OworfTsKIAotICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSB1c2VkIGJ5IGBNZWRpYUNvZGVjTGlzdGAgdG8gZmlsbCBpdHMgbWVtYmVycyB3aXRoCisgKiBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbi4gYGJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAgd2lsbCBiZSBjYWxsZWQgZnJvbSBhCisgKiBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdCBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4KKyAqLworc3RydWN0IE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSBgTWVkaWFDb2RlY0xpc3RgIHZpYSB0aGUgZ2l2ZW4gYE1lZGlhQ29kZWNMaXN0V3JpdGVyYCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGUgY29uc3RydWN0aW9uLiBgTk9fRVJST1JgIG1lYW5zIHN1Y2Nlc3MuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpID0gMDsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjTGlzdCk7CisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICovCisgICAgdmlydHVhbCB+TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSgpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAppbmRleCAyZTY2M2VjLi42YTVjNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCkBAIC03OSw2ICs3OSwyNiBAQAogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAogCisgICAgLy8gQ0FTLXJlbGF0ZWQgZXJyb3IgY29kZXMKKyAgICBDQVNfRVJST1JfQkFTRSA9IC00MDAwLAorCisgICAgRVJST1JfQ0FTX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFLAorICAgIEVSUk9SX0NBU19OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfQ0FTX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0NBU19ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBDQVNfRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfQ0FTX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9DQVNfQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0NBU19UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9DQVNfREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0NBU19SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0NBU19JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBDQVNfRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0NBU19MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDExLAorCisgICAgRVJST1JfQ0FTX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0NBU19WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDk5OSwKKwogICAgIC8vIE5ESyBFcnJvciBjb2RlcwogICAgIC8vIGZyYW1ld29ya3MvYXYvaW5jbHVkZS9uZGsvTmRrTWVkaWFFcnJvci5oCiAgICAgLy8gZnJvbSAtMTAwMDAgKDB4RkZGRkQ4RjAgLSAweEZGRkZEOEVDKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCmluZGV4IGE4NTZiMmIuLjZlYzdlYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKQEAgLTIzLDEwICsyMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKIGNsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZXRhRGF0YTsKQEAgLTcwLDEyICs2NiwxNCBAQAogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IC8qdWlkKi8pIHsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiYgLypjYXMqLykgb3ZlcnJpZGUgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICYvKmNhc1Rva2VuKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KIAorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkge30KKwogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCA5Njc2Yjk3Li42Y2ZkZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KICAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAogICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAorICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAorICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKIAogICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQogICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKQEAgLTU4LDYgKzYwLDcgQEAKICAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQogICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCkBAIC0yMDksNiArMjEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgogICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQogICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAorCisgICAga0tleUdyaWRXaWR0aCAgICAgICAgPSAnZ3JkVycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCB3aWR0aAorICAgIGtLZXlHcmlkSGVpZ2h0ICAgICAgID0gJ2dyZEgnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgaGVpZ2h0CisgICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJpZmlsZSBkYXRhCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggM2UzY2MxNy4uNmE5M2JkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTI4LDEwICsyOCw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotfQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKQEAgLTY0LDcgKzYwLDcgQEAKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFzb3VyY2UpOwogCi0gICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcyk7CisgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwpAQCAtMTE1LDcgKzExMSw3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAKICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IG1JbXBsOwotICAgIHNwPElDYXM+IG1DYXM7CisgICAgSEludGVyZmFjZVRva2VuIG1DYXNUb2tlbjsKIAogICAgIFZlY3RvcjxUcmFja0luZm8+IG1TZWxlY3RlZFRyYWNrczsKICAgICBpbnQ2NF90IG1Ub3RhbEJpdHJhdGU7ICAvLyBpbiBiaXRzL3NlYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmgKaW5kZXggMjAzYTE4MS4uMmYxNTliMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oCkBAIC0yOCw5ICsyOCwxMCBAQAogCiAgICAgc3RhdHVzX3QgY29ubmVjdCgpOwogICAgIHN0YXR1c190IGNvbm5lY3QoYm9vbCogdHJlYmxlRmxhZyk7CisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBjaGFyKiBuYW1lLCBib29sKiB0cmVibGVGbGFnID0gbnVsbHB0cik7CiAKICAgICBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KCk7Ci0gICAgc3RhdHVzX3QgY29ubmVjdFRyZWJsZSgpOworICAgIHN0YXR1c190IGNvbm5lY3RUcmVibGUoY29uc3QgY2hhciogbmFtZSA9ICJkZWZhdWx0Iik7CiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICBzcDxJT01YPiBpbnRlcmZhY2UoKSB7CkBAIC00MCw4ICs0MSw4IEBACiBwcml2YXRlOgogICAgIHNwPElPTVg+IG1PTVg7CiAKLSAgICBPTVhDbGllbnQoY29uc3QgT01YQ2xpZW50ICYpOwotICAgIE9NWENsaWVudCAmb3BlcmF0b3I9KGNvbnN0IE9NWENsaWVudCAmKTsKKyAgICBPTVhDbGllbnQoY29uc3QgT01YQ2xpZW50ICYpID0gZGVsZXRlOworICAgIE9NWENsaWVudCAmb3BlcmF0b3I9KGNvbnN0IE9NWENsaWVudCAmKSA9IGRlbGV0ZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGRybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAppbmRleCBmZGY5OWViLi4xYjRkODczIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaApAQCAtMTQsMTQgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaWZuZGVmIE9NWF9JTkZPX0JVSUxERVJfSF8KKyNkZWZpbmUgT01YX0lORk9fQlVJTERFUl9IXwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyYW1ibGVyOworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElEZXNjcmFtYmxlciB7Ci0gICAgdm9pZCBzZXRNZWRpYUNhc1Nlc3Npb24oaW4gYnl0ZVtdIHNlc3Npb25JZCk7Ci0gICAgYm9vbGVhbiByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoU3RyaW5nIG1pbWUpOwotICAgIGludCBkZXNjcmFtYmxlKGluIE1lZGlhRGVzY3JhbWJsZXIuRGVzY3JhbWJsZUluZm8gZGVzY3JhbWJsZUluZm8pOwotICAgIHZvaWQgcmVsZWFzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgT214SW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CitwdWJsaWM6CisgICAgT214SW5mb0J1aWxkZXIoKTsKKyAgICBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfSU5GT19CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAppbmRleCBkMzhjMzM3Li5kMTY3N2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAKLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIAogI2luY2x1ZGUgImZvdW5kYXRpb24vQUJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IDg4YTQxNmEuLjc3Y2JkNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTk1LDcgKzk1LDcgQEAKIHZvaWQgcmVhZEZyb21BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgQnVmZmVyaW5nU2V0dGluZ3MgKmJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKIAogQVN0cmluZyBuYW1lRm9yRmQoaW50IGZkKTsKLQordm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpOwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBVVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDMxZWRiMjEuLmEyNTZhNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDEsOCArNDEsMTIgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXVzaW5nIE1lZGlhRGVzY3JhbWJsZXI6OkRlc2NyYW1ibGVJbmZvOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMjAzLDYgKzIwNyw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwogICAgIHNwPElNZW1vcnk+IG1NZW07CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKQEAgLTIzNSw3ICsyNDAsNyBAQAogCiAgICAgLy8gRW5zdXJlIGludGVybmFsIGJ1ZmZlcnMgY2FuIGhvbGQgc3BlY2lmaWVkIHNpemUsIGFuZCB3aWxsIHJlLWFsbG9jYXRlCiAgICAgLy8gYXMgbmVlZGVkLgotICAgIHZvaWQgZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IHNpemUpOworICAgIGJvb2wgZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IHNpemUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyZWFtKTsKIH07CkBAIC04MDcsOSArODEyLDkgQEAKICAgICBtUXVldWUgPSBOVUxMOwogfQogCi12b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgeworYm9vbCBBVFNQYXJzZXI6OlN0cmVhbTo6ZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IG5lZWRlZFNpemUpIHsKICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMICYmIG1CdWZmZXItPmNhcGFjaXR5KCkgPj0gbmVlZGVkU2l6ZSkgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIEFMT0dWKCJlbnN1cmVCdWZmZXJDYXBhY2l0eTogY3VycmVudCBzaXplICV6dSwgbmV3IHNpemUgJXp1LCBzY3JhbWJsZWQgJWQiLApAQCAtODM3LDYgKzg0MiwyNiBAQAogICAgICAgICBtTWVtID0gbmV3TWVtOwogICAgICAgICBtRGVhbGVyID0gbmV3RGVhbGVyOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CisKKyAgICAgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgICAgIGlmICghbmF0aXZlSGFuZGxlKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZmFpbGVkIHRvIGNyZWF0ZSBuYXRpdmUgaGFuZGxlIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGhlYXAtPmdldEhlYXBJRCgpOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuaGVhcEJhc2UgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwKKyAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOworCisgICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgb2Zmc2V0ICV6ZCwgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBvZmZzZXQsIHNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTg1MCw2ICs4NzUsNyBAQAogICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCkBAIC05MjMsNyArOTQ5LDkgQEAKICAgICB9CiAKICAgICBzaXplX3QgbmVlZGVkU2l6ZSA9IG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDg7Ci0gICAgZW5zdXJlQnVmZmVyQ2FwYWNpdHkobmVlZGVkU2l6ZSk7CisgICAgaWYgKCFlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KIAogICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksIGJyLT5kYXRhKCksIHBheWxvYWRTaXplQml0cyAvIDgpOwogICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDgpOwpAQCAtMTM2NSw0NyArMTM5Myw1OSBAQAogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKICAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOwogCi0gICAgICAgIHNwPEFCdWZmZXI+IHN1YlNhbXBsZXMgPSBuZXcgQUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBzaXplb2YoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSkgKiBkZXNjcmFtYmxlU3ViU2FtcGxlcyk7Ci0KLSAgICAgICAgRGVzY3JhbWJsZUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5kc3RUeXBlID0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXI7Ci0gICAgICAgIGluZm8uc2NyYW1ibGluZ0NvbnRyb2wgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sKXNjdHJsOwotICAgICAgICBpbmZvLm51bVN1YlNhbXBsZXMgPSBkZXNjcmFtYmxlU3ViU2FtcGxlczsKLSAgICAgICAgaW5mby5zdWJTYW1wbGVzID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKilzdWJTYW1wbGVzLT5kYXRhKCk7Ci0gICAgICAgIGluZm8uc3JjTWVtID0gbU1lbTsKLSAgICAgICAgaW5mby5zcmNPZmZzZXQgPSAwOwotICAgICAgICBpbmZvLmRzdFB0ciA9IE5VTEw7IC8vIGluLXBsYWNlIGRlc2NyYW1ibGluZyBpbnRvIHNyY01lbQotICAgICAgICBpbmZvLmRzdE9mZnNldCA9IDA7CisgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gc3ViU2FtcGxlczsKKyAgICAgICAgc3ViU2FtcGxlcy5yZXNpemUoZGVzY3JhbWJsZVN1YlNhbXBsZXMpOwogCiAgICAgICAgIGludDMyX3QgaSA9IDA7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TdWJTYW1wbGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN1YlNhbXBsZXMuZW5kKCkgJiYgaSA8IGRlc2NyYW1ibGVTdWJTYW1wbGVzOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmIChpdC0+dHJhbnNwb3J0X3NjcmFtYmxpbmdfbW9kZSAhPSAwIHx8IHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSAwOwotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSAwOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzcmNPZmZzZXQgPSAwLCBkc3RPZmZzZXQgPSAwOwogICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgIGlmIChwZXNTY3JhbWJsaW5nQ29udHJvbCAhPSAwKSB7Ci0gICAgICAgICAgICBpbmZvLnNyY09mZnNldCA9IGluZm8uZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OwotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzWzBdLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBzcmNPZmZzZXQgPSBkc3RPZmZzZXQgPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBzdWJTYW1wbGVzWzBdLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKGluZm8sICZyZXN1bHQpOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKIAotICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgZXhjZXB0aW9uQ29kZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpKTsKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBtRGVzY3JhbWJsZXJTcmNCdWZmZXI7CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIChTY3JhbWJsaW5nQ29udHJvbCkgc2N0cmwsCisgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0LAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZieXRlc1dyaXR0ZW4sICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcyIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXN1bHQpOworICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwogICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDM3NGUwMTEuLjQxYzE5Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjksMTEgKzI5LDEzIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLWNsYXNzIElEZXNjcmFtYmxlcjsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSUNhczsKK319fQordXNpbmcgaGFyZHdhcmU6OmNhczo6VjFfMDo6SUNhczsKKwogY2xhc3MgQUJpdFJlYWRlcjsKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggOTZlYjViZi4uMjEyNTljNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMzUsNSArMzUsOCBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKaW5kZXggMDQ3YjFiMy4uOWZmNDUyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCkBAIC0xOCwxNSArMTgsMTkgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ2FzTWFuYWdlciIKICNpbmNsdWRlICJDYXNNYW5hZ2VyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JTWVkaWFDYXNTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpDYXNNYW5hZ2VyOjpQcm9ncmFtQ2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBQcm9ncmFtQ2FzTWFuYWdlcih1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IpOwpAQCAtMTI1LDQ1ICsxMjksNjAgQEAKICAgICAgICAgIGNvbnN0IHNwPElDYXM+JiBjYXMsCiAgICAgICAgICBQaWRUb1Nlc3Npb25NYXAgJnNlc3Npb25NYXAsCiAgICAgICAgICBDYXNTZXNzaW9uICpzZXNzaW9uKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIHNwPElCaW5kZXI+IGNhc1NlcnZpY2VCaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FzIikpOwotICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPQotICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ2FzU2VydmljZT4oY2FzU2VydmljZUJpbmRlcik7Ci0KKyAgICBzcDxJTWVkaWFDYXNTZXJ2aWNlPiBjYXNTZXJ2aWNlID0gSU1lZGlhQ2FzU2VydmljZTo6Z2V0U2VydmljZSgiZGVmYXVsdCIpOwogICAgIGlmIChjYXNTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU1lZGlhQ2FzU2VydmljZSIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXI7CisgICAgc3A8SURlc2NyYW1ibGVyQmFzZT4gZGVzY3JhbWJsZXJCYXNlOworICAgIFJldHVybjxTdGF0dXM+IHJldHVyblN0YXR1cyhTdGF0dXM6Ok9LKTsKKyAgICBSZXR1cm48c3A8SURlc2NyYW1ibGVyQmFzZT4gPiByZXR1cm5EZXNjcmFtYmxlcihOVUxMKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CiAgICAgY29uc3QgQ0FEZXNjcmlwdG9yICZkZXNjcmlwdG9yID0gc2Vzc2lvbi0+bUNBRGVzY3JpcHRvcjsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBjYXMtPm9wZW5TZXNzaW9uKCZzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gc2Vzc2lvbjogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICBhdXRvIHJldHVyblZvaWQgPSBjYXMtPm9wZW5TZXNzaW9uKAorICAgICAgICAgICAgWyZzdGF0dXMsICZzZXNzaW9uSWRdIChTdGF0dXMgX3N0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIF9zZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IF9zZXNzaW9uSWQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgY2FzLT5zZXRTZXNzaW9uUHJpdmF0ZURhdGEoc2Vzc2lvbklkLCBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YSk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHByaXZhdGUgZGF0YTogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5TdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpLCAoU3RhdHVzKXJldHVyblN0YXR1cyk7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIAotICAgIHN0YXR1cyA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlELCAmZGVzY3JhbWJsZXIpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCBkZXNjcmFtYmxlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRlc2NyYW1ibGVyOiA6IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgcmV0dXJuRGVzY3JhbWJsZXIgPSBjYXNTZXJ2aWNlLT5jcmVhdGVEZXNjcmFtYmxlcihkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisgICAgaWYgKCFyZXR1cm5EZXNjcmFtYmxlci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICByZXR1cm5EZXNjcmFtYmxlci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBnb3RvIGxfZmFpbDsKKyAgICB9CisgICAgZGVzY3JhbWJsZXJCYXNlID0gKHNwPElEZXNjcmFtYmxlckJhc2U+KSByZXR1cm5EZXNjcmFtYmxlcjsKKyAgICBpZiAoZGVzY3JhbWJsZXJCYXNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IG51bGwgcHRyIik7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIAotICAgIHN0YXR1cyA9IGRlc2NyYW1ibGVyLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGRlc2NyYW1ibGVyOiA6IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgcmV0dXJuU3RhdHVzID0gZGVzY3JhbWJsZXJCYXNlLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGRlc2NyYW1ibGVyOiA6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpIHJldHVyblN0YXR1cyk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKworICAgIGRlc2NyYW1ibGVyID0gSURlc2NyYW1ibGVyOjpjYXN0RnJvbShkZXNjcmFtYmxlckJhc2UpOworICAgIGlmIChkZXNjcmFtYmxlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY2FzdCBmcm9tIElEZXNjcmFtYmxlckJhc2UgdG8gSURlc2NyYW1ibGVyIik7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIApAQCAtMTc3LDggKzE5Niw4IEBACiAgICAgaWYgKCFzZXNzaW9uSWQuZW1wdHkoKSkgewogICAgICAgICBjYXMtPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KLSAgICBpZiAoZGVzY3JhbWJsZXIgIT0gTlVMTCkgewotICAgICAgICBkZXNjcmFtYmxlci0+cmVsZWFzZSgpOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBkZXNjcmFtYmxlckJhc2UtPnJlbGVhc2UoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CkBAIC0zMTYsMTEgKzMzNSwxMiBAQAogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBNZWRpYUNhczo6UGFyY2VsYWJsZUNhc0RhdGEgZWNtKGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiBlY207CisgICAgZWNtLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7CisgICAgYXV0byByZXR1cm5TdGF0dXMgPSBtSUNhcy0+cHJvY2Vzc0VjbShtQ0FQaWRUb1Nlc3Npb25JZE1hcFtpbmRleF0sIGVjbSk7CisgICAgaWYgKCFyZXR1cm5TdGF0dXMuaXNPaygpIHx8IChTdGF0dXMpIHJldHVyblN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJvY2VzcyBFQ006IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpIHJldHVyblN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOyAvLyBoYW5kbGVkCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCmluZGV4IDgwODhkZWMuLjgxZjY1NDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCkBAIC0yMSwxMCArMjEsMTMgQEAKICNpbmNsdWRlIDxzZXQ+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfQorbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQ2FzTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggYzNmMTI3NC4uOWQ2ODRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0zOCw4ICszOCwxMyBAQAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKQEAgLTE1Niw3ICsxNjEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIHsKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbi5kYXRhKCksIGNhc1Rva2VuLnNpemUoKSk7CisgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKICAgICBBTE9HRCgic2V0TWVkaWFDYXM6ICVwIiwgY2FzLmdldCgpKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPnNldE1lZGlhQ2FzKGNhcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggNzg5Mzc5YS4uZmU1MDY1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMTksMjAgKzE5LDE5IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLSNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaD4KIAotI2luY2x1ZGUgIi4uL09NWFV0aWxzLmgiCi0jaW5jbHVkZSAiLi4vT01YTWFzdGVyLmgiCi0jaW5jbHVkZSAiLi4vR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSAiV09teE5vZGUuaCIKLSNpbmNsdWRlICJXT214T2JzZXJ2ZXIuaCIKLSNpbmNsdWRlICJXR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgiCi0jaW5jbHVkZSAiV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCi0KLSNpbmNsdWRlICJPbXguaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTExNSwxNSArMTE0LDIzIEBACiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgICAgIGluc3RhbmNlLT5zZXRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8QVN0cmluZz4gcXVpcmtWZWN0b3I7Ci0gICAgICAgIGlmIChtUGFyc2VyLmdldFF1aXJrcyhuYW1lLmNfc3RyKCksICZxdWlya1ZlY3RvcikgPT0gT0spIHsKKworICAgICAgICAvLyBGaW5kIHF1aXJrcyBmcm9tIG1QYXJzZXIKKyAgICAgICAgY29uc3QgYXV0byYgY29kZWMgPSBtUGFyc2VyLmdldENvZGVjTWFwKCkuZmluZChuYW1lLmNfc3RyKCkpOworICAgICAgICBpZiAoY29kZWMgPT0gbVBhcnNlci5nZXRDb2RlY01hcCgpLmNlbmQoKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gb2J0YWluIHF1aXJrcyBmb3Igb214IGNvbXBvbmVudCAiCisgICAgICAgICAgICAgICAgICAgICInIiA8PCBuYW1lLmNfc3RyKCkgPDwgIicgIgorICAgICAgICAgICAgICAgICAgICAiZnJvbSBYTUwgZmlsZXMiOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoY29uc3QgQVN0cmluZyBxdWlyayA6IHF1aXJrVmVjdG9yKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewogICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKKyAgICAgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewotICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5zdGFuY2UtPnNldFF1aXJrcyhxdWlya3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAppbmRleCAwZTM3YWY5Li40NDdhZjZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcApAQCAtMTksOCArMTksOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJPbXhTdG9yZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTI5LDI0ICszMCw4NyBAQAogbmFtZXNwYWNlIFYxXzAgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAotT214U3RvcmU6Ok9teFN0b3JlKCkgeworT214U3RvcmU6Ok9teFN0b3JlKAorICAgICAgICBjb25zdCBjaGFyKiBvd25lciwKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCisgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKSB7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyKHNlYXJjaERpcnMsCisgICAgICAgICAgICBtYWluWG1sTmFtZSwKKyAgICAgICAgICAgIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgICAgIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKKyAgICBtUGFyc2luZ1N0YXR1cyA9IHRvU3RhdHVzKHBhcnNlci5nZXRQYXJzaW5nU3RhdHVzKCkpOworCisgICAgY29uc3QgYXV0byYgc2VydmljZUF0dHJpYnV0ZU1hcCA9IHBhcnNlci5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CisgICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0LnJlc2l6ZShzZXJ2aWNlQXR0cmlidXRlTWFwLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlUGFpciA6IHNlcnZpY2VBdHRyaWJ1dGVNYXApIHsKKyAgICAgICAgU2VydmljZUF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OworICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKKyAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0W2ldID0gc3RkOjptb3ZlKGF0dHJpYnV0ZSk7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiByb2xlTWFwID0gcGFyc2VyLmdldFJvbGVNYXAoKTsKKyAgICBtUm9sZUxpc3QucmVzaXplKHJvbGVNYXAuc2l6ZSgpKTsKKyAgICBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJvbGVQYWlyIDogcm9sZU1hcCkgeworICAgICAgICBSb2xlSW5mbyByb2xlOworICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKKyAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CisgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKKyAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KKyAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAorICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgorICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIGhpZGxfdmVjPE5vZGVJbmZvPiYgbm9kZUxpc3QgPSByb2xlLm5vZGVzOworICAgICAgICBub2RlTGlzdC5yZXNpemUocm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0LnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlUGFpciA6IHJvbGVQYWlyLnNlY29uZC5ub2RlTGlzdCkgeworICAgICAgICAgICAgTm9kZUluZm8gbm9kZTsKKyAgICAgICAgICAgIG5vZGUubmFtZSA9IG5vZGVQYWlyLnNlY29uZC5uYW1lOworICAgICAgICAgICAgbm9kZS5vd25lciA9IG93bmVyOworICAgICAgICAgICAgaGlkbF92ZWM8Tm9kZUF0dHJpYnV0ZT4mIGF0dHJpYnV0ZUxpc3QgPSBub2RlLmF0dHJpYnV0ZXM7CisgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0LnJlc2l6ZShub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGsgPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogbm9kZVBhaXIuc2Vjb25kLmF0dHJpYnV0ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBOb2RlQXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5ID0gYXR0cmlidXRlUGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0W2tdID0gc3RkOjptb3ZlKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgKytrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZUxpc3Rbal0gPSBzdGQ6Om1vdmUobm9kZSk7CisgICAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgICAgbVJvbGVMaXN0W2ldID0gc3RkOjptb3ZlKHJvbGUpOworICAgICAgICArK2k7CisgICAgfQorCisgICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKIH0KIAogT214U3RvcmU6On5PbXhTdG9yZSgpIHsKIH0KIAogUmV0dXJuPHZvaWQ+IE9teFN0b3JlOjpsaXN0U2VydmljZUF0dHJpYnV0ZXMobGlzdFNlcnZpY2VBdHRyaWJ1dGVzX2NiIF9oaWRsX2NiKSB7Ci0gICAgX2hpZGxfY2IodG9TdGF0dXMoTk9fRVJST1IpLCBoaWRsX3ZlYzxTZXJ2aWNlQXR0cmlidXRlPigpKTsKKyAgICBpZiAobVBhcnNpbmdTdGF0dXMgPT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok5PX0VSUk9SLCBtU2VydmljZUF0dHJpYnV0ZUxpc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKG1QYXJzaW5nU3RhdHVzLCBoaWRsX3ZlYzxTZXJ2aWNlQXR0cmlidXRlPigpKTsKKyAgICB9CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAogUmV0dXJuPHZvaWQ+IE9teFN0b3JlOjpnZXROb2RlUHJlZml4KGdldE5vZGVQcmVmaXhfY2IgX2hpZGxfY2IpIHsKLSAgICBfaGlkbF9jYihoaWRsX3N0cmluZygpKTsKKyAgICBfaGlkbF9jYihtUHJlZml4KTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCiBSZXR1cm48dm9pZD4gT214U3RvcmU6Omxpc3RSb2xlcyhsaXN0Um9sZXNfY2IgX2hpZGxfY2IpIHsKLSAgICBfaGlkbF9jYihoaWRsX3ZlYzxSb2xlSW5mbz4oKSk7CisgICAgX2hpZGxfY2IobVJvbGVMaXN0KTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCkBAIC01NCwxMiArMTE4LDYgQEAKICAgICByZXR1cm4gSU9teDo6dHJ5R2V0U2VydmljZShvbXhOYW1lKTsKIH0KIAotLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgotCi1JT214U3RvcmUqIEhJRExfRkVUQ0hfSU9teFN0b3JlKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKLSAgICByZXR1cm4gbmV3IE9teFN0b3JlKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgogfSAgLy8gbmFtZXNwYWNlIFYxXzAKIH0gIC8vIG5hbWVzcGFjZSBvbXgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwCmluZGV4IGFjZGEwNjAuLmM0NDk5ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcApAQCAtMTgsOSArMTgsOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKLSNpbmNsdWRlICJXUHJvZHVjZXJMaXN0ZW5lci5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00MSw3ICs0MSw5IEBACiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsICZidWYpOwogICAgIEFud0J1ZmZlciBhbndCdWZmZXI7Ci0gICAgd3JhcEFzKCZhbndCdWZmZXIsICpidWYpOworICAgIGlmIChidWYgIT0gbnVsbHB0cikgeworICAgICAgICB3cmFwQXMoJmFud0J1ZmZlciwgKmJ1Zik7CisgICAgfQogICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIGFud0J1ZmZlcik7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KQEAgLTY0LDEwICs2Niw5IEBACiAgICAgc3A8RmVuY2U+IGZlbmNlOwogICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBvdXRUaW1lc3RhbXBzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgJnNsb3QsICZmZW5jZSwKLSAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLCB1c2FnZSwKLSAgICAgICAgICAgIGdldEZyYW1lVGltZXN0YW1wcyA/ICZvdXRUaW1lc3RhbXBzIDogbnVsbHB0cik7CisgICAgICAgICZzbG90LCAmZmVuY2UsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLCBudWxscHRyLAorICAgICAgICBnZXRGcmFtZVRpbWVzdGFtcHMgPyAmb3V0VGltZXN0YW1wcyA6IG51bGxwdHIpOwogICAgIGhpZGxfaGFuZGxlIHRGZW5jZTsKICAgICBGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IGQ4NTQwZjguLjMyMDFjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0xNywxNSArMTcsMTQgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVFdHcmFwaGljQnVmZmVyU291cmNlIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teEJ1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLQotI2luY2x1ZGUgIm9teC9PTVhVdGlscy5oIgotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyU291cmNlLmgiCi0jaW5jbHVkZSAiV09teE5vZGUuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTY4LDcgKzY3LDE0IEBACiAgICAgICAgIHRNc2cuZGF0YS5ldmVudERhdGEuZGF0YTEgPSBkYXRhU3BhY2U7CiAgICAgICAgIHRNc2cuZGF0YS5ldmVudERhdGEuZGF0YTIgPSBhc3BlY3RzOwogICAgICAgICB0TXNnLmRhdGEuZXZlbnREYXRhLmRhdGEzID0gcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIG1PbXhOb2RlLT5kaXNwYXRjaE1lc3NhZ2UodE1zZyk7CisgICAgICAgIGlmICghbU9teE5vZGUtPmRpc3BhdGNoTWVzc2FnZSh0TXNnKS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUV09teE5vZGVXcmFwcGVyIGZhaWxlZCB0byBkaXNwYXRjaCBtZXNzYWdlICIKKyAgICAgICAgICAgICAgICAgICAgIk9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgImRhdGFTcGFjZSA9ICVsZCwgYXNwZWN0cyA9ICVsZCwgcGl4ZWxGb3JtYXQgPSAlbGQiLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihkYXRhU3BhY2UpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihhc3BlY3RzKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZz4ocGl4ZWxGb3JtYXQpKTsKKyAgICAgICAgfQogICAgIH0KIH07CiAKQEAgLTE0NCwxMCArMTUwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbXMuZGF0YSgpICsgb3V0UGFyYW1zLnNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7CiAgICAgICAgICAgICB9KTsKLSAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgYXV0byB0cmFuc1N0YXR1cyA9IG9teE5vZGUtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzKSwKICAgICAgICAgICAgIGluSGlkbEJ5dGVzKCZjb25zdW1lclVzYWdlLCBzaXplb2YoY29uc3VtZXJVc2FnZSkpLAogICAgICAgICAgICAgX2hpZGxfY2IpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1cyhGQUlMRURfVFJBTlNBQ1RJT04pOworICAgIH0KICAgICBpZiAoZm5TdGF0dXMgIT0gT0spIHsKICAgICAgICAgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgfQpAQCAtMTU4LDEwICsxNjcsMTMgQEAKIAogICAgIF9wYXJhbXMgPSAmZGVmOwogICAgIHBhcmFtcyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihfcGFyYW1zKTsKLSAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgdHJhbnNTdGF0dXMgPSBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiksCiAgICAgICAgICAgICBpbkhpZGxCeXRlcygmZGVmLCBzaXplb2YoZGVmKSksCiAgICAgICAgICAgICBfaGlkbF9jYik7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzKEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgfQogICAgIGlmIChmblN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwb3J0IGRlZmluaXRpb246ICVkIiwgZm5TdGF0dXMpOwogICAgICAgICByZXR1cm4gdG9TdGF0dXMoZm5TdGF0dXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAKaW5kZXggODAzMjgzYS4uYzhjOTYzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlICJXT214QnVmZmVyU291cmNlLmgiCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmNwcAppbmRleCA5MWQxMDEwLi45ZjgyMjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmNwcApAQCAtMTYsOSArMTYsOSBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0jaW5jbHVkZSAiV09teE5vZGUuaCIKLSNpbmNsdWRlICJXT214QnVmZmVyU291cmNlLmgiCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmNwcAppbmRleCAzNTRkYjI5Li5jY2JlMjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwCkBAIC0xNiwxNCArMTYsMTQgQEAKIAogI2RlZmluZSBMT0dfVEFHICJXT214T2JzZXJ2ZXItaW1wbCIKIAotI2luY2x1ZGUgPHZlY3Rvcj4KLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAKLSNpbmNsdWRlICJXT214T2JzZXJ2ZXIuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKaW5kZXggYmUwZDRkNS4uYmRjM2FhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJXUHJvZHVjZXJMaXN0ZW5lci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggMmQ5MjFmOS4uZDRjZGY2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTEsMTIgKzEsMTYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCiAgICAgICAgICJHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIk9NWC5jcHAiLAorICAgICAgICAiT01YU3RvcmUuY3BwIiwKICAgICAgICAgIk9NWE1hc3Rlci5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLApAQCAtMjUsMTQgKzI5LDE2IEBACiAgICAgICAgICIxLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsIC8vIGZvciBtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTQ1LDEyICs1MSwxMiBAQAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5Ci0gICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLApAQCAtNTksNyArNjUsMTIgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKICAgICBdLAogCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCkBAIC04MCwxNSArOTEsMjkgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3N0YXRpYyB7CitjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKICAgICBzcmNzOiBbIk9NWFV0aWxzLmNwcCJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgIF0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDc5ZjZkOTMuLjk0ZWY1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0xNywxNSArMTcsMTMgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQldHcmFwaGljQnVmZmVyU291cmNlIgogCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogCi0jaW5jbHVkZSAiT01YVXRpbHMuaCIKLSNpbmNsdWRlICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgT01YX1UzMiBrUG9ydEluZGV4SW5wdXQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcAppbmRleCA5YTQ5NTJlLi4wYzUwYzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcApAQCAtMTgsOCArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJGcmFtZURyb3BwZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggZWY0ZDc0NS4uMTkxN2QyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMjIsNyArMjIsOSBAQAogCiAjZGVmaW5lIFNUUklOR0lGWV9FTlVNUyAvLyBmb3IgYXNTdHJpbmcgaW4gSGFyZHdhcmVBUEkuaC9WaWRlb0FQSS5oCiAKLSNpbmNsdWRlICJHcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC0zMSwxNCArMzMsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KLSNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgIm9teC9PTVhVdGlscy5oIgotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLSNpbmNsdWRlICJtZWRpYS9PTVhCdWZmZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgIkZyYW1lRHJvcHBlci5oIgogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CkBAIC03MzMsNyArNzMzLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHNuYXAgdG8gbmVhcmVzdCBjYXB0dXJlIHBvaW50CiAgICAgICAgICAgICBpbnQ2NF90IG5GcmFtZXMgPSBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyk7CisgICAgICAgICAgICAgICAgICAgICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyAvIDEwMDAwMDApOwogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMCkgewogICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCiAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CkBAIC03NDEsOSArNzQxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GcmFtZUNvdW50ICs9IG5GcmFtZXM7CiAgICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IG1CYXNlQ2FwdHVyZVVzICsgc3RkOjpsbHJvdW5kKAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAvIG1DYXB0dXJlRnBzKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiAxMDAwMDAwIC8gbUNhcHR1cmVGcHMpOwogICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gbUJhc2VGcmFtZVVzICsgc3RkOjpsbHJvdW5kKAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAvIG1GcHMpOworICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtRnBzKTsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCkBAIC05NTYsMjggKzk1Niw0MCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKICAgICB1aW50NjRfdCBzbG90TWFzazsKLSAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOworICAgIHVpbnQ2NF90IHJlbGVhc2VNYXNrOworICAgIGlmIChtQ29uc3VtZXItPmdldFJlbGVhc2VkQnVmZmVycygmcmVsZWFzZU1hc2spICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOworICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNsb3RNYXNrID0gcmVsZWFzZU1hc2s7CisgICAgICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKICAgICB9CiAKLSAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7Ci0KKyAgICBBU3RyaW5nIHVucG9wdWxhdGVkOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewogICAgICAgICBpZiAoKHNsb3RNYXNrICYgMHgwMSkgIT0gMCkgewotICAgICAgICAgICAgZGlzY2FyZEJ1ZmZlckluU2xvdF9sKGkpOworICAgICAgICAgICAgaWYgKCFkaXNjYXJkQnVmZmVySW5TbG90X2woaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXVucG9wdWxhdGVkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5wb3B1bGF0ZWQuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnBvcHVsYXRlZC5hcHBlbmQoaSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc2xvdE1hc2sgPj49IDE7CiAgICAgfQorICAgIGlmICghdW5wb3B1bGF0ZWQuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygicmVsZWFzZWQgdW5wb3B1bGF0ZWQgc2xvdHM6IFslc10iLCB1bnBvcHVsYXRlZC5jX3N0cigpKTsKKyAgICB9CiB9CiAKLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckluU2xvdF9sKEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNsb3RfaWQgaSkgeworYm9vbCBHcmFwaGljQnVmZmVyU291cmNlOjpkaXNjYXJkQnVmZmVySW5TbG90X2woR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2xvdF9pZCBpKSB7CiAgICAgc3NpemVfdCBic2kgPSBtQnVmZmVyU2xvdHMuaW5kZXhPZktleShpKTsKICAgICBpZiAoYnNpIDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzaW5nIGFuIHVucG9wdWxhdGVkIHNsb3Q6ICVkIiwgaSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChic2kpOwogICAgICAgICBtQnVmZmVyU2xvdHMucmVtb3ZlSXRlbXNBdChic2kpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggOGMxMTQxZC4uMDljNDAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTIyLDE1ICsyMiwxMiBAQAogCiAjaW5jbHVkZSA8ZGxmY24uaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YLmgiCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSAiQldHcmFwaGljQnVmZmVyU291cmNlLmgiCi0KLSNpbmNsdWRlICJPTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICJPTVhVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExOCwxNSArMTE1LDIyIEBACiAgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAgICAgaW5zdGFuY2UtPnNldEhhbmRsZShoYW5kbGUpOwotICAgIHN0ZDo6dmVjdG9yPEFTdHJpbmc+IHF1aXJrVmVjdG9yOwotICAgIGlmIChtUGFyc2VyLmdldFF1aXJrcyhuYW1lLCAmcXVpcmtWZWN0b3IpID09IE9LKSB7CisKKyAgICAvLyBGaW5kIHF1aXJrcyBmcm9tIG1QYXJzZXIKKyAgICBjb25zdCBhdXRvJiBjb2RlYyA9IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5maW5kKG5hbWUpOworICAgIGlmIChjb2RlYyA9PSBtUGFyc2VyLmdldENvZGVjTWFwKCkuY2VuZCgpKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gb2J0YWluIHF1aXJrcyBmb3Igb214IGNvbXBvbmVudCAnJXMnIGZyb20gWE1MIGZpbGVzIiwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB9IGVsc2UgewogICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwotICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgcXVpcmsgOiBxdWlya1ZlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewogICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7CisgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CisgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewotICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CisgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CisgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW5zdGFuY2UtPnNldFF1aXJrcyhxdWlya3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCBhYzliMGMzLi5mZDk3ZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMTgsMTUgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIk9NWE1hc3RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgotCi0jaW5jbHVkZSAiU29mdE9NWFBsdWdpbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMTliNzc1Ny4uMDE1YTE0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTIwLDIwICsyMCwyMCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0jaW5jbHVkZSAiT01YTWFzdGVyLmgiCi0jaW5jbHVkZSAiT01YVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCkBAIC0yNDYsNiArMjQ2LDE1IEBACiAgICAgdmlydHVhbCB+Q2FsbGJhY2tEaXNwYXRjaGVyKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVfcmVuZGVyZWQgbWVzc2FnZSBiYXRjaGluZywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiBhCisgICAgICAgIC8vIHNpbmdsZSBBTWVzc2FnZSBpbiBNZWRpYUNvZGVjIHdoZW4gaXQgaXMgc2lnbmFsZWQgdG8gdGhlIGFwcC4gQU1lc3NhZ2UgY2FuIGNvbnRhaW4KKyAgICAgICAgLy8gdXAtdG8gNjQga2V5LXZhbHVlIHBhaXJzLCBhbmQgZWFjaCBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIHVzZXMgMiBrZXlzLCBzbyB0aGUgbWF4CisgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHdvdWxkIGJlIDMyLiBOb25ldGhlbGVzcywgbGltaXQgdGhpcyB0byAxMiB0byB3aGljaCBnaXZlcyBhdCBsZWFzdCAxMAorICAgICAgICAvLyBtc2Vjb25kcyBvZiBiYXRjaGluZyBhdCAxMjBIei4KKyAgICAgICAga01heFF1ZXVlU2l6ZSA9IDEyLAorICAgIH07CisKICAgICBNdXRleCBtTG9jazsKIAogICAgIHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QgbU93bmVyOwpAQCAtMjkwLDcgKzI5OSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1RdWV1ZS5wdXNoX2JhY2sobXNnKTsKLSAgICBpZiAocmVhbFRpbWUpIHsKKyAgICBpZiAocmVhbFRpbWUgfHwgbVF1ZXVlLnNpemUoKSA+PSBrTWF4UXVldWVTaXplKSB7CiAgICAgICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CiAgICAgfQogfQpAQCAtNjcwLDYgKzY3OSwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChtU2FpbGVkIHx8IG1OdW1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdID4gMCkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBDTE9HX0NPTkZJRyhzZXRQb3J0TW9kZSwgIiVzKCVkKSwgcG9ydCAlZCIsIGFzU3RyaW5nKG1vZGUpLCBtb2RlLCBwb3J0SW5kZXgpOwogCiAgICAgc3dpdGNoIChtb2RlKSB7CkBAIC0xMDcwLDcgKzEwODQsNiBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VCdWZmZXJfbCgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIGNvbnN0IHNwPElIaWRsTWVtb3J5PiAmaFBhcmFtcywgSU9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKLQogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhOwogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRXJyb3JOb25lOwpAQCAtMjE5Myw4ICsyMjA2LDggQEAKICAgICAgICAgICAgIG1zZy5mZW5jZUZkID0gLTE7CiAgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPSByZW5kZXJEYXRhW2ldLm5NZWRpYVRpbWVVczsKICAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLm5hbm9UaW1lID0gcmVuZGVyRGF0YVtpXS5uU3lzdGVtVGltZU5zOwotCi0gICAgICAgICAgICBpbnN0YW5jZS0+bURpc3BhdGNoZXItPnBvc3QobXNnLCBmYWxzZSAvKiByZWFsVGltZSAqLyk7CisgICAgICAgICAgICBib29sIHJlYWxUaW1lID0gbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID09IElOVDY0X01BWDsKKyAgICAgICAgICAgIGluc3RhbmNlLT5tRGlzcGF0Y2hlci0+cG9zdChtc2csIHJlYWxUaW1lKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUzMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT01YU3RvcmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7CisgICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlczsKKyAgICAgICAgc3RkOjptdWx0aW1hcDxzaXplX3QsIElPTVhTdG9yZTo6Tm9kZUluZm8+IG5vZGVMaXN0OworICAgIH07Cit9ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQorCitPTVhTdG9yZTo6T01YU3RvcmUoCisgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIHsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCisgICAgICAgICAgICBzZWFyY2hEaXJzLAorICAgICAgICAgICAgbWFpblhtbE5hbWUsCisgICAgICAgICAgICBwZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgbVBhcnNpbmdTdGF0dXMgPSBwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpOworCisgICAgY29uc3QgYXV0byYgc2VydmljZUF0dHJpYnV0ZU1hcCA9IHBhcnNlci5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CisgICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0LnJlc2VydmUoc2VydmljZUF0dHJpYnV0ZU1hcC5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlUGFpciA6IHNlcnZpY2VBdHRyaWJ1dGVNYXApIHsKKyAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICAgICAgYXR0cmlidXRlLmtleSA9IGF0dHJpYnV0ZVBhaXIuZmlyc3Q7CisgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyaWJ1dGUpKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiByb2xlTWFwID0gcGFyc2VyLmdldFJvbGVNYXAoKTsKKyAgICBtUm9sZUxpc3QucmVzZXJ2ZShyb2xlTWFwLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiByb2xlUGFpciA6IHJvbGVNYXApIHsKKyAgICAgICAgUm9sZUluZm8gcm9sZTsKKyAgICAgICAgcm9sZS5yb2xlID0gcm9sZVBhaXIuZmlyc3Q7CisgICAgICAgIHJvbGUudHlwZSA9IHJvbGVQYWlyLnNlY29uZC50eXBlOworICAgICAgICByb2xlLmlzRW5jb2RlciA9IHJvbGVQYWlyLnNlY29uZC5pc0VuY29kZXI7CisgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluCisgICAgICAgIC8vIHRoZSB4bWwgZmlsZS4gT25jZSB3ZSBoYXZlIGEgd2F5IHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiwgaXQKKyAgICAgICAgLy8gc2hvdWxkIGJlIHBhcnNlZCBwcm9wZXJseS4KKyAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZVBhaXIuZmlyc3QuY29tcGFyZSgwLCA1LCAiYXVkaW8iKSA9PSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4mIG5vZGVMaXN0ID0gcm9sZS5ub2RlczsKKyAgICAgICAgbm9kZUxpc3QucmVzZXJ2ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlUGFpciA6IHJvbGVQYWlyLnNlY29uZC5ub2RlTGlzdCkgeworICAgICAgICAgICAgTm9kZUluZm8gbm9kZTsKKyAgICAgICAgICAgIG5vZGUubmFtZSA9IG5vZGVQYWlyLnNlY29uZC5uYW1lOworICAgICAgICAgICAgbm9kZS5vd25lciA9IG93bmVyOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlTGlzdCA9IG5vZGUuYXR0cmlidXRlczsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucmVzZXJ2ZShub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogbm9kZVBhaXIuc2Vjb25kLmF0dHJpYnV0ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUobm9kZSkpOworICAgICAgICB9CisgICAgICAgIG1Sb2xlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKHJvbGUpKTsKKyAgICB9CisKKyAgICBtUHJlZml4ID0gcGFyc2VyLmdldENvbW1vblByZWZpeCgpOworfQorCitzdGF0dXNfdCBPTVhTdG9yZTo6bGlzdFNlcnZpY2VBdHRyaWJ1dGVzKHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpIHsKKyAgICAqYXR0cmlidXRlcyA9IG1TZXJ2aWNlQXR0cmlidXRlTGlzdDsKKyAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Cit9CisKK3N0YXR1c190IE9NWFN0b3JlOjpnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpIHsKKyAgICAqcHJlZml4ID0gbVByZWZpeDsKKyAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Cit9CisKK3N0YXR1c190IE9NWFN0b3JlOjpsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgeworICAgICpyb2xlTGlzdCA9IG1Sb2xlTGlzdDsKKyAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Cit9CisKK3N0YXR1c190IE9NWFN0b3JlOjpnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIHsKKyAgICAqb214ID0gbmV3IE9NWCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworT01YU3RvcmU6On5PTVhTdG9yZSgpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggYTY2ZDU2NS4uNTg5NDgzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0xOSwxMyArMTksMTMgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy1iYXNlLmg+Ci0jaW5jbHVkZSAiT01YVXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggZDg5Y2I5OS4uODdjMjQxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMTgsOCArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IGRmOTc4ZjguLmVlMjY5ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU29mdE9NWENvbXBvbmVudCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggZmNjYjEyYi4uNDk0NmFkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtMTgsOCArMTgsOCBAQAogI2RlZmluZSBMT0dfVEFHICJTb2Z0T01YUGx1Z2luIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiU29mdE9NWFBsdWdpbi5oIgotI2luY2x1ZGUgImluY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CkBAIC04NSw3ICs4NSwyMSBAQAogICAgICAgICBsaWJOYW1lLmFwcGVuZChrQ29tcG9uZW50c1tpXS5tTGliTmFtZVN1ZmZpeCk7CiAgICAgICAgIGxpYk5hbWUuYXBwZW5kKCIuc28iKTsKIAotICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliTmFtZS5jX3N0cigpLCBSVExEX05PVyk7CisgICAgICAgIC8vIFJUTERfTk9ERUxFVEUgbWVhbnMgd2Uga2VlcCB0aGUgc2hhcmVkIGxpYnJhcnkgYXJvdW5kIGZvcmV2ZXIuCisgICAgICAgIC8vIHRoaXMgZWxpbWluYXRlcyB0aHJhc2hpbmcgZHVyaW5nIHNlcXVlbmNlcyBsaWtlIGxvYWRpbmcgc291bmRwb29scy4KKyAgICAgICAgLy8gSXQgYWxzbyBsZWF2ZXMgdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljIGFyb3VuZCB0aGUgZGxvcGVuKCkvZGxjbG9zZSgpCisgICAgICAgIC8vIGNhbGxzIGluIHRoaXMgZmlsZSB1bmNoYW5nZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEltcGxpY2F0aW9ucyBvZiB0aGUgY2hhbmdlOgorICAgICAgICAvLyAtLSB0aGUgY29kZWMgcHJvY2VzcyAod2hlcmUgdGhpcyBoYXBwZW5zKSB3aWxsIGhhdmUgYSBzbGlnaHRseSBsYXJnZXIKKyAgICAgICAgLy8gICAgbG9uZy10ZXJtIG1lbW9yeSBmb290cHJpbnQgYXMgaXQgYWNjdW11bGF0ZXMgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgICAvLyAgICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeS4KKyAgICAgICAgLy8gLS0gcGx1Z2luIGNvZGVjcyBjYW4gbm8gbG9uZ2VyIChhbmQgbmV2ZXIgc2hvdWxkIGhhdmUpIGRlcGVuZCBvbiBhCisgICAgICAgIC8vICAgIGZyZWUgcmVzZXQgb2YgYW55IHN0YXRpYyBkYXRhIGFzIHRoZSBsaWJyYXJ5IHdvdWxkIGhhdmUgY3Jvc3NlZAorICAgICAgICAvLyAgICBhIGRsY2xvc2UvZGxvcGVuIGN5Y2xlLgorICAgICAgICAvLworCisgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOwogCiAgICAgICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoInVuYWJsZSB0byBkbG9wZW4gJXM6ICVzIiwgbGliTmFtZS5jX3N0cigpLCBkbGVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDkyMGRkMTguLmNiODExYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTIwLDE0ICsyMCwxNCBAQAogI2RlZmluZSBMT0dfVEFHICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4MiwxMSArMTgyLDExIEBACiAKIAogdWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVyV2lkdGgoKSB7Ci0gICAgcmV0dXJuIG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4V2lkdGggOiBtV2lkdGg7CisgICAgcmV0dXJuIG1heChtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heFdpZHRoIDogMCwgbVdpZHRoKTsKIH0KIAogdWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVySGVpZ2h0KCkgewotICAgIHJldHVybiBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IG1IZWlnaHQ7CisgICAgcmV0dXJuIG1heChtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IDAsIG1IZWlnaHQpOwogfQogCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA3ZWNmYmJiLi5mMzNiZGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0yMSwyNSArMjEsMjIgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KIAogI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgogI2luY2x1ZGUgPHVpL1JlY3QuaD4KIAogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQogI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgogCi0jaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY29uc3Qgc3RhdGljIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGtTdXBwb3J0ZWRDb2xvckZvcm1hdHNbXSA9IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGZkOTE1NzQuLjhkOGEyZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0yOSwxMiArMjksMTIgQEAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogI2luY2x1ZGUgPHVpL0ZlbmNlVGltZS5oPgotI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgotI2luY2x1ZGUgPFZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgpAQCAtMjA2NCw4ICsyMDY0LDEwIEBACiAgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwogICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CiAgICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShuaCk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgaWYgKG5oICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKaW5kZXggMjM3ODRhYS4uYTZhOWQzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCkBAIC0yMCwxMCArMjAsOSBAQAogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKaW5kZXggZjM3N2Y1YS4uMDA2ZDJkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CkBAIC00MSwxNyArNDIsMzEgQEAKIHVzaW5nIDo6YW5kcm9pZDo6d3A7CiAKIHN0cnVjdCBPbXhTdG9yZSA6IHB1YmxpYyBJT214U3RvcmUgewotICAgIE9teFN0b3JlKCk7CisgICAgT214U3RvcmUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciA9ICJkZWZhdWx0IiwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aAorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisKICAgICB2aXJ0dWFsIH5PbXhTdG9yZSgpOwogCi0gICAgLy8gTWV0aG9kcyBmcm9tIElPbXgKKyAgICAvLyBNZXRob2RzIGZyb20gSU9teFN0b3JlCiAgICAgUmV0dXJuPHZvaWQ+IGxpc3RTZXJ2aWNlQXR0cmlidXRlcyhsaXN0U2VydmljZUF0dHJpYnV0ZXNfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBnZXROb2RlUHJlZml4KGdldE5vZGVQcmVmaXhfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBsaXN0Um9sZXMobGlzdFJvbGVzX2NiKSBvdmVycmlkZTsKICAgICBSZXR1cm48c3A8SU9teD4+IGdldE9teChoaWRsX3N0cmluZyBjb25zdCYpIG92ZXJyaWRlOwotfTsKIAotZXh0ZXJuICJDIiBJT214U3RvcmUqIEhJRExfRkVUQ0hfSU9teFN0b3JlKGNvbnN0IGNoYXIqIG5hbWUpOworcHJvdGVjdGVkOgorICAgIFN0YXR1cyBtUGFyc2luZ1N0YXR1czsKKyAgICBoaWRsX3N0cmluZyBtUHJlZml4OworICAgIGhpZGxfdmVjPFNlcnZpY2VBdHRyaWJ1dGU+IG1TZXJ2aWNlQXR0cmlidXRlTGlzdDsKKyAgICBoaWRsX3ZlYzxSb2xlSW5mbz4gbVJvbGVMaXN0OworfTsKIAogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCiB9ICAvLyBuYW1lc3BhY2UgVjFfMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggNDU0OWM5Ny4uYjlmMjJhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIAotI2luY2x1ZGUgIi4uL0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKaW5kZXggZDcxNTM3NC4uMzhkNTg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214T2JzZXJ2ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDI5YjUxYTguLjg0ZmVlNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAotI2luY2x1ZGUgPFZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgpAQCAtMjY0LDggKzI2NCw4IEBACiAgICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkX2woY29uc3QgVmlkZW9CdWZmZXIgJmJ1ZmZlcik7CiAKICAgICAvLyBtYXJrcyB0aGUgYnVmZmVyIGF0IHRoZSBzbG90IG5vIGxvbmdlciBjYWNoZWQsIGFuZCBhY2NvdW50cyBmb3IgdGhlIG91dHN0YW5kaW5nCi0gICAgLy8gYWNxdWlyZSBjb3VudAotICAgIHZvaWQgZGlzY2FyZEJ1ZmZlckluU2xvdF9sKHNsb3RfaWQgaSk7CisgICAgLy8gYWNxdWlyZSBjb3VudC4gUmV0dXJucyB0cnVlIGlmIHRoZSBzbG90IHdhcyBwb3B1bGF0ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgYm9vbCBkaXNjYXJkQnVmZmVySW5TbG90X2woc2xvdF9pZCBpKTsKIAogICAgIC8vIG1hcmtzIHRoZSBidWZmZXIgYXQgdGhlIHNsb3QgaW5kZXggbm8gbG9uZ2VyIGNhY2hlZCwgYW5kIGFjY291bnRzIGZvciB0aGUgb3V0c3RhbmRpbmcKICAgICAvLyBhY3F1aXJlIGNvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvSU9teE5vZGVXcmFwcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvSU9teE5vZGVXcmFwcGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0lPbXhOb2RlV3JhcHBlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaAppbmRleCA0YWYzZDM5Li41OTRiNGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KICNpbmNsdWRlICJPbXhOb2RlT3duZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCmluZGV4IDNmOWMwY2EuLjg5N2YyODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBPTVhfTUFTVEVSX0hfCiAKLSNpbmNsdWRlIDxPTVhQbHVnaW5CYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCAwMGMzN2UxLi4xMDY1Y2E1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaApAQCAtOTIsNiArOTIsMTUgQEAKICAgICBzdGF0dXNfdCBnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKIAorICAgIC8vIFF1aXJrIHN0aWxsIHN1cHBvcnRlZCwgZXZlbiB0aG91Z2ggZGVwcmVjYXRlZAorICAgIGVudW0gUXVpcmtzIHsKKyAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHMgICA9IDEsCisgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyAgPSAyLAorCisgICAgICAgIGtRdWlya3NNYXNrID0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHMKKyAgICAgICAgICAgICAgICAgICAgfCBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMsCisgICAgfTsKKwogICAgIHN0YXR1c190IHNldFF1aXJrcyhPTVhfVTMyIHF1aXJrcyk7CiAKICAgICBib29sIGlzU2VjdXJlKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBkNzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9PTVhTVE9SRV9IXworI2RlZmluZSBBTkRST0lEX09NWFNUT1JFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE9NWFN0b3JlIDogcHVibGljIEJuT01YU3RvcmUgeworcHVibGljOgorICAgIE9NWFN0b3JlKAorICAgICAgICAgICAgY29uc3QgY2hhciogb3duZXIgPSAiZGVmYXVsdCIsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycworICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzLAorICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworCisgICAgc3RhdHVzX3QgbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZ2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSBvdmVycmlkZTsKKworICAgIH5PTVhTdG9yZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgbVBhcnNpbmdTdGF0dXM7CisgICAgc3RkOjpzdHJpbmcgbVByZWZpeDsKKyAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IG1TZXJ2aWNlQXR0cmlidXRlTGlzdDsKKyAgICBzdGQ6OnZlY3RvcjxSb2xlSW5mbz4gbVJvbGVMaXN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX09NWFNUT1JFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKaW5kZXggYzg5Y2Q4Ny4uOGVjNzE3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIFNPRlRfT01YX1BMVUdJTl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKaW5kZXggZjk2NmI1ZS4uYTkyNWRhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKaW5kZXggMjU5OTYwOC4uMGMyMmE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciBrVGVzdE92ZXJyaWRlc1N0cltdID0KQEAgLTExNyw3ICsxMTksNyBAQAogLy8gVE9ETzogdGhlIGNvZGVjIGNvbXBvbmVudCBuZXZlciByZXR1cm5zIE9NWF9FdmVudENtZENvbXBsZXRlIGluIHVuaXQgdGVzdC4KIFRFU1RfRihNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc1Rlc3QsIERJU0FCTEVEX3Byb2ZpbGVDb2RlY3MpIHsKICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBpbmZvczsKKyAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGluZm9zOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7CiAgICAgICAgIGluZm9zLnB1c2hfYmFjayhsaXN0LT5nZXRDb2RlY0luZm8oaSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCmluZGV4IDJmMTBjYjEuLjM1MDcyODQgMTAwNjQ0Ci0tLSBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCkBAIC0xLDE0ICsxLDE2IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAiLAorICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJNZWRpYUNvZGVjc1htbFBhcnNlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTE3LDYgKzE5LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTMxLDYgKzM0LDEwIEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKICAgICB9LAogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQzMGVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY3NYbWxQYXJzZXIiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxleHBhdC5oPgorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisvKioKKyAqIFNlYXJjaCBmb3IgYSBmaWxlIGluIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCisgKgorICogRm9yIGVhY2ggc3RyaW5nIGBzZWFyY2hEaXJgIGluIGBzZWFyY2hEaXJzYCwgYHNlYXJjaERpci9maWxlTmFtZWAgd2lsbCBiZQorICogdGVzdGVkIHdoZXRoZXIgaXQgaXMgYSB2YWxpZCBmaWxlIG5hbWUgb3Igbm90LiBJZiBpdCBpcyBhIHZhbGlkIGZpbGUgbmFtZSwKKyAqIHRoZSBjb25jYXRlbmF0ZWQgbmFtZSAoYHNlYXJjaERpci9maWxlTmFtZWApIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvdXRwdXQKKyAqIHZhcmlhYmxlIGBvdXRQYXRoYCwgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBgdHJ1ZWAuIE90aGVyd2lzZSwgdGhlCisgKiBzZWFyY2ggY29udGludWVzIHVudGlsIHRoZSBgbnVsbHB0cmAgZWxlbWVudCBpbiBgc2VhcmNoRGlyc2AgaXMgcmVhY2hlZCwgYXQKKyAqIHdoaWNoIHBvaW50IHRoZSBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAuCisgKgorICogXHBhcmFtW2luXSBzZWFyY2hEaXJzIE51bGwtdGVybWluYXRlZCBhcnJheSBvZiBzZWFyY2ggcGF0aHMuCisgKiBccGFyYW1baW5dIGZpbGVOYW1lIE5hbWUgb2YgdGhlIGZpbGUgdG8gc2VhcmNoLgorICogXHBhcmFtW291dF0gb3V0UGF0aCBGdWxsIHBhdGggb2YgdGhlIGZpbGUuIGBvdXRQYXRoYCB3aWxsIGhvbGQgYSB2YWxpZCBmaWxlCisgKiBuYW1lIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBgdHJ1ZWAuCisgKiBccmV0dXJuIGB0cnVlYCBpZiBzb21lIGVsZW1lbnQgaW4gYHNlYXJjaERpcnNgIGNvbWJpbmVkIHdpdGggYGZpbGVOYW1lYCBpcyBhCisgKiB2YWxpZCBmaWxlIG5hbWU7IGBmYWxzZWAgb3RoZXJ3aXNlLgorICovCitib29sIGZpbmRGaWxlSW5EaXJzKAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgIHN0ZDo6c3RyaW5nICpvdXRQYXRoKSB7CisgICAgZm9yICg7ICpzZWFyY2hEaXJzICE9IG51bGxwdHI7ICsrc2VhcmNoRGlycykgeworICAgICAgICAqb3V0UGF0aCA9IHN0ZDo6c3RyaW5nKCpzZWFyY2hEaXJzKSArICIvIiArIGZpbGVOYW1lOworICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKKyAgICAgICAgaWYgKHN0YXQob3V0UGF0aC0+Y19zdHIoKSwgJmZpbGVTdGF0KSA9PSAwICYmCisgICAgICAgICAgICAgICAgU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIHN0cm5FcShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIHNpemVfdCBjb3VudCkgeworICAgIHJldHVybiBzdHJuY21wKHMxLCBzMiwgY291bnQpID09IDA7Cit9CisKK2Jvb2wgc3RyRXEoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Cit9CisKK2Jvb2wgc3RyaUVxKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICAgIHJldHVybiBzdHJjYXNlY21wKHMxLCBzMikgPT0gMDsKK30KKworYm9vbCBzdHJIYXNQcmVmaXgoY29uc3QgY2hhciogdGVzdCwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgcmV0dXJuIHN0cm5FcSh0ZXN0LCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsKK30KKworYm9vbCBwYXJzZUJvb2xlYW4oY29uc3QgY2hhciogcykgeworICAgIHJldHVybiBzdHJpRXEocywgInkiKSB8fAorICAgICAgICAgICAgc3RyaUVxKHMsICJ5ZXMiKSB8fAorICAgICAgICAgICAgc3RyaUVxKHMsICJ0IikgfHwKKyAgICAgICAgICAgIHN0cmlFcShzLCAidHJ1ZSIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgIjEiKTsKK30KKworc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGJvb2wgZm91bmQgPSB0cnVlKSB7CisgICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCAlcyclcycgYXR0cmlidXRlIiwgbmFtZSwKKyAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdHVzX3QgbGltaXRFcnJvcihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUsIG1zZyk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYXR0ciwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUsCisgICAgICAgICAgICBhdHRyLCB2YWx1ZSk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK307IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK2NvbnN0ZXhwciBjaGFyIGNvbnN0KiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnNbXTsKK2NvbnN0ZXhwciBjaGFyIGNvbnN0KiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdE1haW5YbWxOYW1lOworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lOworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGg7CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpNZWRpYUNvZGVjc1htbFBhcnNlcigKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCisgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKSA6CisgICAgbVBhcnNpbmdTdGF0dXMoTk9fSU5JVCksCisgICAgbVVwZGF0ZShmYWxzZSksCisgICAgbUNvZGVjQ291bnRlcigwKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgICBpZiAoZmluZEZpbGVJbkRpcnMoc2VhcmNoRGlycywgbWFpblhtbE5hbWUsICZwYXRoKSkgeworICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwYXRoLmNfc3RyKCksIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgJXMiLCBtYWluWG1sTmFtZSk7CisgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBwZXJmb3JtYW5jZVhtbE5hbWUsICZwYXRoKSkgeworICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwYXRoLmNfc3RyKCksIHRydWUpOworICAgIH0KKyAgICBpZiAocHJvZmlsaW5nUmVzdWx0c1htbFBhdGggIT0gbnVsbHB0cikgeworICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCwgdHJ1ZSk7CisgICAgfQorfQorCitib29sIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVRvcExldmVsWE1MRmlsZSgKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWNzX3htbCwKKyAgICAgICAgYm9vbCBpZ25vcmVfZXJyb3JzKSB7CisgICAgLy8gZ2V0IGhyZWZfYmFzZQorICAgIGNvbnN0IGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7CisgICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gbnVsbHB0cikgeworICAgICAgICBtSHJlZkJhc2UgPSBzdGQ6OnN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOworICAgIH0KKworICAgIG1QYXJzaW5nU3RhdHVzID0gT0s7IC8vIGtlZXBpbmcgdGhpcyBoZXJlIGZvciBzYWZldHkKKyAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworCisgICAgcGFyc2VYTUxGaWxlKGNvZGVjc194bWwpOworCisgICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJwYXJzZVRvcExldmVsWE1MRmlsZSglcykgZmFpbGVkIiwgY29kZWNzX3htbCk7CisgICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7CisgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IE9LOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Db2RlY01hcC5jbGVhcigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6fk1lZGlhQ29kZWNzWG1sUGFyc2VyKCkgeworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOworCisgICAgaWYgKGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7CisgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShudWxscHRyKTsKKyAgICBMT0dfRkFUQUxfSUYocGFyc2VyID09IG51bGxwdHIsICJYTUxfTWVkaWFDb2RlY3NYbWxQYXJzZXJDcmVhdGUoKSBmYWlsZWQuIik7CisKKyAgICA6OlhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHRoaXMpOworICAgIDo6WE1MX1NldEVsZW1lbnRIYW5kbGVyKAorICAgICAgICAgICAgcGFyc2VyLCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlciwgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IEJVRkZfU0laRSA9IDUxMjsKKyAgICB3aGlsZSAobVBhcnNpbmdTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgdm9pZCAqYnVmZiA9IDo6WE1MX0dldEJ1ZmZlcihwYXJzZXIsIEJVRkZfU0laRSk7CisgICAgICAgIGlmIChidWZmID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50IGJ5dGVzX3JlYWQgPSA6OmZyZWFkKGJ1ZmYsIDEsIEJVRkZfU0laRSwgZmlsZSk7CisgICAgICAgIGlmIChieXRlc19yZWFkIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIHJlYWQiKTsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gRVJST1JfSU87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOworICAgICAgICBpZiAoc3RhdHVzICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgKCVzKSIsIDo6WE1MX0Vycm9yU3RyaW5nKDo6WE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICA6OlhNTF9QYXJzZXJGcmVlKHBhcnNlcik7CisKKyAgICBmY2xvc2UoZmlsZSk7CisgICAgZmlsZSA9IG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCisgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcio+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIqPihtZSktPmVuZEVsZW1lbnRIYW5kbGVyKG5hbWUpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6aW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciAqaHJlZiA9IG51bGxwdHI7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHJlZiA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImluY2x1ZGVYTUxGaWxlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgorICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAorICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgICAgIGlmIChocmVmW2ldID09ICcuJyB8fCBocmVmW2ldID09ICdfJyB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICcwJyAmJiBocmVmW2ldIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnQScgJiYgaHJlZltpXSA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ2EnICYmIGhyZWZbaV0gPD0gJ3onKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gaHJlZjsKKyAgICBpZiAoZmlsZW5hbWUuY29tcGFyZSgwLCAxMywgIm1lZGlhX2NvZGVjc18iKSAhPSAwIHx8CisgICAgICAgICAgICBmaWxlbmFtZS5jb21wYXJlKGZpbGVuYW1lLnNpemUoKSAtIDQsIDQsICIueG1sIikgIT0gMCkgeworICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGZpbGVuYW1lLmluc2VydCgwLCBtSHJlZkJhc2UpOworCisgICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6c3RhcnRFbGVtZW50SGFuZGxlcigKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGluVHlwZSA9IHRydWU7CisKKyAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSkgeworICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKKyAgICAgICAgaWYgKG1QYXJzaW5nU3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBtU2VjdGlvblN0YWNrLnB1c2hfYmFjayhtQ3VycmVudFNlY3Rpb24pOworICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgeworICAgICAgICBjYXNlIFNFQ1RJT05fVE9QTEVWRUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRGVjb2RlcnMiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJFbmNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlNldHRpbmdzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZyIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoZmFsc2UgLyogZW5jb2RlciAqLywgYXR0cnMpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXModHJ1ZSAvKiBlbmNvZGVyICovLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRRdWlyayhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluVHlwZSA9IGZhbHNlOworICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCisgICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgICAgIGlmIChvdXRzaWRlICYmCisgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkxpbWl0IikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkZlYXR1cmUiKSkgeworICAgICAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gYWRkRmVhdHVyZShhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmIChtUGFyc2luZ1N0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlNldHRpbmdzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRGVjb2RlcnMiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJFbmNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRSA/CisgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CisgICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7CisgICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSAmJiAobVNlY3Rpb25TdGFjay5zaXplKCkgPiAwKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1TZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHZhbHVlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmIChuYW1lID09IG51bGxwdHIgfHwgdmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG9yIHZhbHVlIHVuc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEJvb2xlYW4gdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gIjAiIG9yICIxIi4KKyAgICBpZiAoc3RySGFzUHJlZml4KG5hbWUsICJzdXBwb3J0cy0iKSkgeworICAgICAgICB2YWx1ZSA9IHBhcnNlQm9vbGVhbih2YWx1ZSkgPyAiMSIgOiAiMCI7CisgICAgfQorCisgICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBtU2VydmljZUF0dHJpYnV0ZU1hcC5maW5kKG5hbWUpOworICAgIGlmIChhdHRyaWJ1dGUgPT0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZW5kKCkpIHsgLy8gTmV3IGF0dHJpYnV0ZSBuYW1lCisgICAgICAgIGlmIChtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3Rpbmcgc2V0dGluZyIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOworICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCisgICAgICAgIGlmICghbVVwZGF0ZSkgeworICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogYWRkaW5nIGV4aXN0aW5nIHNldHRpbmciKTsKKyAgICAgICAgfQorICAgICAgICBhdHRyaWJ1dGUtPnNlY29uZCA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHlwZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7CisgICAgbUN1cnJlbnRDb2RlYyA9IG1Db2RlY01hcC5maW5kKG5hbWUpOworICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgeyAvLyBOZXcgY29kZWMgbmFtZQorICAgICAgICBpZiAobVVwZGF0ZSkgeworICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIGNvZGVjIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY29kZWMgaW4gbUNvZGVjTWFwCisgICAgICAgIG1DdXJyZW50Q29kZWMgPSBtQ29kZWNNYXAuaW5zZXJ0KAorICAgICAgICAgICAgICAgIENvZGVjKG5hbWUsIENvZGVjUHJvcGVydGllcygpKSkuZmlyc3Q7CisgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgVHlwZSh0eXBlLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmlzRW5jb2RlciA9IGVuY29kZXI7CisgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5vcmRlciA9IG1Db2RlY0NvdW50ZXIrKzsKKyAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBjb2RlYyBuYW1lCisgICAgICAgIGlmICghbVVwZGF0ZSkgeworICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogYWRkaW5nIGV4aXN0aW5nIGNvZGVjIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5maW5kKHR5cGUpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBoYXBwZW4gb25seSB3aGVuIHRoZSBjb2RlYyBoYXMgYXQgbW9zdCBvbmUgdHlwZS4KKyAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmJlZ2luKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZFF1aXJrOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnF1aXJrU2V0LmVtcGxhY2UobmFtZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqdXBkYXRlID0gbnVsbHB0cjsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5maW5kKG5hbWUpOworICAgIGlmICghbVVwZGF0ZSkgeworICAgICAgICBpZiAobUN1cnJlbnRUeXBlICE9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiByZS1kZWZpbmluZyBleGlzdGluZyB0eXBlIHdpdGhvdXQgdXBkYXRlIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgVHlwZShuYW1lLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OworICAgIH0gZWxzZSBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIqIGFfbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9kZWZhdWx0ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX2luID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX21heCA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9taW4gPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfcmFuZ2UgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfcmFuZ2VzID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX3NjYWxlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX3ZhbHVlID0gbnVsbHB0cjsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJkZWZhdWx0IikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGRlZmF1bHQgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9kZWZhdWx0ID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJpbiIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBpbiBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX2luID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtYXgiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWF4IGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfbWF4ID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtaW4iKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWluIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfbWluID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiByYW5nZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX3JhbmdlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2VzIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfcmFuZ2VzID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJzY2FsZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBzY2FsZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX3NjYWxlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiB2YWx1ZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHVucmVjb2duaXplZCBsaW1pdDogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gc2l6ZSwgYmxvY2tzLCBiaXRyYXRlLCBmcmFtZS1yYXRlLCBibG9ja3MtcGVyLXNlY29uZCwgYXNwZWN0LXJhdGlvLAorICAgIC8vIG1lYXN1cmVkLWZyYW1lLXJhdGUsIG1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kOiByYW5nZQorICAgIC8vIHF1YWxpdHk6IHJhbmdlICsgZGVmYXVsdCArIFtzY2FsZV0KKyAgICAvLyBjb21wbGV4aXR5OiByYW5nZSArIGRlZmF1bHQKKyAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJhbmdlOworICAgIGlmIChzdHJFcShhX25hbWUsICJhc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiYml0cmF0ZSIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJibG9jay1jb3VudCIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJibG9ja3MtcGVyLXNlY29uZCIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJjb21wbGV4aXR5IikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImZyYW1lLXJhdGUiKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJzaXplIikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIikgfHwKKyAgICAgICAgICAgIHN0ckhhc1ByZWZpeChhX25hbWUsICJtZWFzdXJlZC1mcmFtZS1yYXRlLSIpKSB7CisgICAgICAgIC8vICJyYW5nZSIgaXMgc3BlY2lmaWVkIGluIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisgICAgICAgIC8vIDEpIG1pbi1tYXgKKyAgICAgICAgLy8gMikgdmFsdWUtdmFsdWUKKyAgICAgICAgLy8gMykgcmFuZ2UKKyAgICAgICAgaWYgKGFfbWluICE9IG51bGxwdHIgJiYgYV9tYXggIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gbWluLW1heAorICAgICAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0ciB8fCBhX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgJ21pbicgYW5kICdtYXgnIGFzIHdlbGwgYXMgJ3JhbmdlJyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYW5nZSA9IGFfbWluOworICAgICAgICAgICAgcmFuZ2UgKz0gJy0nOworICAgICAgICAgICAgcmFuZ2UgKz0gYV9tYXg7CisgICAgICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0ciB8fCBhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfSBlbHNlIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIHZhbHVlLXZhbHVlCisgICAgICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzIGJvdGggJ3JhbmdlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYW5nZSA9IGFfdmFsdWU7CisgICAgICAgICAgICByYW5nZSArPSAnLSc7CisgICAgICAgICAgICByYW5nZSArPSBhX3ZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGFfcmFuZ2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJhbmdlCisgICAgICAgICAgICByYW5nZSA9IGFfcmFuZ2U7CisgICAgICAgIH0KKworICAgICAgICAvLyAiYXNwZWN0LXJhdGlvIiByZXF1aXJlcyBzb21lIHNwZWNpYWwgdHJlYXRtZW50LgorICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikpIHsKKyAgICAgICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIG11c3QgaGF2ZSAiaW4iLgorICAgICAgICAgICAgaWYgKGFfaW4gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiaW4iLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAiaW4iIG11c3QgYmUgZWl0aGVyICJwaXhlbHMiIG9yICJibG9ja3MiLgorICAgICAgICAgICAgaWYgKCFzdHJFcShhX2luLCAicGl4ZWxzIikgJiYgIXN0ckVxKGFfaW4sICJibG9ja3MiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKGFfbmFtZSwgImluIiwgYV9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInBpeGVsLWFzcGVjdC1yYXRpby1yYW5nZSIgb3IKKyAgICAgICAgICAgIC8vICJibG9jay1hc3BlY3QtcmF0aW8tcmFuZ2UiLgorICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFfaW4pLnN1YnN0cigwLCBzdHJsZW4oYV9pbikgLSAxKSArCisgICAgICAgICAgICAgICAgICAgICItYXNwZWN0LXJhdGlvLXJhbmdlIl0gPSByYW5nZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UgKGFwYXJ0IGZyb20gImFzcGVjdC1yYXRpbyIpLCBzaW1wbHkgYXBwZW5kCisgICAgICAgICAgICAvLyAiLXJhbmdlIiB0byB0aGUgbmFtZSBmb3IgdGhlIHJhbmdlLXR5cGUgcHJvcGVydHkuCisgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZyhhX25hbWUpICsgIi1yYW5nZSJdID0gcmFuZ2U7CisKKyAgICAgICAgICAgIC8vIE9ubHkgInF1YWxpdHkiIG1heSBoYXZlICJzY2FsZSIuCisgICAgICAgICAgICBpZiAoIXN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSAmJiBhX3NjYWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInNjYWxlIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJxdWFsaXR5LXNjYWxlIiBpcyAibGluZWFyIi4KKyAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsicXVhbGl0eS1zY2FsZSJdID0gYV9zY2FsZSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXIiIDogYV9zY2FsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gInF1YWxpdHkiIGFuZCAiY29tcGxleGl0eSIgbXVzdCBoYXZlICJkZWZhdWx0Ii4KKyAgICAgICAgICAgIC8vIE90aGVyIGxpbWl0cyBtdXN0IG5vdCBoYXZlICJkZWZhdWx0Ii4KKyAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwgc3RyRXEoYV9uYW1lLCAiY29tcGxleGl0eSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFfZGVmYXVsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbmFtZSB3aWxsIGJlICJxdWFsaXR5LWRlZmF1bHQiIG9yICJjb21wbGV4aXR5LWRlZmF1bHQiLgorICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLWRlZmF1bHQiXSA9IGFfZGVmYXVsdDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImRlZmF1bHQiLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhX2RlZmF1bHQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJkZWZhdWx0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFfaW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJpbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhX3NjYWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAic2NhbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFfbWluICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWluIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYV9tYXggIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gIm1heCIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJjaGFubmVsLWNvdW50IiBvcgorICAgICAgICAgICAgLy8gImNvbmN1cnJlbnQtaW5zdGFuY2VzIi4KKyAgICAgICAgICAgIC8vICJtaW4iIGlzIG5vdCBuY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJjaGFubmVsLWNvdW50IikgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiY29uY3VycmVudC1pbnN0YW5jZXMiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJtYXgtIikgKyBhX25hbWVdID0gYV9tYXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWF4IiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgImNoYW5uZWwtY291bnQiKSB8fAorICAgICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWF4Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYV9yYW5nZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gInJhbmdlcyIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJzYW1wbGUtcmF0ZSIuCisgICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAic2FtcGxlLXJhdGUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kWyJzYW1wbGUtcmF0ZS1yYW5nZXMiXSA9IGFfcmFuZ2VzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlcyIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJzYW1wbGUtcmF0ZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gInZhbHVlIiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgImFsaWdubWVudCIgb3IKKyAgICAgICAgICAgIC8vICJibG9jay1zaXplIi4KKyAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJhbGlnbm1lbnQiKSB8fCBzdHJFcShhX25hbWUsICJibG9jay1zaXplIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFthX25hbWVdID0gYV92YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJ2YWx1ZSIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJhbGlnbm1lbnQiKSB8fCBzdHJFcShhX25hbWUsICJibG9jay1zaXplIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAidmFsdWUiLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIGludDMyX3Qgb3B0aW9uYWwgPSAtMTsKKyAgICBpbnQzMl90IHJlcXVpcmVkID0gLTE7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAib3B0aW9uYWwiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiBvcHRpb25hbCBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHRpb25hbCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogcmVxdWlyZWQgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWlyZWQgPSBwYXJzZUJvb2xlYW4oYXR0cnNbaV0pID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IHZhbHVlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgLy8gRXZlcnkgZmVhdHVyZSBtdXN0IGhhdmUgYSBuYW1lLgorICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coImlnbm9yaW5nIG51bGwgdHlwZSIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKChvcHRpb25hbCAhPSAtMSkgfHwgKHJlcXVpcmVkICE9IC0xKSkgeworICAgICAgICBpZiAob3B0aW9uYWwgPT0gcmVxdWlyZWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChvcHRpb25hbCA9PSAxKSB8fCAocmVxdWlyZWQgPT0gMSkpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBjYW5ub3QgaGF2ZSBleHRyYSAndmFsdWUnIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygiZmVhdHVyZS0iKSArIG5hbWVdID0KKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgPT0gMSA/ICIwIiA6ICIxIjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygiZmVhdHVyZS0iKSArIG5hbWVdID0gdmFsdWUgPT0gbnVsbHB0ciA/CisgICAgICAgICAgICAiMCIgOiB2YWx1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2NvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAmCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCkgY29uc3QgeworICAgIHJldHVybiBtU2VydmljZUF0dHJpYnV0ZU1hcDsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjTWFwJgorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Q29kZWNNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db2RlY01hcDsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVNYXAmCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRSb2xlTWFwKCkgY29uc3QgeworICAgIGlmIChtUm9sZU1hcC5lbXB0eSgpKSB7CisgICAgICAgIGdlbmVyYXRlUm9sZU1hcCgpOworICAgIH0KKyAgICByZXR1cm4gbVJvbGVNYXA7Cit9CisKK2NvbnN0IGNoYXIqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKG1Db21tb25QcmVmaXguZW1wdHkoKSkgeworICAgICAgICBnZW5lcmF0ZUNvbW1vblByZWZpeCgpOworICAgIH0KKyAgICByZXR1cm4gbUNvbW1vblByZWZpeC5kYXRhKCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2VuZXJhdGVSb2xlTWFwKCkgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byYgY29kZWMgOiBtQ29kZWNNYXApIHsKKyAgICAgICAgY29uc3QgYXV0byYgY29kZWNOYW1lID0gY29kZWMuZmlyc3Q7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyID0gY29kZWMuc2Vjb25kLmlzRW5jb2RlcjsKKyAgICAgICAgc2l6ZV90IG9yZGVyID0gY29kZWMuc2Vjb25kLm9yZGVyOworICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gY29kZWMuc2Vjb25kLnR5cGVNYXA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVNYXApIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gdHlwZS5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJvbGVOYW1lID0gR2V0Q29tcG9uZW50Um9sZShpc0VuY29kZXIsIHR5cGVOYW1lLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAocm9sZU5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCB0aGUgcm9sZSBmb3IgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyAiYW4gZW5jb2RlciIgOiAiYSBkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBhdXRvJiB0eXBlQXR0cmlidXRlTWFwID0gdHlwZS5zZWNvbmQ7CisKKyAgICAgICAgICAgIGF1dG8gcm9sZUl0ZXJhdG9yID0gbVJvbGVNYXAuZmluZChyb2xlTmFtZSk7CisgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPHNpemVfdCwgTm9kZUluZm8+KiBub2RlTGlzdDsKKyAgICAgICAgICAgIGlmIChyb2xlSXRlcmF0b3IgPT0gbVJvbGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBSb2xlUHJvcGVydGllcyByb2xlUHJvcGVydGllczsKKyAgICAgICAgICAgICAgICByb2xlUHJvcGVydGllcy50eXBlID0gdHlwZU5hbWU7CisgICAgICAgICAgICAgICAgcm9sZVByb3BlcnRpZXMuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgICAgICAgICAgICAgIGF1dG8gaW5zZXJ0UmVzdWx0ID0gbVJvbGVNYXAuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocm9sZU5hbWUsIHJvbGVQcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnNlcnRSZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgYWRkIHJvbGUgJXMiLCByb2xlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlTGlzdCA9ICZpbnNlcnRSZXN1bHQuZmlyc3QtPnNlY29uZC5ub2RlTGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJvbGVJdGVyYXRvci0+c2Vjb25kLnR5cGUgIT0gdHlwZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJvbGUgJXMgaGFzIG1pc21hdGNoaW5nIHR5cGVzOiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVJdGVyYXRvci0+c2Vjb25kLnR5cGUuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocm9sZUl0ZXJhdG9yLT5zZWNvbmQuaXNFbmNvZGVyICE9IGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUm9sZSAlcyBjYW5ub3QgYmUgYm90aCBhbiBlbmNvZGVyIGFuZCBhIGRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGVMaXN0ID0gJnJvbGVJdGVyYXRvci0+c2Vjb25kLm5vZGVMaXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb2RlSW5mbyBub2RlSW5mbzsKKyAgICAgICAgICAgIG5vZGVJbmZvLm5hbWUgPSBjb2RlY05hbWU7CisgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnJlc2VydmUodHlwZUF0dHJpYnV0ZU1hcC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiB0eXBlQXR0cmlidXRlTWFwKSB7CisgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGV7YXR0cmlidXRlLmZpcnN0LCBhdHRyaWJ1dGUuc2Vjb25kfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdlbmVyYXRlQ29tbW9uUHJlZml4KCkgY29uc3QgeworICAgIGlmIChtQ29kZWNNYXAuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gaSA9IG1Db2RlY01hcC5jYmVnaW4oKTsKKyAgICBhdXRvIGZpcnN0ID0gaS0+Zmlyc3QuY2JlZ2luKCk7CisgICAgYXV0byBsYXN0ID0gaS0+Zmlyc3QuY2VuZCgpOworICAgIGZvciAoKytpOyBpICE9IG1Db2RlY01hcC5jZW5kKCk7ICsraSkgeworICAgICAgICBsYXN0ID0gc3RkOjptaXNtYXRjaCgKKyAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgaS0+Zmlyc3QuY2JlZ2luKCksIGktPmZpcnN0LmNlbmQoKSkuZmlyc3Q7CisgICAgfQorICAgIG1Db21tb25QcmVmaXguaW5zZXJ0KG1Db21tb25QcmVmaXguYmVnaW4oKSwgZmlyc3QsIGxhc3QpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2OWU1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1hNTFBBUlNFUl9IXworI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9YTUxQQVJTRVJfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjc1htbFBhcnNlciB7CitwdWJsaWM6CisKKyAgICAvLyBUcmVibGl6ZWQgbWVkaWEgY29kZWMgbGlzdCB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0U2VhcmNoRGlyc1tdID0KKyAgICAgICAgICAgIHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL2V0YyIsIG51bGxwdHJ9OworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdE1haW5YbWxOYW1lID0KKyAgICAgICAgICAgICJtZWRpYV9jb2RlY3MueG1sIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUgPQorICAgICAgICAgICAgIm1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoID0KKyAgICAgICAgICAgICIvZGF0YS9taXNjL21lZGlhL21lZGlhX2NvZGVjc19wcm9maWxpbmdfcmVzdWx0cy54bWwiOworCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycyA9IGRlZmF1bHRTZWFyY2hEaXJzLAorICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUgPSBkZWZhdWx0TWFpblhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUgPSBkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPSBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIH5NZWRpYUNvZGVjc1htbFBhcnNlcigpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBBdHRyaWJ1dGU7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEF0dHJpYnV0ZU1hcDsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBBdHRyaWJ1dGVNYXA+IFR5cGU7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQXR0cmlidXRlTWFwPiBUeXBlTWFwOworCisgICAgdHlwZWRlZiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gUXVpcmtTZXQ7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0aWVzIG9mIGEgY29kZWMgKG5vZGUpCisgICAgICovCisgICAgc3RydWN0IENvZGVjUHJvcGVydGllcyB7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyOyAgICAvLy88IFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2RlcgorICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCisgICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBDb2RlY1Byb3BlcnRpZXM+IENvZGVjOworICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWNNYXA7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0aWVzIG9mIGEgbm9kZSAoZm9yIElPbXhTdG9yZSkKKyAgICAgKi8KKyAgICBzdHJ1Y3QgTm9kZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZUxpc3Q7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgb2YgYSByb2xlIChmb3IgSU9teFN0b3JlKQorICAgICAqLworICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGU7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyOworICAgICAgICBzdGQ6Om11bHRpbWFwPHNpemVfdCwgTm9kZUluZm8+IG5vZGVMaXN0OworICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUm9sZVByb3BlcnRpZXM+IFJvbGU7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUm9sZVByb3BlcnRpZXM+IFJvbGVNYXA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtYXAgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUgc2VydmljZS1zcGVjaWZpYy4KKyAgICAgKi8KKyAgICBjb25zdCBBdHRyaWJ1dGVNYXAmIGdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcCBmb3IgY29kZWNzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIGNvbnN0IENvZGVjTWFwJiBnZXRDb2RlY01hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbWFwIGZvciByb2xlcyBhbmQgdGhlaXIgcHJvcGVydGllcy4KKyAgICAgKiBUaGlzIG1hcCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29kZWNNYXAuCisgICAgICovCisgICAgY29uc3QgUm9sZU1hcCYgZ2V0Um9sZU1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29tbW9uIHByZWZpeCBvZiBhbGwgbm9kZSBuYW1lcy4KKyAgICAgKgorICAgICAqIFRoZSBwcmVmaXggaXMgbm90IHByb3ZpZGVkIGluIHRoZSB4bWwsIHNvIGl0IGhhcyB0byBiZSBjb21wdXRlZCBieSB0YWtpbmcKKyAgICAgKiB0aGUgbG9uZ2VzdCBjb21tb24gcHJlZml4IG9mIGFsbCBub2RlIG5hbWVzLgorICAgICAqLworICAgIGNvbnN0IGNoYXIqIGdldENvbW1vblByZWZpeCgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgZ2V0UGFyc2luZ1N0YXR1cygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGVudW0gU2VjdGlvbiB7CisgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCisgICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCisgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCisgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKKyAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCisgICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKKyAgICB9OworCisgICAgc3RhdHVzX3QgbVBhcnNpbmdTdGF0dXM7CisgICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247CisgICAgYm9vbCBtVXBkYXRlOworICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb24+IG1TZWN0aW9uU3RhY2s7CisgICAgc3RkOjpzdHJpbmcgbUhyZWZCYXNlOworCisgICAgLy8gU2VydmljZSBhdHRyaWJ1dGVzCisgICAgQXR0cmlidXRlTWFwIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworCisgICAgLy8gQ29kZWMgYXR0cmlidXRlcworICAgIHN0ZDo6c3RyaW5nIG1DdXJyZW50TmFtZTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbUNvZGVjU2V0OworICAgIENvZGVjIG1Db2RlY0xpc3RUZW1wWzIwNDhdOworICAgIENvZGVjTWFwIG1Db2RlY01hcDsKKyAgICBzaXplX3QgbUNvZGVjQ291bnRlcjsKKyAgICBDb2RlY01hcDo6aXRlcmF0b3IgbUN1cnJlbnRDb2RlYzsKKyAgICBUeXBlTWFwOjppdGVyYXRvciBtQ3VycmVudFR5cGU7CisKKyAgICAvLyBSb2xlIG1hcAorICAgIG11dGFibGUgUm9sZU1hcCBtUm9sZU1hcDsKKworICAgIC8vIENvbXB1dGVkIGxvbmdlc3QgY29tbW9uIHByZWZpeAorICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbUNvbW1vblByZWZpeDsKKworICAgIGJvb2wgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCwgYm9vbCBpZ25vcmVfZXJyb3JzID0gZmFsc2UpOworCisgICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CisKKyAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKKyAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworCisgICAgc3RhdGljIHZvaWQgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHZvaWQgZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBzdGF0dXNfdCBpbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgdm9pZCBhZGRNZWRpYUNvZGVjKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBudWxscHRyKTsKKworICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICB2b2lkIGFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICB2b2lkIGdlbmVyYXRlUm9sZU1hcCgpIGNvbnN0OworICAgIHZvaWQgZ2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdDsKKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXImIG9wZXJhdG9yPShjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlciYpID0gZGVsZXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gTUVESUFfU1RBR0VGUklHSFRfWE1MUEFSU0VSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCmluZGV4IDFjMDRiY2YuLmQyZWRlMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmNwcApAQCAtMTAyLDYgKzEwMiw3IEBACiAgICAgeyAiTVRQX0ZPUk1BVF9KUDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBGIH0sCiAgICAgeyAiTVRQX0ZPUk1BVF9KUFgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEwIH0sCiAgICAgeyAiTVRQX0ZPUk1BVF9ETkciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODExIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9IRUlGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEyIH0sCiAgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUiLCAgICAgICAgICAgICAgMHhCODAyIH0sCiAgICAgeyAiTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCIsICAgICAgICAgICAgMHhCODgxIH0sCiAgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8iLCAgICAgICAgICAgICAgICAgMHhCOTAwIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGM1MGFmMmYuLjhkODk0YzEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC02Miw2ICs2Miw4IEBACiBjb25zdGV4cHIgaW50IFVTQl9GRlNfTUFYX1dSSVRFID0gTVRQX0JVRkZFUl9TSVpFOwogY29uc3RleHByIGludCBVU0JfRkZTX01BWF9SRUFEID0gTVRQX0JVRkZFUl9TSVpFOwogCitjb25zdGV4cHIgdW5zaWduZWQgRkZTX05VTV9FVkVOVFMgPSA1OworCiBzdGF0aWNfYXNzZXJ0KFVTQl9GRlNfTUFYX1dSSVRFID4gMCwgIk1heCByL3cgdmFsdWVzIG11c3QgYmUgPiAwISIpOwogc3RhdGljX2Fzc2VydChVU0JfRkZTX01BWF9SRUFEID4gMCwgIk1heCByL3cgdmFsdWVzIG11c3QgYmUgPiAwISIpOwogCkBAIC0xMDIsOCArMTA0LDExIEBACiAgICAgX19sZTMyIGZzX2NvdW50OwogICAgIF9fbGUzMiBoc19jb3VudDsKICAgICBfX2xlMzIgc3NfY291bnQ7CisgICAgX19sZTMyIG9zX2NvdW50OwogICAgIHN0cnVjdCBmdW5jX2Rlc2MgZnNfZGVzY3MsIGhzX2Rlc2NzOwogICAgIHN0cnVjdCBzc19mdW5jX2Rlc2Mgc3NfZGVzY3M7CisgICAgc3RydWN0IHVzYl9vc19kZXNjX2hlYWRlciBvc19oZWFkZXI7CisgICAgc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2Mgb3NfZGVzYzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIGNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgbXRwX2ludGVyZmFjZV9kZXNjID0gewpAQCAtMjg3LDYgKzI5MiwzNiBAQAogICAgIH0sCiB9OwogCitzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG10cF9vc19kZXNjX2hlYWRlciA9IHsKKyAgICAuaW50ZXJmYWNlID0gaHRvbGUzMigxKSwKKyAgICAuZHdMZW5ndGggPSBodG9sZTMyKHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpKSwKKyAgICAuYmNkVmVyc2lvbiA9IGh0b2xlMTYoMSksCisgICAgLndJbmRleCA9IGh0b2xlMTYoNCksCisgICAgLmJDb3VudCA9IGh0b2xlMTYoMSksCisgICAgLlJlc2VydmVkID0gaHRvbGUxNigwKSwKK307CisKK3N0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIG10cF9vc19kZXNjX2NvbXBhdCA9IHsKKyAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKKyAgICAuQ29tcGF0aWJsZUlEID0geyAnTScsICdUJywgJ1AnIH0sCisgICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKKyAgICAuUmVzZXJ2ZWQyID0gezB9LAorfTsKKworc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgcHRwX29zX2Rlc2NfY29tcGF0ID0geworICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAorICAgIC5Db21wYXRpYmxlSUQgPSB7ICdQJywgJ1QnLCAnUCcgfSwKKyAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAorICAgIC5SZXNlcnZlZDIgPSB7MH0sCit9OworCitzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMgeworICAgIHVpbnQxNl90ICB3TGVuZ3RoOworICAgIHVpbnQxNl90ICB3Q29kZTsKK307CisKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMTEsMTMgKzM0NiwxNiBAQAogICAgIHYyX2Rlc2NyaXB0b3IuaGVhZGVyLm1hZ2ljID0gY3B1X3RvX2xlMzIoRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMik7CiAgICAgdjJfZGVzY3JpcHRvci5oZWFkZXIubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHYyX2Rlc2NyaXB0b3IpKTsKICAgICB2Ml9kZXNjcmlwdG9yLmhlYWRlci5mbGFncyA9IEZVTkNUSU9ORlNfSEFTX0ZTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19IU19ERVNDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQzsKICAgICB2Ml9kZXNjcmlwdG9yLmZzX2NvdW50ID0gNDsKICAgICB2Ml9kZXNjcmlwdG9yLmhzX2NvdW50ID0gNDsKICAgICB2Ml9kZXNjcmlwdG9yLnNzX2NvdW50ID0gNzsKKyAgICB2Ml9kZXNjcmlwdG9yLm9zX2NvdW50ID0gMTsKICAgICB2Ml9kZXNjcmlwdG9yLmZzX2Rlc2NzID0gbVB0cCA/IHB0cF9mc19kZXNjcmlwdG9ycyA6IG10cF9mc19kZXNjcmlwdG9yczsKICAgICB2Ml9kZXNjcmlwdG9yLmhzX2Rlc2NzID0gbVB0cCA/IHB0cF9oc19kZXNjcmlwdG9ycyA6IG10cF9oc19kZXNjcmlwdG9yczsKICAgICB2Ml9kZXNjcmlwdG9yLnNzX2Rlc2NzID0gbVB0cCA/IHB0cF9zc19kZXNjcmlwdG9ycyA6IG10cF9zc19kZXNjcmlwdG9yczsKKyAgICB2Ml9kZXNjcmlwdG9yLm9zX2hlYWRlciA9IG10cF9vc19kZXNjX2hlYWRlcjsKKyAgICB2Ml9kZXNjcmlwdG9yLm9zX2Rlc2MgPSBtUHRwID8gcHRwX29zX2Rlc2NfY29tcGF0IDogbXRwX29zX2Rlc2NfY29tcGF0OwogCiAgICAgaWYgKG1Db250cm9sIDwgMCkgeyAvLyBtaWdodCBoYXZlIGFscmVhZHkgZG9uZSB0aGlzIGJlZm9yZQogICAgICAgICBtQ29udHJvbC5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQMCwgT19SRFdSKSkpOwpAQCAtMzYxLDYgKzM5OSw4OCBAQAogICAgIG1Db250cm9sLnJlc2V0KCk7CiB9CiAKK3ZvaWQgTXRwRmZzSGFuZGxlOjpjb250cm9sTG9vcCgpIHsKKyAgICB3aGlsZSAoIWhhbmRsZUV2ZW50KCkpIHt9CisgICAgTE9HKERFQlVHKSA8PCAiTXRwIHNlcnZlciBzaHV0dGluZyBkb3duIjsKK30KKworaW50IE10cEZmc0hhbmRsZTo6aGFuZGxlRXZlbnQoKSB7CisgICAgc3RkOjp2ZWN0b3I8dXNiX2Z1bmN0aW9uZnNfZXZlbnQ+IGV2ZW50cyhGRlNfTlVNX0VWRU5UUyk7CisgICAgdXNiX2Z1bmN0aW9uZnNfZXZlbnQgKmV2ZW50ID0gZXZlbnRzLmRhdGEoKTsKKyAgICBpbnQgbmJ5dGVzID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6cmVhZChtQ29udHJvbCwgZXZlbnQsCisgICAgICAgICAgICAgICAgZXZlbnRzLnNpemUoKSAqIHNpemVvZih1c2JfZnVuY3Rpb25mc19ldmVudCkpKTsKKyAgICBpZiAobmJ5dGVzID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IHJldCA9IDA7CisgICAgZm9yIChzaXplX3QgbiA9IG5ieXRlcyAvIHNpemVvZiAqZXZlbnQ7IG47IC0tbiwgKytldmVudCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19CSU5EOgorICAgICAgICBjYXNlIEZVTkNUSU9ORlNfRU5BQkxFOgorICAgICAgICBjYXNlIEZVTkNUSU9ORlNfUkVTVU1FOgorICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZVTkNUSU9ORlNfU1VTUEVORDoKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX1VOQklORDoKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX0RJU0FCTEU6CisgICAgICAgICAgICBlcnJubyA9IEVTSFVURE9XTjsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19TRVRVUDoKKyAgICAgICAgICAgIGlmIChoYW5kbGVDb250cm9sUmVxdWVzdCgmZXZlbnQtPnUuc2V0dXApID09IC0xKQorICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJNdHAgRXZlbnQgIiA8PCBldmVudC0+dHlwZSA8PCAiICh1bmtub3duKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6aGFuZGxlQ29udHJvbFJlcXVlc3QoY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqc2V0dXApIHsKKyAgICB1aW50OF90IHR5cGUgPSBzZXR1cC0+YlJlcXVlc3RUeXBlOworICAgIHVpbnQ4X3QgY29kZSA9IHNldHVwLT5iUmVxdWVzdDsKKyAgICB1aW50MTZfdCBsZW5ndGggPSBzZXR1cC0+d0xlbmd0aDsKKyAgICB1aW50MTZfdCBpbmRleCA9IHNldHVwLT53SW5kZXg7CisgICAgdWludDE2X3QgdmFsdWUgPSBzZXR1cC0+d1ZhbHVlOworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKKyAgICBidWYucmVzaXplKGxlbmd0aCk7CisKKyAgICBpZiAoISh0eXBlICYgVVNCX0RJUl9JTikpIHsKKyAgICAgICAgaWYgKDo6cmVhZChtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSByZWFkIGRhdGEiOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCh0eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MgJiYgaW5kZXggPT0gMCAmJiB2YWx1ZSA9PSAwKSB7CisgICAgICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzICpzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKj4oYnVmLmRhdGEoKSk7CisgICAgICAgICAgICBzdC0+d0xlbmd0aCA9IGh0b2xlMTYoc2l6ZW9mKHN0KSk7CisgICAgICAgICAgICBzdC0+d0NvZGUgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICBsZW5ndGggPSBzdC0+d0xlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgTXRwIGNsYXNzIHJlcXVlc3QhICIgPDwgY29kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCByZXF1ZXN0IHR5cGUgIiA8PCB0eXBlOworICAgIH0KKworICAgIGlmICh0eXBlICYgVVNCX0RJUl9JTikgeworICAgICAgICBpZiAoOjp3cml0ZShtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSB3cml0ZSBkYXRhIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogaW50IE10cEZmc0hhbmRsZTo6d3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7CiAgICAgTE9HKFZFUkJPU0UpIDw8ICJNVFAgYWJvdXQgdG8gd3JpdGUgZmQgPSAiIDw8IGZkIDw8ICIsIGxlbj0iIDw8IGxlbjsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTQ2MCw2ICs1ODAsMTAgQEAKICAgICBwb3NpeF9tYWR2aXNlKG1CdWZmZXIyLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKICAgICAgICAgICAgIFBPU0lYX01BRFZfU0VRVUVOVElBTCB8IFBPU0lYX01BRFZfV0lMTE5FRUQpOwogCisgICAgLy8gSGFuZGxlIGNvbnRyb2wgcmVxdWVzdHMuCisgICAgc3RkOjp0aHJlYWQgdChbdGhpc10oKSB7IHRoaXMtPmNvbnRyb2xMb29wKCk7IH0pOworICAgIHQuZGV0YWNoKCk7CisKICAgICAvLyBHZXQgZGV2aWNlIHNwZWNpZmljIHIvdyBzaXplCiAgICAgbU1heFdyaXRlID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInN5cy51c2IuZmZzLm1heF93cml0ZSIsIFVTQl9GRlNfTUFYX1dSSVRFKTsKICAgICBtTWF4UmVhZCA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfcmVhZCIsIFVTQl9GRlNfTUFYX1JFQUQpOwpAQCAtNTQyLDYgKzY2Niw3IEBACiAgICAgc2l6ZV90IGxlbmd0aDsKICAgICBib29sIHJlYWQgPSBmYWxzZTsKICAgICBib29sIHdyaXRlID0gZmFsc2U7CisgICAgYm9vbCBzaG9ydF9wYWNrZXQgPSBmYWxzZTsKIAogICAgIHBvc2l4X2ZhZHZpc2UobWZyLmZkLCAwLCAwLCBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UpOwogCkBAIC01ODYsNiArNzExLDcgQEAKICAgICAgICAgICAgICAgICAvLyBGb3IgbGFyZ2VyIGZpbGVzLCByZWNlaXZlIHVudGlsIGEgc2hvcnQgcGFja2V0IGlzIHJlY2VpdmVkLgogICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgZmlsZV9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICBzaG9ydF9wYWNrZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gUmVjZWl2ZSBhbiBlbXB0eSBwYWNrZXQgaWYgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbmRwb2ludCBzaXplLgpAQCAtNjA1LDcgKzczMSw3IEBACiAgICAgICAgICAgICByZWFkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJldCAlIHBhY2tldF9zaXplID09IDAgfHwgemVyb19wYWNrZXQpIHsKKyAgICBpZiAoKHJldCAlIHBhY2tldF9zaXplID09IDAgJiYgIXNob3J0X3BhY2tldCkgfHwgemVyb19wYWNrZXQpIHsKICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQobUJ1bGtPdXQsIGRhdGEsIHBhY2tldF9zaXplKSkgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC03MTksOSArODQ1LDIyIEBACiB9CiAKIGludCBNdHBGZnNIYW5kbGU6OnNlbmRFdmVudChtdHBfZXZlbnQgbWUpIHsKKyAgICAvLyBNaW1pYyB0aGUgYmVoYXZpb3Igb2YgZl9tdHAgYnkgc2VuZGluZyB0aGUgZXZlbnQgYXN5bmMuCisgICAgLy8gRXZlbnRzIGFyZW4ndCBjcml0aWNhbCB0byB0aGUgY29ubmVjdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLgorICAgIGNoYXIgKnRlbXAgPSBuZXcgY2hhclttZS5sZW5ndGhdOworICAgIG1lbWNweSh0ZW1wLCBtZS5kYXRhLCBtZS5sZW5ndGgpOworICAgIG1lLmRhdGEgPSB0ZW1wOworICAgIHN0ZDo6dGhyZWFkIHQoW3RoaXMsIG1lXSgpIHsgcmV0dXJuIHRoaXMtPmRvU2VuZEV2ZW50KG1lKTsgfSk7CisgICAgdC5kZXRhY2goKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBNdHBGZnNIYW5kbGU6OmRvU2VuZEV2ZW50KG10cF9ldmVudCBtZSkgewogICAgIHVuc2lnbmVkIGxlbmd0aCA9IG1lLmxlbmd0aDsKLSAgICBpbnQgcmV0ID0gd3JpdGVIYW5kbGUobUludHIsIG1lLmRhdGEsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihyZXQpID09IGxlbmd0aCA/IDAgOiAtMTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShtSW50ciwgbWUuZGF0YSwgbGVuZ3RoKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHJldCkgIT0gbGVuZ3RoKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIHNlbmRpbmcgZXZlbnQgdGhyZWFkISI7CisgICAgZGVsZXRlW10gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obWUuZGF0YSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaAppbmRleCA5ODY2OWZmLi5kYTBjZDlmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCkBAIC0zMyw2ICszMywxMSBAQAogICAgIGJvb2wgaW5pdEZ1bmN0aW9uZnMoKTsKICAgICB2b2lkIGNsb3NlQ29uZmlnKCk7CiAgICAgdm9pZCBjbG9zZUVuZHBvaW50cygpOworICAgIHZvaWQgZG9TZW5kRXZlbnQobXRwX2V2ZW50IG1lKTsKKworICAgIHZvaWQgY29udHJvbExvb3AoKTsKKyAgICBpbnQgaGFuZGxlRXZlbnQoKTsKKyAgICBpbnQgaGFuZGxlQ29udHJvbFJlcXVlc3QoY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqc2V0dXApOwogCiAgICAgYm9vbCBtUHRwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvbXRwLmggYi9tZWRpYS9tdHAvbXRwLmgKaW5kZXggYWRmYjEwMi4uMWM3ODI5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL210cC5oCisrKyBiL21lZGlhL210cC9tdHAuaApAQCAtOTQsNiArOTQsNyBAQAogI2RlZmluZSBNVFBfRk9STUFUX0pQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgICAvLyBKUEVHMjAwMCBCYXNlbGluZSBGaWxlIEZvcm1hdAogI2RlZmluZSBNVFBfRk9STUFUX0pQWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgICAvLyBKUEVHMjAwMCBFeHRlbmRlZCBGaWxlIEZvcm1hdAogI2RlZmluZSBNVFBfRk9STUFUX0RORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTEgICAvLyBEaWdpdGFsIE5lZ2F0aXZlCisjZGVmaW5lIE1UUF9GT1JNQVRfSEVJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMiAgIC8vIEhFSUYgaW1hZ2VzCiAjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFICAgICAgICAgICAgICAgICAgIDB4QjgwMgogI2RlZmluZSBNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUICAgICAgICAgICAgICAgICAweEI4ODEKICNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTAwCkBAIC00OTMsNCArNDk0LDEwIEBACiAjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX1VOREVGSU5FRCAgICAgICAgICAgICAgMHgwMDAwCiAjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSICAgICAgICAgMHgwMDAxCiAKKy8vIE1UUCBjbGFzcyByZXFldXN0cworI2RlZmluZSBNVFBfUkVRX0NBTkNFTCAgICAgICAgICAgICAgMHg2NAorI2RlZmluZSBNVFBfUkVRX0dFVF9FWFRfRVZFTlRfREFUQSAgMHg2NQorI2RlZmluZSBNVFBfUkVRX1JFU0VUICAgICAgICAgICAgICAgMHg2NgorI2RlZmluZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTICAgMHg2NworCiAjZW5kaWYgLy8gX01UUF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDQwOTc0ZjMuLjBkNDhkZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC05MCwzICs5MCw5IEBACiAgICAgICAgIH0sCiAgICAgfSwKIH0KKworbGxuZGtfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKKyAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKaW5kZXggNmQyOGQxYi4uODdiNjQ5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCkBAIC01MywyMSArNTMsMjUgQEAKIAogdm9pZAogQUltYWdlOjpjbG9zZShpbnQgcmVsZWFzZUZlbmNlRmQpIHsKKyAgICBsb2NrUmVhZGVyKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUlzQ2xvc2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3A8QUltYWdlUmVhZGVyPiByZWFkZXIgPSBtUmVhZGVyLnByb21vdGUoKTsKLSAgICBpZiAocmVhZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiRXJyb3I6IEFJbWFnZSBub3QgY2xvc2VkIGJlZm9yZSBBSW1hZ2VSZWFkZXIgY2xvc2UhIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAocmVhZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVhZGVyLT5yZWxlYXNlSW1hZ2VMb2NrZWQodGhpcywgcmVsZWFzZUZlbmNlRmQpOworICAgIH0gZWxzZSBpZiAobUJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBwYXJlbnQgQUltYWdlUmVhZGVyIGNsb3NlZCB3aXRob3V0IHJlbGVhc2luZyBpbWFnZSAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aGlzKTsKICAgICB9Ci0gICAgcmVhZGVyLT5yZWxlYXNlSW1hZ2VMb2NrZWQodGhpcywgcmVsZWFzZUZlbmNlRmQpOworCiAgICAgLy8gU2hvdWxkIGhhdmUgYmVlbiBzZXQgdG8gbnVsbHB0ciBpbiByZWxlYXNlSW1hZ2VMb2NrZWQKICAgICAvLyBTZXQgdG8gbnVsbHB0ciBoZXJlIGZvciBleHRyYSBzYWZldHkgb25seQogICAgIG1CdWZmZXIgPSBudWxscHRyOwogICAgIG1Mb2NrZWRCdWZmZXIgPSBudWxscHRyOwogICAgIG1Jc0Nsb3NlZCA9IHRydWU7CisgICAgdW5sb2NrUmVhZGVyKCk7CiB9CiAKIHZvaWQKQEAgLTYxOCw5ICs2MjIsNyBAQAogdm9pZCBBSW1hZ2VfZGVsZXRlQXN5bmMoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBpZiAoaW1hZ2UgIT0gbnVsbHB0cikgewotICAgICAgICBpbWFnZS0+bG9ja1JlYWRlcigpOwogICAgICAgICBpbWFnZS0+Y2xvc2UocmVsZWFzZUZlbmNlRmQpOwotICAgICAgICBpbWFnZS0+dW5sb2NrUmVhZGVyKCk7CiAgICAgICAgIGlmICghaW1hZ2UtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkltYWdlIGNsb3NlIGZhaWxlZCEiKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggNWQxYTIwYi4uZTkwNzgzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC00NCw3ICs0NCwxMSBAQAogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprR3JhcGhpY0J1ZmZlcktleSA9ICJHcmFwaGljQnVmZmVyIjsKIAogYm9vbAotQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdChpbnQzMl90IGZvcm1hdCkgeworQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSkgeworICAgIC8vIENoZWNrIHdoZXRoZXIgdXNhZ2UgaGFzIGVpdGhlciBDUFVfUkVBRF9PRlRFTiBvciBDUFVfUkVBRCBzZXQuIE5vdGUgdGhhdCBjaGVjayBhZ2FpbnN0CisgICAgLy8gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOICgweDYpIGlzIHN1ZmZpY2llbnQgYXMgaXQgaW1wbGllcworICAgIC8vIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRCAoMHgyKS4KKyAgICBib29sIGhhc0NwdVVzYWdlID0gdXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU47CiAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JHQkFfODg4ODoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JHQlhfODg4ODoKQEAgLTYwLDYgKzY0LDkgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKKyAgICAgICAgICAgIC8vIEZvciBwcml2YXRlIGZvcm1hdCwgY3B1IHVzYWdlIGlzIHByb2hpYml0ZWQuCisgICAgICAgICAgICByZXR1cm4gIWhhc0NwdVVzYWdlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTgzLDYgKzkwLDggQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTM0MCw2ICszNDksNyBAQAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwogICAgICAgICAgICAgICBpdCAhPSBtQWNxdWlyZWRJbWFnZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgQUltYWdlKiBpbWFnZSA9ICppdDsKKyAgICAgICAgcmVsZWFzZUltYWdlTG9ja2VkKGltYWdlLCAvKnJlbGVhc2VGZW5jZUZkKi8tMSk7CiAgICAgICAgIGltYWdlLT5jbG9zZSgpOwogICAgIH0KIApAQCAtNjA2LDkgKzYxNiw5IEBACiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQogCi0gICAgaWYgKCFBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCBieSBBSW1hZ2VSZWFkZXIiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZm9ybWF0KTsKKyAgICBpZiAoIUFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShmb3JtYXQsIHVzYWdlKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggdXNhZ2UgMHglIiBQUkl4NjQgIiBieSBBSW1hZ2VSZWFkZXIiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZm9ybWF0LCB1c2FnZSk7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKaW5kZXggOTg5YzFmZC4uOTg5YjkzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaApAQCAtNDksNyArNDksNyBAQAogCiBzdHJ1Y3QgQUltYWdlUmVhZGVyIDogcHVibGljIFJlZkJhc2UgewogICBwdWJsaWM6Ci0gICAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWRGb3JtYXQoaW50MzJfdCBmb3JtYXQpOworICAgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlMCk7CiAgICAgc3RhdGljIGludCBnZXROdW1QbGFuZXNGb3JGb3JtYXQoaW50MzJfdCBmb3JtYXQpOwogCiAgICAgQUltYWdlUmVhZGVyKGludDMyX3Qgd2lkdGgsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCA1MTE0M2FjLi5lZWNjODU4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubUtleSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7Ci0gICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubVZhbHVlID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5rZXlBdChpKS5zdHJpbmcoKTsKKyAgICAgICAga2V5VmFsdWVQYWlyc1tpXS5tVmFsdWUgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLnZhbHVlQXQoaSkuc3RyaW5nKCk7CiAgICAgfQogICAgICpudW1QYWlycyA9IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOwogICAgIHJldHVybiBBTUVESUFfT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAppbmRleCBkNzQ0M2JlLi4xOTMxNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKQEAgLTQ5NSw3ICs0OTUsMTMgQEAKICAgICAvKioKICAgICAgKiBBbmRyb2lkIHByaXZhdGUgb3BhcXVlIGltYWdlIGZvcm1hdC4KICAgICAgKgotICAgICAqIDxwPlRoaXMgZm9ybWF0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LjwvcD4KKyAgICAgKiA8cD5UaGUgY2hvaWNlcyBvZiB0aGUgYWN0dWFsIGZvcm1hdCBhbmQgcGl4ZWwgZGF0YSBsYXlvdXQgYXJlIGVudGlyZWx5IHVwIHRvIHRoZQorICAgICAqIGRldmljZS1zcGVjaWZpYyBhbmQgZnJhbWV3b3JrIGludGVybmFsIGltcGxlbWVudGF0aW9ucywgYW5kIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB1c2UgY2FzZXMKKyAgICAgKiBldmVuIGZvciB0aGUgc2FtZSBkZXZpY2UuIEFsc28gbm90ZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGVzZSBidWZmZXJzIGFyZSBub3QgZGlyZWN0bHkKKyAgICAgKiBhY2Nlc3NpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5XaGVuIGFuIHtAbGluayBBSW1hZ2V9IG9mIHRoaXMgZm9ybWF0IGlzIG9idGFpbmVkIGZyb20gYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0gb3IKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzKCl9IG1ldGhvZCB3aWxsIHJldHVybiB6ZXJvLjwvcD4KICAgICAgKi8KICAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMgogfTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDU5YWU1MDcuLjdhMGMxN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtNzAsNyArNzAsOSBAQAogICogQHBhcmFtIGhlaWdodCBUaGUgZGVmYXVsdCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCiAgKiBAcGFyYW0gZm9ybWF0IFRoZSBmb3JtYXQgb2YgdGhlIEltYWdlIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLiBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQogICogICAgICAgICAgICBBSU1BR0VfRk9STUFUXyogZW51bSB2YWx1ZSBkZWZpbmVkIGluIHtAbGluayBBSU1BR0VfRk9STUFUU30uIE5vdGUgdGhhdCBub3QgYWxsCi0gKiAgICAgICAgICAgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgbGlrZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfS4KKyAqICAgICAgICAgICAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLiBPbmUgZXhhbXBsZSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgYXMgaXQgaXMgbm90CisgKiAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHJlYWQgYnkgYXBwbGljYXRpb25zIGRpcmVjdGx5LiBUaGF0IGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkKKyAqICAgICAgICAgICAge0BsaW5rIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2V9IGludHJvZHVjZWQgaW4gQVBJIDI2LgogICogQHBhcmFtIG1heEltYWdlcyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIHRoZSB1c2VyIHdpbGwgd2FudCB0byBhY2Nlc3Mgc2ltdWx0YW5lb3VzbHkuIFRoaXMKICAqICAgICAgICAgICAgc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlIHRvIGxpbWl0IG1lbW9yeSB1c2UuIE9uY2UgbWF4SW1hZ2VzIEltYWdlcyBhcmUgb2J0YWluZWQKICAqICAgICAgICAgICAgYnkgdGhlIHVzZXIsIG9uZSBvZiB0aGVtIGhhcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgYSBuZXcge0BsaW5rIEFJbWFnZX0gd2lsbCBiZWNvbWUKQEAgLTMwNyw2ICszMDksMjggQEAKICAqIGZvciB0aGUgY29uc3VtZXIgdXNhZ2UuIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIHBhc3NlZAogICogdG8ge0BsaW5lIEFJbWFnZVJlYWRlcl9uZXd9LgogICoKKyAqIDxwPklmIHRoZSB7QGNvZGUgZm9ybWF0fSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgdGhlIGNyZWF0ZWQge0BsaW5rIEFJbWFnZVJlYWRlcn0KKyAqIHdpbGwgcHJvZHVjZSBpbWFnZXMgd2hvc2UgY29udGVudHMgYXJlIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNhbgorICogc3RpbGwgYWNxdWlyZSBpbWFnZXMgZnJvbSB0aGlzIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGFuZCBhY2Nlc3Mge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gdmlhCisgKiB7QGxpbmsgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKCl9LiBUaGUge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gZ2FpbmVkIHRoaXMgd2F5IGNhbiB0aGVuCisgKiBiZSBwYXNzZWQgYmFjayB0byBoYXJkd2FyZSAoc3VjaCBhcyBHUFUgb3IgaGFyZHdhcmUgZW5jb2RlciBpZiBzdXBwb3J0ZWQpIGZvciBmdXR1cmUgcHJvY2Vzc2luZy4KKyAqIEZvciBleGFtcGxlLCB5b3UgY2FuIG9idGFpbiBhbiB7QGxpbmsgRUdMQ2xpZW50QnVmZmVyfSBmcm9tIHRoZSB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSBieSB1c2luZworICoge0BsaW5rIGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUR9IGV4dGVuc2lvbiBhbmQgcGFzcyB0aGF0IHtAbGluayBFR0xDbGllbnRCdWZmZXJ9IHRvIHtAbGluaworICogZWdsQ3JlYXRlSW1hZ2VLSFJ9IHRvIGNyZWF0ZSBhbiB7QGxpbmsgRUdMSW1hZ2V9IHJlc291cmNlIHR5cGUsIHdoaWNoIG1heSB0aGVuIGJlIGJvdW5kIHRvIGEKKyAqIHRleHR1cmUgdmlhIHtAbGluayBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTfSBvbiBzdXBwb3J0ZWQgZGV2aWNlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvcgorICogdHJhbnNwb3J0aW5nIHRleHR1cmVzIHRoYXQgbWF5IGJlIHNoYXJlZCBjcm9zcy1wcm9jZXNzLjwvcD4KKyAqIDxwPkluIGdlbmVyYWwsIHdoZW4gc29mdHdhcmUgYWNjZXNzIHRvIGltYWdlIGRhdGEgaXMgbm90IG5lY2Vzc2FyeSwgYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0KKyAqIGNyZWF0ZWQgd2l0aCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSBmb3JtYXQgaXMgbW9yZSBlZmZpY2llbnQsIGNvbXBhcmVkIHdpdGgge0BsaW5rCisgKiBBSW1hZ2VSZWFkZXJ9cyB1c2luZyBvdGhlciBmb3JtYXQgc3VjaCBhcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OH0uPC9wPgorICoKKyAqIDxwPk5vdGUgdGhhdCBub3QgYWxsIGZvcm1hdCBhbmQgdXNhZ2UgZmxhZyBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJ9LAorICogZXNwZWNpYWxseSBpZiB7QGNvZGUgZm9ybWF0fSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwge0Bjb2RlIHVzYWdlfSBtdXN0IG5vdCBpbmNsdWRlIGVpdGhlcgorICoge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX1JBUkVMWX0gb3Ige0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX09GVEVOfTwvcD4KKyAqCisgKiBAcGFyYW0gd2lkdGggVGhlIGRlZmF1bHQgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCisgKiBAcGFyYW0gaGVpZ2h0IFRoZSBkZWZhdWx0IGhlaWdodCBpbiBwaXhlbHMgb2YgdGhlIEltYWdlcyB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4KKyAqIEBwYXJhbSBmb3JtYXQgVGhlIGZvcm1hdCBvZiB0aGUgSW1hZ2UgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgIEFJTUFHRV9GT1JNQVRfKiBlbnVtIHZhbHVlIGRlZmluZWQgaW4ge0BsaW5rIEFJTUFHRV9GT1JNQVRTfS4KICAqIEBwYXJhbSB1c2FnZSBzcGVjaWZpZXMgaG93IHRoZSBjb25zdW1lciB3aWxsIGFjY2VzcyB0aGUgQUltYWdlLCB1c2luZyBjb21iaW5hdGlvbiBvZiB0aGUKICAqICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFIGZsYWdzIGRlc2NyaWJlZCBpbiB7QGxpbmsgaGFyZHdhcmVfYnVmZmVyLmh9LgogICogICAgICAgICAgICBQYXNzaW5nIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU59IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwpAQCAtMzMxLDYgKzM1NSwxMSBAQAogICogICB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFfSwgb3IgY29tYmluZWQ8L3RkPgogICogPC90cj4KICAqIDwvdGFibGU+CisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIGlzIE5VTEwsIG9yIG9uZSBvciBtb3JlIG9mIHdpZHRoLAorICogICAgICAgICAgICAgICAgIGhlaWdodCwgZm9ybWF0LCBtYXhJbWFnZXMsIG9yIHVzYWdlIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29ucy48L2xpPjwvdWw+CiAgKgogICogQHNlZSBBSW1hZ2UKICAqIEBzZWUgQUltYWdlUmVhZGVyX25ldwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCmluZGV4IDYzN2JmOWIuLjdlN2U4MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19ICiAjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfSAogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgpAQCAtMTMwLDE3ICsxMzEsNDUgQEAKICAqLwogc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBpbnQ2NF90IHRpbWVvdXRVcyk7CiAKLS8qKgotICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCisvKgorICogX19VU0VfRklMRV9PRkZTRVQ2NCBjaGFuZ2VzIHRoZSB0eXBlIG9mIG9mZl90IGluIExQMzIsIHdoaWNoIGNoYW5nZXMgdGhlIEFCSQorICogb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRvICBub3QgbWF0Y2ggdGhlIHBsYXRmb3JtLiBJbiB0aGF0IGNhc2UsIGRlZmluZSB0aGVzZQorICogQVBJcyBpbiB0ZXJtcyBvZiBpbnQzMl90IGluc3RlYWQuIFBhc3NpbmcgYW4gb2ZmX3QgaW4gdGhpcyBzaXR1YXRpb24gd2lsbAorICogcmVzdWx0IGluIHNpbGVudCB0cnVuY2F0aW9uIHVubGVzcyB0aGUgdXNlciBidWlsZHMgd2l0aCAtV2NvbnZlcnNpb24sIGJ1dCB0aGUKKyAqIG9ubHkgYWx0ZXJuYXRpdmUgaXQgdG8gbm90IGV4cG9zZSB0aGVtIGF0IGFsbCBmb3IgdGhpcyBjb25maWd1cmF0aW9uLCB3aGljaAorICogbWFrZXMgdGhlIHdob2xlIEFQSSB1bnVzYWJsZS4KKyAqCisgKiBodHRwczovL2dpdGh1Yi5jb20vYW5kcm9pZC1uZGsvbmRrL2lzc3Vlcy80NTkKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCi0gICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKyNpZiBkZWZpbmVkKF9fVVNFX0ZJTEVfT0ZGU0VUNjQpICYmICFkZWZpbmVkKF9fTFA2NF9fKQorI2RlZmluZSBfb2ZmX3RfY29tcGF0IGludDMyX3QKKyNlbHNlCisjZGVmaW5lIF9vZmZfdF9jb21wYXQgb2ZmX3QKKyNlbmRpZiAgLyogZGVmaW5lZChfX1VTRV9GSUxFX09GRlNFVDY0KSAmJiAhZGVmaW5lZChfX0xQNjRfXykgKi8KKworI2lmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSB8fCBcCisgICAgX19TVERDX1ZFUlNJT05fXyA+PSAyMDExMTJMCitzdGF0aWNfYXNzZXJ0KHNpemVvZihfb2ZmX3RfY29tcGF0KSA9PSBzaXplb2YobG9uZyksCisgICAgICAgICAgICAgICJfb2ZmX3RfY29tcGF0IGRvZXMgbm90IG1hdGNoIHRoZSBOREsgQUJJLiBTZWUgIgorICAgICAgICAgICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2FuZHJvaWQtbmRrL25kay9pc3N1ZXMvNDU5LiIpOworI2VuZGlmCiAKIC8qKgogICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLAotICAgICAgICBzaXplX3QgaWR4LCBvZmZfdCBvZmZzZXQsIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZmZfdF9jb21wYXQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisKKyN1bmRlZiBfb2ZmX3RfY29tcGF0CiAKIC8qKgogICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyIG9mIHByb2Nlc3NlZCBkYXRhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvdm5kay9BbmRyb2lkLmJwIGIvbWVkaWEvdm5kay9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNmZDE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL3ZuZGsvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAieG1scGFyc2VyLzEuMCIsCi1dCi0KZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU1NTE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjc1htbFBhcnNlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxleHBhdC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDI1NgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7IC8vIExvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0KLWNvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzID0KLSAgICAgICAgIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7Ci0KLS8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KLWNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9Ci0gICAgICAgIHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL2V0YyJ9OwotY29uc3RleHByIGludCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZSA9Ci0gICAgICAgIChzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdCkgLyBzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdFswXSkpOwotCi1ib29sIGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBzdGQ6OnN0cmluZyAqb3V0X3BhdGgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgKm91dF9wYXRoID0gc3RkOjpzdHJpbmcoa0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSkgKyAiLyIgKyBmaWxlX25hbWU7Ci0gICAgICAgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGgtPmNfc3RyKCksICZmaWxlX3N0YXQpID09IDAgJiYKLSAgICAgICAgICAgICAgICBTX0lTUkVHKGZpbGVfc3RhdC5zdF9tb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBGaW5kIFR5cGVJbmZvIGJ5IG5hbWUuCi1zdGQ6OnZlY3RvcjxUeXBlSW5mbz46Oml0ZXJhdG9yIGZpbmRUeXBlSW5mbygKLSAgICAgICAgQ29kZWNJbmZvICZjb2RlY0luZm8sIGNvbnN0IEFTdHJpbmcgJnR5cGVOYW1lKSB7Ci0gICAgcmV0dXJuIHN0ZDo6ZmluZF9pZigKLSAgICAgICAgICAgIGNvZGVjSW5mby5tVHlwZXMuYmVnaW4oKSwgY29kZWNJbmZvLm1UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgIFt0eXBlTmFtZV0oY29uc3QgYXV0byAmdHlwZUluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUluZm8ubU5hbWUgPT0gdHlwZU5hbWU7Ci0gICAgICAgICAgICB9KTsKLX0KLQotLy8gQ29udmVydCBhIHN0cmluZyBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KLWJvb2wgUGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKLSAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2hhciAqZW5kOwotICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7Ci0gICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Ci19Ci0KLX0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKLQotTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKCkgOgotICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgbVVwZGF0ZShmYWxzZSkgewotICAgIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3BhdGg7Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3MueG1sIiwgJmNvbmZpZ19maWxlX3BhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwgZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIiwgJmNvbmZpZ19maWxlX3BhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlKTsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VUb3BMZXZlbFhNTEZpbGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjc194bWwsIGJvb2wgaWdub3JlX2Vycm9ycykgewotICAgIC8vIGdldCBocmVmX2Jhc2UKLSAgICBjb25zdCBjaGFyICpocmVmX2Jhc2VfZW5kID0gc3RycmNocihjb2RlY3NfeG1sLCAnLycpOwotICAgIGlmIChocmVmX2Jhc2VfZW5kICE9IE5VTEwpIHsKLSAgICAgICAgbUhyZWZCYXNlID0gQVN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KLQotICAgIG1Jbml0Q2hlY2sgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQotICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgbURlcHRoID0gMDsKLQotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotTWVkaWFDb2RlY3NYbWxQYXJzZXI6On5NZWRpYUNvZGVjc1htbFBhcnNlcigpIHsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKLQotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOwotICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiU3RhcnQgcGFyc2luZyAlcyIsIHBhdGgpOwotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOwotICAgIENIRUNLKHBhcnNlciAhPSBOVUxMKTsKLQotICAgIDo6WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdGhpcyk7Ci0gICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIoCi0gICAgICAgICAgICBwYXJzZXIsIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOwotCi0gICAgY29uc3QgaW50IEJVRkZfU0laRSA9IDUxMjsKLSAgICB3aGlsZSAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKLSAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBieXRlc19yZWFkID0gOjpmcmVhZChidWZmLCAxLCBCVUZGX1NJWkUsIGZpbGUpOwotICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byByZWFkIik7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfSU87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOwotICAgICAgICBpZiAoc3RhdHVzICE9IFhNTF9TVEFUVVNfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgKCVzKSIsIDo6WE1MX0Vycm9yU3RyaW5nKDo6WE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKLQotICAgIGZjbG9zZShmaWxlKTsKLSAgICBmaWxlID0gTlVMTDsKLX0KLQotLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKLSAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyICo+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOwotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImluY2x1ZGVYTUxGaWxlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgotICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAotICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7Ci0gICAgICAgIGlmIChocmVmW2ldID09ICcuJyB8fCBocmVmW2ldID09ICdfJyB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICcwJyAmJiBocmVmW2ldIDw9ICc5JykgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnQScgJiYgaHJlZltpXSA8PSAnWicpIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ2EnICYmIGhyZWZbaV0gPD0gJ3onKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIEFTdHJpbmcgZmlsZW5hbWUgPSBocmVmOwotICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aCgibWVkaWFfY29kZWNzXyIpIHx8Ci0gICAgICAgICFmaWxlbmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZmlsZW5hbWUuaW5zZXJ0KG1IcmVmQmFzZSwgMCk7Ci0KLSAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnN0YXJ0RWxlbWVudEhhbmRsZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIGluVHlwZSA9IHRydWU7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBpbmNsdWRlWE1MRmlsZShhdHRycyk7Ci0gICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnB1c2gobUN1cnJlbnRTZWN0aW9uKTsKLSAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fSU5DTFVERTsKLSAgICAgICAgfQotICAgICAgICArK21EZXB0aDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVJTOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmciKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGZhbHNlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVpcmsiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRRdWlyayhhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluVHlwZSA9IGZhbHNlOwotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCi0gICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmIG1DdXJyZW50VHlwZSA9PSBtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdLm1UeXBlcy5lbmQoKTsKLSAgICAgICAgICAgIGlmIChvdXRzaWRlICYmICghc3RyY21wKG5hbWUsICJMaW1pdCIpIHx8ICFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkTGltaXQoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkRmVhdHVyZShhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICArK21EZXB0aDsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSIDogU0VDVElPTl9FTkNPREVSKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikgJiYgbVBhc3RTZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVBhc3RTZWN0aW9ucy50b3AoKTsKLSAgICAgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnBvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLS1tRGVwdGg7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBvciB2YWx1ZSB1bnNwZWNpZmllZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBQYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBpZiAobVVwZGF0ZSAhPSAobUdsb2JhbFNldHRpbmdzLmNvdW50KG5hbWUpID4gMCkpIHsKLSAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHNldHRpbmciKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIG1HbG9iYWxTZXR0aW5nc1tuYW1lXSA9IHZhbHVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidHlwZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB0eXBlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IE5VTEwpICYmIFBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIGlmIChtVXBkYXRlICE9IChtQ29kZWNJbmZvcy5jb3VudChuYW1lKSA+IDApKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBjb2RlYyBvciB2aWNlIHZlcnNhIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvc1tuYW1lXTsKLSAgICBpZiAobVVwZGF0ZSkgewotICAgICAgICAvLyBleGlzdGluZyBjb2RlYwotICAgICAgICBtQ3VycmVudE5hbWUgPSBuYW1lOwotICAgICAgICBtQ3VycmVudFR5cGUgPSBpbmZvLT5tVHlwZXMuYmVnaW4oKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gZXhpc3RpbmcgdHlwZQotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gZmluZFR5cGVJbmZvKCppbmZvLCB0eXBlKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gaW5mby0+bVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5ldyBjb2RlYwotICAgICAgICBtQ3VycmVudE5hbWUgPSBuYW1lOwotICAgICAgICBtUXVpcmtzW25hbWVdLmNsZWFyKCk7Ci0gICAgICAgIGluZm8tPm1UeXBlcy5jbGVhcigpOwotICAgICAgICBpbmZvLT5tVHlwZXMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgIG1DdXJyZW50VHlwZSA9IC0taW5mby0+bVR5cGVzLmVuZCgpOwotICAgICAgICBtQ3VycmVudFR5cGUtPm1OYW1lID0gdHlwZTsKLSAgICAgICAgaW5mby0+bUlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFF1aXJrOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtUXVpcmtzW21DdXJyZW50TmFtZV0uZW1wbGFjZV9iYWNrKG5hbWUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2RlcikgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zW21DdXJyZW50TmFtZV07Ci0gICAgaW5mby0+bUlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgbUN1cnJlbnRUeXBlID0gZmluZFR5cGVJbmZvKCppbmZvLCBuYW1lKTsKLSAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBpbmZvLT5tVHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHJlLWRlZmluaW5nIGV4aXN0aW5nIHR5cGUgd2l0aG91dCB1cGRhdGUiKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1UeXBlcy5lbXBsYWNlX2JhY2soKTsKLSAgICAgICAgbUN1cnJlbnRUeXBlID0gLS1pbmZvLT5tVHlwZXMuZW5kKCk7Ci0gICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gaW5mby0+bVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0Rm91bmRNaXNzaW5nQXR0cihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLmNfc3RyKCksIG1zZyk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IEFTdHJpbmcgJnZhbHVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICBhdHRyLCB2YWx1ZS5jX3N0cigpKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbGltaXQgaXMgbm90IGdpdmVuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiZGVmYXVsdCIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImluIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWF4IikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWluIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2UiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZXMiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJzY2FsZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGF0dHJzW2ldLCBhdHRyc1tpICsgMV0pOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiB1bnJlY29nbml6ZWQgbGltaXQ6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIEFTdHJpbmcgbmFtZTsKLSAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygibmFtZSIsICZuYW1lKSkgewotICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbywKLSAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKLSAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCi0gICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgYm9vbCBmb3VuZDsKLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iIHx8IG5hbWUgPT0gImJpdHJhdGUiIHx8IG5hbWUgPT0gImJsb2NrLWNvdW50IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiCi0gICAgICAgICAgICB8fCBuYW1lID09ICJmcmFtZS1yYXRlIiB8fCBuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJzaXplIgotICAgICAgICAgICAgfHwgbmFtZSA9PSAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUuc3RhcnRzV2l0aCgibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewotICAgICAgICBBU3RyaW5nIG1pbiwgbWF4OwotICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW4iLCAmbWluKSAmJiBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSB7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7Ci0gICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSB8fCBtc2ctPmNvbnRhaW5zKCJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikgfHwgbXNnLT5jb250YWlucygibWF4IikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJm1heCkpIHsKLSAgICAgICAgICAgIG1pbiA9IG1heDsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKLSAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgcmFuZ2UsIHNjYWxlID0gImxpbmVhciIsIGRlZiwgaW5fOwotICAgICAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygicmFuZ2UiLCAmcmFuZ2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImRlZmF1bHQiLCAmZGVmKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiLCBmb3VuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgIT0gInF1YWxpdHkiICYmIG1zZy0+ZmluZFN0cmluZygic2NhbGUiLCAmc2NhbGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgXiAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImluIiwgJmluXykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIsIGZvdW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSB7Ci0gICAgICAgICAgICBpZiAoIShpbl8gPT0gInBpeGVscyIpICYmICEoaW5fID09ICJibG9ja3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKG5hbWUsICJpbiIsIGluXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbl8uZXJhc2UoNSwgMSk7IC8vIChwaXhlbHxibG9jayktYXNwZWN0LXJhdGlvCi0gICAgICAgICAgICBpbl8uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBpbl8uYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgbmFtZSA9IGluXzsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbInF1YWxpdHktc2NhbGUiXSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgewotICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICAgICAgdGFnLmFwcGVuZCgiLWRlZmF1bHQiKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbdGFnXSA9IGRlZjsKLSAgICAgICAgfQotICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZSIpOwotICAgICAgICBtQ3VycmVudFR5cGUtPm1EZXRhaWxzW3RhZ10gPSByYW5nZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIG1heCwgdmFsdWUsIHJhbmdlczsKLSAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoImRlZmF1bHQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoImluIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiIHx8IG5hbWUgPT0gImNvbmN1cnJlbnQtaW5zdGFuY2VzIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtYXgiLCBmb3VuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgIm1pbiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInJhbmdlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gInNhbXBsZS1yYXRlIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygicmFuZ2VzIiwgJnJhbmdlcykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZXMiLCBmb3VuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygic2NhbGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAiYWxpZ25tZW50IiB8fCBuYW1lID09ICJibG9jay1zaXplIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygidmFsdWUiLCAmdmFsdWUpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAidmFsdWUiLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4LnNpemUoKSkgewotICAgICAgICAgICAgQVN0cmluZyB0YWcgPSAibWF4LSI7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5tRGV0YWlsc1t0YWddID0gbWF4OwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5tRGV0YWlsc1tuYW1lXSA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHJhbmdlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZXMiKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbdGFnXSA9IHJhbmdlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyB1bnJlY29nbml6ZWQgbGltaXQgJyVzJyIsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNpemVfdCBpID0gMDsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7Ci0gICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLQotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IGZlYXR1cmUgaXMgbm90IGdpdmVuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpUGFyc2VCb29sZWFuKGF0dHJzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25hbCA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkICYmIG9wdGlvbmFsICE9IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICBtQ3VycmVudFR5cGUtPm1TdHJpbmdGZWF0dXJlc1tuYW1lXSA9IHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DdXJyZW50VHlwZS0+bUJvb2xGZWF0dXJlc1tuYW1lXSA9IChyZXF1aXJlZCA9PSAxKSB8fCAob3B0aW9uYWwgPT0gMCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0R2xvYmFsU2V0dGluZ3MoCi0gICAgICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+ICpzZXR0aW5ncykgY29uc3QgewotICAgIHNldHRpbmdzLT5jbGVhcigpOwotICAgIHNldHRpbmdzLT5pbnNlcnQobUdsb2JhbFNldHRpbmdzLmJlZ2luKCksIG1HbG9iYWxTZXR0aW5ncy5lbmQoKSk7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb2RlY0luZm8oY29uc3QgY2hhciAqbmFtZSwgQ29kZWNJbmZvICppbmZvKSBjb25zdCB7Ci0gICAgaWYgKG1Db2RlY0luZm9zLmNvdW50KG5hbWUpID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIG5vdCBmb3VuZCB3aXRoIG5hbWUgJyVzJyIsIG5hbWUpOwotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgICppbmZvID0gbUNvZGVjSW5mb3MuYXQobmFtZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0UXVpcmtzKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6dmVjdG9yPEFTdHJpbmc+ICpxdWlya3MpIGNvbnN0IHsKLSAgICBpZiAobVF1aXJrcy5jb3VudChuYW1lKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBub3QgZm91bmQgd2l0aCBuYW1lICclcyciLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIH0KLSAgICBxdWlya3MtPmNsZWFyKCk7Ci0gICAgcXVpcmtzLT5pbnNlcnQocXVpcmtzLT5lbmQoKSwgbVF1aXJrcy5hdChuYW1lKS5iZWdpbigpLCBtUXVpcmtzLmF0KG5hbWUpLmVuZCgpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLmJwIGIvcmFkaW8vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTRmMi4uMDAwMDAwMAotLS0gYS9yYWRpby9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJyYWRpbyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvLmNwcCIsCi0gICAgICAgICJJUmFkaW9DbGllbnQuY3BwIiwKLSAgICAgICAgIklSYWRpb1NlcnZpY2UuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnJhZGlvX21ldGFkYXRhIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjNiNjguLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklSYWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9DT05GSUdVUkFUSU9OLAotICAgIEdFVF9DT05GSUdVUkFUSU9OLAotICAgIFNFVF9NVVRFLAotICAgIEdFVF9NVVRFLAotICAgIFNDQU4sCi0gICAgU1RFUCwKLSAgICBUVU5FLAotICAgIENBTkNFTCwKLSAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKLSAgICBIQVNfQ09OVFJPTAotfTsKLQotY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpbz4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBkZXRhY2goKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRldGFjaCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJR1VSQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGUgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChtdXRlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBtdXRlcmVhZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICptdXRlID0gbXV0ZXJlYWQgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2tpcFN1YkNoYW5uZWwgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTQ0FOLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RFUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoY2hhbm5lbCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3ViQ2hhbm5lbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChUVU5FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGxwdHIgfHwgaW5mby0+bWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByYWRpb19tZXRhZGF0YV90ICptZXRhZGF0YSA9IGluZm8tPm1ldGFkYXRhOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBsb2NhbCBtZXRhZGF0YSBwb2ludGVyCi0gICAgICAgICAgICAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbmV3TWV0YWRhdGEgPSAocmFkaW9fbWV0YWRhdGFfdCAqKW1hbGxvYyhtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3TWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXBseS5yZWFkKG5ld01ldGFkYXRhLCBtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBuZXdNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoaGFzQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChIQVNfQ09OVFJPTCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICpoYXNDb250cm9sID0gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpbywgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5SYWRpbzo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgREVUQUNIOiB7Ci0gICAgICAgICAgICBBTE9HVigiREVUQUNIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfQ09ORklHVVJBVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRDb25maWd1cmF0aW9uKCZjb25maWcpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9DT05GSUdVUkFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGUgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNdXRlKG11dGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNdXRlKCZtdXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobXV0ZSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNDQU46IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNjYW4oZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU1RFUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gKHJhZGlvX2RpcmVjdGlvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHNraXBTdWJDaGFubmVsID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUVU5FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENBTkNFTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2FuY2VsKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX1BST0dSQU1fSU5GT1JNQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gaW5mbzsKLSAgICAgICAgICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmaW5mby5tZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFByb2dyYW1JbmZvcm1hdGlvbigmaW5mbyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaW5mbywgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8pKTsKLSAgICAgICAgICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfZ2V0X2NvdW50KGluZm8ubWV0YWRhdGEpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGluZm8ubWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoKHVpbnQzMl90KXNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaW5mby5tZXRhZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEhBU19DT05UUk9MOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGNvbnRyb2w7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYXNDb250cm9sKCZjb250cm9sKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY29udHJvbCA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAgYi9yYWRpby9JUmFkaW9DbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIxOTQ5Li4wMDAwMDAwCi0tLSBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIE9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLX07Ci0KLWNsYXNzIEJwUmFkaW9DbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci0KLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpb0NsaWVudD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW9DbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblJhZGlvQ2xpZW50OjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPTl9FVkVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBvbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfSAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAgYi9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlM2E2MS4uMDAwMDAwMAotLS0gYS9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkJwUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBBVFRBQ0gsCi19OwotCi0jZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0Ci0KLWNsYXNzIEJwUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCi0gICAgewotICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdWludDMyX3QgbnVtTW9kdWxlc1JlcSA9IChwcm9wZXJ0aWVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICpudW1Nb2R1bGVzID0gKHVpbnQzMl90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgewotICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocHJvcGVydGllcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwotICAgICAgICBBTE9HVigiYXR0YWNoKCkgY29uZmlnICVwIHdpdGhBdWRpbyAlZCByZWdpb24gJWQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgIGNvbmZpZyA9PSBOVUxMID8gMCA6IGNvbmZpZywgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICBjb25maWcgPT0gTlVMTCA/IDAgOiBjb25maWctPnJlZ2lvbiwKLSAgICAgICAgICAgICAgY29uZmlnID09IE5VTEwgPyAwIDogY29uZmlnLT5iYW5kLnR5cGUpOwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHdpdGhBdWRpbyA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgIHJhZGlvID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvU2VydmljZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVRUQUNIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9faGFuZGxlX3QgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWdQdHIgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgQUxPR1YoIkFUVEFDSCBjb25maWdQdHIgJXAgd2l0aEF1ZGlvICVkIiwgY29uZmlnUHRyLCB3aXRoQXVkaW8pOwotICAgICAgICAgICAgc3A8SVJhZGlvPiByYWRpbzsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgY29uZmlnUHRyLCB3aXRoQXVkaW8sIHJhZGlvKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAocmFkaW8gIT0gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpbykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGQyMjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vUmFkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0jaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCi0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7Ci0KLSAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOwotICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOwotfTsgLy8gbmFtZXNwYWNlIGFub255bW91cwotCi1jb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBSYWRpbzo6Z2V0UmFkaW9TZXJ2aWNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgIGlmIChnUmFkaW9TZXJ2aWNlLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtSYWRpb1NlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJSYWRpb1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgdXNsZWVwKGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkpOwotICAgICAgICB9IHdoaWxlKHRydWUpOwotICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOwotICAgICAgICBnUmFkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0gICAgQUxPR0VfSUYoZ1JhZGlvU2VydmljZSA9PSAwLCAibm8gUmFkaW9TZXJ2aWNlIT8iKTsKLSAgICByZXR1cm4gZ1JhZGlvU2VydmljZTsKLX0KLQotLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFJhZGlvOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMocHJvcGVydGllcywgbnVtTW9kdWxlcyk7Ci19Ci0KLXNwPFJhZGlvPiBSYWRpbzo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi17Ci0gICAgQUxPR1YoImF0dGFjaCgpIik7Ci0gICAgc3A8UmFkaW8+IHJhZGlvOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0gICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7Ci0gICAgICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByYWRpbzsKLX0KLQotCi0KLS8vIFJhZGlvCi1SYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgLypoYW5kbGUqLywgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi1SYWRpbzo6flJhZGlvKCkKLXsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvOjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUlSYWRpbyA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKLX0KLQotCi0vLyBCcFJhZGlvQ2xpZW50Ci12b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9ICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQotICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKLSAgICB9Ci19Ci0KLQotLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotdm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOwotICAgIG1JUmFkaW8gPSAwOwotICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOwotICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9PV05FUlMgYi9zZXJ2aWNlcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMGRjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2V0YWx2YWxhQGdvb2dsZS5jb20KK2drYXN0ZW5AYW5kcm9pZC5jb20KK2h1bmdhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMGRmOWEzOS4uMzlmMDRmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTMyNiw5ICszMjYsMTQgQEAKICAgICBzcDxNbWFwVGhyZWFkPiB0aHJlYWQgPSBtTW1hcFRocmVhZHMudmFsdWVGb3IoaW8pOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpbnRlcmZhY2UgPSBuZXcgTW1hcFRocmVhZEhhbmRsZSh0aHJlYWQpOwotICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQsIGNhbGxiYWNrLCBwb3J0SWQpOworICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQsIGNhbGxiYWNrLCAqZGV2aWNlSWQsIHBvcnRJZCk7CiAgICAgICAgICpoYW5kbGUgPSBwb3J0SWQ7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChpbywgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW8sIHNlc3Npb25JZCk7CisgICAgICAgIH0KICAgICAgICAgcmV0ID0gTk9fSU5JVDsKICAgICB9CiAKQEAgLTEzOTcsMTEgKzE0MDIsMTEgQEAKICAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCiAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19PVVRQVVRfT1BFTkVELCBwaWQpOworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX09VVFBVVF9SRUdJU1RFUkVELCBwaWQpOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fSU5QVVRfT1BFTkVELCBwaWQpOworICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19JTlBVVF9SRUdJU1RFUkVELCBwaWQpOwogICAgIH0KIH0KIApAQCAtMjYwMyw3ICsyNjA4LDcgQEAKICAgICAgICAgICAgIHdoaWxlIChlYy0+bUVmZmVjdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBlYy0+bUVmZmVjdHNbMF07CiAgICAgICAgICAgICAgICAgZWZmZWN0LT51blBpbigpOwotICAgICAgICAgICAgICAgIHQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgdC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0LCAvKnJlbGVhc2UqLyB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LT5wdXJnZUhhbmRsZXMoKSkgewogICAgICAgICAgICAgICAgICAgICB0LT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWRfbChlZmZlY3QsIGZhbHNlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOTAyM2IyZC4uNjM4OThhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNjA0LDcgKzYwNCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgc3A8TW1hcFRocmVhZD4gbVRocmVhZDsKKyAgICAgICAgY29uc3Qgc3A8TW1hcFRocmVhZD4gbVRocmVhZDsKICAgICB9OwogCiAgICAgICAgICAgICAgIFRocmVhZEJhc2UgKmNoZWNrVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGYyYzFjNGYuLmJkNWYxNDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAKQEAgLTEwOSw3ICsxMTAsMTAgQEAKIHsKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlICE9IDApIHsKLSAgICAgICAgQUxPR1coIkVmZmVjdE1vZHVsZSAlcCBkZXN0cnVjdG9yIGNhbGxlZCB3aXRoIHVucmVsZWFzZWQgaW50ZXJmYWNlIiwgdGhpcyk7CisgICAgICAgIGNoYXIgdXVpZFN0cls2NF07CisgICAgICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnV1aWQsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7CisgICAgICAgIEFMT0dXKCJFZmZlY3RNb2R1bGUgJXAgZGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCB1bnJlbGVhc2VkIGludGVyZmFjZSwgZWZmZWN0ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1dWlkU3RyKTsKICAgICAgICAgcmVsZWFzZV9sKCk7CiAgICAgfQogCkBAIC0xMDgxLDE4ICsxMDg1LDEyIEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQudGltZUxvdywgbURlc2NyaXB0b3IudXVpZC50aW1lTWlkLCBtRGVzY3JpcHRvci51dWlkLnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLmNsb2NrU2VxLCBtRGVzY3JpcHRvci51dWlkLm5vZGVbMF0sIG1EZXNjcmlwdG9yLnV1aWQubm9kZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudXVpZC5ub2RlWzJdLAotICAgICAgICAgICAgbURlc2NyaXB0b3IudXVpZC5ub2RlWzNdLG1EZXNjcmlwdG9yLnV1aWQubm9kZVs0XSxtRGVzY3JpcHRvci51dWlkLm5vZGVbNV0pOworICAgIGNoYXIgdXVpZFN0cls2NF07CisgICAgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZygmbURlc2NyaXB0b3IudXVpZCwgdXVpZFN0ciwgc2l6ZW9mKHV1aWRTdHIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlc1xuIiwgdXVpZFN0cik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUudGltZUxvdywgbURlc2NyaXB0b3IudHlwZS50aW1lTWlkLAotICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5jbG9ja1NlcSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzBdLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMV0sCi0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CisgICAgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZygmbURlc2NyaXB0b3IudHlwZSwgdXVpZFN0ciwgc2l6ZW9mKHV1aWRTdHIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBUWVBFOiAlc1xuIiwgdXVpZFN0cik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYICglcylcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLApAQCAtMTMwNiwxMSArMTMwNCwxMCBAQAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICB0aHJlYWQtPmRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwogICAgICAgICAvLyB0cnkgdG8gY2xlYW51cCBhcyBtdWNoIGFzIHdlIGNhbgogICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgIGVmZmVjdC0+ZGlzY29ubmVjdEhhbmRsZSh0aGlzLCB1bnBpbklmTGFzdCk7CisgICAgICAgIGlmIChlZmZlY3QgIT0gMCAmJiBlZmZlY3QtPmRpc2Nvbm5lY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpID4gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzIEVmZmVjdCBoYW5kbGUgJXAgZGlzY29ubmVjdGVkIGFmdGVyIHRocmVhZCBkZXN0cnVjdGlvbiIsIF9fRlVOQ1RJT05fXywgdGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzRmMWFmMy4uYzEwZmEwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTEzOCw3ICsxMzgsOCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgTE9HX0hJU1RfRkxVU0goKTsKKyAgICAvLyBsb2cgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorICAgIExPR19BVURJT19TVEFURSgpOwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1QcmV2aW91czsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCAyYTI3ZGZkLi4zNjZhMTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksNyArNDAsNyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTW1hcFRocmVhZDsKQEAgLTU1LDUgKzU2LDYgQEAKICAgICB2aXJ0dWFsIGludDY0X3QgZnJhbWVzUmVsZWFzZWQoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgb25UaW1lc3RhbXAoY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKKyAgICBwaWRfdCBtUGlkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNlNGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2h1bmdhQGdvb2dsZS5jb20KK2ptdHJpdmlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGQ3YzA3MjguLjI3YzZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ3NCw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAzZjFhMGMwLi4xYzFhOTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTQwLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0yNDAsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDNmODNjYTguLmY4ZGE3ODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggM2M3MzU0My4uYzEwNDRlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMTEzLDEwICsxMTMsMTUgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCisgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgfQogICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CiAgICAgcmV0dXJuIG9rOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggOGIxYmMwMC4uMDRjYjljZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yMiw3ICsyMiw3IEBACiBib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKIGJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCk7Citib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOwogYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggNjVlY2NiNi4uZTIwMmNhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMTk3LDcgKzE5Nyw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHgyMDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNTQ0LDYgKzE1NDQsNyBAQAogICAgICAgICBBTE9HVygiQWN0aXZlVHJhY2tzPFQ+OjphZGQgdHJhY2sgJXAgYWxyZWFkeSB0aGVyZSIsIHRyYWNrLmdldCgpKTsKICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgIH0KKyAgICBsb2dUcmFjaygiYWRkIiwgdHJhY2spOwogICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrID0gdHJhY2s7CiAgICAgKyttQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CkBAIC0xNTU3LDYgKzE1NTgsNyBAQAogICAgICAgICBBTE9HVygiQWN0aXZlVHJhY2tzPFQ+OjpyZW1vdmUgbm9uZXhpc3RlbnQgdHJhY2sgJXAiLCB0cmFjay5nZXQoKSk7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CisgICAgbG9nVHJhY2soInJlbW92ZSIsIHRyYWNrKTsKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgpAQCAtMTU2Nyw2ICsxNTY5LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpBY3RpdmVUcmFja3M8VD46OmNsZWFyKCkgewogICAgIGZvciAoY29uc3Qgc3A8VD4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BBdWRpbyh0cmFjay0+dWlkKCkpOworICAgICAgICBsb2dUcmFjaygiY2xlYXIiLCB0cmFjayk7CiAgICAgfQogICAgIG1MYXN0QWN0aXZlVHJhY2tzR2VuZXJhdGlvbiA9IG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgIG1BY3RpdmVUcmFja3MuY2xlYXIoKTsKQEAgLTE2MDUsNiArMTYwOCwxNiBAQAogICAgIH0KIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+Ojpsb2dUcmFjaygKKyAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3QgeworICAgIGlmIChtTG9jYWxMb2cgIT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgICAgICBtTG9jYWxMb2ctPmxvZygiQVQ6OiUtMTBzKCVwKSAlcyIsIGZ1bmNOYW1lLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpicm9hZGNhc3RfbCgpCiB7CiAgICAgLy8gVGhyZWFkIGNvdWxkIGJlIGJsb2NrZWQgd2FpdGluZyBmb3IgYXN5bmMKQEAgLTE2NDAsNiArMTY1Myw3IEBACiAgICAgICAgIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCiAgICAgICAgIG1GcmFtZXNXcml0dGVuKDApLAogICAgICAgICBtU3VzcGVuZGVkRnJhbWVzKDApLAorICAgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKICAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLApAQCAtMTY1NCw3ICsxNjY4LDggQEAKICAgICAgICAgbVNjcmVlblN0YXRlKEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlKSwKICAgICAgICAgLy8gaW5kZXggMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbE1hc2soKCgxIDw8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcykgLSAxKSAmIH4xKSwKLSAgICAgICAgbUh3U3VwcG9ydHNQYXVzZShmYWxzZSksIG1Id1BhdXNlZChmYWxzZSksIG1GbHVzaFBlbmRpbmcoZmFsc2UpCisgICAgICAgIG1Id1N1cHBvcnRzUGF1c2UoZmFsc2UpLCBtSHdQYXVzZWQoZmFsc2UpLCBtRmx1c2hQZW5kaW5nKGZhbHNlKSwKKyAgICAgICAgbUxlZnRWb2xGbG9hdCgtMS4wKSwgbVJpZ2h0Vm9sRmxvYXQoLTEuMCkKIHsKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb091dF8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CkBAIC0xNzA3LDggKzE3MjIsNiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CkBAIC0xNzM1LDggKzE3NDgsMTAgQEAKICAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgZHByaW50ZihmZCwgIiAgJXp1IFRyYWNrcyIsIG51bXRyYWNrcyk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKQEAgLTE3NDUsOCArMTc2MCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNzU0LDE1ICsxNzY5LDE1IEBACiAgICAgfQogICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgewogICAgICAgICAvLyBzb21lIHRyYWNrcyBpbiB0aGUgYWN0aXZlIGxpc3Qgd2VyZSBub3QgaW4gdGhlIHRyYWNrcyBsaXN0Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIwMTMsNyArMjAyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwpAQCAtMjE3MiwxMCArMjE4OCw2IEBACiAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgIG1Mb2NhbExvZy5sb2coImFkZFRyYWNrX2wgICAgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcwotCiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjIwMiw5ICsyMjE0LDkgQEAKIHsKICAgICB0cmFjay0+dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOwogCi0gICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICB0cmFjay0+ZHVtcChidWZmZXIsIGFycmF5c2l6ZShidWZmZXIpLCBmYWxzZSAvKiBhY3RpdmUgKi8pOwotICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcworICAgIFN0cmluZzggcmVzdWx0OworICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKIAogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKQEAgLTIyNDIsNiArMjI1NCw3IEBACiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwpAQCAtMzQwNCwxMCArMzQxNyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpbmFjdGl2ZSBidXQgbm90IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tzX2woJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDI4Nyw2ICs0Mjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOworICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdHJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIGZpcnN0IGZyYW1lIHdhcyBtaXhlZCwKQEAgLTQyOTcsNiArNDMwNywxMCBAQAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2cjsgICAgICAgLy8gaW4gVTguMjQgaW50ZWdlciBmb3JtYXQKICAgICAgICAgICAgIGZsb2F0IHZsZiwgdnJmLCB2YWY7ICAgLy8gaW4gWzAuMCwgMS4wXSBmbG9hdCBmb3JtYXQKKyAgICAgICAgICAgIC8vIHJlYWQgb3JpZ2luYWwgdm9sdW1lcyB3aXRoIHZvbHVtZSBjb250cm9sCisgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKKyAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOworCiAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7CiAgICAgICAgICAgICAgICAgdmwgPSB2ciA9IDA7CiAgICAgICAgICAgICAgICAgdmxmID0gdnJmID0gdmFmID0gMC47CkBAIC00MzA0LDEwICs0MzE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWFkIG9yaWdpbmFsIHZvbHVtZXMgd2l0aCB2b2x1bWUgY29udHJvbAotICAgICAgICAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwotICAgICAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOwogICAgICAgICAgICAgICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CkBAIC00MzU5LDYgKzQzNjksMjUgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gRm9yIGRlZGljYXRlZCBWb0lQIG91dHB1dHMsIGxldCB0aGUgSEFMIGFwcGx5IHRoZSBzdHJlYW0gdm9sdW1lLiBUcmFjayB2b2x1bWUgaXMKKyAgICAgICAgICAgIC8vIHN0aWxsIGFwcGxpZWQgYnkgdGhlIG1peGVyLgorICAgICAgICAgICAgaWYgKChtT3V0cHV0LT5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB2ID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUgPyAwLjBmIDogdjsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBtTGVmdFZvbEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKHYsIHYpOworICAgICAgICAgICAgICAgICAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgb3V0cHV0IHN0cmVhbSB2b2x1bWU6ICVkIiwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IHY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgc3RyZWFtIHZvbHVtZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIEhBTCwgbUxlZnRWb2xGbG9hdCA9PSB2IGhlcmUgYW5kIHdlCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0cmVhbSB2b2x1bWUgY29udHJpYnV0aW9uIGZyb20gc29mdHdhcmUgdm9sdW1lLgorICAgICAgICAgICAgICAgIGlmICh2ICE9IDAuMGYgJiYgbUxlZnRWb2xGbG9hdCA9PSB2KSB7CisgICAgICAgICAgICAgICAgICAgdmxmID0gbWluKDEuMGYsIHZsZiAvIHYpOworICAgICAgICAgICAgICAgICAgIHZyZiA9IG1pbigxLjBmLCB2cmYgLyB2KTsKKyAgICAgICAgICAgICAgICAgICB2YWYgPSBtaW4oMS4wZiwgdmFmIC8gdik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKQEAgLTQ4MDAsNyArNDgyOSw2IEBACiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QsIHN5c3RlbVJlYWR5KQotICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogewogfQogCkBAIC00ODA4LDcgKzQ4MzYsNiBAQAogICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLAogICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQotICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogICAgICAgICAsIG1Wb2x1bWVTaGFwZXJBY3RpdmUoZmFsc2UpCiB7CiB9CkBAIC01OTI1LDcgKzU5NTIsOSBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCi0gICAgbUlucHV0KGlucHV0KSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKKyAgICBtSW5wdXQoaW5wdXQpLAorICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCisgICAgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzLCBtUnNtcEluRnJhbWVzUDIsIGFuZCBtUnNtcEluRnJhbWVzT0EgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCiAjaWZkZWYgVEVFX1NJTksKQEAgLTY2OTYsNyArNjcyNSw4IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzZXNzaW9uSWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CkBAIC02ODg4LDYgKzY5MTgsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVtb3ZlVHJhY2tfbChjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHRyYWNrKQogeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKKwogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAvLyBuZWVkIGFueXRoaW5nIHJlbGF0ZWQgdG8gZWZmZWN0cyBoZXJlPwogICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewpAQCAtNjkwMSw2ICs2OTM1LDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtNjkxNCw2ICs2OTUwLDEyIEBACiAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9CisKKyAgICBpZiAoaW5wdXQgIT0gbnVsbHB0cikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYWwgc3RyZWFtIGR1bXA6XG4iKTsKKyAgICAgICAgKHZvaWQpaW5wdXQtPnN0cmVhbS0+ZHVtcChmZCk7CisgICAgfQorCiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCBjYXB0dXJlIHRocmVhZDogJXNcbiIsIGhhc0Zhc3RDYXB0dXJlKCkgPyAieWVzIiA6ICJubyIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxhYmxlOiAlc1xuIiwgbUZhc3RUcmFja0F2YWlsID8gInllcyIgOiAibm8iKTsKIApAQCAtNjkyOCwxNiArNjk3MCwxNSBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKICAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOwogICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CkBAIC02OTQ2LDggKzY5ODcsOCBAQAogICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGFjdGl2ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNjk1NSwxNSArNjk5NiwxNSBAQAogICAgIH0KIAogICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgorICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIHRydWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCB0cnVlIC8qIGFjdGl2ZSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzIyMSw2ICs3MjYyLDcgQEAKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKICAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwogICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7CkBAIC03NDgyLDM0ICs3NTI0LDIyIEBACiBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6Ok1tYXBUaHJlYWRIYW5kbGUoY29uc3Qgc3A8TW1hcFRocmVhZD4mIHRocmVhZCkKICAgICA6IG1UaHJlYWQodGhyZWFkKQogeworICAgIGFzc2VydCh0aHJlYWQgIT0gMCk7IC8vIHRocmVhZCBtdXN0IHN0YXJ0IG5vbi1udWxsIGFuZCBzdGF5IG5vbi1udWxsCiB9CiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6fk1tYXBUaHJlYWRIYW5kbGUoKQogewotICAgIE1tYXBUaHJlYWQgKnRocmVhZCA9IG1UaHJlYWQuZ2V0KCk7Ci0gICAgLy8gY2xlYXIgb3VyIHN0cm9uZyByZWZlcmVuY2UgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgdGhlIHRocmVhZDogdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgIC8vIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIGNsb3NlSW5wdXQvY2xvc2VPdXRwdXQgaXMgZXhlY3V0ZWQgdXBvbiBjYWxsIGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIKLSAgICAvLyBhbmQgdGhlIHRocmVhZCByZW1vdmVkIGZyb20gbU1NYXBUaHJlYWRzIGxpc3QgY2F1c2luZyB0aGUgdGhyZWFkIGRlc3RydWN0aW9uLgotICAgIG1UaHJlYWQuY2xlYXIoKTsKLSAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKLSAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0KCk7Ci0gICAgfQorICAgIG1UaHJlYWQtPmRpc2Nvbm5lY3QoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykKIHsKLSAgICBpZiAobVRocmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KICAgICByZXR1cm4gbVRocmVhZC0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCBpbmZvKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5nZXRNbWFwUG9zaXRpb24ocG9zaXRpb24pOwogfQogCkBAIC03NTE3LDI1ICs3NTQ3LDE2IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKIAogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5zdGFydChjbGllbnQsIGhhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6c3RvcChhdWRpb19wb3J0X2hhbmRsZV90IGhhbmRsZSkKIHsKLSAgICBpZiAobVRocmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KICAgICByZXR1cm4gbVRocmVhZC0+c3RvcChoYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6OnN0YW5kYnkoKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5zdGFuZGJ5KCk7CiB9CiAKQEAgLTc1NDUsNyArNzU2NiwxMCBAQAogICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAotICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpCisgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCisgICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCisgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpCiB7CiAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKQEAgLTc1NjYsNyArNzU5MCw3IEBACiAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICBzdG9wKHQtPnBvcnRJZCgpKTsKICAgICB9Ci0gICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KKyAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOwogICAgIH0gZWxzZSB7CkBAIC03NTc5LDExICs3NjAzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgbUF0dHIgPSAqYXR0cjsKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIG1Qb3J0SWQgPSBwb3J0SWQ7CiB9CiAKQEAgLTc2MjgsNiArNzY1NCwxMCBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgaWYgKCFpc091dHB1dCgpICYmICFyZWNvcmRpbmdBbGxvd2VkKGNsaWVudC5wYWNrYWdlTmFtZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gbUlkOwpAQCAtNzYzOSw3ICs3NjY5LDcgQEAKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlKCk7CiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC03NjUzLDcgKzc2ODMsNyBAQAogICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKQEAgLTc2OTMsNyArNzcyMyw3IEBACiAgICAgfQogCiAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKQEAgLTc5MDQsOCArNzkzNCwxMCBAQAogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fSU5QVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgogICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CiAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKQEAgLTc5OTAsMTcgKzgwMjIsMTkgQEAKICAgICAgICAgbVByZXZPdXREZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2FsbGJhY2sgIT0gMCkgeworICAgICAgICBpZiAobURldmljZUlkICE9IGRldmljZUlkICYmIGNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgIGNhbGxiYWNrLT5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKICAgICAgICAgfQorICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9CiAgICAgaWYgKCFpc091dHB1dCgpICYmIG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlKSB7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGlmIChtRGV2aWNlSWQgIT0gZGV2aWNlSWQgJiYgY2FsbGJhY2sgIT0gMCkgewogICAgICAgICAgICAgY2FsbGJhY2stPm9uUm91dGluZ0NoYW5nZWQoZGV2aWNlSWQpOwogICAgICAgICB9CisgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtODExNCwxMCArODE0OCw4IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0aHJlYWRMb29wX2V4aXQoKQogewotICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIGNhbGxiYWNrLT5vblRlYXJEb3duKCk7Ci0gICAgfQorICAgIC8vIERvIG5vdCBjYWxsIGNhbGxiYWNrLT5vblRlYXJEb3duKCkgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZm9yIHRocmVhZCBleGl0CisgICAgLy8gYW5kIGJlY2F1c2UgaXQgY2FuIGNhdXNlIGEgcmVjdXJzaXZlIG11dGV4IGxvY2sgb24gc3RvcCgpLgogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkKQEAgLTgxNzgsNiArODIxMCw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC04MTk0LDE4ICs4MjI4LDE3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIHNpemVfdCBudW10cmFja3MgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKLSAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzXG4iLCBudW10cmFja3MpOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwpAQCAtODI0MCw5ICs4MjczLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgTW1hcFRocmVhZDo6Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCwgY2FsbGJhY2ssIHBvcnRJZCk7CisgICAgTW1hcFRocmVhZDo6Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCwgY2FsbGJhY2ssIGRldmljZUlkLCBwb3J0SWQpOwogICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggMDYyYmFkNi4uZGQyYjg5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC01MDgsOSArNTA4LDEwIEBACiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgY2xhc3MgQWN0aXZlVHJhY2tzIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2ZVRyYWNrcygpCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0IEFjdGl2ZVRyYWNrcyhTaW1wbGVMb2cgKmxvY2FsTG9nID0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgIDogbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKICAgICAgICAgICAgICAgICAgICAgICAgICwgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAsIG1Mb2NhbExvZyhsb2NhbExvZykKICAgICAgICAgICAgICAgICAgICAgeyB9CiAKICAgICAgICAgICAgICAgICAgICAgfkFjdGl2ZVRyYWNrcygpIHsKQEAgLTU2Miw2ICs1NjMsOCBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdXBkYXRlUG93ZXJTdGF0ZShzcDxUaHJlYWRCYXNlPiB0aHJlYWQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9nVHJhY2soY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3Q7CisKICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPHVpZF90PiBnZXRXYWtlTG9ja1VpZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IHdha2VMb2NrVWlkczsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VD4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewpAQCAtNTc2LDYgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgICAgICAgICAgICAgICAgICB3cDxUPiAgICAgICAgICAgICAgIG1MYXRlc3RBY3RpdmVUcmFjazsgLy8gbGF0ZXN0IHRyYWNrIGFkZGVkIHRvIEFjdGl2ZVRyYWNrcworICAgICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgKiBjb25zdCAgIG1Mb2NhbExvZzsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgU2ltcGxlTG9nIG1Mb2NhbExvZzsKQEAgLTk5NSw2ICs5OTksOSBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1Id1N1cHBvcnRzUGF1c2U7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUh3UGF1c2VkOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1GbHVzaFBlbmRpbmc7CisgICAgICAgICAgICAgICAgLy8gdm9sdW1lcyBsYXN0IHNlbnQgdG8gYXVkaW8gSEFMIHdpdGggc3RyZWFtLT5zZXRWb2x1bWUoKQorICAgICAgICAgICAgICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7CisgICAgICAgICAgICAgICAgZmxvYXQgbVJpZ2h0Vm9sRmxvYXQ7CiB9OwogCiBjbGFzcyBNaXhlclRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CkBAIC0xMTEyLDkgKzExMTksNiBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKLSAgICAvLyB2b2x1bWVzIGxhc3Qgc2VudCB0byBhdWRpbyBIQUwgd2l0aCBzdHJlYW0tPnNldF92b2x1bWUoKQotICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7Ci0gICAgZmxvYXQgbVJpZ2h0Vm9sRmxvYXQ7CiAgICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlOwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKQEAgLTE0NzUsNiArMTQ3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTE1MzYsNiArMTU0MSw3IEBACiAKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cjsKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZDsKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOwogCiAgICAgICAgICAgICAgICAgd3A8TW1hcFN0cmVhbUNhbGxiYWNrPiAgbUNhbGxiYWNrOwpAQCAtMTU1OCw2ICsxNTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGNsZWFyT3V0cHV0KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2I1NDBjYS4uZDRjZTBiNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtNjEsNiArNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKQEAgLTgyLDYgKzgzLDcgQEAKIAogICAgICAgICAgICAgc3A8SU1lbW9yeT4gZ2V0QnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJNZW1vcnk7IH0KICAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCA9IDA7CiAgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CkBAIC0xMzMsNiArMTM1LDQwIEBACiAgICAgICAgIG1UZXJtaW5hdGVkID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvLyBVcHBlciBjYXNlIGNoYXJhY3RlcnMgYXJlIGZpbmFsIHN0YXRlcy4KKyAgICAvLyBMb3dlciBjYXNlIGNoYXJhY3RlcnMgYXJlIHRyYW5zaXRvcnkuCisgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tTdGF0ZVN0cmluZygpIGNvbnN0IHsKKyAgICAgICAgaWYgKGlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIlQgIjsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICByZXR1cm4gIkkgIjsKKyAgICAgICAgY2FzZSBTVE9QUElOR18xOiAvLyBmb3IgRmFzdCBhbmQgT2ZmbG9hZAorICAgICAgICAgICAgcmV0dXJuICJzMSI7CisgICAgICAgIGNhc2UgU1RPUFBJTkdfMjogLy8gZm9yIEZhc3QgYW5kIE9mZmxvYWQKKyAgICAgICAgICAgIHJldHVybiAiczIiOworICAgICAgICBjYXNlIFNUT1BQRUQ6CisgICAgICAgICAgICByZXR1cm4gIlMgIjsKKyAgICAgICAgY2FzZSBSRVNVTUlORzoKKyAgICAgICAgICAgIHJldHVybiAiciAiOworICAgICAgICBjYXNlIEFDVElWRToKKyAgICAgICAgICAgIHJldHVybiAiQSAiOworICAgICAgICBjYXNlIFBBVVNJTkc6CisgICAgICAgICAgICByZXR1cm4gInAgIjsKKyAgICAgICAgY2FzZSBQQVVTRUQ6CisgICAgICAgICAgICByZXR1cm4gIlAgIjsKKyAgICAgICAgY2FzZSBGTFVTSEVEOgorICAgICAgICAgICAgcmV0dXJuICJGICI7CisgICAgICAgIGNhc2UgU1RBUlRJTkdfMTogLy8gZm9yIFJlY29yZFRyYWNrCisgICAgICAgICAgICByZXR1cm4gInIxIjsKKyAgICAgICAgY2FzZSBTVEFSVElOR18yOiAvLyBmb3IgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgIHJldHVybiAicjIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICI/ICI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBib29sIGlzT3V0KCkgY29uc3QgeyByZXR1cm4gbUlzT3V0OyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGZvciBUcmFjaywgZmFsc2UgZm9yIFJlY29yZFRyYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhIHRyYWNrIHR5cGUgaWYgbmVlZGVkIGxhdGVyCkBAIC0xNDQsNiArMTgwLDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1CdWZmZXJNZW1vcnk7ICAvLyBjdXJyZW50bHkgbm9uLTAgZm9yIGZhc3QgUmVjb3JkVHJhY2sgb25seQogICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcjsgICAgLy8gc3RhcnQgb2YgdHJhY2sgYnVmZmVyLCB0eXBpY2FsbHkgaW4gc2hhcmVkIG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBPdXRwdXRUcmFjayB3aGVuIGl0IGlzIGluIGxvY2FsIG1lbW9yeQorICAgIHNpemVfdCAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7IC8vIHNpemUgb2YgbUJ1ZmZlciBpbiBieXRlcwogICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKICAgICB0cmFja19zdGF0ZSAgICAgICAgIG1TdGF0ZTsKICAgICBjb25zdCB1aW50MzJfdCAgICAgIG1TYW1wbGVSYXRlOyAgICAvLyBpbml0aWFsIHNhbXBsZSByYXRlIG9ubHk7IGZvciB0cmFja3Mgd2hpY2gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggOTc2M2JmMi4uMGYyNTE1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTUwLDEwICs1MCw2IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0vLyBUT0RPIG1vdmUgdG8gYSBjb21tb24gaGVhZGVyICAoQWxzbyBzaGFyZWQgd2l0aCBBdWRpb1RyYWNrLmNwcCkKLSNkZWZpbmUgTkFOT1NfUEVSX1NFQ09ORCAgICAxMDAwMDAwMDAwCi0jZGVmaW5lIFRJTUVfVE9fTkFOT1ModGltZSkgKCh1aW50NjRfdCkodGltZSkudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCArICh0aW1lKS50dl9uc2VjKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxLDYgKzY3LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBib29sIGlzT3V0LApAQCAtODEsNyArNzgsNyBAQAogICAgICAgICBtVGhyZWFkKHRocmVhZCksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgICAgbUNibGsoTlVMTCksCi0gICAgICAgIC8vIG1CdWZmZXIKKyAgICAgICAgLy8gbUJ1ZmZlciwgbUJ1ZmZlclNpemUKICAgICAgICAgbVN0YXRlKElETEUpLAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgICAgbUZvcm1hdChmb3JtYXQpLApAQCAtMTEzLDE1ICsxMTAsMjIgQEAKIAogICAgIC8vIEFMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKIAotICAgIHNpemVfdCBidWZmZXJTaXplID0gYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudDsKKyAgICBzaXplX3QgbWluQnVmZmVyU2l6ZSA9IGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQ7CiAgICAgLy8gY2hlY2sgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgYnVmZmVyU2l6ZSBkdWUgdG8gbXVsdGlwbGljYXRpb24gYnkgbUZyYW1lU2l6ZS4KLSAgICBpZiAoYnVmZmVyU2l6ZSA8IGZyYW1lQ291bnQgIC8vIHJvdW5kdXAgcm91bmRzIGRvd24gZm9yIHZhbHVlcyBhYm92ZSBVSU5UX01BWCAvIDIKKyAgICBpZiAobWluQnVmZmVyU2l6ZSA8IGZyYW1lQ291bnQgIC8vIHJvdW5kdXAgcm91bmRzIGRvd24gZm9yIHZhbHVlcyBhYm92ZSBVSU5UX01BWCAvIDIKICAgICAgICAgICAgIHx8IG1GcmFtZVNpemUgPT0gMCAgIC8vIGZvcm1hdCBuZWVkcyB0byBiZSBjb3JyZWN0Ci0gICAgICAgICAgICB8fCBidWZmZXJTaXplID4gU0laRV9NQVggLyBtRnJhbWVTaXplKSB7CisgICAgICAgICAgICB8fCBtaW5CdWZmZXJTaXplID4gU0laRV9NQVggLyBtRnJhbWVTaXplKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzQ3NDk1NzEiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBidWZmZXJTaXplICo9IG1GcmFtZVNpemU7CisgICAgbWluQnVmZmVyU2l6ZSAqPSBtRnJhbWVTaXplOworCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlclNpemUgPSBtaW5CdWZmZXJTaXplOyAvLyBhbGxvY2F0ZWQgaGVyZS4KKyAgICB9IGVsc2UgaWYgKG1pbkJ1ZmZlclNpemUgPiBidWZmZXJTaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzgzNDAxMTciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMICYmIGFsbG9jID09IEFMTE9DX0NCTEspIHsKQEAgLTE3Nyw2ICsxODEsNyBAQAogICAgICAgICAgICAgLy8gSXQgc2hvdWxkIHJlZmVyZW5jZXMgdGhlIGJ1ZmZlciB2aWEgdGhlIHBpcGUuCiAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNhZ2Ugb2YgdGhlIGJ1ZmZlciwgd2Ugc2V0IG1CdWZmZXIgdG8gTlVMTC4KICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBTExPQ19DQkxLOgogICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKQEAgLTE5Niw3ICsyMDEsMTAgQEAKICAgICAgICAgY2FzZSBBTExPQ19OT05FOgogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CiAgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOwogCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7CkBAIC0zNjgsNiArMzc2LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMzc2LDYgKzM4NSw3IEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpIDogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIDogYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCB0cnVlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfUEFUQ0gpID8gKCBidWZmZXIgPT0gTlVMTCA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSkgOiBBTExPQ19DQkxLLAogICAgICAgICAgICAgICAgICAgdHlwZSwgcG9ydElkKSwKQEAgLTQxMSwyMSArNDIxLDYgQEAKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpLCBzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBJcyB0aGUgc2hhcmVkIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemU/Ci0gICAgICAgIC8vIChmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSkgaXMgPD0gU0laRV9NQVgsIGNoZWNrZWQgaW4gVHJhY2tCYXNlLgotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyLT5zaXplKCkgPCBmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSkgewotICAgICAgICAgICAgLy8gV29ya2Fyb3VuZDogY2xlYXIgb3V0IG1DYmxrIHRvIGluZGljYXRlIHRyYWNrIGhhc24ndCBiZWVuIHByb3Blcmx5IGNyZWF0ZWQuCi0gICAgICAgICAgICBtQ2Jsay0+fmF1ZGlvX3RyYWNrX2NibGtfdCgpOyAgIC8vIGRlc3Ryb3kgb3VyIHNoYXJlZC1zdHJ1Y3R1cmUuCi0gICAgICAgICAgICBpZiAobUNsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2Jsayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2JsayA9IE5VTEw7Ci0KLSAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsgLy8gcmVsZWFzZSBzaGFyZWQgYnVmZmVyIGVhcmx5Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM4MzQwMTE3Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKICAgICB9CkBAIC01MDMsNTggKzQ5OCw0MCBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBOYW1lIEFjdGl2ZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKLSAgICAgICAgICAgICAgICAgICJMIGRCICBSIGRCICBWUyBkQiAgICBTZXJ2ZXIgTWFpbiBidWYgIEF1eCBidWYgRmxhZ3MgVW5kRnJtQ250ICBGbHVzaGVkXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKKyAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgorICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgorICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIEYgJTJkIiwgbUZhc3RJbmRleCk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIG5vbmUiKTsKLSAgICB9Ci0gICAgdHJhY2tfc3RhdGUgc3RhdGUgPSBtU3RhdGU7Ci0gICAgY2hhciBzdGF0ZUNoYXI7Ci0gICAgaWYgKGlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgIHN0YXRlQ2hhciA9ICdUJzsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgSURMRToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdJJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQSU5HXzE6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAncyc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUElOR18yOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJzUnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdTJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFU1VNSU5HOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1InOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUNUSVZFOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0EnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFVU0lORzoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdwJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBVVNFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdQJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZMVVNIRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnRic7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICc/JzsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGNoYXIgdHJhY2tUeXBlOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICBjYXNlIFRZUEVfREVGQVVMVDoKKyAgICBjYXNlIFRZUEVfT1VUUFVUOgorICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB0cmFja1R5cGUgPSAnUyc7IC8vIHN0YXRpYworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2tUeXBlID0gJyAnOyAvLyBub3JtYWwKICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfUEFUQ0g6CisgICAgICAgIHRyYWNrVHlwZSA9ICdQJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdHJhY2tUeXBlID0gJz8nOwogICAgIH0KKworICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOworICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIG5vbmUiLCB0cmFja1R5cGUpOworICAgIH0KKwogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKICAgICBzd2l0Y2ggKG1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50KSB7CiAgICAgY2FzZSBVTkRFUlJVTl9GVUxMOgpAQCAtNTcxLDMxICs1NDgsNzUgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3RkOjpwYWlyPGZsb2F0IC8qIHZvbHVtZSAqLywgYm9vbCAvKiBhY3RpdmUgKi8+IHZzVm9sdW1lID0gbVZvbHVtZUhhbmRsZXItPmdldExhc3RWb2x1bWUoKTsKLSAgICBzbnByaW50ZigmYnVmZmVyWzhdLCBzaXplIC0gOCwgIiAlNnMgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2enUgJTFjICUxZCAlNXUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmclYyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDh6WCAlMDh6WCAweCUwM1ggJTl1JWMgJTd1XG4iLAorICAgIGNoYXIgZmlsbGluZ1N0YXR1czsKKyAgICBzd2l0Y2ggKG1GaWxsaW5nVXBTdGF0dXMpIHsKKyAgICBjYXNlIEZTX0lOVkFMSUQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnSSc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfRklMTElORzoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdmJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19GSUxMRUQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnRic7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfQUNUSVZFOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0EnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJz8nOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBjbGlwIGZyYW1lc1JlYWR5U2FmZSB0byBtYXggcmVwcmVzZW50YXRpb24gaW4gZHVtcAorICAgIGNvbnN0IHNpemVfdCBmcmFtZXNSZWFkeVNhZmUgPQorICAgICAgICAgICAgc3RkOjptaW4obUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksIChzaXplX3QpOTk5OTk5OTkpOworCisgICAgLy8gb2J0YWluIHZvbHVtZXMKKyAgICBjb25zdCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOworICAgIGNvbnN0IHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPiB2c1ZvbHVtZSA9CisgICAgICAgICAgICBtVm9sdW1lSGFuZGxlci0+Z2V0TGFzdFZvbHVtZSgpOworCisgICAgLy8gT3VyIGVmZmVjdGl2ZSBmcmFtZSBjb3VudCBpcyBvYnRhaW5lZCBieSBTZXJ2ZXJQcm94eTo6Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKyAgICAvLyBhcyBpdCBtYXkgYmUgcmVkdWNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemVJbkZyYW1lcyA9IChzaXplX3QpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCk7CisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIHNpemUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIGFwcC4KKyAgICBjb25zdCBjaGFyIG1vZGlmaWVkQnVmZmVyQ2hhciA9IGJ1ZmZlclNpemVJbkZyYW1lcyA8IG1GcmFtZUNvdW50CisgICAgICAgICAgICA/ICdyJyAvKiBidWZmZXIgcmVkdWNlZCAqLzogYnVmZmVyU2l6ZUluRnJhbWVzID4gbUZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAgICAgPyAnZScgLyogZXJyb3IgKi8gOiAnICcgLyogaWRlbnRpY2FsICovOworCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICU1LjJnICU1LjJnICU1LjJnJWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh6WCAlMDh6WFxuIiwKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAorICAgICAgICAgICAgbUNibGstPm1GbGFncywKKwogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCwKLSAgICAgICAgICAgIHN0YXRlQ2hhciwKLSAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCiAgICAgICAgICAgICB2c1ZvbHVtZS5zZWNvbmQgPyAnQScgOiAnICcsICAvLyBpZiBhbnkgVm9sdW1lU2hhcGVycyBhY3RpdmUKKwogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciwgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAotICAgICAgICAgICAgbUNibGstPm1GbGFncywKKyAgICAgICAgICAgIGJ1ZmZlclNpemVJbkZyYW1lcywKKyAgICAgICAgICAgIG1vZGlmaWVkQnVmZmVyQ2hhciwKKyAgICAgICAgICAgIGZyYW1lc1JlYWR5U2FmZSwKKyAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCk7IC8vIDcgZGlnaXRzCisgICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDAsCisKKyAgICAgICAgICAgIChzaXplX3QpbU1haW5CdWZmZXIsIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHNpemVfdCltQXV4QnVmZmVyICAgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4CisgICAgICAgICAgICApOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTEyMzUsNyArMTI1Niw4IEBACiAgICAgICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fUEFUQ0gsCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgIE5VTEwsIDAsIEFVRElPX1NFU1NJT05fTk9ORSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgVFlQRV9PVVRQVVQpLAogICAgIG1BY3RpdmUoZmFsc2UpLCBtU291cmNlVGhyZWFkKHNvdXJjZVRocmVhZCkKIHsKQEAgLTEzNTEsNyArMTM3Myw5IEBACiAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSkgewogICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5yZW1vdmVBdCgwKTsKICAgICAgICAgICAgICAgICBmcmVlKHBJbkJ1ZmZlci0+bUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MzAsMTAgKzE0NTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICBidWZmZXIsIDAsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCkBAIC0xNTY3LDEzICsxNTkzLDE0IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBidWZmZXJTaXplLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovLAogICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9ERUZBVUxUKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpID8gQUxMT0NfUElQRSA6IEFMTE9DX0NCTEspIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidWZmZXIgPT0gTlVMTCkgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpLApAQCAtMTcwMSwyMiArMTcyOCwyOCBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgQWN0aXZlIENsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudCBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnRcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICU2cyAlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enUgJTV1XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAiJTA4WCAlNnp1XG4iLAorICAgICAgICAgICAgaXNGYXN0VHJhY2soKSA/ICdGJyA6ICcgJywKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKKyAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgbVN0YXRlLAotICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogCisgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKKyAgICAgICAgICAgIG1GcmFtZUNvdW50CisgICAgICAgICAgICApOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xNzY3LDkgKzE4MDAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKICAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTgzNCwxMSArMTg2OCwxNSBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgMCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIChzaXplX3QpMCAvKiBmcmFtZUNvdW50ICovLAorICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qIGlzT3V0ICovLAogICAgICAgICAgICAgICAgICAgQUxMT0NfTk9ORSwKLSAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKQorICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAorICAgICAgICBtUGlkKHBpZCkKIHsKIH0KIApAQCAtMTg4NSwxNyArMTkyMywxNyBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDbGllbnQgRm10IENobiBtYXNrICBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAgICAgICAgICU2dSAlM3UgICAgJTA4WCAlNXVcbiIsCi0gICAgICAgICAgICBtVWlkLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKLQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDJkODQwMjguLjkwOWFmMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC04OCwxMSArODgsMTEgQEAKIAogLy8gV3JpdGUgaGlzdG9ncmFtIHRpbWVzdGFtcCBlbnRyeQogI2RlZmluZSBMT0dfSElTVF9UUygpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+bG9nSGlzdFRTKGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKKyAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCi0vLyBmbHVzaCBhbGwgaGlzdG9ncmFtCi0jZGVmaW5lIExPR19ISVNUX0ZMVVNIKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5sb2dIaXN0Rmx1c2goaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQorLy8gUmVjb3JkIHRoYXQgYXVkaW8gd2FzIHR1cm5lZCBvbi9vZmYKKyNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawppbmRleCBhZDM0MGU1Li42NTU3MWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDggQEAKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAogICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliZWZmZWN0c2NvbmZpZwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IGM4NjgyMDYuLjdiMTlmNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtMzQ5LDggKzM0OSw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ODNmYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2ptdHJpdmlAZ29vZ2xlLmNvbQora3JvY2FyZEBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKaW5kZXggY2EwNzBjZi4uY2VkZjIyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CiAjaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ0LDE0ICs0NSwxNCBAQAogCiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uOyB9Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1JbnB1dFNvdXJjZTsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQorICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1VaWQgPSB1aWQ7IH0KKyAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KKyAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9CiAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CiAgICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7CkBAIC02NSwxMSArNjYsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1JbnB1dFNvdXJjZTsKKyAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtUmVjb3JkQ2xpZW50SW5mbzsKICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNvbmZpZzsKICAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKLSAgICB1aWRfdCBtVWlkOwogICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKICAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKICAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKaW5kZXggYmVhOWY0Zi4uNWI1N2QzZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCkBAIC0zOCw5ICszOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU291bmRUcmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXgqIHBvbGljeU1peCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpIDoKLSAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbUlucHV0U291cmNlKGlucHV0U291cmNlKSwKKyAgICBtUmVjb3JkQ2xpZW50SW5mbyh7IC51aWQgPSB1aWQsIC5zZXNzaW9uID0gc2Vzc2lvbiwgLnNvdXJjZSA9IGlucHV0U291cmNlfSksCiAgICAgbUNvbmZpZyh7IC5mb3JtYXQgPSBmb3JtYXQsIC5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGUsIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFza30pLAotICAgIG1GbGFncyhmbGFncyksIG1VaWQodWlkKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKKyAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAogICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUluZm9Qcm92aWRlcihOVUxMKQogewpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIG1TZXNzaW9uLCBtSW5wdXRTb3VyY2UsCisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZtUmVjb3JkQ2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMiwxMyArMTAyLDEzIEBACiAKIGJvb2wgQXVkaW9TZXNzaW9uOjptYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdAogewotICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1TZXNzaW9uICYmCi0gICAgICAgIG90aGVyLT5pbnB1dFNvdXJjZSgpID09IG1JbnB1dFNvdXJjZSAmJgorICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24gJiYKKyAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbVJlY29yZENsaWVudEluZm8uc291cmNlICYmCiAgICAgICAgIG90aGVyLT5mb3JtYXQoKSA9PSBtQ29uZmlnLmZvcm1hdCAmJgogICAgICAgICBvdGhlci0+c2FtcGxlUmF0ZSgpID09IG1Db25maWcuc2FtcGxlX3JhdGUgJiYKICAgICAgICAgb3RoZXItPmNoYW5uZWxNYXNrKCkgPT0gbUNvbmZpZy5jaGFubmVsX21hc2sgJiYKICAgICAgICAgb3RoZXItPmZsYWdzKCkgPT0gbUZsYWdzICYmCi0gICAgICAgIG90aGVyLT51aWQoKSA9PSBtVWlkKSB7CisgICAgICAgIG90aGVyLT51aWQoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby51aWQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTEzMCw4ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJULAotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbiwgbUlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAmbVJlY29yZENsaWVudEluZm8sICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNDQsMTEgKzE0MywxMSBAQAogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gc2Vzc2lvbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVNlc3Npb24pOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtSW5wdXRTb3VyY2UpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuZm9ybWF0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYmY1MDhhYy4uNWI3YWU3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTMsNyArMTMsNyBAQAogICAgICAgICA8L21peFBvcnQ+CiAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgogICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgogICAgICAgICA8L21peFBvcnQ+CiAgICA8L21peFBvcnRzPgogICAgPGRldmljZVBvcnRzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggNzhmMTk1ZC4uYmRmYWYyZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0xMzIwLDkgKzEzMjAsOSBAQAogCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwpAQCAtMTQ5OSw2MiArMTQ5OSwxMyBAQAogICAgICAgICAgICAgInNlc3Npb24gJWQsIGZsYWdzICUjeCIsCiAgICAgICAgICAgYXR0ci0+c291cmNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIHNlc3Npb24sIGZsYWdzKTsKIAotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCi0gICAgLy8gcG9zc2libGUKLSAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSA9PSBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEgJiYKLSAgICAgICAgICAgICppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KCppbnB1dCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSB1bmtub3duIE1NQVAgaW5wdXQgJWQiLCAqaW5wdXQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIE1NQVAgbW9kZSwgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgaXMgbWFkZSBvbiBiZWhhbGYgb2YgYXVkaW9mbGluZ2VyLgotICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKLSAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJZC4KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoaW5wdXREZXNjLT5tRGV2aWNlKTsKLSAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAogICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gYXR0ci0+c291cmNlOwogICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gYXR0ci0+c291cmNlOwogICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOwotCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLSAgICB9Ci0gICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQorICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXM7CiAKICAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CkBAIC0xNTY4LDExICsxNTE5LDY3IEBACiAgICAgfQogICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKIAorICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCisgICAgLy8gcG9zc2libGUKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSA9PSBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEgJiYKKyAgICAgICAgICAgICppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KCppbnB1dCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSB1bmtub3duIE1NQVAgaW5wdXQgJWQiLCAqaW5wdXQpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIE1NQVAgbW9kZSwgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgaXMgbWFkZSBvbiBiZWhhbGYgb2YgYXVkaW9mbGluZ2VyLgorICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKKyAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJZC4KKyAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CisgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOworICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQorICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOworCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9CisgICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAorICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKwogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgogICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CkBAIC0xNTgxLDcgKzE1ODgsOCBAQAogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7CiAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgewogICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CkBAIC0xNjEwLDExICsxNjE4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgpOwogICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CiAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIApAQCAtMTYyMiw2ICsxNjMwLDEwIEBACiAgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyb3I6CisgICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIApAQCAtNDcyMSwxMCArNDczMywxMCBAQAogICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQogICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKICAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkKICAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKQEAgLTQ3NDEsMTAgKzQ3NTMsMTAgQEAKICAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKICAgICAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CiAgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKQEAgLTQ5MjYsMTIgKzQ5MzgsMTMgQEAKICAgICAvLyBzY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCwgZm9yIGVhY2ggZW50cnksIGNvbnZlcnQgdGhlIHN0cmVhbSB0eXBlIHRvIGEgc3RyYXRlZ3kKICAgICAvLyAoZ2V0U3RyYXRlZ3koc3RyZWFtKSkuCiAgICAgLy8gaWYgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIHN0cmVhbSB0eXBlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCi0gICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvCi0gICAgLy8gdGhlIGRldmljZSA9IHRoZSBkZXZpY2UgZnJvbSB0aGUgZGVzY3JpcHRvciBpbiB0aGUgUm91dGVNYXAsIGFuZCBleGl0LgorICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKKyAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KICAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1PdXRwdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKICAgICAgICAgcm91dGluZ19zdHJhdGVneSByb3V0ZVN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKTsKLSAgICAgICAgaWYgKChyb3V0ZVN0cmF0ZWd5ID09IHN0cmF0ZWd5KSAmJiByb3V0ZS0+aXNBY3RpdmUoKSkgeworICAgICAgICBpZiAoKHJvdXRlU3RyYXRlZ3kgPT0gc3RyYXRlZ3kpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwogICAgICAgICB9CiAgICAgfQpAQCAtNTMyNiw5ICs1MzM5LDE1IEBACiAKIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQogeworICAgIC8vIFJvdXRpbmcKKyAgICAvLyBTY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCByb3V0ZToKKyAgICAvLyBpZiB0aGUgaW5wdXQgc291cmNlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCisgICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvIGFuZCB0aGUgZGV2aWNlIGluIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQorICAgIC8vIHRoZW4gc2VsZWN0IHRoaXMgZGV2aWNlLgogICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbUlucHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7CiAgICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7Ci0gICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UgJiYgcm91dGUtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewogICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKICAgICAgICAgIH0KICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGRiY2MwNzAuLjMxYzk1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIyMCwxMSArMjIwLDExIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNjU0NDY1ZC4uODRiMTA3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzksMTEgKzQxLDE3IEBACiAKIEF1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKIHsKLSAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9hZFJlc3VsdCA+IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJWQgZWxlbWVudHMiLCBsb2FkUmVzdWx0KTsKICAgICB9CiB9CiAKQEAgLTY4NSw2ICs2OTMsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCkgeworICAgIGF1dG8gcmVzdWx0ID0gZWZmZWN0c0NvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGF1dG8gbG9hZFByb2Nlc3NpbmdDaGFpbiA9IFtdKGF1dG8mIHByb2Nlc3NpbmdDaGFpbiwgYXV0byYgc3RyZWFtcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICAgICAgYXV0byBlZmZlY3REZXNjcyA9IHN0ZDo6bWFrZV91bmlxdWU8RWZmZWN0RGVzY1ZlY3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZWZmZWN0IDogc3RyZWFtLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbS50eXBlLCBlZmZlY3REZXNjcy5yZWxlYXNlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOworICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjbm9kZSAqcm9vdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDBjNzRkODcuLjU5ZDVkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsgLy8gVE9ETzogYWRkIGxlZ2FjeSBpbiB0aGUgbmFtZQorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOyAvLyBUT0RPOiByZW1vdmUgIlhtbCIgaW4gdGhlIG5hbWUKIAogICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggZjYwMDMwZC4uYjdiY2U1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMjg5LDEzICsyODksNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7Ci0KICAgICBib29sIHVwZGF0ZVBpZCA9IChwaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CkBAIC0zMTMsNyArMzA2LDE1IEBACiAgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCisgICAgaWYgKChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkLCB1aWQpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CisKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCiAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGM0ZjYzNjcuLmI0MTc2MzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTE4NSwyMSArMTg1LDIxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgc2Vzc2lvbiwgc291cmNlLAorICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICB9CiB9CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTU0NCw4ICs1NDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCBkYXRhLT5tU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tU291cmNlLCAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCAmZGF0YS0+bUNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsICZkYXRhLT5tRGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKQEAgLTgxMCw3ICs4MTAsNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CkBAIC04MTgsMTQgKzgxOCwxMyBAQAogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOwogICAgIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhICpkYXRhID0gbmV3IFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhKCk7CiAgICAgZGF0YS0+bUV2ZW50ID0gZXZlbnQ7Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGRhdGEtPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgZGF0YS0+bUNsaWVudEluZm8gPSAqY2xpZW50SW5mbzsKICAgICBkYXRhLT5tQ2xpZW50Q29uZmlnID0gKmNsaWVudENvbmZpZzsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgZXZlbnQsIHNvdXJjZSk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAorICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMzU1NDJmMS4uMzhkNGIxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogCiAgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCiBwcml2YXRlOgpAQCAtMzA2LDggKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKQEAgLTQwNCw4ICs0MDQsNyBAQAogICAgICAgICBjbGFzcyBSZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgaW50IG1FdmVudDsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1EZXZpY2VDb25maWc7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CkBAIC01MTgsNyArNTE3LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC01NDAsOCArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL09XTkVSUyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhY2ZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjeWNoZW5AZ29vZ2xlLmNvbQorZXBlZXZAZ29vZ2xlLmNvbQorZXRhbHZhbGFAZ29vZ2xlLmNvbQorc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoreWluY2hpYXllaEBnb29nbGUuY29tCit6aGlqdW5oZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBmMWNkZWEzLi43ZWMzY2NiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTc3LDcgKzc3LDggQEAKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zCiAKIExPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBhMjg1MThlLi4yY2Y2NDhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTcyLDYgKzcyLDIwIEBACiAgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIpOwogfQogCitib29sIENhbWVyYTJDbGllbnQ6OmlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpIHsKKyAgICBib29sIHpzbEVuYWJsZWQgPSBmYWxzZTsKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGlsbFRlbXBsYXRlOworICAgIHN0YXR1c190IHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW5hYmxlWnNsID0gc3RpbGxUZW1wbGF0ZS5maW5kKEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMKTsKKyAgICAgICAgaWYgKGVuYWJsZVpzbC5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICB6c2xFbmFibGVkID0gKGVuYWJsZVpzbC5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMX1RSVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHpzbEVuYWJsZWQ7Cit9CisKIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cikKIHsKQEAgLTkzLDYgKzEwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CisKKyAgICAgICAgbC5tUGFyYW1ldGVycy5pc0RldmljZVpzbFN1cHBvcnRlZCA9IGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogICAgIH0KIAogICAgIFN0cmluZzggdGhyZWFkTmFtZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNzIzMTVkNC4uNWFmNzRlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTIyNCw2ICsyMjQsOCBAQAogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgogICAgIHN0YXR1c190IGluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cik7CisKKyAgICBib29sIGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IDNmNDAxN2YuLjBkMmRiYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtMTIxLDE4ICsxMjEsMTcgQEAKIAogICAgIGlmIChtQ2FsbGJhY2tTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwotICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obUNhbGxiYWNrU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAwKTsKKyAgICAgICAgQ2FtZXJhRGV2aWNlQmFzZTo6U3RyZWFtSW5mbyBzdHJlYW1JbmZvOworICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obUNhbGxiYWNrU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhbGxiYWNrIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3SGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpY2FsbGJhY2tGb3JtYXQpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQgfHwKKyAgICAgICAgICAgICAgICAhc3RyZWFtSW5mby5tYXRjaEZvcm1hdCgodWludDMyX3QpY2FsbGJhY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAvLyBTaW5jZSBzaXplIHNob3VsZCBvbmx5IGNoYW5nZSB3aGlsZSBwcmV2aWV3IGlzIG5vdCBydW5uaW5nLAogICAgICAgICAgICAgLy8gYXNzdW1pbmcgdGhhdCBhbGwgZXhpc3RpbmcgdXNlIG9mIG9sZCBjYWxsYmFjayBzdHJlYW0gaXMKICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBkNmQ4ZGRlLi5kOGI3YWYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC0xMzYsMTcgKzEzNiwxNiBAQAogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYXB0dXJlU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FwdHVyZVN0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnBpY3R1cmVXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CisgICAgICAgIGlmIChzdHJlYW1JbmZvLndpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucGljdHVyZVdpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRGVsZXRpbmcgc3RyZWFtICVkIHNpbmNlIHRoZSBidWZmZXIgZGltZW5zaW9ucyBjaGFuZ2VkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCBhMzA1YmM3Li42ZmI1YzIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC05NTQsNyArOTU0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJWQ6IERpc2FibGluZyBaU0wgbW9kZSIsIGNhbWVyYUlkKTsKICAgICAgICAgYWxsb3dac2xNb2RlID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKQEAgLTE5OTcsNyArMTk5OCw4IEBACiAgICAgaWYgKHByZXZpZXdGcHNSYW5nZVsxXSA+IDFlOS9taW5GcmFtZUR1cmF0aW9uTnMgKyBGUFNfTUFSR0lOKSB7CiAgICAgICAgIHNsb3dKcGVnTW9kZSA9IHRydWU7CiAgICAgfQotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGlzWnNsUmVwcm9jZXNzUHJlc2VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IGJlYTg2N2EuLjE3ZTNkNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTc1LDYgKzE3NSw4IEBACiAgICAgYm9vbCBzbG93SnBlZ01vZGU7CiAgICAgLy8gV2hldGhlciBaU0wgcmVwcm9jZXNzIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgogICAgIGJvb2wgaXNac2xSZXByb2Nlc3NQcmVzZW50OworICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBlbmFibGVac2wuCisgICAgYm9vbCBpc0RldmljZVpzbFN1cHBvcnRlZDsKIAogICAgIC8vIE92ZXJhbGwgY2FtZXJhIHN0YXRlCiAgICAgZW51bSBTdGF0ZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IGQ3OWU0MzAuLjczZGNhNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC0xNjEsMTggKzE2MSwxNyBAQAogCiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1QcmV2aWV3U3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUHJldmlld1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBwcmV2aWV3IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucHJldmlld1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcmV2aWV3IHNpemUgc3dpdGNoOiAlZCB4ICVkIC0+ICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0KTsKICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMzEyLDEwICszMTEsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwotICAgIGFuZHJvaWRfZGF0YXNwYWNlIGN1cnJlbnREYXRhU3BhY2U7Ci0gICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgIENhbWVyYURldmljZUJhc2U6OlN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKyAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zMjQsMTAgKzMyMSwxMCBAQAogICAgIH0KIAogICAgIGlmIChtUmVjb3JkaW5nV2luZG93ID09IG51bGxwdHIgfHwKLSAgICAgICAgICAgIGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAotICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICBjdXJyZW50RGF0YVNwYWNlICE9IHBhcmFtcy52aWRlb0RhdGFTcGFjZSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwKKyAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAhc3RyZWFtSW5mby5tYXRjaERhdGFTcGFjZShwYXJhbXMudmlkZW9EYXRhU3BhY2UpKSB7CiAgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMzQ4LDIyICszNDUsMTggQEAKIAogICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgdWludDMyX3QgY3VycmVudEZvcm1hdDsKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwKLSAgICAgICAgICAgICAgICAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUmVjb3JkaW5nU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBwYXJhbXMudmlkZW9EYXRhU3BhY2UpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAorICAgICAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAgICAgIXN0cmVhbUluZm8ubWF0Y2hEYXRhU3BhY2UocGFyYW1zLnZpZGVvRGF0YVNwYWNlKSkgewogICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdhaXQgdG8gYmUgc3VyZSBwcmV2aW91cyByZWNvcmRpbmcgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtUmVjb3JkaW5nU3RyZWFtSWQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDliYzMxYjkuLmIwNjA3ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0yMzMsMTcgKzIzMywxNiBAQAogCiAgICAgaWYgKChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB8fCAobUlucHV0U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQotICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCkgeworICAgICAgICBpZiAoc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0KSB7CiAgICAgICAgICAgICBpZiAobVpzbFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW0gJWQgc2luY2UgdGhlIGJ1ZmZlciAiCiAgICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbnMgY2hhbmdlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggMDQyOWU3Zi4uYzAzZThhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMzEzLDExICszMTMsMTMgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJWQgaW5wdXQgc3RyZWFtLCAlenUgb3V0cHV0IHN1cmZhY2VzKSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID8gMSA6IDAsCiAgICAgICAgICAgICBtU3RyZWFtTWFwLnNpemUoKSk7CkBAIC01NjgsNyArNTcwLDcgQEAKICAgICAgICAgLypvdXQqLwogICAgICAgICBpbnQqIG5ld1N0cmVhbUlkKSB7CiAgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc3VyZmFjZVR5cGU7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgIHN0YXR1c190IGVycjsKICAgICBiaW5kZXI6OlN0YXR1cyByZXM7CkBAIC03NjQsMjQgKzc2NiwyMyBAQAogICAgIC8vIFF1ZXJ5IGNvbnN1bWVyIHVzYWdlIGJpdHMgdG8gc2V0IGFzeW5jIG9wZXJhdGlvbiBtb2RlIGZvcgogICAgIC8vIEdMQ29uc3VtZXIgdXNpbmcgY29udHJvbGxlZEJ5QXBwIHBhcmFtZXRlci4KICAgICBib29sIHVzZUFzeW5jID0gZmFsc2U7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IGdicC0+cXVlcnkoTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgJmNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gZ2JwLT5nZXRDb25zdW1lclVzYWdlKCZjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgY29uc3VtZXIgdXNhZ2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmIChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgewotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlcyB3aXRoIGNvbnN1bWVyIHVzYWdlIGZsYWc6IDB4JXg6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGNvbnN1bWVyVXNhZ2UpOwogICAgICAgICB1c2VBc3luYyA9IHRydWU7CiAgICAgfQogCi0gICAgaW50MzJfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKKyAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOwotICAgIGludDMyX3QgYWxsb3dlZEZsYWdzID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9NQVNLIHwKKyAgICB1aW50NjRfdCBhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKICAgICBib29sIGZsZXhpYmxlQ29uc3VtZXIgPSAoY29uc3VtZXJVc2FnZSAmIGRpc2FsbG93ZWRGbGFncykgPT0gMCAmJgpAQCAtODc0LDcgKzg3NSw3IEBACiAgICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7CiAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAweCV4IHZzIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOlN1cmZhY2UgdXNhZ2UgZmxhZyBkb2Vzbid0IG1hdGNoICUiIFBSSXU2NCAiIHZzICUiIFBSSXU2NCAiIiwKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBjb25zdW1lclVzYWdlLCBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKQEAgLTEzNTMsNyArMTM1NCw3IEBACiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICByZW1vdGVDYi0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCBtU3RyZWFtaW5nUmVxdWVzdElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWRMb2NrKG1TdHJlYW1pbmdSZXF1ZXN0SWRMb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGU4ZmMwODAuLjUwNjYxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjEzLDEzICsyMTMsMTMgQEAKICAgICAgICAgaW50IGhlaWdodDsKICAgICAgICAgaW50IGZvcm1hdDsKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwotICAgICAgICBpbnQzMl90IGNvbnN1bWVyVXNhZ2U7CisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgICAgIGJvb2wgZmluYWxpemVkID0gZmFsc2U7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6CiAgICAgICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIGludDMyX3QgX2NvbnN1bWVyVXNhZ2UpIDoKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBfY29uc3VtZXJVc2FnZSkgOgogICAgICAgICAgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKICAgICAgICAgICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSB7fQogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBkOTA1OWYzLi4zOTE5YmZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlcXVlc3RlZCBzaXplLCBmb3JtYXQsIHJvdGF0aW9uIGFuZApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KQEAgLTE0MiwxMiArMTQyLDUxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsIC8qb3V0Ki8gaW50MzJfdCAqaWQpID0gMDsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIGJvb2wgZm9ybWF0T3ZlcnJpZGRlbjsKKyAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxGb3JtYXQ7CisKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOworICAgICAgICBib29sIGRhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG9yaWdpbmFsRGF0YVNwYWNlOworCisgICAgICAgIFN0cmVhbUluZm8oKSA6IHdpZHRoKDApLCBoZWlnaHQoMCksIGZvcm1hdCgwKSwgZm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksIG9yaWdpbmFsRm9ybWF0KDApLAorICAgICAgICAgICAgICAgIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLCBkYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHt9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBmb3JtYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRm9ybWF0KHVpbnQzMl90IGNsaWVudEZvcm1hdCkgY29uc3QgeworICAgICAgICAgICAgaWYgKChmb3JtYXRPdmVycmlkZGVuICYmIChvcmlnaW5hbEZvcm1hdCA9PSBjbGllbnRGb3JtYXQpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IGNsaWVudEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBkYXRhc3BhY2UgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGNsaWVudERhdGFTcGFjZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChkYXRhU3BhY2VPdmVycmlkZGVuICYmIChvcmlnaW5hbERhdGFTcGFjZSA9PSBjbGllbnREYXRhU3BhY2UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZGF0YVNwYWNlID09IGNsaWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfTsKKwogICAgIC8qKgogICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0cmVhbS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCBzdHJlYW0gZ3JhbGxvYyBidWZmZXIgdHJhbnNmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDVhZGRhZjEuLmU2YTZhMjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMDIsMTIgKzIwMiwxNyBAQAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICAgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICAgICAgYXV0byByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICAgWyZzdXBwb3J0XShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydGVkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN1cHBvcnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCmluZGV4IDQ2OWM4NmMuLjUyMmQ1MjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCkBAIC0yOSwxMSArMjksNiBAQAogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6On5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpCiB7CiAgICAgQUxPR0koIkRlc3Ryb3lpbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChtRGV2aWNlKSB7Ci0gICAgICAgIGludCByYyA9IG1EZXZpY2UtPmNvbW1vbi5jbG9zZSgmbURldmljZS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHJjICE9IE9LKQotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjbG9zZSBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKLSAgICB9CiAgICAgaWYgKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7CiAgICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7CkBAIC00MiwxMiArMzcsNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICBpZiAobURldmljZSkgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gbGliaGFyZHdhcmUgcGF0aCEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICBBTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7CiAKICAgICBzdGF0dXNfdCByZXQgPSBtYW5hZ2VyLT5vcGVuU2Vzc2lvbihtTmFtZS5zdHJpbmcoKSwgdGhpcywgJm1IaWRsRGV2aWNlKTsKQEAgLTEwOCw1OCArOTcsNzggQEAKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFIZWFwTWVtb3J5IGhhcyBGRCAlZCAoZXhwZWN0ID49IDApIiwgX19GVU5DVElPTl9fLCBtZW1Qb29sSWQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7CiAgICAgbUhpZGxNZW1Qb29sTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihtZW1Qb29sSWQsIG1lbSkpOwogICAgIHJldHVybiBtZW1Qb29sSWQ7CiB9CiAKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnVucmVnaXN0ZXJNZW1vcnkodWludDMyX3QgbWVtSWQpIHsKLSAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KG1lbUlkKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBtZW1JZCk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOworICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KG1lbUlkKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgbWVtSWQpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KG1lbUlkKTsKKyAgICAgICAgbUhpZGxNZW1Qb29sTWFwLmVyYXNlKG1lbUlkKTsKICAgICB9Ci0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQobWVtSWQpOwogICAgIHNQdXRNZW1vcnkobWVtKTsKLSAgICBtSGlkbE1lbVBvb2xNYXAuZXJhc2UobWVtSWQpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkYXRhQ2FsbGJhY2soCiAgICAgICAgIERhdGFDYWxsYmFja01zZyBtc2dUeXBlLCB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBidWZmZXJJbmRleCwKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpDYW1lcmFGcmFtZU1ldGFkYXRhJiBtZXRhZGF0YSkgewotICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOworICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKTsKICAgICB9CiAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgbWQ7CiAgICAgbWQubnVtYmVyX29mX2ZhY2VzID0gbWV0YWRhdGEuZmFjZXMuc2l6ZSgpOwogICAgIG1kLmZhY2VzID0gKGNhbWVyYV9mYWNlX3QqKSBtZXRhZGF0YS5mYWNlcy5kYXRhKCk7Ci0gICAgc0RhdGFDYigoaW50MzJfdCkgbXNnVHlwZSwgbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpLCBidWZmZXJJbmRleCwgJm1kLCB0aGlzKTsKKyAgICBzRGF0YUNiKChpbnQzMl90KSBtc2dUeXBlLCBtZW0sIGJ1ZmZlckluZGV4LCAmbWQsIHRoaXMpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCiAgICAgICAgIERhdGFDYWxsYmFja01zZyBtc2dUeXBlLCB1aW50MzJfdCBkYXRhLAogICAgICAgICB1aW50MzJfdCBidWZmZXJJbmRleCwgaW50NjRfdCB0aW1lc3RhbXApIHsKLSAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOwotICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICBjYW1lcmFfbWVtb3J5X3QqIG1lbSA9IG51bGxwdHI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKKyAgICAgICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChkYXRhKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSk7CiAgICAgfQotICAgIHNEYXRhQ2JUaW1lc3RhbXAodGltZXN0YW1wLCAoaW50MzJfdCkgbXNnVHlwZSwgbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpLCBidWZmZXJJbmRleCwgdGhpcyk7CisgICAgc0RhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIChpbnQzMl90KSBtc2dUeXBlLCBtZW0sIGJ1ZmZlckluZGV4LCB0aGlzKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KIAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAoCiAgICAgICAgIERhdGFDYWxsYmFja01zZyBtc2dUeXBlLCBjb25zdCBoaWRsX2hhbmRsZSYgZnJhbWVEYXRhLCB1aW50MzJfdCBkYXRhLAogICAgICAgICB1aW50MzJfdCBidWZmZXJJbmRleCwgaW50NjRfdCB0aW1lc3RhbXApIHsKLSAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOwotICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICBjYW1lcmFfbWVtb3J5X3QqIG1lbSA9IG51bGxwdHI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKKyAgICAgICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChkYXRhKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSk7CiAgICAgfQotICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKS0+aGFuZGxlKSk7CisgICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gaGVhcE1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1lbS0+aGFuZGxlKSk7CiAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSogbWQgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopCi0gICAgICAgICAgICBtZW0tPm1CdWZmZXJzW2J1ZmZlckluZGV4XS0+cG9pbnRlcigpOworICAgICAgICAgICAgaGVhcE1lbS0+bUJ1ZmZlcnNbYnVmZmVySW5kZXhdLT5wb2ludGVyKCk7CiAgICAgbWQtPnBIYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGZyYW1lRGF0YS5nZXROYXRpdmVIYW5kbGUoKSk7Ci0gICAgc0RhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIChpbnQzMl90KSBtc2dUeXBlLCBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSksIGJ1ZmZlckluZGV4LCB0aGlzKTsKKyAgICBzRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgKGludDMyX3QpIG1zZ1R5cGUsIG1lbSwgYnVmZmVySW5kZXgsIHRoaXMpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCkBAIC0xNjgsMjcgKzE3NywyOCBAQAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpIYW5kbGVUaW1lc3RhbXBNZXNzYWdlPiYgbWVzc2FnZXMpIHsKICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpIYW5kbGVUaW1lc3RhbXBNZXNzYWdlPiBtc2dzOwogICAgIG1zZ3MucmVzZXJ2ZShtZXNzYWdlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaGlkbF9tc2cgOiBtZXNzYWdlcykgeworICAgICAgICAgICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChoaWRsX21zZy5kYXRhKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGhpZGxfbXNnLmRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1IaWRsTWVtUG9vbE1hcC5hdChoaWRsX21zZy5kYXRhKS0+aGFuZGxlKSk7CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGhpZGxfbXNnIDogbWVzc2FnZXMpIHsKLSAgICAgICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChoaWRsX21zZy5kYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgaGlkbF9tc2cuZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIGlmIChoaWRsX21zZy5idWZmZXJJbmRleCA+PSBtZW0tPm1OdW1CdWZzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCAlZCwgbWF4IGFsbG93ZWQgaXMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICBoaWRsX21zZy5idWZmZXJJbmRleCwgbWVtLT5tTnVtQnVmcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikKKyAgICAgICAgICAgICAgICAgICAgbWVtLT5tQnVmZmVyc1toaWRsX21zZy5idWZmZXJJbmRleF0tPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIG1kLT5wSGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihoaWRsX21zZy5mcmFtZURhdGEuZ2V0TmF0aXZlSGFuZGxlKCkpOworCisgICAgICAgICAgICBtc2dzLnB1c2hfYmFjayh7aGlkbF9tc2cudGltZXN0YW1wLCBtZW0tPm1CdWZmZXJzW2hpZGxfbXNnLmJ1ZmZlckluZGV4XX0pOwogICAgICAgICB9Ci0gICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbSgKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1IaWRsTWVtUG9vbE1hcC5hdChoaWRsX21zZy5kYXRhKS0+aGFuZGxlKSk7Ci0KLSAgICAgICAgaWYgKGhpZGxfbXNnLmJ1ZmZlckluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICBoaWRsX21zZy5idWZmZXJJbmRleCwgbWVtLT5tTnVtQnVmcyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikKLSAgICAgICAgICAgICAgICBtZW0tPm1CdWZmZXJzW2hpZGxfbXNnLmJ1ZmZlckluZGV4XS0+cG9pbnRlcigpOwotICAgICAgICBtZC0+cEhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oaGlkbF9tc2cuZnJhbWVEYXRhLmdldE5hdGl2ZUhhbmRsZSgpKTsKLQotICAgICAgICBtc2dzLnB1c2hfYmFjayh7aGlkbF9tc2cudGltZXN0YW1wLCBtZW0tPm1CdWZmZXJzW2hpZGxfbXNnLmJ1ZmZlckluZGV4XX0pOwogICAgIH0KLQogICAgIG1EYXRhQ2JUaW1lc3RhbXBCYXRjaCgoaW50MzJfdCkgbXNnVHlwZSwgbXNncywgbUNiVXNlcik7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CkBAIC0zNzIsNyArMzgyLDcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIHM7CiAgICAgfQotICAgIG1QcmV2aWV3VXNhZ2UgPSAoaW50KSB1c2FnZTsKKyAgICBtUHJldmlld1VzYWdlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+ICh1c2FnZSk7CiAgICAgaW50IHJjID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgbVByZXZpZXdVc2FnZSk7CiAgICAgaWYgKHJjID09IE9LKSB7CiAgICAgICAgIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKQEAgLTQ0NCwyMyArNDU0LDYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnNldFByZXZpZXdXaW5kb3coYnVmLmdldCgpID8gdGhpcyA6IG51bGxwdHIpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UpIHsKLSAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c2V0X3ByZXZpZXdfd2luZG93KSB7Ci0gICAgICAgICAgICBtUHJldmlld1dpbmRvdyA9IGJ1ZjsKLSAgICAgICAgICAgIGlmIChidWYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGlmIChtUHJldmlld1NjYWxpbmdNb2RlICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlld1NjYWxpbmdNb2RlKG1QcmV2aWV3U2NhbGluZ01vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVByZXZpZXdUcmFuc2Zvcm0gIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgICAgICAgICBzZXRQcmV2aWV3VHJhbnNmb3JtKG1QcmV2aWV3VHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSGFsUHJldmlld1dpbmRvdy51c2VyID0gdGhpczsKLSAgICAgICAgICAgIEFMT0dWKCIlcyAmbUhhbFByZXZpZXdXaW5kb3cgJXAgbUhhbFByZXZpZXdXaW5kb3cudXNlciAlcCIsX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAmbUhhbFByZXZpZXdXaW5kb3csIG1IYWxQcmV2aWV3V2luZG93LnVzZXIpOwotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2V0X3ByZXZpZXdfd2luZG93KG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5nZXQoKSA/ICZtSGFsUHJldmlld1dpbmRvdy5udyA6IDApOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTQ3OCwxNSArNDcxLDYgQEAKICAgICBtQ2JVc2VyID0gdXNlcjsKIAogICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLQotICAgIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c2V0X2NhbGxiYWNrcykgewotICAgICAgICBtRGV2aWNlLT5vcHMtPnNldF9jYWxsYmFja3MobURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzTm90aWZ5Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RhdGFDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGF0YUNiVGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHZXRNZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgfQogfQogCiB2b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjplbmFibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkKQEAgLTQ5NCw4ICs0NzgsNiBAQAogICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIG1IaWRsRGV2aWNlLT5lbmFibGVNc2dUeXBlKG1zZ1R5cGUpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmVuYWJsZV9tc2dfdHlwZSkgewotICAgICAgICBtRGV2aWNlLT5vcHMtPmVuYWJsZV9tc2dfdHlwZShtRGV2aWNlLCBtc2dUeXBlKTsKICAgICB9CiB9CiAKQEAgLTUwNCw4ICs0ODYsNiBAQAogICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIG1IaWRsRGV2aWNlLT5kaXNhYmxlTXNnVHlwZShtc2dUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5kaXNhYmxlX21zZ190eXBlKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+ZGlzYWJsZV9tc2dfdHlwZShtRGV2aWNlLCBtc2dUeXBlKTsKICAgICB9CiB9CiAKQEAgLTUxNCw4ICs0OTQsNiBAQAogICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBtSGlkbERldmljZS0+bXNnVHlwZUVuYWJsZWQobXNnVHlwZSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+bXNnX3R5cGVfZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5tc2dfdHlwZV9lbmFibGVkKG1EZXZpY2UsIG1zZ1R5cGUpOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CkBAIC01MjYsOCArNTA0LDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c3RhcnRQcmV2aWV3KCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnN0YXJ0X3ByZXZpZXcpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RhcnRfcHJldmlldyhtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNTM3LDggKzUxMyw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPnN0b3BQcmV2aWV3KCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RvcF9wcmV2aWV3KSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+c3RvcF9wcmV2aWV3KG1EZXZpY2UpOwogICAgIH0KIH0KIApAQCAtNTQ3LDggKzUyMSw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIG1IaWRsRGV2aWNlLT5wcmV2aWV3RW5hYmxlZCgpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnByZXZpZXdfZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5wcmV2aWV3X2VuYWJsZWQobURldmljZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTU1OSw4ICs1MzEsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGVuYWJsZSkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKG1EZXZpY2UsIGVuYWJsZSk7CiAgICAgfQogICAgIHJldHVybiBlbmFibGUgPyBJTlZBTElEX09QRVJBVElPTjogT0s7CiB9CkBAIC01NzEsOCArNTQxLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c3RhcnRSZWNvcmRpbmcoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RhcnRfcmVjb3JkaW5nKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnN0YXJ0X3JlY29yZGluZyhtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNTg1LDggKzU1Myw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPnN0b3BSZWNvcmRpbmcoKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zdG9wX3JlY29yZGluZykgewotICAgICAgICBtRGV2aWNlLT5vcHMtPnN0b3BfcmVjb3JkaW5nKG1EZXZpY2UpOwogICAgIH0KIH0KIApAQCAtNTk4LDggKzU2NCw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIG1IaWRsRGV2aWNlLT5yZWNvcmRpbmdFbmFibGVkKCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cmVjb3JkaW5nX2VuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+cmVjb3JkaW5nX2VuYWJsZWQobURldmljZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTYyNCw5ICs1ODgsNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShoZWFwSWQsIGJ1ZmZlckluZGV4KTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKSB7Ci0gICAgICAgIHZvaWQgKmRhdGEgPSAoKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkpICsgb2Zmc2V0OwotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5yZWxlYXNlX3JlY29yZGluZ19mcmFtZShtRGV2aWNlLCBkYXRhKTsKICAgICB9CiB9CiAKQEAgLTY1Myw5ICs2MTQsNiBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBvbmx5IHN1cHBvcnRzIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vbiBISURMIG1vZGUgZG8gbm90IHN1cHBvcnQgJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NzQsOCArNjMyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+YXV0b0ZvY3VzKCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmF1dG9fZm9jdXMpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+YXV0b19mb2N1cyhtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNjg2LDggKzY0Miw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmNhbmNlbEF1dG9Gb2N1cygpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5jYW5jZWxfYXV0b19mb2N1cykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5jYW5jZWxfYXV0b19mb2N1cyhtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNjk4LDggKzY1Miw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnRha2VQaWN0dXJlKCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnRha2VfcGljdHVyZSkgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT50YWtlX3BpY3R1cmUobURldmljZSk7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTcxMCw4ICs2NjIsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5jYW5jZWxQaWN0dXJlKCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9waWN0dXJlKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9waWN0dXJlKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC03MjIsOCArNjcyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpLnN0cmluZygpKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c2V0X3BhcmFtZXRlcnMpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2V0X3BhcmFtZXRlcnMobURldmljZSwgcGFyYW1zLmZsYXR0ZW4oKS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTc0MCwxNCArNjg4LDYgQEAKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgU3RyaW5nOCB0bXAob3V0UGFyYW0uY19zdHIoKSk7CiAgICAgICAgIHBhcm1zLnVuZmxhdHRlbih0bXApOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmdldF9wYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGNoYXIgKnRlbXAgPSBtRGV2aWNlLT5vcHMtPmdldF9wYXJhbWV0ZXJzKG1EZXZpY2UpOwotICAgICAgICBTdHJpbmc4IHN0cl9wYXJtcyh0ZW1wKTsKLSAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+cHV0X3BhcmFtZXRlcnMpCi0gICAgICAgICAgICBtRGV2aWNlLT5vcHMtPnB1dF9wYXJhbWV0ZXJzKG1EZXZpY2UsIHRlbXApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcmVlKHRlbXApOwotICAgICAgICBwYXJtcy51bmZsYXR0ZW4oc3RyX3Bhcm1zKTsKICAgICB9CiAgICAgcmV0dXJuIHBhcm1zOwogfQpAQCAtNzU4LDggKzY5OCw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnNlbmRDb21tYW5kKChDb21tYW5kVHlwZSkgY21kLCBhcmcxLCBhcmcyKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c2VuZF9jb21tYW5kKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnNlbmRfY29tbWFuZChtRGV2aWNlLCBjbWQsIGFyZzEsIGFyZzIpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC03NzMsOCArNzExLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIG1IaWRsRGV2aWNlLT5jbG9zZSgpOwogICAgICAgICBtSGlkbERldmljZS5jbGVhcigpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnJlbGVhc2UpIHsKLSAgICAgICAgbURldmljZS0+b3BzLT5yZWxlYXNlKG1EZXZpY2UpOwogICAgIH0KIH0KIApAQCAtNzkwLDE1ICs3MjYsMTAgQEAKICAgICAgICAgU3RhdHVzIHMgPSBtSGlkbERldmljZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5kdW1wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmR1bXAobURldmljZSwgZmQpOwogICAgIH0KICAgICByZXR1cm4gT0s7IC8vIEl0J3MgZmluZSBpZiB0aGUgSEFMIGRvZXNuJ3QgaW1wbGVtZW50IGR1bXAoKQogfQogCi0vKioKLSAqIE1ldGhvZHMgZm9yIGxlZ2FjeSAobm9uLUhJREwpIHBhdGggZm9sbG93cwotICovCiB2b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzTm90aWZ5Q2IoaW50MzJfdCBtc2dfdHlwZSwgaW50MzJfdCBleHQxLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyLCB2b2lkICp1c2VyKQogewpAQCAtODY4LDE3NyArNzk5LDQgQEAKICAgICBtZW0tPmRlY1N0cm9uZyhtZW0pOwogfQogCi1BTmF0aXZlV2luZG93KiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1RvQW53KHZvaWQgKnVzZXIpCi17Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKm9iamVjdCA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOwotICAgIHJldHVybiBvYmplY3QtPm1QcmV2aWV3V2luZG93LmdldCgpOwotfQotI2RlZmluZSBhbncobikgc1RvQW53KCgoc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyAqKShuKSktPnVzZXIpCi0jZGVmaW5lIGh3aShuKSByZWludGVycHJldF9jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KFwKLSAgICAoKHN0cnVjdCBjYW1lcmFfcHJldmlld193aW5kb3cgKikobikpLT51c2VyKQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNEZXF1ZXVlQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyLCBpbnQgKnN0cmlkZSkKLXsKLSAgICBpbnQgcmM7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgcmMgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KGEsICZhbmIpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqYnVmZmVyID0gJmFuYi0+aGFuZGxlOwotICAgICAgICAqc3RyaWRlID0gYW5iLT5zdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotI2lmbmRlZiBjb250YWluZXJfb2YKLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgX190eXBlb2ZfXygoKHR5cGUgKikgMCktPm1lbWJlcikgKl9fbXB0ciA9IChwdHIpOyAgICAgXAotICAgICh0eXBlICopICgoY2hhciAqKSBfX21wdHIgLSAoY2hhciAqKSgmKCh0eXBlICopMCktPm1lbWJlcikpOyB9KQotI2VuZGlmCi0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0xvY2tCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogLypidWZmZXIqLykKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgICh2b2lkKWE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0VucXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgcmV0dXJuIGEtPnF1ZXVlQnVmZmVyKGEsCi0gICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSksIC0xKTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzQ2FuY2VsQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIHJldHVybiBhLT5jYW5jZWxCdWZmZXIoYSwKLSAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwgLTEpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRCdWZmZXJDb3VudChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgY291bnQpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLQotICAgIGlmIChhICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgYi8yNzAzOTc3NQotICAgICAgICAvLyBQcmV2aW91c2x5LCBzZXR0aW5nIHRoZSBidWZmZXIgY291bnQgd291bGQgcmVzZXQgdGhlIGJ1ZmZlcgotICAgICAgICAvLyBxdWV1ZSdzIGZsYWcgdGhhdCBhbGxvd3MgZm9yIGFsbCBidWZmZXJzIHRvIGJlIGRlcXVldWVkIG9uIHRoZQotICAgICAgICAvLyBwcm9kdWNlciBzaWRlLCBpbnN0ZWFkIG9mIGp1c3QgdGhlIHByb2R1Y2VyJ3MgZGVjbGFyZWQgbWF4IGNvdW50LAotICAgICAgICAvLyBpZiBubyBmaWxsZWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuICBUaGlzCi0gICAgICAgIC8vIHJlc2V0IG5vIGxvbmdlciBoYXBwZW5zLCBidXQgc29tZSBIQUxzIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW9yLAotICAgICAgICAvLyBzbyBpdCBuZWVkcyB0byBiZSBtYWludGFpbmVkIGZvciBIQUwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIFNpbXVsYXRlIHRoZSBwcmlvciBiZWhhdmlvciBieSBkaXNjb25uZWN0aW5nL3JlY29ubmVjdGluZyB0byB0aGUKLSAgICAgICAgLy8gd2luZG93IGFuZCBzZXR0aW5nIHRoZSB2YWx1ZXMgYWdhaW4uICBUaGlzIGhhcyB0aGUgZHJhd2JhY2sgb2YKLSAgICAgICAgLy8gYWN0dWFsbHkgY2F1c2luZyBtZW1vcnkgcmVhbGxvY2F0aW9uLCB3aGljaCBtYXkgbm90IGhhdmUgaGFwcGVuZWQKLSAgICAgICAgLy8gaW4gdGhlIHBhc3QuCi0gICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpodyA9IGh3aSh3KTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChhLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KGEsIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdTY2FsaW5nTW9kZSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUoYSwgaHctPm1QcmV2aWV3U2NhbGluZ01vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdUcmFuc2Zvcm0gIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oYSwgaHctPm1QcmV2aWV3VHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHctPm1QcmV2aWV3V2lkdGggIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGEsCi0gICAgICAgICAgICAgICAgICAgIGh3LT5tUHJldmlld1dpZHRoLCBody0+bVByZXZpZXdIZWlnaHQpOwotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoYSwgaHctPm1QcmV2aWV3Rm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHctPm1QcmV2aWV3VXNhZ2UgIT0gMCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgaHctPm1QcmV2aWV3VXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdTd2FwSW50ZXJ2YWwgIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgYS0+c2V0U3dhcEludGVydmFsKGEsIGh3LT5tUHJldmlld1N3YXBJbnRlcnZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh3LT5tUHJldmlld0Nyb3AubGVmdCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICYoaHctPm1QcmV2aWV3Q3JvcCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhLCBjb3VudCk7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldEJ1ZmZlcnNHZW9tZXRyeShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KQotewotICAgIGludCByYzsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpodyA9IGh3aSh3KTsKLSAgICBody0+bVByZXZpZXdXaWR0aCA9IHdpZHRoOwotICAgIGh3LT5tUHJldmlld0hlaWdodCA9IGhlaWdodDsKLSAgICBody0+bVByZXZpZXdGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoYSwgZm9ybWF0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRDcm9wKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCi0gICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld0Nyb3AubGVmdCA9IGxlZnQ7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC50b3AgPSB0b3A7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC5yaWdodCA9IHJpZ2h0OwotICAgIGh3LT5tUHJldmlld0Nyb3AuYm90dG9tID0gYm90dG9tOwotICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICYoaHctPm1QcmV2aWV3Q3JvcCkpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRUaW1lc3RhbXAoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoYSwgdGltZXN0YW1wKTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzU2V0VXNhZ2Uoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywgaW50IHVzYWdlKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld1VzYWdlID0gdXNhZ2U7Ci0gICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGEsIHVzYWdlKTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzU2V0U3dhcEludGVydmFsKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsIGludCBpbnRlcnZhbCkKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpodyA9IGh3aSh3KTsKLSAgICBody0+bVByZXZpZXdTd2FwSW50ZXJ2YWwgPSBpbnRlcnZhbDsKLSAgICByZXR1cm4gYS0+c2V0U3dhcEludGVydmFsKGEsIGludGVydmFsKTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzR2V0TWluVW5kZXF1ZXVlZEJ1ZmZlckNvdW50KAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgIGludCAqY291bnQpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICByZXR1cm4gYS0+cXVlcnkoYSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCBjb3VudCk7Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmluaXRIYWxQcmV2aWV3V2luZG93KCkKLXsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5jYW5jZWxfYnVmZmVyID0gc0NhbmNlbEJ1ZmZlcjsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5sb2NrX2J1ZmZlciA9IHNMb2NrQnVmZmVyOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmRlcXVldWVfYnVmZmVyID0gc0RlcXVldWVCdWZmZXI7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuZW5xdWV1ZV9idWZmZXIgPSBzRW5xdWV1ZUJ1ZmZlcjsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfYnVmZmVyX2NvdW50ID0gc1NldEJ1ZmZlckNvdW50OwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9idWZmZXJzX2dlb21ldHJ5ID0gc1NldEJ1ZmZlcnNHZW9tZXRyeTsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfY3JvcCA9IHNTZXRDcm9wOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF90aW1lc3RhbXAgPSBzU2V0VGltZXN0YW1wOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF91c2FnZSA9IHNTZXRVc2FnZTsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfc3dhcF9pbnRlcnZhbCA9IHNTZXRTd2FwSW50ZXJ2YWw7Ci0KLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5nZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50ID0KLSAgICAgICAgICAgIHNHZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQ7Ci19Ci0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggMWMzOGQwMC4uZTUxOWIwNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtOTAsNyArOTAsNiBAQAogCiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSk6Ci0gICAgICAgICAgICBtRGV2aWNlKG51bGxwdHIpLAogICAgICAgICAgICAgbUhpZGxEZXZpY2UobnVsbHB0ciksCiAgICAgICAgICAgICBtTmFtZShuYW1lKSwKICAgICAgICAgICAgIG1QcmV2aWV3U2NhbGluZ01vZGUoTk9UX1NFVCksCkBAIC0yOTksNyArMjk4LDYgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGNhbWVyYV9kZXZpY2VfdCAqbURldmljZTsKICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IG1IaWRsRGV2aWNlOwogICAgIFN0cmluZzggbU5hbWU7CiAKQEAgLTM2OSw0MSArMzY3LDYgQEAKIAogICAgIHN0YXRpYyB2b2lkIHNQdXRNZW1vcnkoY2FtZXJhX21lbW9yeV90ICpkYXRhKTsKIAotICAgIHN0YXRpYyBBTmF0aXZlV2luZG93ICpzVG9Bbncodm9pZCAqdXNlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNEZXF1ZXVlQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwgaW50ICpzdHJpZGUpOwotCi0gICAgc3RhdGljIGludCBzTG9ja0J1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogLypidWZmZXIqLyk7Ci0KLSAgICBzdGF0aWMgaW50IHNFbnF1ZXVlQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpOwotCi0gICAgc3RhdGljIGludCBzQ2FuY2VsQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpOwotCi0gICAgc3RhdGljIGludCBzU2V0QnVmZmVyQ291bnQoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywgaW50IGNvdW50KTsKLQotICAgIHN0YXRpYyBpbnQgc1NldEJ1ZmZlcnNHZW9tZXRyeShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCk7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRDcm9wKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRUaW1lc3RhbXAoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCk7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRVc2FnZShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgdXNhZ2UpOwotCi0gICAgc3RhdGljIGludCBzU2V0U3dhcEludGVydmFsKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsIGludCBpbnRlcnZhbCk7Ci0KLSAgICBzdGF0aWMgaW50IHNHZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvdW50KTsKLQotICAgIHZvaWQgaW5pdEhhbFByZXZpZXdXaW5kb3coKTsKLQogICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iKTsKICAgICB2b2lkIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKIApAQCAtNDU5LDEzICs0MjIsNiBAQAogCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgIG1QcmV2aWV3V2luZG93OwogCi0gICAgc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyB7Ci0gICAgICAgIHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgbnc7Ci0gICAgICAgIHZvaWQgKnVzZXI7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBjYW1lcmFfcHJldmlld193aW5kb3cgbUhhbFByZXZpZXdXaW5kb3c7Ci0KICAgICBub3RpZnlfY2FsbGJhY2sgICAgICAgICAgICAgICBtTm90aWZ5Q2I7CiAgICAgZGF0YV9jYWxsYmFjayAgICAgICAgICAgICAgICAgbURhdGFDYjsKICAgICBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCAgICAgICBtRGF0YUNiVGltZXN0YW1wOwpAQCAtNDc5LDcgKzQzNSw3IEBACiAgICAgaW50IG1QcmV2aWV3V2lkdGg7CiAgICAgaW50IG1QcmV2aWV3SGVpZ2h0OwogICAgIGludCBtUHJldmlld0Zvcm1hdDsKLSAgICBpbnQgbVByZXZpZXdVc2FnZTsKKyAgICB1aW50NjRfdCBtUHJldmlld1VzYWdlOwogICAgIGludCBtUHJldmlld1N3YXBJbnRlcnZhbDsKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbVByZXZpZXdDcm9wOwogCkBAIC01MjMsNiArNDc5LDcgQEAKICAgICB1aW50NjRfdCBtTmV4dEJ1ZmZlcklkID0gMTsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7CiAKKyAgICBzdGQ6Om11dGV4IG1IaWRsTWVtUG9vbE1hcExvY2s7IC8vIHByb3RlY3RpbmcgbUhpZGxNZW1Qb29sTWFwCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgY2FtZXJhX21lbW9yeV90Kj4gbUhpZGxNZW1Qb29sTWFwOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggNjliMWQ3ZC4uY2VkMWQzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC0xNTQsNiArMTU0LDE1IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KKyAgICBJRl9BTE9HVigpIHsKKyAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oW10oCisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4gaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiU2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgJXMiLCBpZmFjZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICB9CiAKICAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSk7CiAgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOwpAQCAtNDA3LDcgKzQxNiw3IEBACiB9CiAKIEJ1ZmZlclVzYWdlRmxhZ3MgQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKAotICAgICAgICB1aW50MzJfdCB1c2FnZSkgeworICAgICAgICB1aW50NjRfdCB1c2FnZSkgewogICAgIHJldHVybiB1c2FnZTsKIH0KIApAQCAtNDYwLDEyICs0NjksMTcgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBpeGVsRm9ybWF0KTsKIH0KIAotdWludDMyX3QgQ2FtZXJhM0RldmljZTo6bWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorYW5kcm9pZF9kYXRhc3BhY2UgQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgIERhdGFzcGFjZUZsYWdzIGRhdGFTcGFjZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oZGF0YVNwYWNlKTsKK30KKwordWludDY0X3QgQ2FtZXJhM0RldmljZTo6bWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAogICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7CiAgICAgcmV0dXJuIHVzYWdlOwogfQogCi11aW50MzJfdCBDYW1lcmEzRGV2aWNlOjptYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCit1aW50NjRfdCBDYW1lcmEzRGV2aWNlOjptYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCiAgICAgICAgIEJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpIHsKICAgICByZXR1cm4gdXNhZ2U7CiB9CkBAIC0xMjA4LDcgKzEyMjIsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKLSAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDMyX3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CkBAIC0xMjI2LDEzICsxMjQwLDEzIEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCiAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAotICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpIHsKKyAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBBTE9HVigiQ2FtZXJhICVzOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQsIGRhdGFzcGFjZSAlZCByb3RhdGlvbiAlZCIKLSAgICAgICAgICAgICIgY29uc3VtZXIgdXNhZ2UgMHgleCwgaXNTaGFyZWQgJWQiLCBtSWQuc3RyaW5nKCksIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgICIgY29uc3VtZXIgdXNhZ2UgJSIgUFJJdTY0ICIsIGlzU2hhcmVkICVkIiwgbUlkLnN0cmluZygpLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCiAgICAgICAgICAgICBkYXRhU3BhY2UsIHJvdGF0aW9uLCBjb25zdW1lclVzYWdlLCBpc1NoYXJlZCk7CiAKICAgICBzdGF0dXNfdCByZXM7CkBAIC0xMzQ1LDEwICsxMzU5LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAotICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRTdHJlYW1JbmZvKGludCBpZCwgU3RyZWFtSW5mbyAqc3RyZWFtSW5mbykgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG51bGxwdHIgPT0gc3RyZWFtSW5mbykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtMTM3NSwxMCArMTM5MCwxNCBAQAogICAgICAgICByZXR1cm4gaWR4OwogICAgIH0KIAotICAgIGlmICh3aWR0aCkgKndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7Ci0gICAgaWYgKGhlaWdodCkgKmhlaWdodCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEhlaWdodCgpOwotICAgIGlmIChmb3JtYXQpICpmb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRGb3JtYXQoKTsKLSAgICBpZiAoZGF0YVNwYWNlKSAqZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+d2lkdGggID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0V2lkdGgoKTsKKyAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRIZWlnaHQoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNGb3JtYXRPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZU92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNDc4LDYgKzE0OTcsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAogICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC0xNjkxLDYgKzE3MTEsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIApAQCAtMTg4NCw2ICsxOTA1LDcgQEAKICAqLwogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeVN0YXR1cyhib29sIGlkbGUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHsKICAgICAgICAgLy8gTmVlZCBtTG9jayB0byBzYWZlbHkgdXBkYXRlIHN0YXRlIGFuZCBzeW5jaHJvbml6ZSB0byBjdXJyZW50CiAgICAgICAgIC8vIHN0YXRlIG9mIG1ldGhvZHMgaW4gZmxpZ2h0LgpAQCAtMjMxNyw2ICsyMzM5LDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgdmFfbGlzdCBhcmdzOwogICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CkBAIC0yMzI3LDYgKzIzNTAsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnNldEVycm9yU3RhdGVWKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc2V0RXJyb3JTdGF0ZUxvY2tlZFYoZm10LCBhcmdzKTsKIH0KQEAgLTI0MTEsNiArMjQzNSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6cmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChpbnQgaWR4KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBuc2Vjc190IGR1cmF0aW9uID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KS5tYXhFeHBlY3RlZER1cmF0aW9uOwogICAgIG1JbkZsaWdodE1hcC5yZW1vdmVJdGVtc0F0KGlkeCwgMSk7CiAKQEAgLTI0MzMsMjUgKzI0NTgsNiBAQAogICAgIG5zZWNzX3Qgc2Vuc29yVGltZXN0YW1wID0gcmVxdWVzdC5zZW5zb3JUaW1lc3RhbXA7CiAgICAgbnNlY3NfdCBzaHV0dGVyVGltZXN0YW1wID0gcmVxdWVzdC5zaHV0dGVyVGltZXN0YW1wOwogCi0gICAgYm9vbCBza2lwUmVzdWx0TWV0YWRhdGEgPSBmYWxzZTsKLSAgICBpZiAocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHN3aXRjaCAocmVxdWVzdC5yZXF1ZXN0U3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX0RFVklDRToKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1JfUkVRVUVTVDoKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUOgotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUjoKLSAgICAgICAgICAgICAgICAvL1Jlc3VsdCBtZXRhZGF0YSBzaG91bGQgcmV0dXJuIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgU0VUX0VSUigiVW5rbm93biBlcnJvciBtZXNzYWdlOiAlZCIsIHJlcXVlc3QucmVxdWVzdFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBDaGVjayBpZiBpdCdzIG9rYXkgdG8gcmVtb3ZlIHRoZSByZXF1ZXN0IGZyb20gSW5GbGlnaHRNYXA6CiAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIHJlcXVlc3Q6CiAgICAgLy8gICAgICBhbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzLCBhbGwgcmVzdWx0IG1ldGFkYXRhLCBzaHV0dGVyIGNhbGxiYWNrCkBAIC0yNDU5LDcgKzI0NjUsNyBAQAogICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgdW5zdWNjZXNzZnVsIHJlcXVlc3Q6CiAgICAgLy8gICAgICBhbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFycml2ZWQuCiAgICAgaWYgKHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCAmJgotICAgICAgICAgICAgKHNraXBSZXN1bHRNZXRhZGF0YSB8fAorICAgICAgICAgICAgKHJlcXVlc3Quc2tpcFJlc3VsdE1ldGFkYXRhIHx8CiAgICAgICAgICAgICAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgc2h1dHRlclRpbWVzdGFtcCAhPSAwKSkpIHsKICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgiZnJhbWUgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKIApAQCAtMjQ5NSw2ICsyNTAxLDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpmbHVzaEluZmxpZ2h0UmVxdWVzdHMoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICB7IC8vIEZpcnN0IHJldHVybiBidWZmZXJzIGNhY2hlZCBpbiBtSW5GbGlnaHRNYXAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGlkeCsrKSB7CkBAIC0yNjIxLDYgKzI2MjgsNyBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnNlbmRQYXJ0aWFsQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqIHBhcnRpYWxSZXN1bHQsCiAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIAogICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKQEAgLTI2MzYsNiArMjY0NCw3IEBACiAgICAgICAgIENhbWVyYU1ldGFkYXRhICZjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LAogICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgYm9vbCByZXByb2Nlc3MpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChwZW5kaW5nTWV0YWRhdGEuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKQEAgLTI4ODQsNyArMjg5Myw3IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5RXJyb3IoY29uc3QgY2FtZXJhM19lcnJvcl9tc2dfdCAmbXNnLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKLQorICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gTWFwIGNhbWVyYSBIQUwgZXJyb3IgY29kZXMgdG8gSUNhbWVyYURldmljZUNhbGxiYWNrIGVycm9yIGNvZGVzCiAgICAgLy8gSW5kZXggaW50byB0aGlzIHdpdGggdGhlIEhBTCBlcnJvciBjb2RlCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgaGFsRXJyb3JNYXBbQ0FNRVJBM19NU0dfTlVNX0VSUk9SU10gPSB7CkBAIC0yOTMyLDYgKzI5NDEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CiAgICAgICAgICAgICAgICAgICAgIHIucmVxdWVzdFN0YXR1cyA9IG1zZy5lcnJvcl9jb2RlOwogICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09IGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuc2tpcFJlc3VsdE1ldGFkYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQgPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgbWlzc2luZyByZXN1bHQgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVycwpAQCAtMjk2Miw2ICsyOTc2LDcgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpub3RpZnlTaHV0dGVyKGNvbnN0IGNhbWVyYTNfc2h1dHRlcl9tc2dfdCAmbXNnLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHNzaXplX3QgaWR4OwogCiAgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZwpAQCAtMzA0OCwyNCArMzA2MywyMCBAQAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6Ci0gICAgICAgIG1IYWwzRGV2aWNlKG51bGxwdHIpLAogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCiAgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkge30KIAotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6Ci0gICAgICAgIG1IYWwzRGV2aWNlKG51bGxwdHIpIHt9CitDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIHt9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKLSAgICAgICAgbUhhbDNEZXZpY2Uob3RoZXIubUhhbDNEZXZpY2UpLAogICAgICAgICBtSGlkbFNlc3Npb24ob3RoZXIubUhpZGxTZXNzaW9uKSwKICAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSkge30KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewotICAgIHJldHVybiAobUhhbDNEZXZpY2UgIT0gbnVsbHB0cikgfHwgKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKKyAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgewotICAgIG1IYWwzRGV2aWNlID0gbnVsbHB0cjsKICAgICBtSGlkbFNlc3Npb24uY2xlYXIoKTsKIH0KIApAQCAtMzA4MCw3MiArMzA5MSw2MCBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyOwotICAgICAgICByID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncygKLSAgICAgICAgICAgICAgICBtSGFsM0RldmljZSwgdGVtcGxhdGVJZCk7Ci0gICAgICAgIGlmIChyID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICpyZXF1ZXN0VGVtcGxhdGUgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEocik7Ci0gICAgICAgIGlmIChyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2xvbmUgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKLSAgICAgICAgUmVxdWVzdFRlbXBsYXRlIGlkOwotICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpQUkVWSUVXOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkU6Ci0gICAgICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfVklERU9fUkVDT1JEOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfVklERU9fU05BUFNIT1Q6Ci0gICAgICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1NOQVBTSE9UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6Ci0gICAgICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfTUFOVUFMOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIFVua25vd24gdGVtcGxhdGUgSUQKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGlkLAotICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQotICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC5kYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisgICAgUmVxdWVzdFRlbXBsYXRlIGlkOworICAgIHN3aXRjaCAodGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpQUkVWSUVXOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1NOQVBTSE9UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFVua25vd24gdGVtcGxhdGUgSUQKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGlkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZyZXF1ZXN0VGVtcGxhdGVdCisgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTMxNTQsMTQ1ICszMTUzLDE5MSBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uZmlndXJlX3N0cmVhbXMobUhhbDNEZXZpY2UsIGNvbmZpZyk7CisgICAgLy8gQ29udmVydCBzdHJlYW0gY29uZmlnIHRvIEhJREwKKyAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7CisgICAgU3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgU3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOworICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworCisgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKKyAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChtQnVmZmVySWRNYXBzLmNvdW50KHN0cmVhbUlkKSA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVySWRNYXBzLmVtcGxhY2Uoc3RyZWFtSWQsIEJ1ZmZlcklkTWFwe30pOworICAgICAgICB9CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yKGF1dG8gaXQgPSBtQnVmZmVySWRNYXBzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJJZE1hcHMuZW5kKCk7KSB7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgYm9vbCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmNvdW50KHN0cmVhbUlkKSA+IDA7CisgICAgICAgIGlmICghYWN0aXZlKSB7CisgICAgICAgICAgICBpdCA9IG1CdWZmZXJJZE1hcHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICAoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcworCisgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My4zIEhBTAorICAgIHNwPGRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfMzsKKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBoaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCi0gICAgICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKLSAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uOwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgU3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07Ci0KLSAgICAgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7Ci0gICAgICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKLSAgICAgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fT1VUUFVUOgotICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX0lOUFVUOgotICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6SU5QVVQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgIGRzdC53aWR0aCA9IHNyYy0+d2lkdGg7Ci0gICAgICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgICAgICBkc3QuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkc3QudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2Uoc3JjLT51c2FnZSk7Ci0gICAgICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgICAgICBkc3Qucm90YXRpb24gPSBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKLQotICAgICAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOwotICAgICAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlcklkTWFwcy5jb3VudChzdHJlYW1JZCkgPT0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXJJZE1hcHMuZW1wbGFjZShzdHJlYW1JZCwgQnVmZmVySWRNYXB7fSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBjYXN0aW5nIElDYW1lcmFEZXZpY2VTZXNzaW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYXN0UmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChoaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuMyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhdXRvIGVyciA9IGhpZGxTZXNzaW9uXzNfMy0+Y29uZmlndXJlU3RyZWFtc18zXzMocmVxdWVzdGVkQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcwotICAgICAgICBmb3IoYXV0byBpdCA9IG1CdWZmZXJJZE1hcHMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcklkTWFwcy5lbmQoKTspIHsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGl0LT5maXJzdDsKLSAgICAgICAgICAgIGJvb2wgYWN0aXZlID0gYWN0aXZlU3RyZWFtcy5jb3VudChzdHJlYW1JZCkgPiAwOwotICAgICAgICAgICAgaWYgKCFhY3RpdmUpIHsKLSAgICAgICAgICAgICAgICBpdCA9IG1CdWZmZXJJZE1hcHMuZXJhc2UoaXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKLSAgICAgICAgICAgICAgICAoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCi0gICAgICAgICAgICAgICAgLypvdXQqLyAmcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCi0KLSAgICAgICAgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247Ci0gICAgICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCisgICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7CiAgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25dCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQogICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgfQorICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS52M18yID0gZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zW2ldOworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0ub3ZlcnJpZGVEYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0uZGF0YVNwYWNlOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmIChzdGF0dXMgIT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LICkgewotICAgICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgKSB7CisgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIEFuZCBjb252ZXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiBmcm9tIEhJREwKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpLT5nZXRJZCgpOworCisgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcworICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOyBpZHgrKykgeworICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdLnYzXzIuaWQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpKSA/IDAgOiByZWFsSWR4ICsgMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogZHN0U3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpOworICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKKyAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CisgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy52M18yLm92ZXJyaWRlRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2Ugb3ZlcnJpZGVEYXRhU3BhY2UgPSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZShzcmMub3ZlcnJpZGVEYXRhU3BhY2UpOworCisgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGb3JtYXQgb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkc3QtPmRhdGFfc3BhY2UgIT0gb3ZlcnJpZGVEYXRhU3BhY2UpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRGF0YVNwYWNlIG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgPyB0cnVlIDogZmFsc2UpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZSgoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFsbG93ZWQgd2l0aCBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgZHN0LT5kYXRhX3NwYWNlID0gb3ZlcnJpZGVEYXRhU3BhY2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCi0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgc2NhbiBhdCBpLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmVhbSBvcmRlciBtYXRjaGVzCi0gICAgICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7Ci0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCk7IGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdLmlkID09IHN0cmVhbUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlYWxJZHggPSAocmVhbElkeCA+PSBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCkpID8gMCA6IHJlYWxJZHggKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIG5vdCBmb3VuZCBpbiBzdHJlYW0gY29uZmlndXJhdGlvbiByZXNwb25zZSBmcm9tIEhBTCIsCisgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgICAgICBpZiAoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF07Ci0KLSAgICAgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy5vdmVycmlkZUZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGb3JtYXQgb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBhbGxvd2VkIHdpdGggSU1QTEVNRU5UQVRJT05fREVGSU5FRAotICAgICAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnYzXzIuY29uc3VtZXJVc2FnZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT1VUUFVUCisgICAgICAgICAgICBpZiAoc3JjLnYzXzIuY29uc3VtZXJVc2FnZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE9VVFBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBjb25zdW1lciB1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYy5wcm9kdWNlclVzYWdlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkc3QtPnVzYWdlID0gbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy5jb25zdW1lclVzYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT1VUUFVUCi0gICAgICAgICAgICAgICAgaWYgKHNyYy5jb25zdW1lclVzYWdlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE9VVFBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBjb25zdW1lciB1c2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHN0LT51c2FnZSA9IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZShzcmMucHJvZHVjZXJVc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLm1heEJ1ZmZlcnM7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSkpOwogICAgICAgICB9CisgICAgICAgIGRzdC0+bWF4X2J1ZmZlcnMgPSBzcmMudjNfMi5tYXhCdWZmZXJzOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKLQorICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCkgYW5kIGhhbmRsZXNDcmVhdGVkICglcCkgbXVzdCBub3QgYmUgbnVsbCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQpOwpAQCAtMzQ0MSwxNCArMzQ4NiwxMSBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+cHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QobUhhbDNEZXZpY2UsIHJlcXVlc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IG51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOwotICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoMSk7Ci0gICAgICAgIHJlcXVlc3RzWzBdID0gcmVxdWVzdDsKLSAgICAgICAgcmVzID0gcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKHJlcXVlc3RzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZCk7Ci0gICAgfQorICAgIHVpbnQzMl90IG51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqPiByZXF1ZXN0cygxKTsKKyAgICByZXF1ZXN0c1swXSA9IHJlcXVlc3Q7CisgICAgcmVzID0gcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKHJlcXVlc3RzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZCk7CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC0zNDU3LDMxICszNDk5LDI0IEBACiAgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBpZiAobUhhbDNEZXZpY2UgIT0gbnVsbHB0cikgewotICAgICAgICByZXMgPSBtSGFsM0RldmljZS0+b3BzLT5mbHVzaChtSGFsM0RldmljZSk7CisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmZsdXNoKCk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmZsdXNoKCk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChlcnIpOwotICAgICAgICB9CisgICAgICAgIHJlcyA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKGVycik7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpkdW1wKGludCBmZCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpkdW1wKGludCAvKmZkKi8pIHsKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpkdW1wIik7CiAgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBpZiAobUhhbDNEZXZpY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtSGFsM0RldmljZS0+b3BzLT5kdW1wKG1IYWwzRGV2aWNlLCBmZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKKyAgICAvLyBIYW5kbGVkIGJ5IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZHVtcAorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsb3NlKCkgewpAQCAtMzQ4OSwxNSArMzUyNCwxMiBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhhbDNEZXZpY2UtPmNvbW1vbi5jbG9zZSgmbUhhbDNEZXZpY2UtPmNvbW1vbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNsb3NlKCk7Ci0gICAgICAgIC8vIEludGVyZmFjZSB3aWxsIGJlIGRlYWQgc2hvcnRseSBhbnl3YXksIHNvIGRvbid0IGxvZyBlcnJvcnMKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQorICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jbG9zZSgpOworICAgIC8vIEludGVyZmFjZSB3aWxsIGJlIGRlYWQgc2hvcnRseSBhbnl3YXksIHNvIGRvbid0IGxvZyBlcnJvcnMKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMzYxNCwxMSArMzY0NiwxMyBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKAogICAgICAgICB3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y29uZmlndXJhdGlvbkNvbXBsZXRlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVjb25maWd1cmVkID0gdHJ1ZTsKICAgICAvLyBQcmVwYXJlIHZpZGVvIHN0cmVhbSBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcuCkBAIC0zNjI5LDYgKzM2NjMsNyBAQAogICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cywKICAgICAgICAgLypvdXQqLwogICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgZm9yIChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+OjppdGVyYXRvciBpdCA9IHJlcXVlc3RzLmJlZ2luKCk7IGl0ICE9IHJlcXVlc3RzLmVuZCgpOwogICAgICAgICAgICAgKytpdCkgewpAQCAtMzY1MSw3ICszNjg2LDcgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlVHJpZ2dlcigKICAgICAgICAgUmVxdWVzdFRyaWdnZXIgdHJpZ2dlcltdLAogICAgICAgICBzaXplX3QgY291bnQpIHsKLQorICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyaWdnZXJNdXRleCk7CiAgICAgc3RhdHVzX3QgcmV0OwogCkBAIC0zNzA4LDYgKzM3NDMsNyBAQAogICAgICAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVxdWVzdHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgewogICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKQEAgLTM3MzQsNiArMzc3MCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICByZXR1cm4gY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZChsYXN0RnJhbWVOdW1iZXIpOwogCkBAIC0zNzUwLDYgKzM3ODcsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigKICAgICAgICAgLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBBTE9HVigiUmVxdWVzdFRocmVhZDo6JXM6IiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzgwNSw2ICszODQzLDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRQYXVzZWQoYm9vbCBwYXVzZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1QYXVzZUxvY2spOwogICAgIG1Eb1BhdXNlID0gcGF1c2VkOwogICAgIG1Eb1BhdXNlU2lnbmFsLnNpZ25hbCgpOwpAQCAtMzgxMiw2ICszODUxLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6d2FpdFVudGlsUmVxdWVzdFByb2Nlc3NlZCgKICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxhdGVzdFJlcXVlc3RNdXRleCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHdoaWxlIChtTGF0ZXN0UmVxdWVzdElkICE9IHJlcXVlc3RJZCkgewpAQCAtMzgzOCw2ICszODc4LDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjaGVja0FuZFN0b3BSZXBlYXRpbmdSZXF1ZXN0KCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgYm9vbCBzdXJmYWNlQWJhbmRvbmVkID0gZmFsc2U7CiAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOwogICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKQEAgLTM4NjYsNiArMzkwNyw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2VuZFJlcXVlc3RzQmF0Y2goKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgc2l6ZV90IGJhdGNoU2l6ZSA9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpOwogICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqPiByZXF1ZXN0cyhiYXRjaFNpemUpOwpAQCAtNDI2MSw2ICs0MzAzLDcgQEAKIH0KIAogQ2FtZXJhTWV0YWRhdGEgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Z2V0TGF0ZXN0UmVxdWVzdCgpIGNvbnN0IHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKIAogICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOjolcyIsIF9fRlVOQ1RJT05fXyk7CkBAIC00MjcwLDYgKzQzMTMsNyBAQAogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmlzU3RyZWFtUGVuZGluZygKICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgbmV4dFJlcXVlc3QgOiBtTmV4dFJlcXVlc3RzKSB7CkBAIC00Mjk5LDYgKzQzNDMsNyBAQAogfQogCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtSW5GbGlnaHRMb2NrKTsKICAgICByZXR1cm4gbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA+IGtNaW5JbmZsaWdodER1cmF0aW9uID8KICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gOiBrTWluSW5mbGlnaHREdXJhdGlvbjsKQEAgLTQzNzAsNiArNDQxNSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6d2FpdEZvck5leHRSZXF1ZXN0QmF0Y2goKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICAvLyBPcHRpbWl6ZWQgYSBiaXQgZm9yIHRoZSBzaW1wbGUgc3RlYWR5LXN0YXRlIGNhc2UgKHNpbmdsZSByZXBlYXRpbmcKICAgICAvLyByZXF1ZXN0KSwgdG8gYXZvaWQgcHV0dGluZyB0aGF0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlIHRlbXBvcmFyaWx5LgogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CkBAIC00NTE5LDYgKzQ1NjUsNyBAQAogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OndhaXRJZlBhdXNlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUGF1c2VMb2NrKTsKICAgICB3aGlsZSAobURvUGF1c2UpIHsKQEAgLTQ1NDMsNiArNDU5MCw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dW5wYXVzZUZvck5ld1JlcXVlc3RzKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gV2l0aCB3b3JrIHRvIGRvLCBtYXJrIHRocmVhZCBhcyB1bnBhdXNlZC4KICAgICAvLyBJZiBwYXVzZWQgYnkgcmVxdWVzdCAoc2V0UGF1c2VkKSwgZG9uJ3QgcmVzdW1lLCB0byBhdm9pZAogICAgIC8vIGV4dHJhIHNpZ25hbGluZy93YWl0aW5nIG92ZXJoZWFkIHRvIHdhaXRVbnRpbFBhdXNlZApAQCAtNDU3NCw3ICs0NjIyLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aW5zZXJ0VHJpZ2dlcnMoCiAgICAgICAgIGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiAmcmVxdWVzdCkgewotCisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKQEAgLTQ2NjMsNiArNDcxMSw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnJlbW92ZVRyaWdnZXJzKAogICAgICAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcXVlc3QpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtVHJpZ2dlck11dGV4KTsKIAogICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nczsKQEAgLTQ3NzksNiArNDgyOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpwcmVwYXJlKGludCBtYXhDb3VudCwgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtNDgyMiw2ICs0ODcyLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OmNsZWFyKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUGVuZGluZ1N0cmVhbXMpIHsKQEAgLTQ4MzQsNiArNDg4NSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCBkNzAwZTAzLi5mYmJiZDA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CkBAIC0xMTcsMjAgKzExOCwxOCBAQAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMCkgb3ZlcnJpZGU7CisgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgKmlkKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pIG92ZXJyaWRlOwogICAgIHN0YXR1c190IHNldFN0cmVhbVRyYW5zZm9ybShpbnQgaWQsIGludCB0cmFuc2Zvcm0pIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCkgb3ZlcnJpZGU7CkBAIC0yNzEsNyArMjcwLDYgQEAKICAgICAgICAgdm9pZCBnZXRJbmZsaWdodEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KTsKIAogICAgICAgcHJpdmF0ZToKLSAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqbUhhbDNEZXZpY2U7CiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTU5MCw3ICs1ODgsNyBAQAogICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKICAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQzMl90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CiAgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgpAQCAtNTk4LDkgKzU5NiwxMSBAQAogICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKICAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwogICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgdWludDMyX3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotICAgIHN0YXRpYyB1aW50MzJfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CiAKICAgICBzdHJ1Y3QgUmVxdWVzdFRyaWdnZXIgewpAQCAtODg2LDYgKzg4NiwxMSBAQAogICAgICAgICAvLyBGb3IgYXV0by1leHBvc3VyZSBtb2RlcywgZXF1YWwgdG8gMS8obG93ZXIgZW5kIG9mIHRhcmdldCBGUFMgcmFuZ2UpCiAgICAgICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbjsKIAorICAgICAgICAvLyBXaGV0aGVyIHRoZSByZXN1bHQgbWV0YWRhdGEgZm9yIHRoaXMgcmVxdWVzdCBpcyB0byBiZSBza2lwcGVkLiBUaGUKKyAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhIHNob3VsZCBiZSBza2lwcGVkIGluIHRoZSBjYXNlIG9mCisgICAgICAgIC8vIFJFUVVFU1QvUkVTVUxUIGVycm9yLgorICAgICAgICBib29sIHNraXBSZXN1bHRNZXRhZGF0YTsKKwogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKQEAgLTg5NSw3ICs5MDAsOCBAQAogICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KDApLAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKLSAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCkBAIC05MDgsNyArOTE0LDggQEAKICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihoYXNJbnB1dCksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAotICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpIHsKICAgICAgICAgfQogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCA5Yzk1MWI3Li42ZTI5NzhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC05NSw3ICs5NSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdCB7CiAgICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggMzVhNmExOC4uNDkyZmI0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC05NCw3ICs5NCw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIERVTU1ZX0RBVEFTUEFDRSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKICAgICBzdGF0aWMgY29uc3QgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCBEVU1NWV9ST1RBVElPTiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERVTU1ZX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCA3YWQyMzAwLi5hNTI0MjJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAodm9pZCkgYXJnczsKICAgICBTdHJpbmc4IGxpbmVzOwogCi0gICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmY29uc3VtZXJVc2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgY29uc3VtZXJVc2FnZSA9IDA7CiAKQEAgLTc4LDggKzc4LDggQEAKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIE1heCBzaXplOiAlenVcbiIsIG1NYXhTaXplKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIENvbWJpbmVkIHVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSB8IGNvbnN1bWVyVXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJSIgUFJJdTY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCisgICAgICAgICAgICBtVXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDM1ZGRhMzkuLjIzNzYwNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC04NSw3ICs4NSw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKICAgICBzdGF0dXNfdCByZXR1cm5CdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IGZmMmRjZWYuLjJjYjFlYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzIDogbWluQnVmczsKICAgICAgICAgLy8gVE9ETzogc29tZWhvdyBzZXQgdGhlIHRvdGFsIGJ1ZmZlciBjb3VudCB3aGVuIHByb2R1Y2VyIGNvbm5lY3RzPwogCi0gICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKKyAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwgbVVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhMy1JbnB1dFN0cmVhbS0lZCIsIG1JZCkpOwogCkBAIC0yODQsNyArMjg0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0IHsKICAgICAvLyBQZXIgSEFMMyBzcGVjLCBpbnB1dCBzdHJlYW1zIGhhdmUgMCBmb3IgdGhlaXIgaW5pdGlhbCB1c2FnZSBmaWVsZC4KICAgICAqdXNhZ2UgPSAwOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDhmNWI0MzEuLjgxMjI2ZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNzYsNyArNzYsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckZyZWVkTGlzdGVuZXIgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCBiMDJjZDZhLi5kY2FlZmUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKIAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLApAQCAtMTExLDcgKzExMSw4IEBACiAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgY29uc3VtZXIgdXNhZ2UgZmxhZy4KICAgICBpZiAoKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFKSA9PSAwICYmCiAgICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRGVmZXJyZWQgY29uc3VtZXIgdXNhZ2UgZmxhZyBpcyBpbGxlZ2FsICgweCV4KSEiLCBfX0ZVTkNUSU9OX18sIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVyIHVzYWdlIGZsYWcgaXMgaWxsZWdhbCAlIiBQUkl1NjQgIiEiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbnN1bWVyVXNhZ2UpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9FUlJPUjsKICAgICB9CiAKQEAgLTEyNyw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIHR5cGUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLApAQCAtMzY1LDEwICszNjYsMTAgQEAKIAogICAgIG1Db25zdW1lck5hbWUgPSBtQ29uc3VtZXItPmdldENvbnN1bWVyTmFtZSgpOwogCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUNvbnN1bWVyLmdldCgpLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UpOworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1Db25zdW1lci5nZXQoKSwgbVVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSB1c2FnZSAlMDh4IGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OnVzYWdlLCBtSWQpOworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgdXNhZ2UgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtVXNhZ2UsIG1JZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC00NjEsMTEgKzQ2MiwxMSBAQAogICAgICAqIEhBTDMuMiBkZXZpY2VzIG1heSBub3Qgc3VwcG9ydCB0aGUgZHluYW1pYyBidWZmZXIgcmVnaXN0ZXJhdGlvbi4KICAgICAgKi8KICAgICBpZiAobUJ1ZmZlck1hbmFnZXIgIT0gMCAmJiBtU2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgewotICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMDsKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgICAgIGdldEVuZHBvaW50VXNhZ2UoJmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICBTdHJlYW1JbmZvIHN0cmVhbUluZm8oCiAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGdldEZvcm1hdCgpLCBnZXREYXRhU3BhY2UoKSwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgfCBjb25zdW1lclVzYWdlLCBtVG90YWxCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICBtVXNhZ2UgfCBjb25zdW1lclVzYWdlLCBtVG90YWxCdWZmZXJDb3VudCwKICAgICAgICAgICAgICAgICAvKmlzQ29uZmlndXJlZCovdHJ1ZSk7CiAgICAgICAgIHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHdlYWtUaGlzKHRoaXMpOwogICAgICAgICByZXMgPSBtQnVmZmVyTWFuYWdlci0+cmVnaXN0ZXJTdHJlYW0od2Vha1RoaXMsCkBAIC02MjgsNyArNjI5LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgewogCiAgICAgc3RhdHVzX3QgcmVzOwogCkBAIC02NDMsMTQgKzY0NCwxMiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQzMl90ICp1c2FnZSwKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKICAgICBzdGF0dXNfdCByZXM7Ci0gICAgaW50MzJfdCB1ID0gMDsKKyAgICB1aW50NjRfdCB1ID0gMDsKIAotICAgIHJlcyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKS0+cXVlcnkoc3VyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJnUpOwotCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CiAgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCiAgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCiAgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCkBAIC02NzAsNyArNjY5LDcgQEAKIH0KIAogYm9vbCBDYW1lcmEzT3V0cHV0U3RyZWFtOjppc1ZpZGVvU3RyZWFtKCkgY29uc3QgewotICAgIHVpbnQzMl90IHVzYWdlID0gMDsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGVuZCBwb2ludCB1c2FnZSBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTgxMyw3ICs4MTIsNyBAQAogfQogCiBib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OmlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSBjb25zdCB7Ci0gICAgdWludDMyX3QgdXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICBzdGF0dXNfdCByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IGdldHRpbmcgZW5kIHBvaW50IHVzYWdlIGZhaWxlZDogJXMgKCVkKS4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtODI0LDcgKzgyMyw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6aXNDb25zdW1lZEJ5SFdUZXh0dXJlKCkgY29uc3QgewotICAgIHVpbnQzMl90IHVzYWdlID0gMDsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGVuZCBwb2ludCB1c2FnZSBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggOTdhYTdkNC4uNzAyM2Q1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICB1aW50MzJfdCBoZWlnaHQ7CiAgICAgdWludDMyX3QgZm9ybWF0OwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKLSAgICB1aW50MzJfdCBjb21iaW5lZFVzYWdlOworICAgIHVpbnQ2NF90IGNvbWJpbmVkVXNhZ2U7CiAgICAgc2l6ZV90IHRvdGFsQnVmZmVyQ291bnQ7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQ7CiAgICAgZXhwbGljaXQgU3RyZWFtSW5mbyhpbnQgaWQgPSBDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElELApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgdWludDMyX3QgaCA9IDAsCiAgICAgICAgICAgICB1aW50MzJfdCBmbXQgPSAwLAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZHMgPSBIQUxfREFUQVNQQUNFX1VOS05PV04sCi0gICAgICAgICAgICB1aW50MzJfdCB1c2FnZSA9IDAsCisgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDAsCiAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSAwLAogICAgICAgICAgICAgYm9vbCBjb25maWd1cmVkID0gZmFsc2UpIDoKICAgICAgICAgICAgICAgICBzdHJlYW1JZChpZCksCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgKiBzdHJlYW0gc2V0IGlkIG5lZWRzIHRvIGJlIHNldCB0byBzdXBwb3J0IGJ1ZmZlciBzaGFyaW5nIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcy4KICAgICAgKi8KICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCA9IDAsCiAgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKICAgICAvKioKQEAgLTE5MSwxNCArMTkxLDE0IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAotICAgIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQzMl90ICp1c2FnZSwKKyAgICBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCiAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZCgpOwogCiAgICAgLy8gQ29uc3VtZXIgYXMgdGhlIG91dHB1dCBvZiBjYW1lcmEgSEFMCiAgICAgc3A8U3VyZmFjZT4gbUNvbnN1bWVyOwogCi0gICAgdWludDMyX3QgZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25zdW1lclVzYWdlOyB9CisgICAgdWludDY0X3QgZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25zdW1lclVzYWdlOyB9CiAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICA9IDEwMDAwMDAwMDA7IC8vIDEgc2VjCiAKQEAgLTI0NSw3ICsyNDUsNyBAQAogICAgICAqIENvbnN1bWVyIGVuZCBwb2ludCB1c2FnZSBmbGFnIHNldCBieSB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBkZWZlcnJlZAogICAgICAqIGNvbnN1bWVyIGNhc2UuCiAgICAgICovCi0gICAgdWludDMyX3QgICAgbUNvbnN1bWVyVXNhZ2U7CisgICAgdWludDY0X3QgICAgbUNvbnN1bWVyVXNhZ2U7CiAKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQpAQCAtMjYyLDcgKzI2Miw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFByaXZhdGUgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggMmFlNTY2MC4uNTA1MTcxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcywKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOwogCi0gICAgdWludDMyX3QgdXNhZ2U7CisgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KG1TdXJmYWNlcywgdXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycywgJm1Db25zdW1lcik7CkBAIC0xOTEsMTAgKzE5MSwxMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgewogCiAgICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgdWludDMyX3QgdSA9IDA7CisgICAgdWludDY0X3QgdSA9IDA7CiAKICAgICBpZiAobUNvbnN1bWVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gQ2FsbGVkIGJlZm9yZSBzaGFyZWQgYnVmZmVyIHF1ZXVlIGlzIGNvbnN0cnVjdGVkLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCA3YmUwOTQwLi4yMmJiMmZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMzQsNyArMzQsNyBAQAogICAgICAqLwogICAgIENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oaW50IGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDllNmFjNzkuLmZiZThmNGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNTYsMTIgKzU2LDE1IEBACiAgICAgbVN0YXRlKFNUQVRFX0NPTlNUUlVDVEVEKSwKICAgICBtU3RhdHVzSWQoU3RhdHVzVHJhY2tlcjo6Tk9fU1RBVFVTX0lEKSwKICAgICBtU3RyZWFtVW5wcmVwYXJhYmxlKHRydWUpLAorICAgIG1Vc2FnZSgwKSwKICAgICBtT2xkVXNhZ2UoMCksCiAgICAgbU9sZE1heEJ1ZmZlcnMoMCksCiAgICAgbVByZXBhcmVkKGZhbHNlKSwKICAgICBtUHJlcGFyZWRCdWZmZXJJZHgoMCksCiAgICAgbUxhc3RNYXhDb3VudChDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOjpBTExPQ0FURV9QSVBFTElORV9NQVgpLAotICAgIG1CdWZmZXJMaW1pdExhdGVuY3koa0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUpIHsKKyAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSwKKyAgICBtRm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksCisgICAgbU9yaWdpbmFsRm9ybWF0KC0xKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtNjksNyArNzIsNiBAQAogICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPSBmb3JtYXQ7CiAgICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UgPSBkYXRhU3BhY2U7CiAgICAgY2FtZXJhM19zdHJlYW06OnJvdGF0aW9uID0gcm90YXRpb247Ci0gICAgY2FtZXJhM19zdHJlYW06OnVzYWdlID0gMDsKICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSAwOwogICAgIGNhbWVyYTNfc3RyZWFtOjpwcml2ID0gTlVMTDsKIApAQCAtMTA0LDYgKzEwNiw0MCBAQAogICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKIH0KIAordWludDY0X3QgQ2FtZXJhM1N0cmVhbTo6Z2V0VXNhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2FnZTsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtOjpzZXRVc2FnZSh1aW50NjRfdCB1c2FnZSkgeworICAgIG1Vc2FnZSA9IHVzYWdlOworfQorCit2b2lkIENhbWVyYTNTdHJlYW06OnNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGRlbikgeworICAgIG1Gb3JtYXRPdmVycmlkZGVuID0gZm9ybWF0T3ZlcnJpZGRlbjsKKyAgICBpZiAoZm9ybWF0T3ZlcnJpZGRlbikgbU9yaWdpbmFsRm9ybWF0ID0gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKK30KKworYm9vbCBDYW1lcmEzU3RyZWFtOjppc0Zvcm1hdE92ZXJyaWRkZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1Gb3JtYXRPdmVycmlkZGVuOworfQorCitpbnQgQ2FtZXJhM1N0cmVhbTo6Z2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PcmlnaW5hbEZvcm1hdDsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtOjpzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRkZW4pIHsKKyAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbiA9IGRhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgaWYgKGRhdGFTcGFjZU92ZXJyaWRkZW4pIG1PcmlnaW5hbERhdGFTcGFjZSA9IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOworfQorCitib29sIENhbWVyYTNTdHJlYW06OmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGFTcGFjZU92ZXJyaWRkZW47Cit9CisKK2FuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNTdHJlYW06OmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBtT3JpZ2luYWxEYXRhU3BhY2U7Cit9CisKIGNhbWVyYTNfc3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpzdGFydENvbmZpZ3VyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xMzMsMTAgKzE2OSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbU9sZFVzYWdlID0gY2FtZXJhM19zdHJlYW06OnVzYWdlOworICAgIG1PbGRVc2FnZSA9IG1Vc2FnZTsKICAgICBtT2xkTWF4QnVmZmVycyA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKIAotICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJihjYW1lcmEzX3N0cmVhbTo6dXNhZ2UpKTsKKyAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZtVXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcXVlcnkgY29uc3VtZXIgZW5kcG9pbnQgdXNhZ2UhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtMTk3LDcgKzIzMyw3IEBACiAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIHVuY2hhbmdlZCwgYW5kIHNraXAgcmVhbGxvY2F0aW9uIGlmCiAgICAgLy8gc28uIEFzIGRvY3VtZW50ZWQgaW4gaGFyZHdhcmUvY2FtZXJhMy5oOmNvbmZpZ3VyZV9zdHJlYW1zKCkuCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyAmJgotICAgICAgICAgICAgbU9sZFVzYWdlID09IGNhbWVyYTNfc3RyZWFtOjp1c2FnZSAmJgorICAgICAgICAgICAgbU9sZFVzYWdlID09IG1Vc2FnZSAmJgogICAgICAgICAgICAgbU9sZE1heEJ1ZmZlcnMgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTI0Myw3ICsyNzksNyBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSA9IG1PbGRVc2FnZTsKKyAgICBtVXNhZ2UgPSBtT2xkVXNhZ2U7CiAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gbU9sZE1heEJ1ZmZlcnM7CiAKICAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0NPTkZJR1VSRUQgOiBTVEFURV9DT05TVFJVQ1RFRDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNDRmZTZiNi4uNmU3OTEyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTE0NCw2ICsxNDQsMTQgQEAKICAgICB1aW50MzJfdCAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSBjb25zdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICBnZXRVc2FnZSgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgIHNldFVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICB2b2lkICAgICAgICAgICAgICBzZXRGb3JtYXRPdmVycmlkZShib29sIGZvcm1hdE92ZXJyaWRlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgaXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgZ2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICBzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3Q7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdDsKIAogICAgIGNhbWVyYTNfc3RyZWFtKiAgIGFzSGFsU3RyZWFtKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTQ1OSw3ICs0NjcsNyBAQAogCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBpbiB0aGUgbGlzdCBvZiBvdXRzdGFuZGluZyBidWZmZXJzLgogICAgIGJvb2wgaXNPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlcikgY29uc3Q7CkBAIC00NzMsOCArNDgxLDEwIEBACiAgICAgLy8gcHJlcGFyZU5leHRCdWZmZXIgY2FsbGVkIG9uIGl0LgogICAgIGJvb2wgbVN0cmVhbVVucHJlcGFyYWJsZTsKIAorICAgIHVpbnQ2NF90IG1Vc2FnZTsKKwogICBwcml2YXRlOgotICAgIHVpbnQzMl90IG1PbGRVc2FnZTsKKyAgICB1aW50NjRfdCBtT2xkVXNhZ2U7CiAgICAgdWludDMyX3QgbU9sZE1heEJ1ZmZlcnM7CiAgICAgQ29uZGl0aW9uIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICBDb25kaXRpb24gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CkBAIC01MTAsNiArNTIwLDE1IEBACiAgICAgLy8gbWF4X2J1ZmZlcnMuCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUgPSAzMzsgLy9pbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbUJ1ZmZlckxpbWl0TGF0ZW5jeTsKKworICAgIC8vS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBmb3JtYXQgaW4gY2FzZSBpdCBnZXRzIG92ZXJyaWRkZW4KKyAgICBib29sIG1Gb3JtYXRPdmVycmlkZGVuOworICAgIGludCBtT3JpZ2luYWxGb3JtYXQ7CisKKyAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZGF0YVNwYWNlIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCisgICAgYm9vbCBtRGF0YVNwYWNlT3ZlcnJpZGRlbjsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CisKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggMDU0NGExYi4uY2M5YmY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDEyIEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRGb3JtYXQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGVuKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRPcmlnaW5hbEZvcm1hdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZW4pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdCA9IDA7CiAKICAgICAvKioKICAgICAgKiBHZXQgYSBIQUwzIGhhbmRsZSBmb3IgdGhlIHN0cmVhbSwgd2l0aG91dCBzdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbi4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCA4NjllOTNhLi5hMGE1MGMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0zOSw3ICszOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Y29ubmVjdChjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPiA+JiBzdXJmYWNlcywKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgeworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewogICAgICAgICBTUF9MT0dFKCIlczogY29uc3VtZXIgcG9pbnRlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKQEAgLTE5NSwxMCArMTk1LDggQEAKIAogICAgIC8vIFNldCBkZXF1ZXVlQnVmZmVyL2F0dGFjaEJ1ZmZlciB0aW1lb3V0IGlmIHRoZSBjb25zdW1lciBpcyBub3QgaHcgY29tcG9zZXIgb3IgaHcgdGV4dHVyZS4KICAgICAvLyBXZSBuZWVkIHNraXAgdGhlc2UgY2FzZXMgYXMgdGltZW91dCB3aWxsIGRpc2FibGUgdGhlIG5vbi1ibG9ja2luZyAoYXN5bmMpIG1vZGUuCi0gICAgaW50MzJfdCB1c2FnZSA9IDA7Ci0gICAgc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKS0+cXVlcnkoCi0gICAgICAgICAgICBvdXRwdXRRdWV1ZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJnVzYWdlKTsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKICAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggY2M2MjNlMC4uM2I4ODM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC01Miw3ICs1Miw3IEBACiAgICAgLy8gQ29ubmVjdCB0byB0aGUgc3RyZWFtIHNwbGl0dGVyIGJ5IGNyZWF0aW5nIGJ1ZmZlciBxdWV1ZSBhbmQgY29ubmVjdGluZyBpdAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgogICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4gPiYgc3VyZmFjZXMsCi0gICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLAogICAgICAgICAgICAgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKTsKIAogICAgIC8vIGFkZE91dHB1dCBhZGRzIGFuIG91dHB1dCBCdWZmZXJRdWV1ZSB0byB0aGUgc3BsaXR0ZXIuIFRoZSBzcGxpdHRlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCAzZDU0NDYwLi5lZTAxOGMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMzgsNyArMzgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBSaW5nQnVmZmVyQ29uc3VtZXI6OlJpbmdCdWZmZXJDb25zdW1lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsCiAgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgIENvbnN1bWVyQmFzZShjb25zdW1lciksCiAgICAgbUJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KSwKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgIHJldHVybiBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZGVmYXVsdEZvcm1hdCk7CiB9CiAKLXN0YXR1c190IFJpbmdCdWZmZXJDb25zdW1lcjo6c2V0Q29uc3VtZXJVc2FnZSh1aW50MzJfdCB1c2FnZSkgeworc3RhdHVzX3QgUmluZ0J1ZmZlckNvbnN1bWVyOjpzZXRDb25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CiAgICAgcmV0dXJuIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHModXNhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCmluZGV4IDJiYWZlNGEuLmI3Mzc0NjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAvLyB0aGUgY29uc3VtZXIgdXNhZ2UgZmxhZ3MgcGFzc2VkIHRvIHRoZSBncmFwaGljcyBhbGxvY2F0b3IuIFRoZQogICAgIC8vIGJ1ZmZlckNvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnVmZmVycyBjYW4gYmUgcGlubmVkIGZvciB1c2VyCiAgICAgLy8gYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKKyAgICBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGNvbnN1bWVyLCB1aW50NjRfdCBjb25zdW1lclVzYWdlLAogICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50KTsKIAogICAgIHZpcnR1YWwgflJpbmdCdWZmZXJDb25zdW1lcigpOwpAQCAtODAsNyArODAsNyBAQAogCiAgICAgLy8gc2V0Q29uc3VtZXJVc2FnZSBhbGxvd3MgdGhlIEJ1ZmZlclF1ZXVlIGNvbnN1bWVyIHVzYWdlIHRvIGJlCiAgICAgLy8gc2V0IGF0IGEgbGF0ZXIgdGltZSBhZnRlciBjb25zdHJ1Y3Rpb24uCi0gICAgc3RhdHVzX3Qgc2V0Q29uc3VtZXJVc2FnZSh1aW50MzJfdCB1c2FnZSk7CisgICAgc3RhdHVzX3Qgc2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CiAKICAgICAvLyBCdWZmZXIgaW5mbywgbWludXMgdGhlIGdyYXBoaWNzIGJ1ZmZlci9zbG90IGl0c2VsZi4KICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA4NzZjNjg1Li5jN2Y5MjcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTI5LDEyICsyOSwxNSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHdkLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogCiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtODAsMjcgKzgzLDI2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjb250ZW50OjpwbTsKKwogCiAKIC8vIHN1bW1hcml6ZWQgcmVjb3JkcwotLy8gdXAgdG8gNDggc2V0cywgZWFjaCBjb3ZlcmluZyBhbiBob3VyIC0tIGF0IGxlYXN0IDIgZGF5cyBvZiBjb3ZlcmFnZQorLy8gdXAgdG8gMzYgc2V0cywgZWFjaCBjb3ZlcmluZyBhbiBob3VyIC0tIHNvIGF0IGxlYXN0IDEuNSBkYXlzCiAvLyAod2lsbCBiZSBsb25nZXIgaWYgdGhlcmUgYXJlIGhvdXJzIHdpdGhvdXQgYW55IG1lZGlhIGFjdGlvbikKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOZXdTZXRJbnRlcnZhbE5zID0gMzYwMCooMTAwMCoxMDAwKjEwMDBsbCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRTZXRzID0gNDg7Ci0vLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnkKLXN0YXRpYyBjb25zdCBpbnQga01heFJlY29yZHMgICAgPSAxMDA7CitzdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRTZXRzID0gMzY7CiAKKy8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50CisvLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGNvdW50OiBoYXJkIGxpbWl0IG9mICMgcmVjb3JkcworLy8gKDAgZm9yIGVpdGhlciBvZiB0aGVzZSBkaXNhYmxlcyB0aGF0IHRocmVzaG9sZCkKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAzNiAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CitzdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmtTZXJ2aWNlTmFtZSA9ICJtZWRpYS5tZXRyaWNzIjsKIAotCi0vL3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotLy91c2luZyBhbmRyb2lkOjpPSzsKLS8vdXNpbmcgYW5kcm9pZDo6QkFEX1ZBTFVFOwotLy91c2luZyBhbmRyb2lkOjpOT1RfRU5PVUdIX0RBVEE7Ci0vL3VzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLQotCiB2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CiAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCiAgICAgICAgICAgICBTdHJpbmcxNihrU2VydmljZU5hbWUpLCBuZXcgTWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkpOwpAQCAtMTEwLDYgKzExMiw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OlN1bW1hcml6ZXJTZXQ6OlN1bW1hcml6ZXJTZXQoKSB7CiAgICAgbVN1bW1hcml6ZXJzID0gbmV3IExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4oKTsKIH0KKwogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0Ojp+U3VtbWFyaXplclNldCgpIHsKICAgICAvLyBlbXB0eSB0aGUgbGlzdAogICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmwgPSBtU3VtbWFyaXplcnM7CkBAIC0xNTMsOCArMTU2LDEwIEBACiAKIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkKICAgICAgICAgOiBtTWF4UmVjb3JkcyhrTWF4UmVjb3JkcyksCisgICAgICAgICAgbU1heFJlY29yZEFnZU5zKGtNYXhSZWNvcmRBZ2VOcyksCiAgICAgICAgICAgbU1heFJlY29yZFNldHMoa01heFJlY29yZFNldHMpLAotICAgICAgICAgIG1OZXdTZXRJbnRlcnZhbChrTmV3U2V0SW50ZXJ2YWxOcykgeworICAgICAgICAgIG1OZXdTZXRJbnRlcnZhbChrTmV3U2V0SW50ZXJ2YWxOcyksCisgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwKSB7CiAKICAgICBBTE9HRCgiTWVkaWFBbmFseXRpY3NTZXJ2aWNlIGNyZWF0ZWQiKTsKICAgICAvLyBjbGVhciBvdXIgcXVldWVzCkBAIC0xNjcsNiArMTcyLDggQEAKICAgICBtSXRlbXNTdWJtaXR0ZWQgPSAwOwogICAgIG1JdGVtc0ZpbmFsaXplZCA9IDA7CiAgICAgbUl0ZW1zRGlzY2FyZGVkID0gMDsKKyAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUgPSAwOworICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50ID0gMDsKIAogICAgIG1MYXN0U2Vzc2lvbklEID0gMDsKICAgICAvLyByZWNvdmVyIGFueSBwZXJzaXN0ZW5jeSB3ZSBzZXQgdXAKQEAgLTE3Nyw4ICsxODQsMjMgQEAKICAgICAgICAgQUxPR0QoIk1lZGlhQW5hbHl0aWNzU2VydmljZSBkZXN0cm95ZWQiKTsKIAogICAgIC8vIGNsZWFuIG91dCBtT3BlbiBhbmQgbUZpbmFsaXplZAorICAgIHdoaWxlIChtT3Blbi0+c2l6ZSgpID4gMCkgeworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobU9wZW4tPmJlZ2luKCkpOworICAgICAgICBtT3Blbi0+ZXJhc2UobU9wZW4tPmJlZ2luKCkpOworICAgICAgICBkZWxldGUgb2l0ZW07CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOworICAgICAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCsrOworICAgIH0KICAgICBkZWxldGUgbU9wZW47CiAgICAgbU9wZW4gPSBOVUxMOworCisgICAgd2hpbGUgKG1GaW5hbGl6ZWQtPnNpemUoKSA+IDApIHsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1GaW5hbGl6ZWQtPmJlZ2luKCkpOworICAgICAgICBtRmluYWxpemVkLT5lcmFzZShtRmluYWxpemVkLT5iZWdpbigpKTsKKyAgICAgICAgZGVsZXRlIG9pdGVtOworICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKKyAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKKyAgICB9CiAgICAgZGVsZXRlIG1GaW5hbGl6ZWQ7CiAgICAgbUZpbmFsaXplZCA9IE5VTEw7CiAKQEAgLTIwMCw2ICsyMjIsOCBAQAogCiAgICAgLy8gd2UgY29udHJvbCB0aGVzZSwgZ2VuZXJhbGx5IG5vdCB0cnVzdGluZyB1c2VyIGlucHV0CiAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKKyAgICAvLyByb3VuZCBuc2VjcyB0byBzZWNvbmRzCisgICAgbm93ID0gKChub3cgKyA1MDAwMDAwMDApIC8gMTAwMDAwMDAwMCkgKiAxMDAwMDAwMDAwOwogICAgIGl0ZW0tPnNldFRpbWVzdGFtcChub3cpOwogICAgIGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKQEAgLTIxMiwxMyArMjM2LDE1IEBACiAgICAgLy8KICAgICBib29sIGlzVHJ1c3RlZCA9IGZhbHNlOwogCisgICAgQUxPR1YoImNhbGxlciBoYXMgdWlkPSVkLCBlbWJlZGRlZCB1aWQ9JWQiLCB1aWQsIHVpZF9naXZlbik7CisKICAgICBzd2l0Y2ggKHVpZCkgIHsKICAgICAgICAgY2FzZSBBSURfTUVESUE6CiAgICAgICAgIGNhc2UgQUlEX01FRElBX0NPREVDOgogICAgICAgICBjYXNlIEFJRF9NRURJQV9FWDoKICAgICAgICAgY2FzZSBBSURfTUVESUFfRFJNOgogICAgICAgICAgICAgLy8gdHJ1c3RlZCBzb3VyY2UsIG9ubHkgb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgICAgICBpc1RydXN0ZWQgPSB0cnVlOworICAgICAgICAgICAgaXNUcnVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGlmICh1aWRfZ2l2ZW4gPT0gKC0xKSkgewogICAgICAgICAgICAgICAgIGl0ZW0tPnNldFVpZCh1aWQpOwogICAgICAgICAgICAgfQpAQCAtMjM0LDYgKzI2MCwyMiBAQAogICAgIH0KIAogCisgICAgLy8gT3ZlcndyaXRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpZiB0aGUgY2FsbGVyIHdhcyB1bnRydXN0ZWQuCisgICAgaWYgKCFpc1RydXN0ZWQpIHsKKyAgICAgIHNldFBrZ0luZm8oaXRlbSwgaXRlbS0+Z2V0VWlkKCksIHRydWUsIHRydWUpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0UGtnTmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIC8vIGVtcHR5LCBzbyBmaWxsIG91dCBib3RoIHBhcnRzCisgICAgICBzZXRQa2dJbmZvKGl0ZW0sIGl0ZW0tPmdldFVpZCgpLCB0cnVlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gdHJ1c3RlZCwgcHJvdmlkZWQgYSBwYWNrYWdlLCBkbyBub3RoaW5nCisgICAgfQorCisgICAgQUxPR1YoImdpdmVuIHVpZCAlZDsgc2FuaXRpemVkIHVpZDogJWQgc2FuaXRpemVkIHBrZzogJXMgIgorICAgICAgICAgICJzYW5pdGl6ZWQgcGtnIHZlcnNpb246ICVkIiwKKyAgICAgICAgICB1aWRfZ2l2ZW4sIGl0ZW0tPmdldFVpZCgpLAorICAgICAgICAgIGl0ZW0tPmdldFBrZ05hbWUoKS5jX3N0cigpLAorICAgICAgICAgIGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCkpOworCiAgICAgbUl0ZW1zU3VibWl0dGVkKys7CiAKICAgICAvLyB2YWxpZGF0ZSB0aGUgcmVjb3JkOyB3ZSBkaXNjYXJkIGlmIHdlIGRvbid0IGxpa2UgaXQKQEAgLTMxNiw2ICszNTgsNyBAQAogICAgIHJldHVybiBpZDsKIH0KIAorCiBzdGF0dXNfdCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwpAQCAtMzMzLDIyICszNzYsNDEgQEAKICAgICB9CiAKICAgICAvLyBjcmFjayBhbnkgcGFyYW1ldGVycwotICAgIGJvb2wgY2xlYXIgPSBmYWxzZTsKLSAgICBib29sIHN1bW1hcnkgPSBmYWxzZTsKLSAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBzdW1tYXJ5T3B0aW9uKCItc3VtbWFyeSIpOworICAgIGJvb2wgc3VtbWFyeSA9IGZhbHNlOworICAgIFN0cmluZzE2IHByb3RvT3B0aW9uKCItcHJvdG8iKTsKICAgICBTdHJpbmcxNiBjbGVhck9wdGlvbigiLWNsZWFyIik7CisgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIFN0cmluZzE2IHNpbmNlT3B0aW9uKCItc2luY2UiKTsKKyAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBoZWxwT3B0aW9uKCItaGVscCIpOwogICAgIFN0cmluZzE2IG9ubHlPcHRpb24oIi1vbmx5Iik7Ci0gICAgY29uc3QgY2hhciAqb25seSA9IE5VTEw7CisgICAgQVN0cmluZyBvbmx5OwogICAgIGludCBuID0gYXJncy5zaXplKCk7CisKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICBTdHJpbmc4IG15YXJnKGFyZ3NbaV0pOwogICAgICAgICBpZiAoYXJnc1tpXSA9PSBjbGVhck9wdGlvbikgewogICAgICAgICAgICAgY2xlYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gc3VtbWFyeU9wdGlvbikgewogICAgICAgICAgICAgc3VtbWFyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBwcm90b09wdGlvbikgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGkgPCBuKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZShhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICBpbnQgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwOyAgICAgICAvLyBkZWZhdWx0IHRvIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgY2hhciAqZW5kcDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gdmFsdWUuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcHJvdG8gPSBzdHJ0b2wocCwgJmVuZHAsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kcCAhPSBwIHx8ICplbmRwID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvIDwgTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19GSVJTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX0ZJUlNUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvID4gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19MQVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90byA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fTEFTVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRHVtcFByb3RvID0gcHJvdG87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gc2luY2VPcHRpb24pIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIGlmIChpIDwgbikgewpAQCAtMzY4LDE4ICs0MzAsMTIgQEAKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIGlmIChpIDwgbikgewogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLnN0cmluZygpOwotICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBzdHJkdXAocCk7Ci0gICAgICAgICAgICAgICAgaWYgKHEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob25seSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCh2b2lkKilvbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ubHkgPSBxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbmx5ID0gdmFsdWUuc3RyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBoZWxwT3B0aW9uKSB7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJSZWNvZ25pemVkIHBhcmFtZXRlcnM6XG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1oZWxwICAgICAgICB0aGlzIGhlbHAgbWVzc2FnZVxuIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItcHJvdG8gWCAgICAgZHVtcCB1c2luZyBwcm90b2NvbCBYIChkZWZhdWx0cyB0byAxKSIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLXN1bW1hcnkgICAgIHNob3cgc3VtbWFyeSBpbmZvXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1jbGVhciAgICAgICBjbGVhcnMgb3V0IHNhdmVkIHJlY29yZHNcbiIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLW9ubHkgWCAgICAgIHByb2Nlc3MgcmVjb3JkcyBmb3IgY29tcG9uZW50IFhcbiIpOwpAQCAtMzk4LDExICs0NTQsMTEgQEAKIAogICAgIGR1bXBIZWFkZXJzKHJlc3VsdCwgdHNfc2luY2UpOwogCi0gICAgLy8gb25seSB3YW50IDEsIHRvIGF2b2lkIGNvbmZ1c2luZyBmb2xrcyB0aGF0IHBhcnNlIHRoZSBvdXRwdXQKKyAgICAvLyB3YW50IGV4YWN0bHkgMSwgdG8gYXZvaWQgY29uZnVzaW5nIGZvbGtzIHRoYXQgcGFyc2UgdGhlIG91dHB1dAogICAgIGlmIChzdW1tYXJ5KSB7Ci0gICAgICAgIGR1bXBTdW1tYXJpZXMocmVzdWx0LCB0c19zaW5jZSwgb25seSk7CisgICAgICAgIGR1bXBTdW1tYXJpZXMocmVzdWx0LCB0c19zaW5jZSwgb25seS5jX3N0cigpKTsKICAgICB9IGVsc2UgewotICAgICAgICBkdW1wUmVjZW50KHJlc3VsdCwgdHNfc2luY2UsIG9ubHkpOworICAgICAgICBkdW1wUmVjZW50KHJlc3VsdCwgdHNfc2luY2UsIG9ubHkuY19zdHIoKSk7CiAgICAgfQogCiAKQEAgLTQyOCw2ICs0ODQsOSBAQAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUHJvdG9jb2wgVmVyc2lvbjogJWRcbiIsIG1EdW1wUHJvdG8pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKwogICAgIGludCBlbmFibGVkID0gTWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKTsKICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJNZXRyaWNzIGdhdGhlcmluZzogZW5hYmxlZFxuIik7CkBAIC00MzcsMTAgKzQ5NiwxNCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgIlNpbmNlIEJvb3Q6IFN1Ym1pc3Npb25zOiAlIiBQUklkNjQKLSAgICAgICAgICAgICIgRmluYWxpemF0aW9uczogJSIgUFJJZDY0Ci0gICAgICAgICIgRGlzY2FyZGVkOiAlIiBQUklkNjQgIlxuIiwKLSAgICAgICAgbUl0ZW1zU3VibWl0dGVkLCBtSXRlbXNGaW5hbGl6ZWQsIG1JdGVtc0Rpc2NhcmRlZCk7CisgICAgICAgICJTaW5jZSBCb290OiBTdWJtaXNzaW9uczogJTgiIFBSSWQ2NAorICAgICAgICAgICAgIiBGaW5hbGl6YXRpb25zOiAlOCIgUFJJZDY0ICJcbiIsCisgICAgICAgIG1JdGVtc1N1Ym1pdHRlZCwgbUl0ZW1zRmluYWxpemVkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAiUmVjb3JkcyBEaXNjYXJkZWQ6ICU4IiBQUklkNjQKKyAgICAgICAgICAgICIgKGJ5IENvdW50OiAlIiBQUklkNjQgIiBieSBFeHBpcmF0aW9uOiAlIiBQUklkNjQgIilcbiIsCisgICAgICAgICBtSXRlbXNEaXNjYXJkZWQsIG1JdGVtc0Rpc2NhcmRlZENvdW50LCBtSXRlbXNEaXNjYXJkZWRFeHBpcmUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCiAgICAgICAgICJTdW1tYXJ5IFNldHMgRGlzY2FyZGVkOiAlIiBQUklkNjQgIlxuIiwgbVNldHNEaXNjYXJkZWQpOwpAQCAtNDYyLDYgKzUyNSwxMCBAQAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3VtbWFyaXplZCBNZXRyaWNzOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCisgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiAqb25seSA9PSAnXDAnKSB7CisgICAgICAgIG9ubHkgPSBOVUxMOworICAgIH0KKwogICAgIC8vIGhhdmUgZWFjaCBvZiB0aGUgZGlzdGlsbGVycyBkdW1wIHJlY29yZHMKICAgICBpZiAobVN1bW1hcml6ZXJTZXRzICE9IE5VTEwpIHsKICAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+OjppdGVyYXRvciBpdFNldCA9IG1TdW1tYXJpemVyU2V0cy0+YmVnaW4oKTsKQEAgLTQ4OCw2ICs1NTUsMTAgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKIAorICAgIGlmIChvbmx5ICE9IE5VTEwgJiYgKm9ubHkgPT0gJ1wwJykgeworICAgICAgICBvbmx5ID0gTlVMTDsKKyAgICB9CisKICAgICAvLyBzaG93IHRoZSByZWNlbnRseSByZWNvcmRlZCByZWNvcmRzCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlxuRmluYWxpemVkIE1ldHJpY3MgKG9sZGVzdCBmaXJzdCk6XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC01MjQsNyArNTk1LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiT21pdCAnJXMnLCBpdCdzIG5vdCAnJXMnIiwgKCppdCktPmdldEtleSgpLmNfc3RyKCksIG9ubHkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQVN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZygpOworICAgICAgICAgICAgQVN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZyhtRHVtcFByb3RvKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU1ZDogJXNcbiIsIHNsb3QsIGVudHJ5LmNfc3RyKCkpOwogICAgICAgICAgICAgc2xvdCsrOwogICAgICAgICB9CkBAIC01NDksMTMgKzYyMCwzMiBAQAogICAgICAgICBsLT5wdXNoX2JhY2soaXRlbSk7CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzCisgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7CiAgICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKGwtPmJlZ2luKCkpOwogICAgICAgICAgICAgbC0+ZXJhc2UobC0+YmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKKyAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQorICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CisgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobC0+YmVnaW4oKSk7CisgICAgICAgICAgICBuc2Vjc190IHdoZW4gPSBvaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgICAgICAgICAvLyBjYXJlZnVsIGFib3V0IHRpbWVqdW1wcyB0b28KKyAgICAgICAgICAgIGlmICgobm93ID4gd2hlbikgJiYgKG5vdy13aGVuKSA8PSBtTWF4UmVjb3JkQWdlTnMpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwtPmVyYXNlKGwtPmJlZ2luKCkpOworICAgICAgICAgICAgZGVsZXRlIG9pdGVtOworICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CisgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTU2MywxMSArNjUzLDYgQEAKIC8vIGFyZSB0aGV5IGFsaWtlIGVub3VnaCB0aGF0IG5pdGVtIGNhbiBiZSBmb2xkZWQgaW50byBvaXRlbT8KIHN0YXRpYyBib29sIGNvbXBhdGlibGVJdGVtcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSwgTWVkaWFBbmFseXRpY3NJdGVtICogbml0ZW0pIHsKIAotICAgIGlmICgwKSB7Ci0gICAgICAgIEFMT0dEKCJDb21wYXJlOiBvICVzIG4gJXMiLAotICAgICAgICAgICAgICBvaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpLCBuaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0KICAgICAvLyBnZW5lcmFsIHNhZmV0eQogICAgIGlmIChuaXRlbS0+Z2V0VWlkKCkgIT0gb2l0ZW0tPmdldFVpZCgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcxOCw0ICs4MDMsMTU1IEBACiAKIH0KIAorLy8gaG93IGxvbmcgd2UgaG9sZCBwYWNrYWdlIGluZm8gYmVmb3JlIHdlIHJlLWZldGNoIGl0CisjZGVmaW5lIFBLR19FWFBJUkFUSU9OX05TICgzMCo2MCoxMDAwMDAwMDAwbGwpICAgLy8gMzAgbWludXRlcywgaW4gbnNlY3MKKworLy8gZ2l2ZSBtZSB0aGUgcGFja2FnZSBuYW1lLCBwZXJoYXBzIGdvaW5nIHRvIGZpbmQgaXQKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzZXRQa2dJbmZvKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSwgdWlkX3QgdWlkLCBib29sIHNldE5hbWUsIGJvb2wgc2V0VmVyc2lvbikgeworICAgIEFMT0dWKCJhc2tpbmcgZm9yIHBhY2thZ2VuYW1lIHRvIGdvIHdpdGggdWlkPSVkIiwgdWlkKTsKKworICAgIGlmICghc2V0TmFtZSAmJiAhc2V0VmVyc2lvbikgeworICAgICAgICAvLyBzZXR0aW5nIG5vdGhpbmc/IHN0cmFuZ2UKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgc3RydWN0IFVpZFRvUGtnTWFwIG1hcHBpbmc7CisgICAgbWFwcGluZy51aWQgPSAoLTEpOworCisgICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIG1hcHBpbmcgPSBtUGtnTWFwcGluZ3MudmFsdWVBdChpKTsKKyAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCisgICAgICAgICAgICAgIHVpZCwgbWFwcGluZy5leHBpcmF0aW9uLCBub3cpOworICAgICAgICBpZiAobWFwcGluZy5leHBpcmF0aW9uIDwgbm93KSB7CisgICAgICAgICAgICAvLyBwdXJnZSBvdXIgY3VycmVudCBlbnRyeSBhbmQgcmUtcXVlcnkKKyAgICAgICAgICAgIEFMT0dWKCJlbnRyeSBmb3IgdWlkICVkIGV4cGlyZWQsIG5vdz0gJSIgUFJJZDY0ICIiLCB1aWQsIG5vdyk7CisgICAgICAgICAgICBtUGtnTWFwcGluZ3MucmVtb3ZlSXRlbXNBdChpLCAxKTsKKyAgICAgICAgICAgIC8vIGNvdWxkIGNoZWF0IGFuZCB1c2UgYSBnb3RvIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGUgcm91dGluZS4KKyAgICAgICAgICAgIC8vIGEgZ29vZCBjb21waWxlciBzaG91bGQgcmVjb2duaXplIHRoZSBsb2NhbCB0YWlsIHJlY3Vyc2lvbi4uLgorICAgICAgICAgICAgcmV0dXJuIHNldFBrZ0luZm8oaXRlbSwgdWlkLCBzZXROYW1lLCBzZXRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTdHJpbmcgcGtnOworICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXIgPSAiIjsKKyAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZSA9IDA7CisKKyAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworICAgICAgICBpZiAocHcpIHsKKyAgICAgICAgICAgIHBrZyA9IHB3LT5wd19uYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHZhbHVlIC0tIHNob3VsZCB3ZSBjYWNoZSB0aGlzIGJpbmRlcj8/CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gTlVMTDsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBpZiAoc20gPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImRlZmF1bHRTZXJ2aWNlTWFuYWdlciBmYWlsZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJwYWNrYWdlX25hdGl2ZSIpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTZXJ2aWNlIHBhY2thZ2VfbmF0aXZlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VfbWdyID0gaW50ZXJmYWNlX2Nhc3Q8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7CisKKyAgICAgICAgICAgIHVpZHMucHVzaF9iYWNrKHVpZCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhY2thZ2VfbWdyLT5nZXROYW1lc0ZvclVpZHModWlkcywgJm5hbWVzKTsKKyAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJwYWNrYWdlX25hdGl2ZTo6Z2V0TmFtZXNGb3JVaWRzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbmFtZXNbMF0uZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwa2cgPSBuYW1lc1swXS5jX3N0cigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RyaXAgYW55IGxlYWRpbmcgInNoYXJlZDoiIHN0cmluZ3MgdGhhdCBjYW1lIGJhY2sKKyAgICAgICAgICAgIGlmIChwa2cuc3RhcnRzV2l0aCgic2hhcmVkOiIpKSB7CisgICAgICAgICAgICAgICAgcGtnLmVyYXNlKDAsIDcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IHBrZyB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgdmVyc2lvbkNvZGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAocGtnLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBuYW1lIGZvciB1cyB0byBtYW5hZ2UKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY2hyKHBrZy5jX3N0cigpLCAnLicpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBub3Qgb2YgZm9ybSAnY29tLndoYXRldmVyLi4uJzsgYXNzdW1lIGludGVybmFsIGFuZCBvaworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHBrZy5jX3N0cigpLCAiYW5kcm9pZC4iLCA4KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gYW5kcm9pZC4qIHBhY2thZ2VzIGFyZSBhc3N1bWVkIGZpbmUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nMTYgcGtnTmFtZTE2KHBrZy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWNrYWdlX21nci0+Z2V0SW5zdGFsbGVyRm9yUGFja2FnZShwa2dOYW1lMTYsICZpbnN0YWxsZXIpOworICAgICAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFja2FnZV9uYXRpdmU6OmdldEluc3RhbGxlckZvclBhY2thZ2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB3ZSBkaWRuJ3QgZ2V0IGFuIGluc3RhbGxlcgorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhY2thZ2VfbWdyLT5nZXRWZXJzaW9uQ29kZUZvclBhY2thZ2UocGtnTmFtZTE2LCAmdmVyc2lvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwYWNrYWdlX25hdGl2ZTo6Z2V0VmVyc2lvbkNvZGVGb3JQYWNrYWdlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBBTE9HVigicGFja2FnZSAnJXMnIGluc3RhbGxlZCBieSAnJXMnIHZlcnNpb25jb2RlICVkIC8gJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgcGtnLmNfc3RyKCksIGluc3RhbGxlci5jX3N0cigpLCB2ZXJzaW9uQ29kZSwgdmVyc2lvbkNvZGUpOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoaW5zdGFsbGVyLmNfc3RyKCksICJjb20uYW5kcm9pZC4iLCAxMikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBwbGF5IHN0b3JlLCB3ZSBrZWVwIGluZm8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoaW5zdGFsbGVyLmNfc3RyKCksICJjb20uZ29vZ2xlLiIsIDExKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGdvb2dsZSBzb3VyY2UsIHdlIGtlZXAgaW5mbworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGluc3RhbGxlci5jX3N0cigpLCAicHJlbG9hZCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWRzLCB3ZSBrZWVwIHRoZSBpbmZvCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0YWxsZXIuY19zdHIoKVswXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlbG9hZCAobm8gaW5zdGFsbGVyKTsgZG8gbm90IHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uQ29kZSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVua25vd24gaW5zdGFsbGVyOyBkbyBub3QgcmVwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25Db2RlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIG1hcCwgdG8gc2F2ZSBhIHN1YnNlcXVlbnQgbG9va3VwCisgICAgICAgIGlmICghcGtnLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9ja19tYXBwaW5ncyk7CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIHVpZCAlZCBwa2cgJyVzJyIsIHVpZCwgcGtnLmNfc3RyKCkpOworICAgICAgICAgICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgIG1hcHBpbmcudWlkID0gdWlkOworICAgICAgICAgICAgICAgIG1hcHBpbmcucGtnID0gcGtnOworICAgICAgICAgICAgICAgIG1hcHBpbmcuaW5zdGFsbGVyID0gaW5zdGFsbGVyLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgbWFwcGluZy52ZXJzaW9uQ29kZSA9IHZlcnNpb25Db2RlOworICAgICAgICAgICAgICAgIG1hcHBpbmcuZXhwaXJhdGlvbiA9IG5vdyArIFBLR19FWFBJUkFUSU9OX05TOworICAgICAgICAgICAgICAgIEFMT0dWKCJleHBpcmF0aW9uIGZvciB1aWQgJWQgc2V0IHRvICUiIFBSSWQ2NCAiIiwgdWlkLCBtYXBwaW5nLmV4cGlyYXRpb24pOworCisgICAgICAgICAgICAgICAgbVBrZ01hcHBpbmdzLmFkZCh1aWQsIG1hcHBpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1hcHBpbmcudWlkICE9ICh1aWRfdCkoLTEpKSB7CisgICAgICAgIGlmIChzZXROYW1lKSB7CisgICAgICAgICAgICBpdGVtLT5zZXRQa2dOYW1lKG1hcHBpbmcucGtnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0VmVyc2lvbikgeworICAgICAgICAgICAgaXRlbS0+c2V0UGtnVmVyc2lvbkNvZGUobWFwcGluZy52ZXJzaW9uQ29kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKaW5kZXggNjY4NTk2Ny4uNTJlNDYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKQEAgLTU0LDE2ICs1NCwyMiBAQAogICAgIGludDY0X3QgbUl0ZW1zU3VibWl0dGVkOwogICAgIGludDY0X3QgbUl0ZW1zRmluYWxpemVkOwogICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkOworICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlOworICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkQ291bnQ7CiAgICAgaW50NjRfdCBtU2V0c0Rpc2NhcmRlZDsKICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IG1MYXN0U2Vzc2lvbklEOwogCiAgICAgLy8gcGFydGl0aW9uZWQgYSBiaXQgc28gd2UgZG9uJ3Qgb3ZlciBzZXJpYWxpemUKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9ja19pZHM7CisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2tfbWFwcGluZ3M7CiAKLSAgICAvLyB0aGUgbW9zdCB3ZSBob2xkIGluIG1lbW9yeQotICAgIC8vIHVwIHRvIHRoaXMgbWFueSBpbiBlYWNoIHF1ZXVlIChvcGVuLCBmaW5hbGl6ZWQpCisgICAgLy8gbGltaXQgaG93IG1hbnkgcmVjb3JkcyB3ZSdsbCByZXRhaW4KKyAgICAvLyBieSBjb3VudCAoaW4gZWFjaCBxdWV1ZSAob3BlbiwgZmluYWxpemVkKSkKICAgICBpbnQzMl90IG1NYXhSZWNvcmRzOworICAgIC8vIGJ5IHRpbWUgKG5vbmUgb2xkZXIgdGhhbiB0aGlzIGxvbmcgYWdhbgorICAgIG5zZWNzX3QgbU1heFJlY29yZEFnZU5zOworICAgIC8vCiAgICAgLy8gIyBvZiBzZXRzIG9mIHN1bW1hcmllcwogICAgIGludDMyX3QgbU1heFJlY29yZFNldHM7CiAgICAgLy8gbnNlY3MgdW50aWwgd2Ugc3RhcnQgYSBuZXcgcmVjb3JkIHNldApAQCAtMTE4LDYgKzEyNCw3IEBACiAgICAgdm9pZCBkZWxldGVJdGVtKExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+ICosIE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CisgICAgaW50IG1EdW1wUHJvdG87CiAgICAgU3RyaW5nOCBkdW1wUXVldWUoTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqKTsKICAgICBTdHJpbmc4IGR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSo+ICosIG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOwogCkBAIC0xMjUsNiArMTMyLDE4IEBACiAgICAgdm9pZCBkdW1wU3VtbWFyaWVzKFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpOwogICAgIHZvaWQgZHVtcFJlY2VudChTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKiBvbmx5KTsKIAorICAgIC8vIG1hcHBpbmcgdWlkcyB0byBwYWNrYWdlIG5hbWVzCisgICAgc3RydWN0IFVpZFRvUGtnTWFwIHsKKyAgICAgICAgdWlkX3QgdWlkOworICAgICAgICBBU3RyaW5nIHBrZzsKKyAgICAgICAgQVN0cmluZyBpbnN0YWxsZXI7CisgICAgICAgIGludDMyX3QgdmVyc2lvbkNvZGU7CisgICAgICAgIG5zZWNzX3QgZXhwaXJhdGlvbjsKKyAgICB9OworCisgICAgS2V5ZWRWZWN0b3I8dWlkX3Qsc3RydWN0IFVpZFRvUGtnTWFwPiAgbVBrZ01hcHBpbmdzOworICAgIHZvaWQgc2V0UGtnSW5mbyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIHVpZF90IHVpZCwgYm9vbCBzZXROYW1lLCBib29sIHNldFZlcnNpb24pOworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAKaW5kZXggMzQ3N2YxZi4uOTNmZTBlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmNwcApAQCAtMTQxLDIzICsxNDEsMjMgQEAKICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBtU3VtbWFyaWVzLT5iZWdpbigpOwogICAgIGZvciAoOyBpdCAhPSBtU3VtbWFyaWVzLT5lbmQoKTsgaXQrKykgewogICAgICAgICBib29sIGdvb2QgPSBzYW1lQXR0cmlidXRlcygoKml0KSwgaXRlbSwgZ2V0SWdub3JhYmxlcygpKTsKLSAgICAgICAgQUxPR1YoIk1hdGNoIGFnYWluc3QgJXMgc2F5cyAlZCIsCi0gICAgICAgICAgICAgICgqaXQpLT50b1N0cmluZygpLmNfc3RyKCksIGdvb2QpOworICAgICAgICBBTE9HVigiTWF0Y2ggYWdhaW5zdCAlcyBzYXlzICVkIiwgKCppdCktPnRvU3RyaW5nKCkuY19zdHIoKSwgZ29vZCk7CiAgICAgICAgIGlmIChnb29kKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChpdCA9PSBtU3VtbWFyaWVzLT5lbmQoKSkgewogICAgICAgICAgICAgQUxPR1YoInNhdmUgbmV3IHJlY29yZCIpOwotICAgICAgICAgICAgaXRlbSA9IGl0ZW0tPmR1cCgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICpuaXRlbSA9IGl0ZW0tPmR1cCgpOworICAgICAgICAgICAgaWYgKG5pdGVtID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgidW5hYmxlIHRvIHNhdmUgTWVkaWFNZXRyaWNzIHJlY29yZCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc29ydFByb3BzKGl0ZW0pOwotICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoImNvdW50IiwxKTsKLSAgICAgICAgICAgIG1TdW1tYXJpZXMtPnB1c2hfYmFjayhpdGVtKTsKKyAgICAgICAgICAgIHNvcnRQcm9wcyhuaXRlbSk7CisgICAgICAgICAgICBuaXRlbS0+c2V0SW50MzIoImFnZ3JlZ2F0ZWQiLDEpOworICAgICAgICAgICAgbWVyZ2VSZWNvcmQoKm5pdGVtLCAqaXRlbSk7CisgICAgICAgICAgICBtU3VtbWFyaWVzLT5wdXNoX2JhY2sobml0ZW0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiaW5jcmVtZW50IGV4aXN0aW5nIHJlY29yZCIpOwotICAgICAgICAgICAgKCppdCktPmFkZEludDMyKCJjb3VudCIsMSk7CisgICAgICAgICAgICAoKml0KS0+YWRkSW50MzIoImFnZ3JlZ2F0ZWQiLDEpOwogICAgICAgICAgICAgbWVyZ2VSZWNvcmQoKigqaXQpLCAqaXRlbSk7CiAgICAgfQogfQpAQCAtMTY4LDYgKzE2OCw3MSBAQAogICAgIHJldHVybjsKIH0KIAorLy8ga2VlcCBzb21lIHN0YXRzIGZvciB0aGluZ3M6IHN1bXMsIGNvdW50cywgc3RhbmRhcmQgZGV2aWF0aW9uCisvLyB0aGUgaW50ZWdlciB2ZXJzaW9uIC0tIGFsbCBvZiB0aGVzZSBwaWVjZXMgYXJlIGluIDY0IGJpdHMKK3ZvaWQgTWV0cmljc1N1bW1hcml6ZXI6Om1pbk1heFZhcjY0KE1lZGlhQW5hbHl0aWNzSXRlbSAmc3VtbWF0aW9uLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpbnQgbGVuID0gc3RybGVuKGtleSkgKyAzMjsKKyAgICBjaGFyICp0bXBLZXkgPSAoY2hhciAqKW1hbGxvYyhsZW4pOworCisgICAgaWYgKHRtcEtleSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOIC0gY291bnQgb2Ygc2FtcGxlcworICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubiIsIGtleSk7CisgICAgc3VtbWF0aW9uLmFkZEludDY0KHRtcEtleSwgMSk7CisKKyAgICAvLyB6ZXJvIC0gY291bnQgb2Ygc2FtcGxlcyB0aGF0IGFyZSB6ZXJvCisgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgICAgc25wcmludGYodG1wS2V5LCBsZW4sICIlcy56ZXJvIiwga2V5KTsKKyAgICAgICAgaW50NjRfdCB6ZXJvID0gMDsKKyAgICAgICAgKHZvaWQpIHN1bW1hdGlvbi5nZXRJbnQ2NCh0bXBLZXksJnplcm8pOworICAgICAgICB6ZXJvKys7CisgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHplcm8pOworICAgIH0KKworICAgIC8vIG1pbgorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubWluIiwga2V5KTsKKyAgICBpbnQ2NF90IG1pbiA9IHZhbHVlOworICAgIGlmIChzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZtaW4pKSB7CisgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgeworICAgICAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIG1heAorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubWF4Iiwga2V5KTsKKyAgICBpbnQ2NF90IG1heCA9IHZhbHVlOworICAgIGlmIChzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZtYXgpKSB7CisgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgeworICAgICAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIGNvbXBvbmVudHMgZm9yIG1lYW4sIHN0ZGRldjsKKyAgICAvLyBzdGRkZXYgPSBzcXJ0KDEvNCooc3VteDIgLSAoMipzdW14KnN1bXgvbikgKyAoKHN1bXgvbileMikpKQorICAgIC8vIHN1bSB4CisgICAgc25wcmludGYodG1wS2V5LCBsZW4sICIlcy5zdW1YIiwga2V5KTsKKyAgICBzdW1tYXRpb24uYWRkSW50NjQodG1wS2V5LCB2YWx1ZSk7CisgICAgLy8gc3VtIHheMgorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuc3VtWDIiLCBrZXkpOworICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCh0bXBLZXksIHZhbHVlKnZhbHVlKTsKKworCisgICAgLy8gbGFzdCB0aGluZyB3ZSBkbyAtLSByZW1vdmUgdGhlIGJhc2Uga2V5IGZyb20gdGhlIHN1bW1hdGlvbgorICAgIC8vIHJlY29yZCBzbyB3ZSB3b24ndCBnZXQgY29uZnVzZWQgYWJvdXQgaXQgaGF2aW5nIGJvdGggaW5kaXZpZHVhbAorICAgIC8vIGFuZCBzdW1tYXJ5IGluZm9ybWF0aW9uIGluIHRoZXJlLgorICAgIHN1bW1hdGlvbi5yZW1vdmVQcm9wKGtleSk7CisKKyAgICBmcmVlKHRtcEtleSk7Cit9CisKIAogLy8KIC8vIENvbXBhcmF0b3JzCkBAIC0xODYsMjAgKzI1MSwyMyBAQAogICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoKTogc3VtbSAlcyIsIHN1bW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyOjpzYW1lQXR0cmlidXRlcygpOiBzaW5nbGUgJXMiLCBzaW5nbGUtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKKyAgICAvLyBrZWVwIGRpZmZlcmVudCBzb3VyY2VzL3VzZXJzIHNlcGFyYXRlCisgICAgaWYgKHNpbmdsZS0+bVVpZCAhPSBzdW1tLT5tVWlkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICAvLyB0aGlzIGNhbiBiZSBtYWRlIGJldHRlci4KICAgICBmb3Ioc2l6ZV90IGk9MDtpPHNpbmdsZS0+bVByb3BDb3VudDtpKyspIHsKICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMSA9ICYoc2luZ2xlLT5tUHJvcHNbaV0pOwogICAgICAgICBjb25zdCBjaGFyICphdHRyTmFtZSA9IHByb3AxLT5tTmFtZTsKLSAgICAgICAgQUxPR1YoImNvbXBhcmUgb24gYXR0ciAnJXMnIiwgYXR0ck5hbWUpOwogCiAgICAgICAgIC8vIGlzIGl0IHNvbWV0aGluZyB3ZSBzaG91bGQgaWdub3JlCiAgICAgICAgIGlmIChpZ25vcmFibGUgIT0gTlVMTCkgewogICAgICAgICAgICAgY29uc3QgY2hhciAqKmlnID0gaWdub3JhYmxlOwotICAgICAgICAgICAgd2hpbGUgKCppZykgeworICAgICAgICAgICAgZm9yICg7KmlnOyBpZysrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqaWcsIGF0dHJOYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZysrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCppZykgewogICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSBkb24ndCBtaW5kIHRoYXQgaXQgaGFzIGF0dHIgJyVzJyIsIGF0dHJOYW1lKTsKQEAgLTIxOCwyOSArMjg2LDQyIEBACiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChwcm9wMS0+bVR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDMyOgotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQzMlZhbHVlICE9IHByb3AyLT51LmludDMyVmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmludDMyVmFsdWUgIT0gcHJvcDItPnUuaW50MzJWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQ2NDoKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50NjRWYWx1ZSAhPSBwcm9wMi0+dS5pbnQ2NFZhbHVlKQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQ2NFZhbHVlICE9IHByb3AyLT51LmludDY0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgogICAgICAgICAgICAgICAgIC8vIFhYWDogd2F0Y2ggb3V0IGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucyEKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuZG91YmxlVmFsdWUgIT0gcHJvcDItPnUuZG91YmxlVmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmRvdWJsZVZhbHVlICE9IHByb3AyLT51LmRvdWJsZVZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwcm9wMS0+dS5DU3RyaW5nVmFsdWUsIHByb3AyLT51LkNTdHJpbmdWYWx1ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHByb3AxLT51LkNTdHJpbmdWYWx1ZSwgcHJvcDItPnUuQ1N0cmluZ1ZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuY291bnQgIT0gcHJvcDItPnUucmF0ZS5jb3VudCkKKyAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUucmF0ZS5jb3VudCAhPSBwcm9wMi0+dS5yYXRlLmNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5yYXRlLmR1cmF0aW9uICE9IHByb3AyLT51LnJhdGUuZHVyYXRpb24pCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5yYXRlLmR1cmF0aW9uICE9IHByb3AyLT51LnJhdGUuZHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIGluIGRlZmF1bHQgdHlwZSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0OCwxNSArMzI5LDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXNJZChNZWRpYUFuYWx5dGljc0l0ZW0gKnN1bW0sIE1lZGlhQW5hbHl0aWNzSXRlbSAqc2luZ2xlLCBjb25zdCBjaGFyICoqaWdub3JhYmxlKSB7Ci0KLSAgICAvLyB2ZXJpZnkgc2FtZSB1c2VyCi0gICAgaWYgKHN1bW0tPm1QaWQgIT0gc2luZ2xlLT5tUGlkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBhbmQgZmluYWxseSBkbyB0aGUgbW9yZSBleHBlbnNpdmUgdmFsaWRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcwotICAgIHJldHVybiBzYW1lQXR0cmlidXRlcyhzdW1tLCBzaW5nbGUsIGlnbm9yYWJsZSk7Ci19CiAKIGludCBNZXRyaWNzU3VtbWFyaXplcjo6UHJvcFNvcnRlcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICphaSA9IChNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKilhOwpAQCAtMjY3LDE0ICszMzksOCBAQAogLy8gd2Ugc29ydCBpbiB0aGUgc3VtbWFyaWVzIHNvIHRoYXQgaXQgbG9va3MgcHJldHR5IGluIHRoZSBkdW1wc3lzCiB2b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpzb3J0UHJvcHMoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7CiAgICAgaWYgKGl0ZW0tPm1Qcm9wQ291bnQgIT0gMCkgewotICAgICAgICBpZiAoREVCVUdfU09SVCkgewotICAgICAgICAgICAgQUxPR0QoInNvcnRQcm9wcyhwcmUpOiAlcyIsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KICAgICAgICAgcXNvcnQoaXRlbS0+bVByb3BzLCBpdGVtLT5tUHJvcENvdW50LAogICAgICAgICAgICAgICBzaXplb2YoTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wKSwgTWV0cmljc1N1bW1hcml6ZXI6OlByb3BTb3J0ZXIpOwotICAgICAgICBpZiAoREVCVUdfU09SVCkgewotICAgICAgICAgICAgQUxPR0QoInNvcnRQcm9wcyhwc3QpOiAlcyIsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oCmluZGV4IDBiNjRlYWMuLmE5ZjA3ODYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuaApAQCAtNTksMTAgKzU5LDkgQEAKIAogICAgIC8vIHZhcmlvdXMgY29tcGFyYXRvcnMKICAgICAvLyAiZG8gdGhlc2UgcmVjb3JkcyBoYXZlIHNhbWUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRob3NlIGF0dHJzIgotICAgIC8vIGRpdHRvLCBidXQgd2F0Y2ggZm9yICJlcnJvciIgZmllbGRzCiAgICAgYm9vbCBzYW1lQXR0cmlidXRlcyhNZWRpYUFuYWx5dGljc0l0ZW0gKnN1bW0sIE1lZGlhQW5hbHl0aWNzSXRlbSAqc2luZ2xlLCBjb25zdCBjaGFyICoqaWdub3JlYWJsZXMpOwotICAgIC8vIGF0dHJpYnV0ZXMgKyBmcm9tIHRoZSBzYW1lIGFwcC91c2VyaWQKLSAgICBib29sIHNhbWVBdHRyaWJ1dGVzSWQoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yZWFibGVzKTsKKworICAgIHZvaWQgbWluTWF4VmFyNjQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpOwogCiAgICAgc3RhdGljIGludCBQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogICAgIHZvaWQgc29ydFByb3BzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCmluZGV4IDhjNzQ3ODIuLjZhZjNjOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyQ29kZWMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNDAsNSArNDIsNCBAQAogICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckNvZGVjOjpNZXRyaWNzU3VtbWFyaXplckNvZGVjIik7CiB9CiAKLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwCmluZGV4IDUxNjIwNTkuLmY4ODJjYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAKQEAgLTUxLDM3ICs1MSw0MyBAQAogICAgIHNldElnbm9yYWJsZXMocGxheWVyX2lnbm9yYWJsZSk7CiB9CiAKKy8vIE5COiB0aGlzIGlzIGFsc28gY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAtLSBzbyBzdW1tYXRpb24gPT0gaXRlbQorLy8gTm90IHN1cmUgaWYgd2UgbmVlZCBhIGZsYWcgZm9yIHRoYXQgb3Igbm90LgorLy8gSW4gdGhpcyBwYXJ0aWN1bGFyIG1lcmdlUmVjb3JkKCkgY29kZSAtLSB3ZSdyZScgb2sgZm9yIHRoaXMuCiB2b2lkIE1ldHJpY3NTdW1tYXJpemVyUGxheWVyOjptZXJnZVJlY29yZChNZWRpYUFuYWx5dGljc0l0ZW0gJnN1bW1hdGlvbiwgTWVkaWFBbmFseXRpY3NJdGVtICZpdGVtKSB7CiAKICAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXI6Om1lcmdlUmVjb3JkKCkiKTsKIAotICAgIC8vCi0gICAgLy8gd2Ugc3VtIHRpbWUgJiBmcmFtZXMuCi0gICAgLy8gYmUgY2FyZWZ1bCBhYm91dCBvdXIgc3BlY2lhbCAiLTEiIHZhbHVlcyB0aGF0IGluZGljYXRlICd1bmtub3duJwotICAgIC8vIHRyZWF0IHRob3NlIGFzIDAgW2Jhc2ljYWxseSwgbm90IHN1bW1pbmcgdGhlbSBpbnRvIHRoZSB0b3RhbHNdLgorCiAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CiAgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIGR1cmF0aW9uTXMgb2YgJSIgUFJJZDY0LCBkdXJhdGlvbik7Ci0gICAgICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIixkdXJhdGlvbik7CisgICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwgImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsIGR1cmF0aW9uKTsKICAgICB9CisKICAgICBpbnQ2NF90IHBsYXlpbmcgPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIsICZwbGF5aW5nKSkKKyAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZykpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIHBsYXlpbmdNcyBvZiAlIiBQUklkNjQsIHBsYXlpbmcpOwotICAgICAgICBpZiAocGxheWluZyA+PSAwKSB7Ci0gICAgICAgICAgICBzdW1tYXRpb24uYWRkSW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucGxheWluZ01zIixwbGF5aW5nKTsKLSAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGxheWluZyA+PSAwKSB7CisgICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLHBsYXlpbmcpOworICAgIH0KKwogICAgIGludDY0X3QgZnJhbWVzID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkKKyAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkgewogICAgICAgICBBTE9HVigiZm91bmQgZnJhbWVzcyBvZiAlIiBQUklkNjQsIGZyYW1lcyk7Ci0gICAgICAgIGlmIChmcmFtZXMgPj0gMCkgewotICAgICAgICAgICAgc3VtbWF0aW9uLmFkZEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyIsZnJhbWVzKTsKLSAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWVzID49IDApIHsKKyAgICAgICAgbWluTWF4VmFyNjQoc3VtbWF0aW9uLCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyIsZnJhbWVzKTsKKyAgICB9CisKICAgICBpbnQ2NF90IGRyb3BwZWQgPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLCAmZHJvcHBlZCkpCisgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsICZkcm9wcGVkKSkgewogICAgICAgICBBTE9HVigiZm91bmQgZHJvcHBlZCBvZiAlIiBQUklkNjQsIGRyb3BwZWQpOwotICAgICAgICBpZiAoZHJvcHBlZCA+PSAwKSB7Ci0gICAgICAgICAgICBzdW1tYXRpb24uYWRkSW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsZHJvcHBlZCk7Ci0gICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRyb3BwZWQgPj0gMCkgeworICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsZHJvcHBlZCk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKaW5kZXggNjk5N2I1YS4uZmFlYjBhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawpAQCAtOSwxMyArOSw4IEBACiAgICAgbGliZ3VpIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXgKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKyAgICBsaWJzdGFnZWZyaWdodF9vbXggXAorICAgIGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcgogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFjb2RlY3NlcnZpY2UKIExPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQpAQCAtMzgsMTUgKzMzLDEwIEBACiAgICAgbGliaHdiaW5kZXIgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgbGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXAogICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCiAKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIExPQ0FMX01PRFVMRSA6PSBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKIExPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAppbmRleCBmYzFlNWQ5Li42YjUxMGM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcApAQCAtMjQsMTUgKzI0LDI1IEBACiAKIHNwPElPTVg+IE1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRPTVgoKSB7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT01YTG9jayk7CiAKICAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIG1PTVggPSBuZXcgT01YOworICAgICAgICBtT01YID0gbmV3IE9NWCgpOwogICAgIH0KIAogICAgIHJldHVybiBtT01YOwogfQogCitzcDxJT01YU3RvcmU+IE1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRPTVhTdG9yZSgpIHsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT01YU3RvcmVMb2NrKTsKKworICAgIGlmIChtT01YU3RvcmUuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBtT01YU3RvcmUgPSBuZXcgT01YU3RvcmUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbU9NWFN0b3JlOworfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oCmluZGV4IGQ2NGRlYmIuLjkzMDExMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKQEAgLTE5LDExICsxOSwxMyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL09NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZWRpYUNvZGVjU2VydmljZSA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNTZXJ2aWNlPiwgcHVibGljIEJuTWVkaWFDb2RlY1NlcnZpY2UKK2NsYXNzIE1lZGlhQ29kZWNTZXJ2aWNlIDogcHVibGljIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1NlcnZpY2U+LAorICAgICAgICBwdWJsaWMgQm5NZWRpYUNvZGVjU2VydmljZQogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNTZXJ2aWNlPjsgICAgLy8gZm9yIE1lZGlhQ29kZWNTZXJ2aWNlKCkKIHB1YmxpYzoKQEAgLTMxLDE2ICszMywyMCBAQAogICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIAotICAgIHN0YXRpYyBjb25zdCBjaGFyKiAgZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuY29kZWMiOyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIqICAgIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjIjsgfQogCi0gICAgdmlydHVhbCBzcDxJT01YPiAgICBnZXRPTVgoKTsKKyAgICB2aXJ0dWFsIHNwPElPTVg+ICAgICAgZ2V0T01YKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwogCiBwcml2YXRlOgotICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgc3A8SU9NWD4gICAgICAgICAgICBtT01YOworICAgIE11dGV4ICAgICAgICAgICAgICAgICBtT01YTG9jazsKKyAgICBzcDxJT01YPiAgICAgICAgICAgICAgbU9NWDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgbU9NWFN0b3JlTG9jazsKKyAgICBzcDxJT01YU3RvcmU+ICAgICAgICAgbU9NWFN0b3JlOwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTZjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2plZmZ2QGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCBjNTk5NDRhLi43OWQ2ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtMzIsOCArMzIsOCBAQAogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCiAKICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8b214LzEuMC9PbXguaD4KLSNpbmNsdWRlIDxvbXgvMS4wL09teFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCA2YjMwZGI2Li4yZGFhODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFDYXNTZXJ2aWNlLmNwcCBcCiAgICAgTWVkaWFEcm1TZXJ2aWNlLmNwcCBcCiAgICAgbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oIGIvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxMTE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfTE9BREVSX0hfCi0jZGVmaW5lIE1FRElBX0NBU19MT0FERVJfSF8KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBGYWN0b3J5TG9hZGVyIHsKLXB1YmxpYzoKLSAgICBGYWN0b3J5TG9hZGVyKGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbUZhY3RvcnkoTlVMTCksIG1DcmVhdGVGYWN0b3J5RnVuY05hbWUobmFtZSkge30KLQotICAgIHZpcnR1YWwgfkZhY3RvcnlMb2FkZXIoKSB7IGNsb3NlRmFjdG9yeSgpOyB9Ci0KLSAgICBib29sIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSA9IE5VTEwsCi0gICAgICAgICAgICBUKiogZmFjdG9yeSA9IE5VTEwpOwotCi0gICAgYm9vbCBlbnVtZXJhdGVQbHVnaW5zKHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgVCooKkNyZWF0ZUZhY3RvcnlGdW5jKSgpOwotCi0gICAgTXV0ZXggbU1hcExvY2s7Ci0gICAgVCogbUZhY3Rvcnk7Ci0gICAgY29uc3QgY2hhciAqbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBTdHJpbmc4PiBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXA7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotCi0gICAgYm9vbCBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksCi0gICAgICAgICAgICBUKiogZmFjdG9yeSk7Ci0KLSAgICBib29sIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi0gICAgYm9vbCBvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICBsaWJyYXJ5LT5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkoQ0Ffc3lzdGVtX2lkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLAotICAgICAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gbm8gbHVjaywgaGF2ZSB0byBzZWFyY2gKLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBpZiAobG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgcGx1Z2luUGF0aCwgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KSkgewotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5hZGQoQ0Ffc3lzdGVtX2lkLCBwbHVnaW5QYXRoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgcGx1Z2luIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dJKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICByZXN1bHRzLT5jbGVhcigpOwotCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKHBsdWdpblBhdGgsIHJlc3VsdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6bG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCAhbUZhY3RvcnktPmlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgKmxpYnJhcnkgPSBtTGlicmFyeTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IG1GYWN0b3J5OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OnF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICB2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCBtRmFjdG9yeS0+cXVlcnlQbHVnaW5zKCZkZXNjcmlwdG9ycykgIT0gT0spIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXNjcmlwdG9ycy5iZWdpbigpOyBpdCAhPSBkZXNjcmlwdG9ycy5lbmQoKTsgaXQrKykgewotICAgICAgICByZXN1bHRzLT5wdXNoX2JhY2soUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgaXQtPkNBX3N5c3RlbV9pZCwgaXQtPm5hbWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKSB7Ci0gICAgLy8gZ2V0IHN0cm9uZyBwb2ludGVyIHRvIG9wZW4gc2hhcmVkIGxpYnJhcnkKLSAgICBzc2l6ZV90IGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5pbmRleE9mS2V5KHBhdGgpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcFtpbmRleF0ucHJvbW90ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5hZGQocGF0aCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFtTGlicmFyeS5nZXQoKSkgewotICAgICAgICBtTGlicmFyeSA9IG5ldyBTaGFyZWRMaWJyYXJ5KHBhdGgpOwotICAgICAgICBpZiAoISptTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgbUxpYnJhcnkpOwotICAgIH0KLQotICAgIENyZWF0ZUZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnkgPQotICAgICAgICAoQ3JlYXRlRmFjdG9yeUZ1bmMpbUxpYnJhcnktPmxvb2t1cChtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKTsKLSAgICBpZiAoY3JlYXRlRmFjdG9yeSA9PSBOVUxMIHx8IChtRmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgRmFjdG9yeUxvYWRlcjxUPjo6Y2xvc2VGYWN0b3J5KCkgewotICAgIGRlbGV0ZSBtRmFjdG9yeTsKLSAgICBtRmFjdG9yeSA9IE5VTEw7Ci0gICAgbUxpYnJhcnkuY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTEyODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNhc1NlcnZpY2UiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhLmNhcyIpLCBuZXcgTWVkaWFDYXNTZXJ2aWNlKCkpOwotfQotCi1NZWRpYUNhc1NlcnZpY2U6Ok1lZGlhQ2FzU2VydmljZSgpIDoKLSAgICBtQ2FzTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+KCJjcmVhdGVDYXNGYWN0b3J5IikpLAotICAgIG1EZXNjcmFtYmxlckxvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+KAotICAgICAgICAgICAgImNyZWF0ZURlc2NyYW1ibGVyRmFjdG9yeSIpKSB7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6fk1lZGlhQ2FzU2VydmljZSgpIHsKLSAgICBkZWxldGUgbUNhc0xvYWRlcjsKLSAgICBkZWxldGUgbURlc2NyYW1ibGVyTG9hZGVyOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR1YoImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIG1DYXNMb2FkZXItPmVudW1lcmF0ZVBsdWdpbnMocmVzdWx0cyk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzU3lzdGVtSWRTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZVBsdWdpbjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIENhc0ZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIENhc1BsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgc3A8Q2FzSW1wbD4gY2FzSW1wbCA9IG5ldyBDYXNJbXBsKGxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICh1aW50NjRfdCljYXNJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICZDYXNJbXBsOjpPbkV2ZW50LCAmcGx1Z2luKSA9PSBPSyAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgY2FzSW1wbC0+aW5pdChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICAgICAgKnJlc3VsdCA9IGNhc0ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlRGVzY3JhbWJsZXI6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBEZXNjcmFtYmxlckZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICZwbHVnaW4pID09IE9LCi0gICAgICAgICAgICAgICAgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpyZXN1bHQgPSBuZXcgRGVzY3JhbWJsZXJJbXBsKGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgyOGYyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUNhc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIkZhY3RvcnlMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzRmFjdG9yeTsKLXN0cnVjdCBEZXNjcmFtYmxlckZhY3Rvcnk7Ci0KLWNsYXNzIE1lZGlhQ2FzU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhQ2FzU2VydmljZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PiAqbUNhc0xvYWRlcjsKLSAgICBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4gKm1EZXNjcmFtYmxlckxvYWRlcjsKLQotICAgIE1lZGlhQ2FzU2VydmljZSgpOwotICAgIHZpcnR1YWwgfk1lZGlhQ2FzU2VydmljZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhZHJtL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDNiNTMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoranRpbmtlckBnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKaW5kZXggYjY4NWFlMC4uYjc2N2I4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIk1lZGlhRHJtU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzksNyArMzgsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIE1lZGlhRHJtU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2plZmZ2QGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTIGIvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGI4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitlbGF1cmVudEBnb29nbGUuY29tCitna2FzdGVuQGFuZHJvaWQuY29tCitodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhYmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL09XTkVSUwpAQCAtMCwwICsxIEBACitkd2thbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKaW5kZXggZWMyZjViOS4uZjk5NmY3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCkBAIC0yNiw2ICsyNiwxMCBAQAogI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtMzQsMTU5ICszOCwyMzcgQEAKIAogQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpBQXVkaW9FbmRwb2ludE1hbmFnZXIoKQogICAgICAgICA6IFNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+KCkKLSAgICAgICAgLCBtSW5wdXRzKCkKLSAgICAgICAgLCBtT3V0cHV0cygpIHsKKyAgICAgICAgLCBtU2hhcmVkU3RyZWFtcygpCisgICAgICAgICwgbUV4Y2x1c2l2ZVN0cmVhbXMoKSB7CiB9CiAKIHN0ZDo6c3RyaW5nIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCi0gICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCi0gICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKLSAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOwotICAgIGlmICghaXNMb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJFbmRwb2ludE1hbmFnZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci0gICAgfQorICAgIGludCBpbmRleCA9IDA7CiAKICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlcjoiIDw8ICJcbiI7Ci0gICAgc2l6ZV90IGlucHV0cyA9IG1JbnB1dHMuc2l6ZSgpOwotICAgIHJlc3VsdCA8PCAiSW5wdXQgRW5kcG9pbnRzOiAiIDw8IGlucHV0cyA8PCAiXG4iOwotICAgIGZvciAoY29uc3QgYXV0byAmaW5wdXQgOiBtSW5wdXRzKSB7Ci0gICAgICAgIHJlc3VsdCA8PCAiICBJbnB1dDogIiA8PCBpbnB1dC0+ZHVtcCgpIDw8ICJcbiI7CisKKyAgICBjb25zdCBib29sIGlzU2hhcmVkTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKKyAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1TaGFyZWRMb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKKyAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAorICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CisgICAgaWYgKCFpc1NoYXJlZExvY2tlZCkgeworICAgICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlciBTaGFyZWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAgICAgfQogCi0gICAgc2l6ZV90IG91dHB1dHMgPSBtT3V0cHV0cy5zaXplKCk7Ci0gICAgcmVzdWx0IDw8ICJPdXRwdXQgRW5kcG9pbnRzOiAiIDw8IG91dHB1dHMgPDwgIlxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dCA6IG1PdXRwdXRzKSB7Ci0gICAgICAgIHJlc3VsdCA8PCAiICBPdXRwdXQ6ICIgPDwgb3V0cHV0LT5kdW1wKCkgPDwgIlxuIjsKKyAgICB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNFeGNsdXNpdmVMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAorICAgICAgICAgICAgICAgIFt0aGlzXSgpIC0+IGJvb2wgeyByZXR1cm4gbUV4Y2x1c2l2ZUxvY2sudHJ5X2xvY2soKTsgfSAvKiBmICovLAorICAgICAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAorICAgICAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOworICAgICAgICBpZiAoIWlzRXhjbHVzaXZlTG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlciBFeGNsdXNpdmUgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPDwgIkV4Y2x1c2l2ZSBNTUFQIEVuZHBvaW50czogIiA8PCBtRXhjbHVzaXZlU3RyZWFtcy5zaXplKCkgPDwgIlxuIjsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CisgICAgICAgICAgICByZXN1bHQgPDwgIiAgIyIgPDwgaW5kZXgrKyA8PCAiOiI7CisgICAgICAgICAgICByZXN1bHQgPDwgb3V0cHV0LT5kdW1wKCkgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0V4Y2x1c2l2ZUxvY2tlZCkgeworICAgICAgICAgICAgbUV4Y2x1c2l2ZUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaXNMb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmVzdWx0IDw8ICJTaGFyZWQgRW5kcG9pbnRzOiAiIDw8IG1TaGFyZWRTdHJlYW1zLnNpemUoKSA8PCAiXG4iOworICAgIGluZGV4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlucHV0IDogbVNoYXJlZFN0cmVhbXMpIHsKKyAgICAgICAgcmVzdWx0IDw8ICIgICMiIDw8IGluZGV4KysgPDwgIjoiOworICAgICAgICByZXN1bHQgPDwgaW5wdXQtPmR1bXAoKSA8PCAiXG4iOworICAgIH0KKworICAgIGlmIChpc1NoYXJlZExvY2tlZCkgeworICAgICAgICBtU2hhcmVkTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotQUF1ZGlvU2VydmljZUVuZHBvaW50ICpBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbnVsbHB0cjsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlICpjYXB0dXJlID0gbnVsbHB0cjsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5ICpwbGF5ZXIgPSBudWxscHRyOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCitzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCisgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50OworICAgIGZvciAoY29uc3QgYXV0byBlcCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CisgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5maW5kRXhjbHVzaXZlRW5kcG9pbnRfbCgpLCBmb3VuZCAlcCBmb3IgZGV2aWNlID0gJWQiLAorICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOworICAgIHJldHVybiBlbmRwb2ludDsKK30KKworLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCitzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZmluZFNoYXJlZEVuZHBvaW50X2woCisgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50OworICAgIGZvciAoY29uc3QgYXV0byBlcCAgOiBtU2hhcmVkU3RyZWFtcykgeworICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIuZmluZFNoYXJlZEVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkIiwKKyAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKKyAgICByZXR1cm4gZW5kcG9pbnQ7Cit9CisKK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5FeGNsdXNpdmVFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvcGVuU2hhcmVkRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKKyAgICB9Cit9CisKK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRXhjbHVzaXZlRW5kcG9pbnQoCisgICAgICAgIEFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UgX191bnVzZWQsCisgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUV4Y2x1c2l2ZUxvY2spOworCisgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7CiAKICAgICAvLyBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBlbmRwb2ludC4KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woY29uZmlndXJhdGlvbik7CiAKKyAgICAvLyBJZiB3ZSBmaW5kIGFuIGV4aXN0aW5nIG9uZSB0aGVuIHRoaXMgb25lIGNhbm5vdCBiZSBleGNsdXNpdmUuCisgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICAvLyBBbHJlYWR5IG9wZW4gc28gZG8gbm90IGFsbG93IGEgc2Vjb25kIHN0cmVhbS4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gZW5kcG9pbnRNTWFwID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKyAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSxjcmVhdGVkIE1NQVAgJXAiLCBlbmRwb2ludE1NYXAuZ2V0KCkpOworICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50TU1hcDsKIAotCi0gICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgZm9yIChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVwIDogbUlucHV0cykgewotICAgICAgICAgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgIGZvciAoQUF1ZGlvU2VydmljZUVuZHBvaW50ICplcCA6IG1PdXRwdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHBvc3NpYmxlIGRpcmVjdGlvbnMuCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KCksIGZvdW5kICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAotICAgICAgICAgIGVuZHBvaW50LCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIChpbnQpZGlyZWN0aW9uKTsKLQotICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW4gZXhpc3Rpbmcgb25lIHRoZW4gb3BlbiBhIG5ldyBvbmUuCi0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gd2UgbXVzdCBjYWxsIG9wZW5TdHJlYW0gd2l0aCBhdWRpb3NlcnZlciBpZGVudGl0eQotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgc3dpdGNoKGRpcmVjdGlvbikgewotICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgICAgIGNhcHR1cmUgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhdWRpb1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gY2FwdHVyZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgcGxheWVyID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYXVkaW9TZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IHBsYXllcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50TU1hcCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpmaW5kRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgZW5kcG9pbnQ7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMucHVzaF9iYWNrKGNhcHR1cmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5wdXNoX2JhY2socGxheWVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludCwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCIsCisgICAgICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOwogICAgIH0KIAotICAgIGlmIChlbmRwb2ludCAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludCgpLCBzYW1wbGVSYXRlID0gJWQsIGZyYW1lc1BlckJ1cnN0ID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpLCBlbmRwb2ludC0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CisgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgotICAgICAgICBlbmRwb2ludC0+c2V0UmVmZXJlbmNlQ291bnQoZW5kcG9pbnQtPmdldFJlZmVyZW5jZUNvdW50KCkgKyAxKTsKKyAgICAgICAgZW5kcG9pbnQtPnNldE9wZW5Db3VudChlbmRwb2ludC0+Z2V0T3BlbkNvdW50KCkgKyAxKTsKICAgICB9CiAgICAgcmV0dXJuIGVuZHBvaW50OwogfQogCi12b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKnNlcnZpY2VFbmRwb2ludCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoc2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuU2hhcmVkRW5kcG9pbnQoCisgICAgICAgIEFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UsCisgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogCi0gICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgotICAgIGludDMyX3QgbmV3UmVmQ291bnQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldFJlZmVyZW5jZUNvdW50KCkgLSAxOwotICAgIHNlcnZpY2VFbmRwb2ludC0+c2V0UmVmZXJlbmNlQ291bnQobmV3UmVmQ291bnQpOwotICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmNsb3NlRW5kcG9pbnQoJXApIG5ld1JlZkNvdW50ID0gJWQiLAotICAgICAgICAgIHNlcnZpY2VFbmRwb2ludCwgbmV3UmVmQ291bnQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaGFyZWRMb2NrKTsKIAotICAgIC8vIElmIG5vIGxvbmdlciBpbiB1c2UgdGhlbiBjbG9zZSBhbmQgZGVsZXRlIGl0LgotICAgIGlmIChuZXdSZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBzZXJ2aWNlRW5kcG9pbnQtPmdldERpcmVjdGlvbigpOwotICAgICAgICAvLyBUcmFjayBlbmRwb2ludHMgYmFzZWQgb24gcmVxdWVzdGVkIGRldmljZUlkIGJlY2F1c2UgVU5TUEVDSUZJRUQKLSAgICAgICAgLy8gY2FuIGNoYW5nZSB0byBhIHNwZWNpZmljIGRldmljZSBhZnRlciBvcGVuaW5nLgotICAgICAgICBpbnQzMl90IGRldmljZUlkID0gc2VydmljZUVuZHBvaW50LT5nZXRSZXF1ZXN0ZWREZXZpY2VJZCgpOworICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24gPSByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBjb25maWd1cmF0aW9uLmdldERpcmVjdGlvbigpOwogCisgICAgLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBlbmRwb2ludCA9IGZpbmRTaGFyZWRFbmRwb2ludF9sKGNvbmZpZ3VyYXRpb24pOworCisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBleGlzdGluZyBvbmUgdGhlbiBvcGVuIGEgbmV3IG9uZS4KKyAgICBpZiAoZW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAvLyB3ZSBtdXN0IGNhbGwgb3BlblN0cmVhbSB3aXRoIGF1ZGlvc2VydmVyIGlkZW50aXR5CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgICAgIG1JbnB1dHMuZXJhc2UoCi0gICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtSW5wdXRzLmJlZ2luKCksIG1JbnB1dHMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksIG1JbnB1dHMuZW5kKCkpOworICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoYWF1ZGlvU2VydmljZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgotICAgICAgICAgICAgICAgIG1PdXRwdXRzLmVyYXNlKAotICAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobU91dHB1dHMuYmVnaW4oKSwgbU91dHB1dHMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksIG1PdXRwdXRzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludCA9IG5ldyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFhdWRpb1NlcnZpY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNoYXJlZFN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5TaGFyZWRFbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAorICAgICAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKworICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IHVuZGVyIHRoaXMgbG9jay4KKyAgICAgICAgZW5kcG9pbnQtPnNldE9wZW5Db3VudChlbmRwb2ludC0+Z2V0T3BlbkNvdW50KCkgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZHBvaW50OworfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+c2VydmljZUVuZHBvaW50KSB7CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludC0+Z2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICByZXR1cm4gY2xvc2VFeGNsdXNpdmVFbmRwb2ludChzZXJ2aWNlRW5kcG9pbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjbG9zZVNoYXJlZEVuZHBvaW50KHNlcnZpY2VFbmRwb2ludCk7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFeGNsdXNpdmVFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCkgeworICAgIGlmIChzZXJ2aWNlRW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1FeGNsdXNpdmVMb2NrKTsKKyAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CisgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOworCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZXJhc2UoCisgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobUV4Y2x1c2l2ZVN0cmVhbXMuYmVnaW4oKSwgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksCisgICAgICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCkpOworCiAgICAgICAgIHNlcnZpY2VFbmRwb2ludC0+Y2xvc2UoKTsKLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludCgpIGRlbGV0ZSAlcCBmb3IgZGV2aWNlICVkLCBkaXIgPSAlZCIsCi0gICAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludCwgZGV2aWNlSWQsIChpbnQpZGlyZWN0aW9uKTsKLSAgICAgICAgZGVsZXRlIHNlcnZpY2VFbmRwb2ludDsKKyAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFeGNsdXNpdmVFbmRwb2ludCgpICVwIGZvciBkZXZpY2UgJWQiLAorICAgICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VTaGFyZWRFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCkgeworICAgIGlmIChzZXJ2aWNlRW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaGFyZWRMb2NrKTsKKyAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CisgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOworCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgbVNoYXJlZFN0cmVhbXMuZXJhc2UoCisgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobVNoYXJlZFN0cmVhbXMuYmVnaW4oKSwgbVNoYXJlZFN0cmVhbXMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksCisgICAgICAgICAgICAgICAgbVNoYXJlZFN0cmVhbXMuZW5kKCkpOworCisgICAgICAgIHNlcnZpY2VFbmRwb2ludC0+Y2xvc2UoKTsKKyAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VTaGFyZWRFbmRwb2ludCgpICVwIGZvciBkZXZpY2UgJWQiLAorICAgICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAyNTExYjJmLi4zMmM4NDU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtMjQsMTEgKzI0LDEyIEBACiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotY2xhc3MgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIDogcHVibGljIGFuZHJvaWQ6OlNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+eworY2xhc3MgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIDogcHVibGljIGFuZHJvaWQ6OlNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+IHsKIHB1YmxpYzoKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIoKTsKICAgICB+QUF1ZGlvRW5kcG9pbnRNYW5hZ2VyKCkgPSBkZWZhdWx0OwpAQCAtNDksMjIgKzUwLDQyIEBACiAgICAgICogRmluZCBhIHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoZSBnaXZlbiBkZXZpY2VJZCBhbmQgZGlyZWN0aW9uLgogICAgICAqIElmIGFuIGVuZHBvaW50IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgdGhlbiB0cnkgdG8gY3JlYXRlIG9uZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2VJZAotICAgICAqIEBwYXJhbSBkaXJlY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGxwdHIKKyAgICAgKiBAcGFyYW0gYXVkaW9TZXJ2aWNlCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gc2hhcmluZ01vZGUKKyAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGwKICAgICAgKi8KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKm9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CiAKLSAgICB2b2lkIGNsb3NlRW5kcG9pbnQoQUF1ZGlvU2VydmljZUVuZHBvaW50ICpzZXJ2aWNlRW5kcG9pbnQpOworICAgIHZvaWQgY2xvc2VFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAKIHByaXZhdGU6CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuRXhjbHVzaXZlRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCi0gICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlblNoYXJlZEVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAotICAgIHN0ZDo6dmVjdG9yPEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUgKj4gbUlucHV0czsKLSAgICBzdGQ6OnZlY3RvcjxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5ICo+IG1PdXRwdXRzOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZmluZFNoYXJlZEVuZHBvaW50X2woCisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKworICAgIHZvaWQgY2xvc2VFeGNsdXNpdmVFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CisgICAgdm9pZCBjbG9zZVNoYXJlZEVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKKworICAgIC8vIFVzZSBzZXBhcmF0ZSBsb2NrcyBiZWNhdXNlIG9wZW5pbmcgYSBTaGFyZWQgZW5kcG9pbnQgcmVxdWlyZXMgb3BlbmluZyBhbiBFeGNsdXNpdmUgb25lLgorICAgIC8vIFRoYXQgY291bGQgY2F1c2UgYSByZWN1cnNpdmUgbG9jay4KKyAgICAvLyBMb2NrIG1TaGFyZWRMb2NrIGJlZm9yZSBtRXhjbHVzaXZlTG9jay4KKyAgICAvLyBpdCBpcyBPSyB0byBvbmx5IGxvY2sgbUV4Y2x1c2l2ZUxvY2suCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRMb2NrOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4+ICBtU2hhcmVkU3RyZWFtczsKKworICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhjbHVzaXZlTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPj4gICAgbUV4Y2x1c2l2ZVN0cmVhbXM7CiAKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggMzk5MjcxOS4uNWEzNDg4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTE4LDkgKzE4LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3N0cmVhbT4KLS8vI2luY2x1ZGUgPHRpbWUuaD4KLS8vI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CkBAIC0zNSwxOCArMzUsMTMgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogI2RlZmluZSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyAgIDgKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFVRElPX0hBTkRMRV9UWVBFX1NUUkVBTQotfSBhYXVkaW9fc2VydmljZV9oYW5kbGVfdHlwZV90Owotc3RhdGljX2Fzc2VydChBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNIDwgSEFORExFX1RSQUNLRVJfTUFYX1RZUEVTLCAiVG9vIG1hbnkgaGFuZGxlIHR5cGVzLiIpOwordXNpbmcgYW5kcm9pZDo6QUF1ZGlvU2VydmljZTsKIAogYW5kcm9pZDo6QUF1ZGlvU2VydmljZTo6QUF1ZGlvU2VydmljZSgpCiAgICAgOiBCbkFBdWRpb1NlcnZpY2UoKSB7CkBAIC03MCw3ICs2NSw4IEBACiAgICAgICAgIHJlc3VsdCA9IHNzLnN0cigpOwogICAgICAgICBBTE9HVygiJXMiLCByZXN1bHQuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gbUhhbmRsZVRyYWNrZXIuZHVtcCgpCisgICAgICAgIHJlc3VsdCA9ICItLS0tLS0tLS0tLS0gQUF1ZGlvIFNlcnZpY2UgLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICsgbVN0cmVhbVRyYWNrZXIuZHVtcCgpCiAgICAgICAgICAgICAgICAgICsgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5kdW1wKCkKICAgICAgICAgICAgICAgICAgKyBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCkuZHVtcCgpOwogICAgIH0KQEAgLTExNCwyMyArMTEwLDIwIEBACiAgICAgICAgICAgICAgICAgbUF1ZGlvQ2xpZW50LmNsaWVudFVpZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHsKICAgICAgICAgICAgIGluU2VydmljZSA9IHJlcXVlc3QuaXNJblNlcnZpY2UoKTsKICAgICAgICAgfQotICAgICAgICBzZXJ2aWNlU3RyZWFtID0gbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKG1BdWRpb0NsaWVudCwgaW5TZXJ2aWNlKTsKLSAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9IG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCgqdGhpcywgaW5TZXJ2aWNlKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byB1c2luZyBhIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgICAgIC8vIENsZWFyIGl0IHNvIHdlIGNhbiBwb3NzaWJseSBmYWxsIGJhY2sgdG8gdXNpbmcgYSBzaGFyZWQgc3RyZWFtLgogICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKSwgY291bGQgbm90IG9wZW4gaW4gRVhDTFVTSVZFIG1vZGUiKTsKICAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCiAgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwotICAgICAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMTM5LDE3ICsxMzIsMTIgQEAKICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewotICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbUhhbmRsZVRyYWNrZXIucHV0KEFBVURJT19IQU5ETEVfVFlQRV9TVFJFQU0sIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwotICAgICAgICBpZiAoaGFuZGxlIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogaGFuZGxlIHRhYmxlIGZ1bGwiKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0tPmNsb3NlKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpOiBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOwotICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgICAgICAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOwotICAgICAgICB9CisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtU3RyZWFtVHJhY2tlci5hZGRTdHJlYW1Gb3JIYW5kbGUoc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0tPnNldEhhbmRsZShoYW5kbGUpOworICAgICAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOworICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7CisgICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuY29weUZyb20oKnNlcnZpY2VTdHJlYW0pOwogICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgIH0KIH0KQEAgLTE1NywzMCArMTQ1LDMyIEBACiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIC8vIENoZWNrIHBlcm1pc3Npb24gYW5kIG93bmVyc2hpcCBmaXJzdC4KICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KIAogICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlLmNsb3NlU3RyZWFtKDB4JTA4WCkiLCBzdHJlYW1IYW5kbGUpOwogICAgIC8vIFJlbW92ZSBoYW5kbGUgZnJvbSB0cmFja2VyIHNvIHRoYXQgd2UgY2Fubm90IGxvb2sgdXAgdGhlIHJhdyBhZGRyZXNzIGFueSBtb3JlLgotICAgIHNlcnZpY2VTdHJlYW0gPSAoQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKikKLSAgICAgICAgICAgIG1IYW5kbGVUcmFja2VyLnJlbW92ZShBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gIT0gbnVsbHB0cikgeworICAgIC8vIHJlbW92ZVN0cmVhbUJ5SGFuZGxlKCkgdXNlcyBhIGxvY2sgc28gdGhhdCBpZiB0aGVyZSBhcmUgdHdvIHNpbXVsdGFuZW91cyBjbG9zZXMKKyAgICAvLyB0aGVuIG9ubHkgb25lIHdpbGwgZ2V0IHRoZSBwb2ludGVyIGFuZCBkbyB0aGUgY2xvc2UuCisgICAgc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLnJlbW92ZVN0cmVhbUJ5SGFuZGxlKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLT5jbG9zZSgpOwogICAgICAgICBwaWRfdCBwaWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclByb2Nlc3NJZCgpOwogICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnVucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpIGJlaW5nIGhhbmRsZWQgYnkgYW5vdGhlciB0aHJlYWQiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogfQogCi1BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqQUF1ZGlvU2VydmljZTo6Y29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKLSAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgY29uc3QgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gKEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICopCi0gICAgICAgICAgICBtSGFuZGxlVHJhY2tlci5nZXQoQUFVRElPX0hBTkRMRV9UWVBFX1NUUkVBTSwgKGFhdWRpb19oYW5kbGVfdClzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtICE9IG51bGxwdHIpIHsKKworc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1NlcnZpY2U6OmNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oCisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLmdldFN0cmVhbUJ5SGFuZGxlKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBPbmx5IGFsbG93IG93bmVyIG9yIHRoZSBhYXVkaW8gc2VydmljZSB0byBhY2Nlc3MgdGhlIHN0cmVhbS4KICAgICAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VzZXJJZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgY29uc3QgdWlkX3Qgb3duZXJVc2VySWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclVzZXJJZCgpOwpAQCAtMjAwLDMwICsxOTAsMzAgQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpnZXRTdHJlYW1EZXNjcmlwdGlvbigKICAgICAgICAgICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5nZXREZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKICAgICAvLyBwYXJjZWxhYmxlLmR1bXAoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnN0YXJ0KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RhcnQoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KQEAgLTIzMiw5ICsyMjIsOSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+c3RvcCgpOwpAQCAtMjQyLDggKzIzMiw4IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CkBAIC0yNTMsOCArMjQzLDggQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQpAQCAtMjc4LDggKzI2OCw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKQEAgLTI5NSw4ICsyODUsOCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0YXJ0Q2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RhcnRDbGllbnQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLAogICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwpAQCAtMzA2LDggKzI5Niw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAppbmRleCA4NDIxZWZjLi5lZWYwODI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCkBAIC0yNCwxMSArMjQsMTMgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgInV0aWxpdHkvSGFuZGxlVHJhY2tlci5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKKworI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKKyNpbmNsdWRlICJBQXVkaW9TdHJlYW1UcmFja2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDksNDUgKzUxLDUzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogCi0gICAgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBMb29rdXAgc3RyZWFtIGFuZCB0aGVuIHZhbGlkYXRlIGFjY2VzcyB0byB0aGUgc3RyZWFtLgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKKyAgICAgICAgICAgIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CiAKLSAgICBIYW5kbGVUcmFja2VyIG1IYW5kbGVUcmFja2VyOwogCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgbUF1ZGlvQ2xpZW50OwogCisgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1UcmFja2VyICAgICAgICAgICAgICAgICBtU3RyZWFtVHJhY2tlcjsKKwogICAgIGVudW0gY29uc3RhbnRzIHsKICAgICAgICAgREVGQVVMVF9BVURJT19QUklPUklUWSA9IDIKICAgICB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggMGY4NjNmZS4uMzA5NWJjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zMywxNyArMzMsMTQgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi0jZGVmaW5lIE1JTl9USU1FT1VUX05BTk9TICAgICAgICAoMTAwMCAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpCi0KLS8vIFdhaXQgYXQgbGVhc3QgdGhpcyBtYW55IHRpbWVzIGxvbmdlciB0aGFuIHRoZSBvcGVyYXRpb24gc2hvdWxkIHRha2UuCi0jZGVmaW5lIE1JTl9USU1FT1VUX09QRVJBVElPTlMgICAgNAotCi0vLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgaW4gZnJhbWVzLiBUaGUgZWZmZWN0aXZlIHNpemUgY2FuIGJlIHR1bmVkIHNtYWxsZXIgYXQgcnVudGltZS4KLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkgICAoNDggKiA4KQorQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgeworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSBkZXN0cm95aW5nIGVuZHBvaW50ICVwIiwgdGhpcyk7Cit9CiAKIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CkBAIC01MywxOSArNTAsMjAgQEAKICAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAogICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CiAgICAgaWYgKCFpc0xvY2tlZCkgewotICAgICAgICByZXN1bHQgPDwgIkVuZHBvaW50TWFuYWdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAgICAgfQogCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKnN0cmVhbSA9IG1TdHJlYW1JbnRlcm5hbDsKLSAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJudWxsIHN0cmVhbSEiIDw8ICJcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0IDw8ICJtbWFwIHN0cmVhbTogcmF0ZSA9ICIgPDwgc3RyZWFtLT5nZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKLSAgICB9Ci0KKyAgICByZXN1bHQgPDwgIiAgICBEaXJlY3Rpb246ICAgICAgICAgICAgIiA8PCAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJPVVRQVVQiIDogIklOUFVUIikgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBSZWZlcmVuY2UgQ291bnQ6ICAgICAgIiA8PCBtT3BlbkNvdW50IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUmVxdWVzdGVkIERldmljZSBJZDogICIgPDwgbVJlcXVlc3RlZERldmljZUlkIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFJlZ2lzdGVyZWQgU3RyZWFtczoiIDw8ICJcbiI7Ci0gICAgZm9yIChzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgcmVzdWx0IDw8IHNoYXJlZFN0cmVhbS0+ZHVtcCgpOworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgIHJlc3VsdCA8PCBzdHJlYW0tPmR1bXAoKSA8PCAiXG4iOwogICAgIH0KIAogICAgIGlmIChpc0xvY2tlZCkgewpAQCAtNzQsMTEwICs3Miw0NCBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLS8vIFNldCB1cCBhbiBFWENMVVNJVkUgTU1BUCBzdHJlYW0gdGhhdCB3aWxsIGJlIHNoYXJlZC4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6Om9wZW4oY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikgewotICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKTsKLSAgICBtU3RyZWFtSW50ZXJuYWwgPSBnZXRTdHJlYW1JbnRlcm5hbCgpOwotCi0gICAgQXVkaW9TdHJlYW1CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7Ci0gICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgotICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOwotICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKLSAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKLSAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOwotICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGdldERpcmVjdGlvbigpKTsKLSAgICBidWlsZGVyLnNldEJ1ZmZlckNhcGFjaXR5KERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZKTsKLQotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5vcGVuKGJ1aWxkZXIpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpjbG9zZSgpIHsKLSAgICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmNsb3NlKCk7Ci19Ci0KLS8vIFRPRE8sIG1heWJlIHVzZSBhbiBpbnRlcmZhY2UgdG8gcmVkdWNlIGV4cG9zdXJlCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpyZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPnNoYXJlZFN0cmVhbSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgbVJlZ2lzdGVyZWRTdHJlYW1zLnB1c2hfYmFjayhzaGFyZWRTdHJlYW0pOwotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnVucmVnaXN0ZXJTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD5zaGFyZWRTdHJlYW0pIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lcmFzZShzdGQ6OnJlbW92ZShtUmVnaXN0ZXJlZFN0cmVhbXMuYmVnaW4oKSwgbVJlZ2lzdGVyZWRTdHJlYW1zLmVuZCgpLCBzaGFyZWRTdHJlYW0pLAotICAgICAgICAgICAgICBtUmVnaXN0ZXJlZFN0cmVhbXMuZW5kKCkpOwotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgaWYgKCsrbVJ1bm5pbmdTdHJlYW1zID09IDEpIHsKLSAgICAgICAgLy8gVE9ETyB1c2UgcmVhbC10aW1lIHRlY2huaXF1ZSB0byBhdm9pZCBtdXRleCwgZWcuIGF0b21pYyBjb21tYW5kIEZJRk8KLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0YXJ0KCk7Ci0gICAgICAgIHN0YXJ0U2hhcmluZ1RocmVhZF9sKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKSB7Ci0gICAgLy8gRG9uJ3QgbG9jayBoZXJlIGJlY2F1c2UgdGhlIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcyBhbHNvIHVzZXMgdGhlIGxvY2suCi0gICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1zID09IDApIHsgLy8gYXRvbWljCi0gICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7Ci0gICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLXN0YXRpYyB2b2lkICphYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2Modm9pZCAqY29udGV4dCkgewotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSAoQUF1ZGlvU2VydmljZUVuZHBvaW50ICopIGNvbnRleHQ7Ci0gICAgaWYgKGVuZHBvaW50ICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50LT5jYWxsYmFja0xvb3AoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0U2hhcmluZ1RocmVhZF9sKCkgewotICAgIC8vIExhdW5jaCB0aGUgY2FsbGJhY2sgbG9vcCB0aHJlYWQuCi0gICAgaW50NjRfdCBwZXJpb2ROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAotICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywgdGhpcyk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0b3BTaGFyaW5nVGhyZWFkKCkgewotICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5qb2luVGhyZWFkKE5VTEwpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICBmb3IoYXV0byBzaGFyZWRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgc2hhcmVkU3RyZWFtLT5zdG9wKCk7Ci0gICAgICAgIHNoYXJlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgIGZvciAoY29uc3QgYXV0byBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtLT5zdG9wKCk7CisgICAgICAgIHN0cmVhbS0+ZGlzY29ubmVjdCgpOwogICAgIH0KICAgICBtUmVnaXN0ZXJlZFN0cmVhbXMuY2xlYXIoKTsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6cmVnaXN0ZXJTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+c3RyZWFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKKyAgICBtUmVnaXN0ZXJlZFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6dW5yZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT5zdHJlYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lcmFzZShzdGQ6OnJlbW92ZSgKKyAgICAgICAgICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5iZWdpbigpLCBtUmVnaXN0ZXJlZFN0cmVhbXMuZW5kKCksIHN0cmVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lbmQoKSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwogYm9vbCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6Om1hdGNoZXMoY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikgeworICAgIGlmIChjb25maWd1cmF0aW9uLmdldERpcmVjdGlvbigpICE9IGdldERpcmVjdGlvbigpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSAhPSBtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSkgeworICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gbVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgeworICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBlNDBhNjcwLi4yZWY2MjM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtMjQsNzAgKzI0LDkzIEBACiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKLSNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCi0jaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKLSNpbmNsdWRlICJBQXVkaW9NaXhlci5oIgotI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKKworI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgeworLyoqCisgKiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgaXMgdXNlZCBieSBhIHN1YmNsYXNzIG9mIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlCisgKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIGF1ZGlvIGRldmljZSBvciBwb3J0LgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQKKyAgICAgICAgOiBwdWJsaWMgdmlydHVhbCBhbmRyb2lkOjpSZWZCYXNlCisgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpID0gZGVmYXVsdDsKIAotICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKLSAgICBpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKTsgfQotICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsgIH0KLSAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOyAgfQorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSA9IDA7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0Q2xpZW50KCVwLCAuLi4pIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIsICZjbGllbnQpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RvcENsaWVudCguLi4pIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcworICAgICAqIEBwYXJhbSB0aW1lTmFub3MKKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgb3Igb3RoZXIgbmVnYXRpdmUgZXJyb3IKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CisKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJ1cnN0OworICAgIH0KIAogICAgIGludDMyX3QgZ2V0UmVxdWVzdGVkRGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdGVkRGV2aWNlSWQ7IH0KLSAgICBpbnQzMl90IGdldERldmljZUlkKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpOyB9Ci0KLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXREaXJlY3Rpb24oKTsgfQotCi0gICAgdm9pZCBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKLQotICAgIHZpcnR1YWwgdm9pZCAqY2FsbGJhY2tMb29wKCkgPSAwOwotCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIHVuZGVyIGEgbXV0ZXguCi0gICAgaW50MzJfdCBnZXRSZWZlcmVuY2VDb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWZlcmVuY2VDb3VudDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBBQXVkaW9FbmRwb2ludE1hbmFnZXIgdW5kZXIgYSBtdXRleC4KLSAgICB2b2lkIHNldFJlZmVyZW5jZUNvdW50KGludDMyX3QgY291bnQpIHsKLSAgICAgICAgbVJlZmVyZW5jZUNvdW50ID0gY291bnQ7Ci0gICAgfQogCiAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pOwogCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpID0gMDsKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBBQXVkaW9FbmRwb2ludE1hbmFnZXIgdW5kZXIgYSBtdXRleC4KKyAgICBpbnQzMl90IGdldE9wZW5Db3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PcGVuQ291bnQ7CisgICAgfQogCi0gICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEFBdWRpb0VuZHBvaW50TWFuYWdlciB1bmRlciBhIG11dGV4LgorICAgIHZvaWQgc2V0T3BlbkNvdW50KGludDMyX3QgY291bnQpIHsKKyAgICAgICAgbU9wZW5Db3VudCA9IGNvdW50OworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKIAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CiAKLSAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPj4gbVJlZ2lzdGVyZWRTdHJlYW1zOworICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOwogCi0gICAgc3RkOjphdG9taWM8aW50PiAgICAgICAgIG1SdW5uaW5nU3RyZWFtc3swfTsKKyAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICAgbU1tYXBDbGllbnQ7ICAgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gb3BlbiBhbmQgc3RhcnRTdHJlYW0KIAotcHJpdmF0ZToKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFNoYXJpbmdUaHJlYWQoKTsKLQotICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgICAgICptU3RyZWFtSW50ZXJuYWwgPSBudWxscHRyOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtUmVmZXJlbmNlQ291bnQgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtT3BlbkNvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZERldmljZUlkID0gMDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCmluZGV4IDZhMzczMzAuLmM3ZDliOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCkBAIC0zMCwyMCArMzAsMjIgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6OkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1TdHJlYW1JbnRlcm5hbENhcHR1cmUoYXVkaW9TZXJ2aWNlLCB0cnVlKSB7CisgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbENhcHR1cmU7CiB9CiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKCkgewogICAgIGRlbGV0ZSBtRGlzdHJpYnV0aW9uQnVmZmVyOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6b3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6b3Blbihjb25maWd1cmF0aW9uKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgZGVsZXRlIG1EaXN0cmlidXRpb25CdWZmZXI7CiAgICAgICAgIGludCBkaXN0cmlidXRpb25CdWZmZXJTaXplQnl0ZXMgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNQZXJCdXJzdCgpCkBAIC02Miw2ICs2NCw5IEBACiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5pc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKKworICAgICAgICBpbnQ2NF90IG1tYXBGcmFtZXNSZWFkID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUmVhZCgpOworCiAgICAgICAgIC8vIFJlYWQgYXVkaW8gZGF0YSBmcm9tIHN0cmVhbSB1c2luZyBhIGJsb2NraW5nIHJlYWQuCiAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPnJlYWQobURpc3RyaWJ1dGlvbkJ1ZmZlciwgZ2V0RnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7CkBAIC03NCwxOCArNzksNDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIERpc3RyaWJ1dGUgZGF0YSB0byBlYWNoIGFjdGl2ZSBzdHJlYW0uCi0gICAgICAgIHsgLy8gdXNlIGxvY2sgZ3VhcmQKKyAgICAgICAgeyAvLyBicmFja2V0cyBhcmUgZm9yIGxvY2tfZ3VhcmQKKwogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgICAgICAgICBmb3IgKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRTdHJlYW0tPmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzaGFyZWRTdHJlYW0tPmdldERhdGFGaWZvQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3dDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlmby0+d3JpdGUobURpc3RyaWJ1dGlvbkJ1ZmZlciwgZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jayB0aGUgQXVkaW9GaWZvIHRvIHByb3RlY3QgYWdhaW5zdCBjbG9zZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgRmlmb0J1ZmZlciAqZmlmbyA9IHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhRmlmb0J1ZmZlcl9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmbyAhPSBudWxscHRyKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgb2Zmc2V0IGJldHdlZW4gZnJhbWVQb3NpdGlvbiBpbiBjbGllbnQncyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2cyB0aGUgdW5kZXJseWluZyBNTUFQIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBpbmRpY2VzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbk9mZnNldCA9IG1tYXBGcmFtZXNSZWFkIC0gY2xpZW50RnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJmbG93Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWZvLT53cml0ZShtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzV3JpdHRlbiA9IGZpZm8tPmdldFdyaXRlQ291bnRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlZFN0cmVhbS0+bWFya1RyYW5zZmVyVGltZShBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50RnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRpb24gb2YgZGF0YSBiZWluZyB3cml0dGVuIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYnVmZmVyLiBJdCBpcyBzZW50IHRvIHRoZSBjbGllbnQgYW5kIHVzZWQgaW4gdGhlIHRpbWluZyBtb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGVjaWRlIHdoZW4gZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSB0byByZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcChjbGllbnRGcmFtZXNXcml0dGVuLCBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+bWFya1RyYW5zZmVyVGltZSh0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaAppbmRleCA4YTNkNzJmLi45NzFkYTlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oCkBAIC0yMCwxOCArMjAsMTggQEAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgogCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgeworY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKCk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAqZ2V0U3RyZWFtSW50ZXJuYWwoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiAmbVN0cmVhbUludGVybmFsQ2FwdHVyZTsKLSAgICB9CiAKICAgICB2b2lkICpjYWxsYmFja0xvb3AoKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmUyNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKKyNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKKworI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCisKKworI2RlZmluZSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTiAgICA0ICogNTEyCisjZGVmaW5lIEFBVURJT19TQU1QTEVfUkFURV9ERUZBVUxUICAgIDQ4MDAwCisKKy8vIFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBIVyBhbmQgdGhlIE1NQVAgdGltZS4KKy8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIGZyb20gdGhlIEhBTCBpbnN0ZWFkIG9mIHVzaW5nIHRoZXNlIGVzdGltYXRlcy4KKyNkZWZpbmUgT1VUUFVUX0VTVElNQVRFRF9IQVJEV0FSRV9PRkZTRVRfTkFOT1MgICgzICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKKyNkZWZpbmUgSU5QVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUyAgICgtMSAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKKworQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCgpCisgICAgICAgIDogIG1NbWFwU3RyZWFtKG51bGxwdHIpIHt9CisKK0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkge30KKworc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6ZHVtcCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CisKKyAgICByZXN1bHQgPDwgIiAgTU1BUDogZnJhbWVzVHJhbnNmZXJyZWQgPSAiIDw8IG1GcmFtZXNUcmFuc2ZlcnJlZC5nZXQoKTsKKyAgICByZXN1bHQgPDwgIiwgSFcgbmFub3MgPSAiIDw8IG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vczsKKyAgICByZXN1bHQgPDwgIiwgcG9ydCBoYW5kbGUgPSAiIDw8IG1Qb3J0SGFuZGxlOworICAgIHJlc3VsdCA8PCAiLCBhdWRpbyBkYXRhIEZEID0gIiA8PCBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3I7CisgICAgcmVzdWx0IDw8ICJcbiI7CisKKyAgICByZXN1bHQgPDwgIiAgICBIVyBPZmZzZXQgTWljcm9zOiAgICAgIiA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0SGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKSA8PCAiXG4iOworCisgICAgcmVzdWx0IDw8IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpOworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgLnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUEsCisgICAgICAgICAgICAuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLAorICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIC50YWdzID0gIiIKKyAgICB9OworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisKKyAgICBpbnQzMl90IGJ1cnN0TWluTWljcm9zID0gQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOworICAgIGludDMyX3QgYnVyc3RNaWNyb3MgPSAwOworCisgICAgY29weUZyb20ocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKSk7CisKKyAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOworICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CisgICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUuc2V0VG8oU3RyaW5nMTYoIiIpKTsKKworICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGRldmljZUlkID0gZ2V0RGV2aWNlSWQoKTsKKworICAgIC8vIEZpbGwgaW4gY29uZmlnCisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOworICAgIGlmIChhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CisgICAgfQorICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKworICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKKyAgICBpZiAoYWF1ZGlvU2FtcGxlUmF0ZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgYWF1ZGlvU2FtcGxlUmF0ZSA9IEFBVURJT19TQU1QTEVfUkFURV9ERUZBVUxUOworICAgIH0KKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBhYXVkaW9TYW1wbGVSYXRlOworCisgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAoYWF1ZGlvU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOworICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSBPVVRQVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUzsgLy8gZnJhbWVzIGF0IERBQyBsYXRlcgorCisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gIChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGFhdWRpb1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IElOUFVUX0VTVElNQVRFRF9IQVJEV0FSRV9PRkZTRVRfTkFOT1M7IC8vIGZyYW1lcyBhdCBBREMgZWFybGllcgorCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIm9wZW5NbWFwU3RyZWFtIC0gaW52YWxpZCBkaXJlY3Rpb24gPSAlZCIsIGRpcmVjdGlvbik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBNbWFwU3RyZWFtSW50ZXJmYWNlOjpzdHJlYW1fZGlyZWN0aW9uX3Qgc3RyZWFtRGlyZWN0aW9uID0KKyAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCisgICAgICAgICAgICA/IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQKKyAgICAgICAgICAgIDogTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX0lOUFVUOworCisgICAgLy8gT3BlbiBIQUwgc3RyZWFtLiBTZXQgbU1tYXBTdHJlYW0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpvcGVuTW1hcFN0cmVhbShzdHJlYW1EaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgLy8gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvcnRIYW5kbGUpOworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAorICAgICAgICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIm9wZW5NbWFwU3RyZWFtIHJldHVybmVkIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIik7CisgICAgfQorICAgIHNldERldmljZUlkKGRldmljZUlkKTsKKworICAgIC8vIENyZWF0ZSBNTUFQL05PSVJRIGJ1ZmZlci4KKyAgICBpbnQzMl90IG1pblNpemVGcmFtZXMgPSBnZXRCdWZmZXJDYXBhY2l0eSgpOworICAgIGlmIChtaW5TaXplRnJhbWVzIDw9IDApIHsgLy8gemVybyB3aWxsIGdldCByZWplY3RlZAorICAgICAgICBtaW5TaXplRnJhbWVzID0gQUFVRElPX0JVRkZFUl9DQVBBQ0lUWV9NSU47CisgICAgfQorICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAorICAgICAgICAgICAgICBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJjcmVhdGVNbWFwQnVmZmVyIHN0YXR1cyA9ICVkLCBidWZmZXJfc2l6ZSA9ICVkLCBidXJzdF9zaXplICVkIgorICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCisgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgYWJzKG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpLAorICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwID8gIlllcyIgOiAiTm8iKTsKKyAgICB9CisKKyAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKKyAgICAvLyBUaGUgYXVkaW8gSEFMIGluZGljYXRlcyBpZiB0aGUgc2hhcmVkIG1lbW9yeSBmZCBjYW4gYmUgc2hhcmVkIG91dHNpZGUgb2YgYXVkaW9zZXJ2ZXIKKyAgICAvLyBieSByZXR1cm5pbmcgYSBuZWdhdGl2ZSBidWZmZXIgc2l6ZQorICAgIGlmIChnZXRCdWZmZXJDYXBhY2l0eSgpIDwgMCkgeworICAgICAgICAvLyBFeGNsdXNpdmUgbW9kZSBjYW4gYmUgdXNlZCBieSBjbGllbnQgb3Igc2VydmljZS4KKyAgICAgICAgc2V0QnVmZmVyQ2FwYWNpdHkoLWdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KKyAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7CisgICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKKyAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCisgICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyZWFtIGFuZCBwYXNzIGl0IGJhY2sgdG8gdGhlIGNhbGxlci4KKyAgICBzZXRTYW1wbGVzUGVyRnJhbWUoKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLmNoYW5uZWxfbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSk7CisKKyAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCisgICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCisgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOworICAgIGlmIChtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IuZ2V0KCkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSAtIGNvdWxkIG5vdCBkdXAgc2hhcmVkX21lbW9yeV9mZCIpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKKyAgICBzZXRGb3JtYXQoQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpKTsKKyAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZy5zYW1wbGVfcmF0ZSk7CisKKyAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgorICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKKyAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KKyAgICBkbyB7CisgICAgICAgIGlmIChidXJzdE1pY3JvcyA+IDApIHsgIC8vIHNraXAgZmlyc3QgbG9vcAorICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnVyc3RNaWNyb3MgPSBtRnJhbWVzUGVyQnVyc3QgKiBzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSAvIGdldFNhbXBsZVJhdGUoKTsKKyAgICB9IHdoaWxlIChidXJzdE1pY3JvcyA8IGJ1cnN0TWluTWljcm9zKTsKKworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgb3JpZ2luYWwgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQsIHRvIGJ1cnN0ID0gJWRcbiIsCisgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKKworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCIKKyAgICAgICAgICAiLCBkZXZpY2VJZCA9ICVkLCBjYXBhY2l0eSA9ICVkXG4iLAorICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIGNsb3NlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgeworCisgICAgaWYgKG1NbWFwU3RyZWFtICE9IDApIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgY2xlYXIoKSBlbmRwb2ludCIpOworICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IGNsZWFyZWQgb3IgQ1RTIHdpbGwgZmFpbCBidXQgaXQgaXMgbm90IGNsZWFyIHdoeS4KKyAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgYWJvdmUgY2xvc2UgaXMgYXN5bmNocm9ub3VzLiBBbiBhdHRlbXB0IHRvIG9wZW4gYSBuZXcgZGV2aWNlCisgICAgICAgIC8vIHJpZ2h0IGFmdGVyIGEgY2xvc2UgY2FuIGZhaWwuIEFsc28gc29tZSBjYWxsYmFja3MgbWF5IHN0aWxsIGJlIGluIGZsaWdodCEKKyAgICAgICAgLy8gRklYTUUgTWFrZSBjbG9zaW5nIHN5bmNocm9ub3VzLgorICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcEZvck5hbm9zKDEwMCAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpOworICAgIH0KKworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CisgICAgLy8gU3RhcnQgdGhlIGNsaWVudCBvbiBiZWhhbGYgb2YgdGhlIEFBdWRpbyBzZXJ2aWNlLgorICAgIC8vIFVzZSB0aGUgcG9ydCBoYW5kbGUgdGhhdCB3YXMgcHJvdmlkZWQgYnkgb3Blbk1tYXBTdHJlYW0oKS4KKyAgICByZXR1cm4gc3RhcnRDbGllbnQobU1tYXBDbGllbnQsICZtUG9ydEhhbmRsZSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wU3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CisgICAgbUZyYW1lc1RyYW5zZmVycmVkLnJlc2V0MzIoKTsKKyAgICByZXR1cm4gc3RvcENsaWVudChtUG9ydEhhbmRsZSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KCVwKHVpZD0lZCwgcGlkPSVkKSkiLAorICAgICAgICAgICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgb3JpZ2luYWxIYW5kbGUgPSAgKmNsaWVudEhhbmRsZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudCgpICwgJWQgPT4gJWQgcmV0dXJucyAlZCIsCisgICAgICAgICAgb3JpZ2luYWxIYW5kbGUsICpjbGllbnRIYW5kbGUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChtTW1hcFN0cmVhbS0+c3RvcChjbGllbnRIYW5kbGUpKTsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RvcENsaWVudCglZCkgcmV0dXJucyAlZCIsIGNsaWVudEhhbmRsZSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHZXQgZnJlZS1ydW5uaW5nIERTUCBvciBETUEgaGFyZHdhcmUgcG9zaXRpb24gZnJvbSB0aGUgSEFMLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gcG9zaXRpb247CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKCZwb3NpdGlvbik7CisgICAgQUxPR1YoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oKSBzdGF0dXM9ICVkLCBwb3MgPSAlZCwgbmFub3MgPSAlbGxkXG4iLAorICAgICAgICAgIHN0YXR1cywgcG9zaXRpb24ucG9zaXRpb25fZnJhbWVzLCAobG9uZyBsb25nKSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgeworICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgYXZhaWxhYmxlIik7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHBvc2l0aW9uIHRvIDY0LWJpdCBwb3NpdGlvbi4KKyAgICAgICAgbUZyYW1lc1RyYW5zZmVycmVkLnVwZGF0ZTMyKHBvc2l0aW9uLnBvc2l0aW9uX2ZyYW1lcyk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IG1GcmFtZXNUcmFuc2ZlcnJlZC5nZXQoKTsKKyAgICAgICAgKnRpbWVOYW5vcyA9IHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHM7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgcmV0dXJuIDA7IC8vIFRPRE8KK30KKworCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSB7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKKyAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKK307CisKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSB7CisgICAgLy8gVE9ETyBkbyB3ZSByZWFsbHkgbmVlZCBhIGRpZmZlcmVudCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbD8KKyAgICBmbG9hdCB2b2x1bWUgPSB2YWx1ZXNbMF07CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVm9sdW1lQ2hhbmdlZCgpIHZvbHVtZVswXSA9ICVmIiwgdm9sdW1lKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgIGZvcihjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBzdHJlYW0tPm9uVm9sdW1lQ2hhbmdlZCh2b2x1bWUpOworICAgIH0KK307CisKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Sb3V0aW5nQ2hhbmdlZChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uUm91dGluZ0NoYW5nZWQoKSBjYWxsZWQgd2l0aCAlZCwgb2xkID0gJWQiLAorICAgICAgICAgIGRldmljZUlkLCBnZXREZXZpY2VJZCgpKTsKKyAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICAmJiBnZXREZXZpY2VJZCgpICE9IGRldmljZUlkKSB7CisgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgIH0KKyAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7Cit9OworCisvKioKKyAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgorICovCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK3sKKyAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUgYmFzZWQgb24gSEFMIGluZm8uCisgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOworICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7CisgICAgaW50IGZkSW5kZXggPSBwYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7CisgICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNjI2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfTU1BUF9ICisjZGVmaW5lIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX01NQVBfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhYXVkaW8geworCisvKioKKyAqIFRoaXMgaXMgdXNlZCBieSBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCB0byBhY2Nlc3MgdGhlIE1NQVAgZGV2aWNlcworICogdGhyb3VnaCBBdWRpb0ZsaW5nZXIuCisgKi8KK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAKKyAgICAgICAgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50CisgICAgICAgICwgcHVibGljIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayB7CisKK3B1YmxpYzoKKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CisKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CisKKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSAgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0gQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBNbWFwU3RyZWFtQ2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGU7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSk7CisKKyAgICBpbnQ2NF90IGdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOworICAgIH0KKworcHJpdmF0ZToKKyAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzVHJhbnNmZXJyZWQ7CisKKyAgICAvLyBJbnRlcmZhY2UgdG8gdGhlIEF1ZGlvRmxpbmdlciBNTUFQIHN1cHBvcnQuCisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TW1hcFN0cmVhbUludGVyZmFjZT4gbU1tYXBTdHJlYW07CisgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgICAgICAgICAgICAgICAgIG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcjsKKworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IDA7IC8vIFRPRE8gZ2V0IGZyb20gSEFMCisKK307CisKK30gLyogbmFtZXNwYWNlIGFhdWRpbyAqLworCisjZW5kaWYgLy9BQVVESU9fU0VSVklDRV9FTkRQT0lOVF9NTUFQX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBiODNiOTE4Li45YjE4MzNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZApAQCAtNDEsMTMgKzQyLDE0IEBACiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1TdHJlYW1JbnRlcm5hbFBsYXkoYXVkaW9TZXJ2aWNlLCB0cnVlKSB7CisgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6b3Blbihjb25maWd1cmF0aW9uKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgbU1peGVyLmFsbG9jYXRlKGdldFN0cmVhbUludGVybmFsKCktPmdldFNhbXBsZXNQZXJGcmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CkBAIC02NSw3ICs2Nyw2IEBACiAKIC8vIE1peCBkYXRhIGZyb20gZWFjaCBhcHBsaWNhdGlvbiBzdHJlYW0gYW5kIHdyaXRlIHJlc3VsdCB0byB0aGUgc2hhcmVkIE1NQVAgc3RyZWFtLgogdm9pZCAqQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6Y2FsbGJhY2tMb29wKCkgewotICAgIGludDMyX3QgdW5kZXJmbG93Q291bnQgPSAwOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dCgpOwogCkBAIC03MywxOSArNzQsNTQgQEAKICAgICB3aGlsZSAobUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkgJiYgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+aXNBY3RpdmUoKSAmJiAocmVzdWx0ID49IDApKSB7CiAgICAgICAgIC8vIE1peCBkYXRhIGZyb20gZWFjaCBhY3RpdmUgc3RyZWFtLgogICAgICAgICBtTWl4ZXIuY2xlYXIoKTsKLSAgICAgICAgeyAvLyB1c2UgbG9jayBndWFyZAorCisgICAgICAgIHsgLy8gYnJhY2tldHMgYXJlIGZvciBsb2NrX2d1YXJkCiAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgaW50NjRfdCBtbWFwRnJhbWVzV3JpdHRlbiA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1dyaXR0ZW4oKTsKKwogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgICAgICAgICBmb3IgKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRTdHJlYW0tPmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzaGFyZWRTdHJlYW0tPmdldERhdGFGaWZvQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsgLy8gdG8gbWF0Y2ggbGVnYWN5IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBib29sIHVuZGVyZmxvd2VkID0gbU1peGVyLm1peChpbmRleCwgZmlmbywgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJmbG93Q291bnQgKz0gdW5kZXJmbG93ZWQgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBsb2cgdW5kZXJmbG93cyBpbiBlYWNoIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBzaGFyZWRTdHJlYW0tPm1hcmtUcmFuc2ZlclRpbWUoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNSZWFkID0gMDsKKworICAgICAgICAgICAgICAgIGlmICghY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKKworICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgdGhlIEF1ZGlvRmlmbyB0byBwcm90ZWN0IGFnYWluc3QgY2xvc2UuCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpKTsKKworICAgICAgICAgICAgICAgICAgICBGaWZvQnVmZmVyICpmaWZvID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8gIT0gbnVsbHB0cikgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgb2Zmc2V0IGJldHdlZW4gZnJhbWVQb3NpdGlvbiBpbiBjbGllbnQncyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzUmVhZCA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSB0d28gaW5kaWNlcyByZWZlciB0byB0aGUgc2FtZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25PZmZzZXQgPSBtbWFwRnJhbWVzV3JpdHRlbiAtIGNsaWVudEZyYW1lc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lID0gMS4wOyAvLyB0byBtYXRjaCBsZWdhY3kgdm9sdW1lCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVuZGVyZmxvd2VkID0gbU1peGVyLm1peChpbmRleCwgZmlmbywgdm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlcmZsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNSZWFkID0gZmlmby0+Z2V0UmVhZENvdW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjbGllbnRGcmFtZXNSZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCByZXByZXNlbnRzIHRoZSBjb21wbGV0aW9uIG9mIGRhdGEgYmVpbmcgcmVhZCBvdXQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBidWZmZXIuIEl0IGlzIHNlbnQgdG8gdGhlIGNsaWVudCBhbmQgdXNlZCBpbiB0aGUgdGltaW5nIG1vZGVsCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRlY2lkZSB3aGVuIHRoZSBjbGllbnQgaGFzIHJvb20gdG8gd3JpdGUgbW9yZSBkYXRhLgorICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1JlYWQsIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPm1hcmtUcmFuc2ZlclRpbWUodGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbmRleCsrOyAvLyBqdXN0IHVzZWQgZm9yIGxhYmVsbGluZyB0cmFja3MgaW4gc3lzdHJhY2UKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC05Myw3ICsxMjksNyBAQAogICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT53cml0ZShtTWl4ZXIuZ2V0T3V0cHV0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTogY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCkBAIC0xMDIsOCArMTM4LDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dXX0lGKCh1bmRlcmZsb3dDb3VudCA+IDApLAotICAgICAgICAgICAgICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk6IGNhbGxiYWNrTG9vcCgpIGhhZCAlZCB1bmRlcmZsb3dzIiwgdW5kZXJmbG93Q291bnQpOwotCiAgICAgcmV0dXJuIE5VTEw7IC8vIFRPRE8gcmV2aWV3CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYzIyZjUxMC4uYTBhMzgzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb01peGVyLmgiCkBAIC0zNSwxNiArMzYsMTIgQEAKIC8qKgogICogQ29udGFpbnMgYSBtaXhlciBhbmQgYSBzdHJlYW0gZm9yIHdyaXRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWl4LgogICovCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOwotCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAqZ2V0U3RyZWFtSW50ZXJuYWwoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiAmbVN0cmVhbUludGVybmFsUGxheTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAogICAgIHZvaWQgKmNhbGxiYWNrTG9vcCgpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQwMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKKyNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgorCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKKworLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIGluIGZyYW1lcy4gVGhlIGVmZmVjdGl2ZSBzaXplIGNhbiBiZSB0dW5lZCBzbWFsbGVyIGF0IHJ1bnRpbWUuCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZICAgKDQ4ICogOCkKKworc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCAiICBTSEFSRUQ6IHNoYXJpbmcgZXhjbHVzaXZlIHN0cmVhbSB3aXRoIGhhbmRsZSA9IDB4IgorICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkKKyAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbVN0cmVhbUludGVybmFsLT5nZXRTZXJ2aWNlSGFuZGxlKCkKKyAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJyk7CisgICAgcmVzdWx0IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUnVubmluZyBTdHJlYW0gQ291bnQ6ICIgPDwgbVJ1bm5pbmdTdHJlYW1Db3VudCA8PCAiXG4iOworCisgICAgcmVzdWx0IDw8IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpOworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8vIFNoYXJlIGFuIEF1ZGlvU3RyZWFtSW50ZXJuYWwuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7CisKKyAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCk7CisgICAgc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworCisgICAgQXVkaW9TdHJlYW1CdWlsZGVyIGJ1aWxkZXI7CisgICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CisgICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgorICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOworICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKKyAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKKyAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOworICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworICAgIGJ1aWxkZXIuc2V0QnVmZmVyQ2FwYWNpdHkoREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkpOworCisgICAgcmVzdWx0ID0gbVN0cmVhbUludGVybmFsLT5vcGVuKGJ1aWxkZXIpOworCisgICAgc2V0U2FtcGxlUmF0ZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Y2xvc2UoKSB7CisgICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmNsb3NlKCk7Cit9CisKKy8vIEdsdWUgYmV0d2VlbiBDIGFuZCBDKysgY2FsbGJhY2tzLgorc3RhdGljIHZvaWQgKmFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYyh2b2lkICpjb250ZXh0KSB7CisgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkICplbmRwb2ludCA9IChBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKikgY29udGV4dDsKKyAgICBpZiAoZW5kcG9pbnQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworYWF1ZGlvX3Jlc3VsdF90IGFhdWRpbzo6QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpzdGFydFNoYXJpbmdUaHJlYWRfbCgpIHsKKyAgICAvLyBMYXVuY2ggdGhlIGNhbGxiYWNrIGxvb3AgdGhyZWFkLgorICAgIGludDY0X3QgcGVyaW9kTmFub3MgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNQZXJCdXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKKyAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y3JlYXRlVGhyZWFkKHBlcmlvZE5hbm9zLCBhYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2MsIHRoaXMpOworfQorCithYXVkaW9fcmVzdWx0X3QgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0b3BTaGFyaW5nVGhyZWFkKCkgeworICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5qb2luVGhyZWFkKE5VTEwpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzaGFyZWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgICAgICBpZiAoKyttUnVubmluZ1N0cmVhbUNvdW50ID09IDEpIHsgLy8gYXRvbWljCisgICAgICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgLS1tUnVubmluZ1N0cmVhbUNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIC0tbVJ1bm5pbmdTdHJlYW1Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5zdGFydENsaWVudChzaGFyZWRTdHJlYW0tPmdldEF1ZGlvQ2xpZW50KCksIGNsaWVudEhhbmRsZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBpZiAoLS1tUnVubmluZ1N0cmVhbUNvdW50ID09IDApIHsgLy8gYXRvbWljCisgICAgICAgICAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2hhcmVkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgIC8vIERvbid0IGxvY2sgaGVyZSBiZWNhdXNlIHRoZSBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMgYWxzbyB1c2VzIHRoZSBsb2NrLgorCisgICAgLy8gSWdub3JlIHJlc3VsdC4KKyAgICAodm9pZCkgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworCisgICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAwKSB7IC8vIGF0b21pYworICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCisvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIHJlYWwtdGltZSBzZXJ2aWNlIHRocmVhZCwgZWcuIG1peGVyLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRUaW1lc3RhbXAoQ0xPQ0tfTU9OT1RPTklDLCBwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiZDJjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICisjZGVmaW5lIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgorI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFhdWRpbyB7CisKKy8qKgorICogVGhpcyBTZXJ2aWNlIGNsYXNzIGNvcnJlc3BvbmRzIHRvIGEgQ2xpZW50IHN0cmVhbSB0aGF0IHNoYXJlcyBhbiBNTUFQIGRldmljZSB0aHJvdWdoIGEgbWl4ZXIKKyAqIG9yIGFuIGlucHV0IGRpc3RyaWJ1dG9yLgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50IHsKKworcHVibGljOgorCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICpjYWxsYmFja0xvb3AoKSA9IDA7CisKKyAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbDsKKyAgICB9OworCitwcm90ZWN0ZWQ6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworCisgICAgLy8gcG9pbnRlciB0byBvYmplY3Qgc3RhdGljYWxseSBhbGxvY2F0ZWQgaW4gc3ViY2xhc3NlcworICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgICAgICptU3RyZWFtSW50ZXJuYWwgPSBudWxscHRyOworCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworCisgICAgc3RkOjphdG9taWM8aW50PiAgICAgICAgIG1SdW5uaW5nU3RyZWFtQ291bnR7MH07Cit9OworCit9CisKKyNlbmRpZiAvL0FBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKaW5kZXggNWY3ZDE3OS4uZTY3MDEyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcApAQCAtMTgsMTIgKzE4LDE3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPG11dGV4PgogCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAorI2luY2x1ZGUgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgogI2luY2x1ZGUgIlRpbWVzdGFtcFNjaGVkdWxlci5oIgogCkBAIC0zNSw5ICs0MCwxMSBAQAogICogQHJldHVybgogICovCiAKLUFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpCitBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZShudWxscHRyKQotICAgICAgICAsIG1BQXVkaW9UaHJlYWQoKSB7CisgICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgpCisgICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCisgICAgICAgICwgbUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHsKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZSA9IFN0cmluZzE2KCIiKTsKQEAgLTQ3LDYxICs1NCwxNDMgQEAKICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6On5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVECi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2Ugc3RyZWFtIHN0aWxsIG9wZW4sIHN0YXRlID0gJWQiLCBtU3RhdGUpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZSBzdHJlYW0gc3RpbGwgb3Blbiwgc3RhdGUgPSAlZCIsIGdldFN0YXRlKCkpOworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiAgICBUICAgSGFuZGxlICAgVUlkIFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOwogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKLSAgICByZXN1bHQgPDwgIiAgICAgIC0tLS0tLS0tIGhhbmRsZSA9IDB4IiA8PCBzdGQ6OmhleCA8PCBtSGFuZGxlIDw8IHN0ZDo6ZGVjIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBzdGF0ZSAgICAgICAgICA9ICIgPDwgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChtU3RhdGUpIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBmb3JtYXQgICAgICAgICA9ICIgPDwgbUF1ZGlvRm9ybWF0IDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBmcmFtZXNQZXJCdXJzdCA9ICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBjaGFubmVsQ291bnQgICA9ICIgPDwgbVNhbXBsZXNQZXJGcmFtZSA8PCAiXG4iOwotICAgIHJlc3VsdCA8PCAiICAgICAgY2FwYWNpdHlGcmFtZXMgPSAiIDw8IG1DYXBhY2l0eUluRnJhbWVzIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBvd25lciB1aWQgICAgICA9ICIgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleCA8PCBtSGFuZGxlCisgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpIDsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDYpIDw8IG1NbWFwQ2xpZW50LmNsaWVudFVpZDsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDQpIDw8IChpc1J1bm5pbmcoKSA/ICJ5ZXMiIDogIiBubyIpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0U3RhdGUoKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDcpIDw8IGdldEZvcm1hdCgpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbUZyYW1lc1BlckJ1cnN0OworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNSkgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg5KSA8PCBnZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgIG1NbWFwQ2xpZW50LnBhY2thZ2VOYW1lLnNldFRvKFN0cmluZzE2KCIiKSk7IC8vIEZJWE1FIHdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/CisgICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUuc2V0VG8oU3RyaW5nMTYoIiIpKTsgLy8gVE9ETyBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPwogCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tVcE1lc3NhZ2VRdWV1ZSk7Ci0gICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9IGVsc2UgeworICAgIC8vIExpbWl0IHNjb3BlIG9mIGxvY2sgdG8gYXZvaWQgcmVjdXJzaXZlIGxvY2sgaW4gY2xvc2UoKS4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOworICAgICAgICBpZiAobVVwTWVzc2FnZVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbigpIGNhbGxlZCB0d2ljZSIpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisKICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbmV3IFNoYXJlZFJpbmdCdWZmZXIoKTsKLSAgICAgICAgcmV0dXJuIG1VcE1lc3NhZ2VRdWV1ZS0+YWxsb2NhdGUoc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSwgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMpOworICAgICAgICByZXN1bHQgPSBtVXBNZXNzYWdlUXVldWUtPmFsbG9jYXRlKHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKCkgb3BlbkVuZHBvaW50KCkgZmFpbGVkIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgICAgIGNvcHlGcm9tKCptU2VydmljZUVuZHBvaW50KTsKICAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCkgewotICAgIGlmIChtU3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfQorCisgICAgc3RvcCgpOworCisgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VydmljZUVuZHBvaW50LT51bnJlZ2lzdGVyU3RyZWFtKHRoaXMpOworICAgICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIG1FbmRwb2ludE1hbmFnZXIuY2xvc2VFbmRwb2ludChtU2VydmljZUVuZHBvaW50KTsKKyAgICAgICAgbVNlcnZpY2VFbmRwb2ludC5jbGVhcigpOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tVcE1lc3NhZ2VRdWV1ZSk7CiAgICAgICAgIGRlbGV0ZSBtVXBNZXNzYWdlUXVldWU7CiAgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOwogICAgIH0KLSAgICByZXR1cm4gQUFVRElPX09LOworCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKSB7CisgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgcmV0dXJuIG1TZXJ2aWNlRW5kcG9pbnQtPnN0YXJ0U3RyZWFtKHRoaXMsICZtQ2xpZW50SGFuZGxlKTsKK30KKworLyoqCisgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgorICoKKyAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KKyAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGlmIChpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KKworICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpIG1pc3NpbmcgZW5kcG9pbnQiKTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KKyAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisKKyAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICByZXN1bHQgPSBzdGFydERldmljZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSBnb3RvIGVycm9yOworCisgICAgLy8gVGhpcyBzaG91bGQgaGFwcGVuIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0LgogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgbVRocmVhZEVuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgcmV0dXJuIG1BQXVkaW9UaHJlYWQuc3RhcnQodGhpcyk7CisgICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdGFydCh0aGlzKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgZ290byBlcnJvcjsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIGRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCkgewpAQCAtMTA5LDE1ICsxOTgsMjUgQEAKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnBhdXNlKCkgbWlzc2luZyBlbmRwb2ludCIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIHJlc3VsdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPnN0b3BTdHJlYW0odGhpcywgbUNsaWVudEhhbmRsZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnBhdXNlKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CisgICAgICAgIGRpc2Nvbm5lY3QoKTsgLy8gVE9ETyBzaG91bGQgd2UgcmV0dXJuIG9yIHBhdXNlIEJhc2UgZmlyc3Q/CisgICAgfQorCiAgICAgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICBtVGhyZWFkRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgcmVzdWx0ID0gbUFBdWRpb1RocmVhZC5zdG9wKCk7CisgICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdG9wKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ7CisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTEyNiwxNSArMjI1LDI5IEBACiAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAvLyBUT0RPIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkIG91dAorCisgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RvcCgpIG1pc3NpbmcgZW5kcG9pbnQiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKwogICAgIHNlbmRDdXJyZW50VGltZXN0YW1wKCk7IC8vIHdhcm5pbmcgLSB0aGlzIGNhbGxzIGEgdmlydHVhbCBmdW5jdGlvbgogICAgIHJlc3VsdCA9IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorCisgICAgLy8gVE9ETyB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCBvdXQKKyAgICByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CisgICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgLy8gVE9ETyB3aGF0IHRvIGRvIHdpdGggcmVzdWx0IGhlcmU/CisgICAgfQorCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEKTsKLSAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQ7CisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNDIsMTQgKzI1NSwyMCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgLy8gY2xlYXIgZmxhZyB0aGF0IHRlbGxzIHRocmVhZCB0byBsb29wCiAgICAgaWYgKG1UaHJlYWRFbmFibGVkLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgICAgICByZXN1bHQgPSBtQUF1ZGlvVGhyZWFkLnN0b3AoKTsKKyAgICAgICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdG9wKCk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHN0cmVhbSBub3QgcGF1c2VkLCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChtU3RhdGUpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICAvLyBEYXRhIHdpbGwgZ2V0IGZsdXNoZWQgd2hlbiB0aGUgY2xpZW50IHJlY2VpdmVzIHRoZSBGTFVTSEVEIGV2ZW50LgogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEOworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtMTU3LDcgKzI3Niw3IEBACiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSB7CiAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSBlbnRlcmluZyAtLS0tLS0tLS0tLS0tLS0tIik7CiAgICAgVGltZXN0YW1wU2NoZWR1bGVyIHRpbWVzdGFtcFNjaGVkdWxlcjsKLSAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBtU2FtcGxlUmF0ZSk7CisgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CiAgICAgd2hpbGUobVRocmVhZEVuYWJsZWQubG9hZCgpKSB7CkBAIC0xNzcsOSArMjk2LDkgQEAKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQpOwotICAgICAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwogICAgIH0KIH0KIApAQCAtMTk1LDcgKzMxNCw3IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6d3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrVXBNZXNzYWdlUXVldWUpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOwogICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgid3JpdGVVcE1lc3NhZ2VRdWV1ZSgpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwpAQCAtMjExLDE1ICszMzAsMzEgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzZW5kQ3VycmVudFRpbWVzdGFtcCgpIHsKICAgICBBQXVkaW9TZXJ2aWNlTWVzc2FnZSBjb21tYW5kOworICAgIC8vIFNlbmQgYSB0aW1lc3RhbXAgZm9yIHRoZSBjbG9jayBtb2RlbC4KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAvLyAgICBBTE9HRCgic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogcG9zaXRpb24gPSAlbGxkLCBuYW5vcyA9ICVsbGQiLAotICAgIC8vICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAotICAgIC8vICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7Ci0gICAgICAgIGNvbW1hbmQud2hhdCA9IEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpUSU1FU1RBTVA7CisgICAgICAgIEFMT0dWKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpIFNFUlZJQ0UgICU4bGxkIGF0ICVsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKKyAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOwogICAgICAgICByZXN1bHQgPSB3cml0ZVVwTWVzc2FnZVF1ZXVlKCZjb21tYW5kKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUpIHsKKworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgLy8gU2VuZCBhIGhhcmR3YXJlIHRpbWVzdGFtcCBmb3IgcHJlc2VudGF0aW9uIHRpbWUuCisgICAgICAgICAgICByZXN1bHQgPSBnZXRIYXJkd2FyZVRpbWVzdGFtcCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbmRDdXJyZW50VGltZXN0YW1wKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX0hBUkRXQVJFOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUpIHsgLy8gVE9ETyByZXZpZXcgYmVzdCBlcnJvciBjb2RlCiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsgLy8ganVzdCBub3QgYXZhaWxhYmxlIHlldCwgdHJ5IGFnYWluIGxhdGVyCiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC0yMzAsOCArMzY1LDE5IEBACiAgKiB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCiAgKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Z2V0RGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKLSAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1lc3NhZ2UgcXVldWUuCi0gICAgbVVwTWVzc2FnZVF1ZXVlLT5maWxsUGFyY2VsYWJsZShwYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5tVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKTsKLSAgICByZXR1cm4gZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOworICAgICAgICBpZiAobVVwTWVzc2FnZVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREZXNjcmlwdGlvbigpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1lc3NhZ2UgcXVldWUuCisgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZS0+ZmlsbFBhcmNlbGFibGUocGFyY2VsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLm1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpOworICAgIH0KKyAgICByZXR1cm4gZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7Cit9CisKK3ZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9uVm9sdW1lQ2hhbmdlZChmbG9hdCB2b2x1bWUpIHsKKyAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSwgdm9sdW1lKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCmluZGV4IGNlYmVmZWMuLmFmNDM1YjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKQEAgLTI3LDcxICsyOCw5NyBAQAogI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgorI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogCiAjaW5jbHVkZSAiU2hhcmVkUmluZ0J1ZmZlci5oIgogI2luY2x1ZGUgIkFBdWRpb1RocmVhZC5oIgogCituYW1lc3BhY2UgYW5kcm9pZCB7CisgICAgY2xhc3MgQUF1ZGlvU2VydmljZTsKK30KKwogbmFtZXNwYWNlIGFhdWRpbyB7CiAKK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludDsKKwogLy8gV2UgZXhwZWN0IHRoZSBxdWV1ZSB0byBvbmx5IGhhdmUgYSBmZXcgY29tbWFuZHMuCiAvLyBUaGlzIHNob3VsZCBiZSB3YXkgbW9yZSB0aGFuIHdlIG5lZWQuCiAjZGVmaW5lIFFVRVVFX1VQX0NBUEFDSVRZX0NPTU1BTkRTICgxMjgpCiAKIC8qKgotICogQmFzZSBjbGFzcyBmb3IgYSBzdHJlYW0gaW4gdGhlIEFBdWRpbyBzZXJ2aWNlLgorICogRWFjaCBpbnN0YW5jZSBvZiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSBjb3JyZXNwb25kcyB0byBhIGNsaWVudCBzdHJlYW0uCisgKiBJdCB1c2VzIGEgc3ViY2xhc3Mgb2YgQUF1ZGlvU2VydmljZUVuZHBvaW50IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcgZGV2aWNlIG9yIHBvcnQuCiAgKi8KIGNsYXNzIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlCiAgICAgOiBwdWJsaWMgdmlydHVhbCBhbmRyb2lkOjpSZWZCYXNlCisgICAgLCBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycwogICAgICwgcHVibGljIFJ1bm5hYmxlICB7CiAKIHB1YmxpYzoKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpOworICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOworCiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKTsKIAogICAgIGVudW0gewogICAgICAgICBJTExFR0FMX1RIUkVBRF9JRCA9IDAKICAgICB9OwogCi0gICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSGVhZGVyKCk7CisKKyAgICAvLyBkb2VzIG5vdCBpbmNsdWRlIEVPTAorICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8qKgogICAgICAqIE9wZW4gdGhlIGRldmljZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSA9IDA7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCiAgICAgLyoqCi0gICAgICogU3RhcnQgdGhlIGZsb3cgb2YgZGF0YS4KKyAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgorICAgICAqCisgICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgorICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpOwogCiAgICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aCBsb3NzIG9mIGRhdGEuCi0gICAgICovCisgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHNvIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGhvdXQgbG9zcyBvZiBkYXRhLgorICAgICAqCisgICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgorICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgorICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKTsKIAogICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBhZnRlciBkYXRhIGluIGJ1ZmZlciBoYXMgcGxheWVkLgorICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBhZnRlciB0aGUgY3VycmVudGx5IHF1ZXVlZCBkYXRhIGhhcyBmaW5pc2hlZCBwbGF5aW5nLgorICAgICAqCisgICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgorICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KKyAgICAgKgogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wVGltZXN0YW1wVGhyZWFkKCk7CiAKICAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgorICAgICAqIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KKyAgICAgKgorICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBmbHVzaCgpOwogCisKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50IF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSBfX3VudXNlZCkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0Q2xpZW50KCVwLCAuLi4pIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIsICZjbGllbnQpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wQ2xpZW50KCVkKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiLCBjbGllbnRIYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIApAQCAtMTI2LDE0ICsxNTMsMTQgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKICAgICB9CiAKLSAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1BdWRpb0Zvcm1hdCk7Ci0gICAgfQotCiAgICAgdm9pZCBydW4oKSBvdmVycmlkZTsgLy8gdG8gaW1wbGVtZW50IFJ1bm5hYmxlCiAKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAorICAgIGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICZnZXRBdWRpb0NsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1NbWFwQ2xpZW50OworICAgIH0KKwogICAgIHVpZF90IGdldE93bmVyVXNlcklkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbU1tYXBDbGllbnQuY2xpZW50VWlkOwogICAgIH0KQEAgLTE1MywxMiArMTgwLDI2IEBACiAgICAgICAgIHJldHVybiBtU3RhdGU7CiAgICAgfQogCisgICAgdm9pZCBvblZvbHVtZUNoYW5nZWQoZmxvYXQgdm9sdW1lKTsKKwogcHJvdGVjdGVkOgogCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGV2aWNlLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOworCiAgICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKICAgICAgICAgbVN0YXRlID0gc3RhdGU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRGV2aWNlIHNwZWNpZmljIHN0YXJ0dXAuCisgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnREZXZpY2UoKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCB3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwpAQCAtMTcwLDI3ICsyMTEsMzAgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgPSAwOwogCiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWRDbGllbnRUaHJlYWQgPSBJTExFR0FMX1RIUkVBRF9JRDsKIAogICAgIFNoYXJlZFJpbmdCdWZmZXIqICAgICAgIG1VcE1lc3NhZ2VRdWV1ZTsKLSAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtTG9ja1VwTWVzc2FnZVF1ZXVlOworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZUxvY2s7CiAKLSAgICBBQXVkaW9UaHJlYWQgICAgICAgICAgICBtQUF1ZGlvVGhyZWFkOworICAgIEFBdWRpb1RocmVhZCAgICAgICAgICAgIG1UaW1lc3RhbXBUaHJlYWQ7CiAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IG9uZSB0aHJlYWQgdG8gdGVsbCBhbm90aGVyIHRocmVhZCB0byBleGl0LiBTbyBpdCBtdXN0IGJlIGF0b21pYy4KLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtVGhyZWFkRW5hYmxlZDsKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtVGhyZWFkRW5hYmxlZHtmYWxzZX07CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICBtQXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICBtTW1hcENsaWVudDsKKyAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICBtTW1hcENsaWVudDsgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gTU1BUCBzdGFydCgpCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKworICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJm1BdWRpb1NlcnZpY2U7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBtU2VydmljZUVuZHBvaW50OworCiBwcml2YXRlOgogICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgIG1IYW5kbGUgPSAtMTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKaW5kZXggMDhkZDY4MC4uNDRiYTFjYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcApAQCAtMTksMjI1ICsxOSw3NiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogI2luY2x1ZGUgPG1lZGlhL01tYXBTdHJlYW1JbnRlcmZhY2UuaD4KIAorI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKKyNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgorCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLSNkZWZpbmUgQUFVRElPX0JVRkZFUl9DQVBBQ0lUWV9NSU4gICAgNCAqIDUxMgotI2RlZmluZSBBQVVESU9fU0FNUExFX1JBVEVfREVGQVVMVCAgICA0ODAwMAotCiAvKioKICAqIFNlcnZpY2UgU3RyZWFtIHRoYXQgdXNlcyBhbiBNTUFQIGJ1ZmZlci4KICAqLwogCi1BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6QUF1ZGlvU2VydmljZVN0cmVhbU1NQVAoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIHNlcnZpY2VDbGllbnQsCitBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6QUF1ZGlvU2VydmljZVN0cmVhbU1NQVAoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYUF1ZGlvU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluU2VydmljZSkKLSAgICAgICAgOiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpCi0gICAgICAgICwgbU1tYXBTdHJlYW1DYWxsYmFjayhuZXcgTXlNbWFwU3RyZWFtQ2FsbGJhY2soKnRoaXMpKQotICAgICAgICAsIG1QcmV2aW91c0ZyYW1lQ291bnRlcigwKQotICAgICAgICAsIG1NbWFwU3RyZWFtKG51bGxwdHIpCi0gICAgICAgICwgbVNlcnZpY2VDbGllbnQoc2VydmljZUNsaWVudCkKKyAgICAgICAgOiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShhQXVkaW9TZXJ2aWNlKQogICAgICAgICAsIG1JblNlcnZpY2UoaW5TZXJ2aWNlKSB7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgeworICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQorCiAgICAgc3RvcCgpOwotICAgIGlmIChtTW1hcFN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIG1NbWFwU3RyZWFtLmNsZWFyKCk7IC8vIFRPRE8gcmV2aWV3LiBJcyB0aGF0IGFsbCB3ZSBoYXZlIHRvIGRvPwotICAgICAgICAvLyBBcHBhcmVudGx5IHRoZSBhYm92ZSBjbG9zZSBpcyBhc3luY2hyb25vdXMuIEFuIGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBkZXZpY2UKLSAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgYSBjbG9zZSBjYW4gZmFpbC4gQWxzbyBzb21lIGNhbGxiYWNrcyBtYXkgc3RpbGwgYmUgaW4gZmxpZ2h0IQotICAgICAgICAvLyBGSVhNRSBNYWtlIGNsb3Npbmcgc3luY2hyb25vdXMuCi0gICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwRm9yTmFub3MoMTAwICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCk7Ci0gICAgfQogCiAgICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpOwogfQogCiAvLyBPcGVuIHN0cmVhbSBvbiBIQUwgYW5kIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGJhY2sgdG8gdGhlIGNsaWVudC4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpIHsKLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKLSAgICAgICAgLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgLnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUEsCi0gICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sCi0gICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1ksCi0gICAgICAgIC50YWdzID0gIiIKLSAgICB9OwotICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQPiBrZWVwKHRoaXMpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2Ugb3BlbiByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbklucHV0ID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gY29uZmlndXJhdGlvbklucHV0LmdldERldmljZUlkKCk7Ci0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IHJlcXVlc3QuZ2V0RGlyZWN0aW9uKCk7Ci0KLSAgICAvLyBGaWxsIGluIGNvbmZpZwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBjb25maWcuZm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb0Zvcm1hdCk7Ci0KLSAgICBpbnQzMl90IGFhdWRpb1NhbXBsZVJhdGUgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBhYXVkaW9TYW1wbGVSYXRlID0gQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQ7Ci0gICAgfQotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGFhdWRpb1NhbXBsZVJhdGU7Ci0KLSAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLQotICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoYWF1ZGlvU2FtcGxlc1BlckZyYW1lKTsKLSAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7Ci0gICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAgKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX0lOX1NURVJFTwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoYWF1ZGlvU2FtcGxlc1BlckZyYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gLSBpbnZhbGlkIGRpcmVjdGlvbiA9ICVkIiwgZGlyZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwotICAgIH0KLQotICAgIE1tYXBTdHJlYW1JbnRlcmZhY2U6OnN0cmVhbV9kaXJlY3Rpb25fdCBzdHJlYW1EaXJlY3Rpb24gPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQotICAgICAgICA/IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQgOiBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fSU5QVVQ7Ci0KLSAgICAvLyBPcGVuIEhBTCBzdHJlYW0uCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTW1hcFN0cmVhbUludGVyZmFjZTo6b3Blbk1tYXBTdHJlYW0oc3RyZWFtRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1tYXBDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwU3RyZWFtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1tYXBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Qb3J0SGFuZGxlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuTW1hcFN0cmVhbSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwotICAgIH0KLQotICAgIGlmIChkZXZpY2VJZCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgTU1BUC9OT0lSUSBidWZmZXIuCi0gICAgaW50MzJfdCBtaW5TaXplRnJhbWVzID0gY29uZmlndXJhdGlvbklucHV0LmdldEJ1ZmZlckNhcGFjaXR5KCk7Ci0gICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCi0gICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKLSAgICB9Ci0gICAgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSByZXR1cm5lZCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCJjcmVhdGVNbWFwQnVmZmVyIHN0YXR1cyA9ICVkLCBidWZmZXJfc2l6ZSA9ICVkLCBidXJzdF9zaXplICVkIgotICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgICAgYWJzKG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCi0gICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwID8gIlllcyIgOiAiTm8iKTsKLSAgICB9Ci0KLSAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXM7Ci0gICAgLy8gRklYTUU6IHRoZSBhdWRpbyBIQUwgaW5kaWNhdGVzIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGZkIGNhbiBiZSBzaGFyZWQgb3V0c2lkZSBvZiBhdWRpb3NlcnZlcgotICAgIC8vIGJ5IHJldHVybmluZyBhIG5lZ2F0aXZlIGJ1ZmZlciBzaXplCi0gICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzIDwgMCkgewotICAgICAgICAvLyBFeGNsdXNpdmUgbW9kZSBpcyBwb3NzaWJsZSBmcm9tIGFueSBjbGllbnQKLSAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSAtbUNhcGFjaXR5SW5GcmFtZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZXhjbHVzaXZlIG1vZGUgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgZmluYWwgZmQgZGVzdGluYXRpb24gaXMgaW5zaWRlIGF1ZGlvc2VydmVyCi0gICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IG1TZXJ2aWNlQ2xpZW50LmNsaWVudFVpZCkgJiYKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQotICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyZWFtIGFuZCBwYXNzIGl0IGJhY2sgdG8gdGhlIGNhbGxlci4KLSAgICBtU2FtcGxlc1BlckZyYW1lID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spOwotCi0gICAgLy8gQUF1ZGlvIGNyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgRkQgYW5kIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBjb3B5LgotICAgIC8vIEFzc3VtZSB0aGF0IEF1ZGlvRmxpbmdlciB3aWxsIGNsb3NlIHRoZSBvcmlnaW5hbCBzaGFyZWRfbWVtb3J5X2ZkLgotICAgIG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5yZXNldChkdXAobU1tYXBCdWZmZXJpbmZvLnNoYXJlZF9tZW1vcnlfZmQpKTsKLSAgICBpZiAobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLmdldCgpID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3BlbigpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIik7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gcmV2aWV3Ci0gICAgfQotICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKLSAgICBtQXVkaW9Gb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCk7Ci0gICAgbVNhbXBsZVJhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0KLSAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgotICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKLSAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KLSAgICBpbnQzMl90IGJ1cnN0TWluTWljcm9zID0gQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOwotICAgIGludDMyX3QgYnVyc3RNaWNyb3MgPSAwOwotICAgIGRvIHsKLSAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCi0gICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgKj0gMjsKLSAgICAgICAgfQotICAgICAgICBidXJzdE1pY3JvcyA9IG1GcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Ci0gICAgfSB3aGlsZSAoYnVyc3RNaWNyb3MgPCBidXJzdE1pbk1pY3Jvcyk7Ci0KLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgZmluYWwgYnVyc3QgPSAlZFxuIiwKLSAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsIGJ1cnN0TWluTWljcm9zLCBtRnJhbWVzUGVyQnVyc3QpOwotCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZFxuIiwKLSAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVNhbXBsZXNQZXJGcmFtZSwgZGV2aWNlSWQpOwotCi0gICAgLy8gRmlsbCBpbiBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uCi0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNhbXBsZXNQZXJGcmFtZShtU2FtcGxlc1BlckZyYW1lKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldEZvcm1hdChtQXVkaW9Gb3JtYXQpOwotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKKworZXJyb3I6CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogLyoqCiAgKiBTdGFydCB0aGUgZmxvdyBvZiBkYXRhLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0KCkgewotICAgIGlmIChpc1J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KLSAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPnN0YXJ0KG1TZXJ2aWNlQ2xpZW50LCAmbVBvcnRIYW5kbGUpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFydCgpIG1NbWFwU3RyZWFtLT5zdGFydCgpIHJldHVybmVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpOwotICAgICAgICBpZiAoIW1JblNlcnZpY2UgJiYgcmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAgICAgc3RhcnRDbGllbnQobU1tYXBDbGllbnQsICZtQ2xpZW50SGFuZGxlKTsKLSAgICAgICAgfQorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFydERldmljZSgpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0RGV2aWNlKCk7CisgICAgaWYgKCFtSW5TZXJ2aWNlICYmIHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY2FuIHNvbWV0aW1lcyB0YWtlIDIwMCB0byAzMDAgbXNlYyBmb3IgYSBjb2xkIHN0YXJ0IQorICAgICAgICByZXN1bHQgPSBzdGFydENsaWVudChtTW1hcENsaWVudCwgJm1DbGllbnRIYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjQ5LDEwNCArMTAwLDc4IEBACiAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KLSAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQxID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpwYXVzZSgpOworICAgIC8vIFRPRE8gcHV0IGJlZm9yZSBiYXNlOjpwYXVzZSgpPwogICAgIGlmICghbUluU2VydmljZSkgewotICAgICAgICBzdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOworICAgICAgICAodm9pZCkgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPnN0b3AobVBvcnRIYW5kbGUpOwotICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsKLSAgICByZXR1cm4gKHJlc3VsdDEgIT0gQUFVRElPX09LKSA/IHJlc3VsdDEgOiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RvcCgpIHsKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQotICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDEgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpOworICAgIC8vIFRPRE8gcHV0IGJlZm9yZSBiYXNlOjpzdG9wKCk/CiAgICAgaWYgKCFtSW5TZXJ2aWNlKSB7Ci0gICAgICAgIHN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7Ci0gICAgfQotICAgIGFhdWRpb19yZXN1bHRfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RvcChtUG9ydEhhbmRsZSk7Ci0gICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOwotICAgIHJldHVybiAocmVzdWx0MSAhPSBBQVVESU9fT0spID8gcmVzdWx0MSA6ICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotfQotCi0vKioKLSAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCi0gKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKLSAgICAvLyBUT0RPIGhvdyBkbyB3ZSBmbHVzaCBhbiBNTUFQL05PSVJRIGJ1ZmZlcj8gc3luYyBwb2ludGVycz8KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCk7OwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gcG9zaXRpb247Ci0gICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKLSAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewotICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgeWV0Iik7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZyYW1lc1JlYWQudXBkYXRlMzIocG9zaXRpb24ucG9zaXRpb25fZnJhbWVzKTsKLSAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gbUZyYW1lc1JlYWQuZ2V0KCk7Ci0gICAgICAgICp0aW1lTmFub3MgPSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzOworICAgICAgICAodm9pZCkgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25UZWFyRG93bigpIHsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKLSAgICBkaXNjb25uZWN0KCk7Ci19OworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgb24gYmVoYWxmIG9mIHRoZSBhcHBsaWNhdGlvbi4gR2VuZXJhdGUgYSBuZXcgcG9ydGhhbmRsZS4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VFbmRwb2ludC0+c3RhcnRDbGllbnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CiAKLXZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSB7Ci0gICAgLy8gVE9ETyBkbyB3ZSByZWFsbHkgbmVlZCBhIGRpZmZlcmVudCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbD8KLSAgICBmbG9hdCB2b2x1bWUgPSB2YWx1ZXNbMF07Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvblZvbHVtZUNoYW5nZWQoKSB2b2x1bWVbMF0gPSAlZiIsIHZvbHVtZSk7Ci0gICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsIHZvbHVtZSk7Ci19OworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPnN0b3BDbGllbnQoY2xpZW50SGFuZGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCi12b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uUm91dGluZ0NoYW5nZWQoKSBjYWxsZWQgd2l0aCAlZCwgb2xkID0gJWQiLAotICAgICAgICAgIGRldmljZUlkLCBtRGV2aWNlSWQpOwotICAgIGlmIChtRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAgJiYgbURldmljZUlkICE9IGRldmljZUlkKSB7CisvLyBHZXQgZnJlZS1ydW5uaW5nIERTUCBvciBETUEgaGFyZHdhcmUgcG9zaXRpb24gZnJvbSB0aGUgSEFMLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gc2VydmljZUVuZHBvaW50TU1BUHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4obVNlcnZpY2VFbmRwb2ludC5nZXQoKSl9OworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRGcmVlUnVubmluZ1Bvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoKnBvc2l0aW9uRnJhbWVzLCAqdGltZU5hbm9zKTsKKyAgICAgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOworICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgfQotICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwotfTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IHNlcnZpY2VFbmRwb2ludE1NQVB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQICo+KG1TZXJ2aWNlRW5kcG9pbnQuZ2V0KCkpfTsKKyAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAorICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCkgKyBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpOworICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorfQogCiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKIHsKLSAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUgYmFzZWQgb24gSEFMIGluZm8uCi0gICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOwotICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gbUNhcGFjaXR5SW5GcmFtZXMgKiBieXRlc1BlckZyYW1lOwotICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS5hZGRGaWxlRGVzY3JpcHRvcihtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IsIGNhcGFjaXR5SW5CeXRlcyk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwgMCwgY2FwYWNpdHlJbkJ5dGVzKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRCeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEZyYW1lc1BlckJ1cnN0KG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Q2FwYWNpdHlJbkZyYW1lcyhtQ2FwYWNpdHlJbkZyYW1lcyk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCAqPihtU2VydmljZUVuZHBvaW50LmdldCgpKX07CisgICAgcmV0dXJuIHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldERvd25EYXRhRGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAppbmRleCBiNjlkYzQ2Li5lMjQxNWQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKQEAgLTM3LDI3ICszNywyMCBAQAogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotICAgIC8qKgotICAgICAqIE1hbmFnZSBvbmUgbWVtb3J5IG1hcHBlZCBidWZmZXIgdGhhdCBvcmlnaW5hdGVkIGZyb20gYSBIQUwuCi0gICAgICovCi1jbGFzcyBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUAotICAgIDogcHVibGljIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlCi0gICAgLCBwdWJsaWMgYW5kcm9pZDo6TW1hcFN0cmVhbUNhbGxiYWNrIHsKKworLyoqCisgKiBUaGVzZSBjb3JyZXNwb25kcyB0byBhbiBFWENMVVNJVkUgbW9kZSBNTUFQIGNsaWVudCBzdHJlYW0uCisgKiBJdCBoYXMgZXhjbHVzaXZlIHVzZSBvZiBvbmUgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nCisgKiBkZXZpY2Ugb3IgcG9ydC4KKyAqLworY2xhc3MgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAgOiBwdWJsaWMgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgewogCiBwdWJsaWM6Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIHNlcnZpY2VDbGllbnQsIGJvb2wgaW5TZXJ2aWNlKTsKKyAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5TZXJ2aWNlKTsKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCgpID0gZGVmYXVsdDsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHNvIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGhvdXQgbG9zcyBvZiBkYXRhLgpAQCAtNjksNzkgKzYyLDM0IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpIG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KLSAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKTsKLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpOwotCiAgICAgLyoqCiAgICAgICogU2VuZCBhIE1NQVAvTk9JUlEgYnVmZmVyIHRpbWVzdGFtcCB0byB0aGUgY2xpZW50LgogICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0gQ2FsbGJhY2sgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHZvaWQgb25UZWFyRG93bigpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBvblZvbHVtZUNoYW5nZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPGZsb2F0PiB2YWx1ZXMpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRGV2aWNlIHNwZWNpZmljIHN0YXJ0dXAuCisgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0RGV2aWNlKCkgb3ZlcnJpZGU7CisKIHByaXZhdGU6Ci0gICAgLy8gVGhpcyBwcm94eSBjbGFzcyB3YXMgbmVlZGVkIHRvIHByZXZlbnQgYSBjcmFzaCBpbiBBdWRpb0ZsaW5nZXIKLSAgICAvLyB3aGVuIHRoZSBzdHJlYW0gd2FzIGNsb3NlZC4KLSAgICBjbGFzcyBNeU1tYXBTdHJlYW1DYWxsYmFjayA6IHB1YmxpYyBhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgTXlNbWFwU3RyZWFtQ2FsbGJhY2soYW5kcm9pZDo6TW1hcFN0cmVhbUNhbGxiYWNrICZzZXJ2aWNlQ2FsbGJhY2spCi0gICAgICAgICAgICA6IG1TZXJ2aWNlQ2FsbGJhY2soc2VydmljZUNhbGxiYWNrKXt9Ci0gICAgICAgIHZpcnR1YWwgfk15TW1hcFN0cmVhbUNhbGxiYWNrKCkgPSBkZWZhdWx0OwogCi0gICAgICAgIHZvaWQgb25UZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sub25UZWFyRG93bigpOwotICAgICAgICB9OwotCi0gICAgICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLCBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgb3ZlcnJpZGUKLSAgICAgICAgewotICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFjay5vblZvbHVtZUNoYW5nZWQoY2hhbm5lbHMsIHZhbHVlcyk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdm9pZCBvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sub25Sb3V0aW5nQ2hhbmdlZChkZXZpY2VJZCk7Ci0gICAgICAgIH07Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgJm1TZXJ2aWNlQ2FsbGJhY2s7Ci0gICAgfTsKLQotICAgIGFuZHJvaWQ6OnNwPE15TW1hcFN0cmVhbUNhbGxiYWNrPiAgIG1NbWFwU3RyZWFtQ2FsbGJhY2s7Ci0gICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47Ci0gICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzRnJhbWVDb3VudGVyID0gMDsgICAvLyBmcm9tIEhBTAotCi0gICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1tYXBTdHJlYW1JbnRlcmZhY2U+IG1NbWFwU3RyZWFtOwotICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mbzsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICAgICAgICAgICAgICBtUG9ydEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNsaWVudDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5TZXJ2aWNlID0gZmFsc2U7Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgICAgICAgICAgICAgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBtSW5TZXJ2aWNlID0gZmFsc2U7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhYXVkaW8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKaW5kZXggNTY1NDExMy4uMDg0Zjk5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bXV0ZXg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CkBAIC00MCw4ICs0MiwzMiBAQAogI2RlZmluZSBNQVhfRlJBTUVTX1BFUl9CVUZGRVIgICAgICAgKDMyICogMTAyNCkKIAogQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCi0gICAgOiBtQXVkaW9TZXJ2aWNlKGF1ZGlvU2VydmljZSkKLSAgICB7CisgICAgOiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShhdWRpb1NlcnZpY2UpCisgICAgLCBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQoMCkKKyAgICAsIG1YUnVuQ291bnQoMCkgeworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmR1bXBIZWFkZXIoKTsKKyAgICByZXN1bHQgPDwgIiAgICBXcml0ZSMgICAgIFJlYWQjICAgQXZhaWwgICBYUnVucyI7CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6ZHVtcCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CisKKyAgICByZXN1bHQgPDwgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmR1bXAoKTsKKworICAgIGF1dG8gZmlmbyA9IG1BdWRpb0RhdGFRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpOworICAgIGludDMyX3QgcmVhZENvdW50ZXIgPSBmaWZvLT5nZXRSZWFkQ291bnRlcigpOworICAgIGludDMyX3Qgd3JpdGVDb3VudGVyID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgd3JpdGVDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoMTApIDw8IHJlYWRDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgKHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDgpIDw8IGdldFhSdW5Db3VudCgpOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAogaW50MzJfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eShpbnQzMl90IHJlcXVlc3RlZENhcGFjaXR5RnJhbWVzLApAQCAtOTAsODcgKzExNiw3MiBAQAogICAgIHJldHVybiBjYXBhY2l0eUluRnJhbWVzOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpICB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpICB7CiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlIG9wZW4oKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbklucHV0ID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKIAotICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKLSAgICBtU2VydmljZUVuZHBvaW50ID0gbUVuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQobUF1ZGlvU2VydmljZSwgY29uZmlndXJhdGlvbk91dHB1dCwgZGlyZWN0aW9uKTsKLSAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNlcnZpY2VFbmRQb2ludCA9ICVwIiwgbVNlcnZpY2VFbmRwb2ludCk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgfQogCiAgICAgLy8gSXMgdGhlIHJlcXVlc3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzaGFyZWQgZW5kcG9pbnQ/Ci0gICAgbUF1ZGlvRm9ybWF0ID0gY29uZmlndXJhdGlvbklucHV0LmdldEZvcm1hdCgpOwotICAgIGlmIChtQXVkaW9Gb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBtQXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKLSAgICB9IGVsc2UgaWYgKG1BdWRpb0Zvcm1hdCAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgbUF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQoY29uZmlndXJhdGlvbklucHV0LmdldEZvcm1hdCgpKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgeworICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIGdldEZvcm1hdCgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIG1TYW1wbGVSYXRlID0gY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZVJhdGUoKTsKLSAgICBpZiAobVNhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1TYW1wbGVSYXRlID0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpOwotICAgIH0gZWxzZSBpZiAobVNhbXBsZVJhdGUgIT0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7CisgICAgc2V0U2FtcGxlUmF0ZShjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBpZiAoZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBzZXRTYW1wbGVSYXRlKG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVSYXRlKCkgIT0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCi0gICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgbVNhbXBsZXNQZXJGcmFtZSA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIH0gZWxzZSBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgeworICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpICE9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKLSAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldEZyYW1lc1BlckJ1cnN0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtU2FtcGxlUmF0ZSA9ICVkLCBtRnJhbWVzUGVyQnVyc3QgPSAlZCIsCi0gICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZXNQZXJCdXJzdCk7Ci0KLSAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IGNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRCdWZmZXJDYXBhY2l0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzIDwgMCkgewotICAgICAgICByZXN1bHQgPSBtQ2FwYWNpdHlJbkZyYW1lczsgLy8gbmVnYXRpdmUgZXJyb3IgY29kZQotICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IDA7CisgICAgc2V0QnVmZmVyQ2FwYWNpdHkoY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoY29uZmlndXJhdGlvbklucHV0LmdldEJ1ZmZlckNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0KSk7CisgICAgaWYgKGdldEJ1ZmZlckNhcGFjaXR5KCkgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7IC8vIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAgICAgICAgc2V0QnVmZmVyQ2FwYWNpdHkoMCk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgLy8gQ3JlYXRlIGF1ZGlvIGRhdGEgc2hhcmVkIG1lbW9yeSBidWZmZXIgZm9yIGNsaWVudC4KLSAgICBtQXVkaW9EYXRhUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOwotICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBtQ2FwYWNpdHlJbkZyYW1lcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBjb3VsZCBub3QgYWxsb2NhdGUgRklGTyB3aXRoICVkIGZyYW1lcyIsCi0gICAgICAgICAgICAgIG1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05PX01FTU9SWTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOworICAgICAgICAvLyBDcmVhdGUgYXVkaW8gZGF0YSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBmb3IgY2xpZW50LgorICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOworICAgICAgICByZXN1bHQgPSBtQXVkaW9EYXRhUXVldWUtPmFsbG9jYXRlKGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGNvdWxkIG5vdCBhbGxvY2F0ZSBGSUZPIHdpdGggJWQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2FtcGxlc1BlckZyYW1lLCBtU2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKLQotICAgIC8vIEZpbGwgaW4gY29uZmlndXJhdGlvbiBmb3IgY2xpZW50LgotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTYW1wbGVzUGVyRnJhbWUobVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRGb3JtYXQobUF1ZGlvRm9ybWF0KTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldERldmljZUlkKG1TZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOworICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIG1TZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogCiAgICAgcmVzdWx0ID0gbVNlcnZpY2VFbmRwb2ludC0+cmVnaXN0ZXJTdHJlYW0oa2VlcCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTE4NSwxMjEgKzE5NiwzMCBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qKgotICogU3RhcnQgdGhlIGZsb3cgb2YgYXVkaW8gZGF0YS4KLSAqCi0gKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdGFydCgpICB7Ci0gICAgaWYgKGlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50OwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0gICAgLy8gRm9yIG91dHB1dCBzdHJlYW1zLCB0aGlzIHdpbGwgYWRkIHRoZSBzdHJlYW0gdG8gdGhlIG1peGVyLgotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+c3RhcnRTdHJlYW0odGhpcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnN0YXJ0KCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBlbmRwb2ludC0+Z2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RhcnRDbGllbnQobU1tYXBDbGllbnQsICZtQ2xpZW50SGFuZGxlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHNvIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGhvdXQgbG9zcyBvZiBkYXRhLgotICoKLSAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpwYXVzZSgpICB7Ci0gICAgaWYgKCFpc1J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludDsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotICAgIGVuZHBvaW50LT5nZXRTdHJlYW1JbnRlcm5hbCgpLT5zdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+c3RvcFN0cmVhbSh0aGlzKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6cGF1c2UoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKLSAgICAgICAgZGlzY29ubmVjdCgpOyAvLyBUT0RPIHNob3VsZCB3ZSByZXR1cm4gb3IgcGF1c2UgQmFzZSBmaXJzdD8KLSAgICB9Ci0gICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpwYXVzZSgpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RvcCgpICB7Ci0gICAgaWYgKCFpc1J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludDsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotICAgIGVuZHBvaW50LT5nZXRTdHJlYW1JbnRlcm5hbCgpLT5zdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+c3RvcFN0cmVhbSh0aGlzKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RvcCgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfQotICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpOwotfQotCi0vKioKLSAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCi0gKgotICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Zmx1c2goKSAgewotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50OwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0gICAgaWYgKG1TdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgewotICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmZsdXNoKCkgc3RyZWFtIG5vdCBwYXVzZWQsIHN0YXRlID0gJXMiLAotICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChtU3RhdGUpKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLSAgICAvLyBEYXRhIHdpbGwgZ2V0IGZsdXNoZWQgd2hlbiB0aGUgY2xpZW50IHJlY2VpdmVzIHRoZSBGTFVTSEVEIGV2ZW50LgotICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKTsKLX0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNsb3NlKCkgIHsKLSAgICBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKTsKIAotICAgIHN0b3AoKTsKLQotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50OwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0KLSAgICBlbmRwb2ludC0+dW5yZWdpc3RlclN0cmVhbSh0aGlzKTsKLQotICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKLSAgICBtRW5kcG9pbnRNYW5hZ2VyLmNsb3NlRW5kcG9pbnQoZW5kcG9pbnQpOwotICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBudWxscHRyOwotCi0gICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKICAgICAgICAgZGVsZXRlIG1BdWRpb0RhdGFRdWV1ZTsKICAgICAgICAgbUF1ZGlvRGF0YVF1ZXVlID0gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCiAgKiBHZXQgYW4gaW1tdXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIHF1ZXVlIGNyZWF0ZWQgYnkgdGhpcyBzZXJ2aWNlLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CisgICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUuCiAgICAgbUF1ZGlvRGF0YVF1ZXVlLT5maWxsUGFyY2VsYWJsZShwYXJjZWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpOwpAQCAtMzA3LDE1ICsyMjcsMzcgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi12b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om1hcmtUcmFuc2ZlclRpbWUoaW50NjRfdCBuYW5vc2Vjb25kcykgewotICAgIG1NYXJrZWRQb3NpdGlvbiA9IG1BdWRpb0RhdGFRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpLT5nZXRSZWFkQ291bnRlcigpOwotICAgIG1NYXJrZWRUaW1lID0gbmFub3NlY29uZHM7Cit2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om1hcmtUcmFuc2ZlclRpbWUoVGltZXN0YW1wICZ0aW1lc3RhbXApIHsKKyAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiB9CiAKKy8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBtaXhlciBvciBkaXN0cmlidXRvci4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKKyAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOworICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorfQorCisvLyBHZXQgdGltZXN0YW1wIGZyb20gbG93ZXIgbGV2ZWwgc2VydmljZS4KK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLSAgICAvLyBUT0RPIGdldCB0aGVzZSB0d28gbnVtYmVycyBhcyBhbiBhdG9taWMgcGFpcgotICAgICpwb3NpdGlvbkZyYW1lcyA9IG1NYXJrZWRQb3NpdGlvbjsKLSAgICAqdGltZU5hbm9zID0gbU1hcmtlZFRpbWU7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKworICAgIGludDY0X3QgcG9zaXRpb24gPSAwOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5nZXRUaW1lc3RhbXAoJnBvc2l0aW9uLCB0aW1lTmFub3MpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gbVRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0LmxvYWQoKTsKKyAgICAgICAgLy8gVE9ETywgZG8gbm90IGdvIGJlbG93IHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIHBvc2l0aW9uIC09IG9mZnNldDsgLy8gT2Zmc2V0IGZyb20gc2hhcmVkIE1NQVAgc3RyZWFtCisgICAgICAgIEFMT0dWKCJnZXRIYXJkd2FyZVRpbWVzdGFtcCgpICU4bGxkID0gJThsbGQgLSAlOGxsZCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpIHBvc2l0aW9uLCAobG9uZyBsb25nKSAocG9zaXRpb24gKyBvZmZzZXQpLCAobG9uZyBsb25nKSBvZmZzZXQpOworICAgIH0KKyAgICAqcG9zaXRpb25GcmFtZXMgPSBwb3NpdGlvbjsKKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCmluZGV4IDZiNjczMzcuLjg0OTllYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKQEAgLTQ2LDUzICs0Niw1NSBAQAogICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYUF1ZGlvU2VydmljZSk7CiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgpID0gZGVmYXVsdDsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpIG92ZXJyaWRlOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSGVhZGVyKCk7CiAKLSAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc28gdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCi0gICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBhZnRlciBkYXRhIGluIGJ1ZmZlciBoYXMgcGxheWVkLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgb3ZlcnJpZGU7CiAKLSAgICBhbmRyb2lkOjpGaWZvQnVmZmVyICpnZXREYXRhRmlmb0J1ZmZlcigpIHsgcmV0dXJuIG1BdWRpb0RhdGFRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpOyB9CisgICAgLyoqCisgICAgICogVGhpcyBtdXN0IGJlIGxvY2tlZCB3aGVuIGNhbGxpbmcgZ2V0QXVkaW9EYXRhRmlmb0J1ZmZlcl9sKCkgYW5kIHdoaWxlCisgICAgICogdXNpbmcgdGhlIEZpZm9CdWZmZXIgaXQgcmV0dXJucy4KKyAgICAgKi8KKyAgICBzdGQ6Om11dGV4ICZnZXRBdWRpb0RhdGFRdWV1ZUxvY2soKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9EYXRhUXVldWVMb2NrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGwgdW5kZXIgZ2V0QXVkaW9EYXRhUXVldWVMb2NrKCkuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpIHsgcmV0dXJuIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsgfQogCiAgICAgLyogS2VlcCBhIHJlY29yZCBvZiB3aGVuIGEgYnVmZmVyIHRyYW5zZmVyIGNvbXBsZXRlZC4KICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBtb3JlIGFjY3VyYXRlIHRpbWluZyBtb2RlbC4KICAgICAgKi8KLSAgICB2b2lkIG1hcmtUcmFuc2ZlclRpbWUoaW50NjRfdCBuYW5vc2Vjb25kcyk7CisgICAgdm9pZCBtYXJrVHJhbnNmZXJUaW1lKFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKKworICAgIHZvaWQgc2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQoaW50NjRfdCBkZWx0YUZyYW1lcykgeworICAgICAgICBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQuc3RvcmUoZGVsdGFGcmFtZXMpOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50WFJ1bkNvdW50KCkgeworICAgICAgICBtWFJ1bkNvdW50Kys7CisgICAgfQorCisgICAgaW50MzJfdCBnZXRYUnVuQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtWFJ1bkNvdW50LmxvYWQoKTsKKyAgICB9CiAKIHByb3RlY3RlZDoKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKICAgICAvKioKICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMKICAgICAgKiBAcGFyYW0gZnJhbWVzUGVyQnVyc3QKQEAgLTEwMiwxMiArMTA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QpOwogCiBwcml2YXRlOgotICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgICZtQXVkaW9TZXJ2aWNlOwotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAgICptU2VydmljZUVuZHBvaW50ID0gbnVsbHB0cjsKLSAgICBTaGFyZWRSaW5nQnVmZmVyICAgICAgICAqbUF1ZGlvRGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBTaGFyZWRSaW5nQnVmZmVyICAgICAgICAqbUF1ZGlvRGF0YVF1ZXVlID0gbnVsbHB0cjsgLy8gcHJvdGVjdGVkIGJ5IG1BdWRpb0RhdGFRdWV1ZUxvY2sKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgbUF1ZGlvRGF0YVF1ZXVlTG9jazsKIAotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTWFya2VkUG9zaXRpb24gPSAwOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTWFya2VkVGltZSA9IDA7CisgICAgc3RkOjphdG9taWM8aW50NjRfdD4gICAgIG1UaW1lc3RhbXBQb3NpdGlvbk9mZnNldDsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgICAgbVhSdW5Db3VudDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODhiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtVHJhY2tlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSAiQUF1ZGlvU3RyZWFtVHJhY2tlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKK3NwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpyZW1vdmVTdHJlYW1CeUhhbmRsZSgKKyAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKKyAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5maW5kKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1TdHJlYW1zQnlIYW5kbGUuZXJhc2UoaXQpOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKK30KKworc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmdldFN0cmVhbUJ5SGFuZGxlKAorICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhhbmRsZUxvY2spOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtOworICAgIGF1dG8gaXQgPSBtU3RyZWFtc0J5SGFuZGxlLmZpbmQoc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoaXQgIT0gbVN0cmVhbXNCeUhhbmRsZS5lbmQoKSkgeworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW07Cit9CisKKy8vIGFkdmFuY2UgdG8gbmV4dCBsZWdhbCBoYW5kbGUgdmFsdWUKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorYWF1ZGlvX2hhbmRsZV90IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmJ1bXBIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGhhbmRsZSsrOworICAgIC8vIE9ubHkgdXNlIHBvc2l0aXZlIGludGVnZXJzLgorICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICBoYW5kbGUgPSAxOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCithYXVkaW9faGFuZGxlX3QgQUF1ZGlvU3RyZWFtVHJhY2tlcjo6YWRkU3RyZWFtRm9ySGFuZGxlKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhhbmRsZUxvY2spOworICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtUHJldmlvdXNIYW5kbGUubG9hZCgpOworICAgIC8vIEFzc2lnbiBhIHVuaXF1ZSBoYW5kbGUuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaGFuZGxlID0gYnVtcEhhbmRsZShoYW5kbGUpOworICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gb2xkU2VydmljZVN0cmVhbSA9IG1TdHJlYW1zQnlIYW5kbGVbaGFuZGxlXTsKKyAgICAgICAgLy8gSXMgdGhpcyBhbiB1bnVzZWQgaGFuZGxlPyBJdCB3b3VsZCBiZSBleHRyZW1lbHkgdW5saWtlbHkgdG8gd3JhcAorICAgICAgICAvLyBhcm91bmQgYW5kIGNvbGxpZGUgd2l0aCBhIHZlcnkgb2xkIGhhbmRsZS4gQnV0IGp1c3QgaW4gY2FzZS4KKyAgICAgICAgaWYgKG9sZFNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVN0cmVhbXNCeUhhbmRsZVtoYW5kbGVdID0gc2VydmljZVN0cmVhbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1QcmV2aW91c0hhbmRsZS5zdG9yZShoYW5kbGUpOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0ZDo6c3RyaW5nIEFBdWRpb1N0cmVhbVRyYWNrZXI6OmR1bXAoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OworICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAorICAgICAgICAgICAgW3RoaXNdKCktPmJvb2wgeyByZXR1cm4gbUhhbmRsZUxvY2sudHJ5X2xvY2soKTsgfSAvKiBmICovLAorICAgICAgICAgICAgNTAgLyogdGltZXMgKi8sCisgICAgICAgICAgICAyMCAvKiBzbGVlcE1zICovKTsKKyAgICBpZiAoIWlzTG9ja2VkKSB7CisgICAgICAgIHJlc3VsdCA8PCAiQUF1ZGlvU3RyZWFtVHJhY2tlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPDwgIlN0cmVhbSBIYW5kbGVzOlxuIjsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiAgaXQgOiBtU3RyZWFtc0J5SGFuZGxlKSB7CisgICAgICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gaXQuc2Vjb25kLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiICAgIDB4IiA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkgPDwgc3RkOjpoZXggPDwgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIG1IYW5kbGVMb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDQ0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUFVRElPX0FBVURJT19TVFJFQU1fVFJBQ0tFUl9ICisjZGVmaW5lIEFBVURJT19BQVVESU9fU1RSRUFNX1RSQUNLRVJfSAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCisKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgorCituYW1lc3BhY2UgYWF1ZGlvIHsKKworY2xhc3MgQUF1ZGlvU3RyZWFtVHJhY2tlciB7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KKyAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlCisgICAgICogQHJldHVybiBzdHJvbmcgcG9pbnRlciB0byB0aGUgc3RyZWFtIGlmIGZvdW5kIG9yIHRvIG51bGxwdHIKKyAgICAgKi8KKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gcmVtb3ZlU3RyZWFtQnlIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBMb29rIHVwIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBoYW5kbGUuCisgICAgICogQHBhcmFtIHN0cmVhbUhhbmRsZQorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBmb3VuZCBvciB0byBudWxscHRyCisgICAgICovCisgICAgYW5kcm9pZDo6c3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gZ2V0U3RyZWFtQnlIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYW5kIHJldHVybiBhIHVuaXF1ZSBoYW5kbGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisgICAgICogVGhlIGhhbmRsZSBpcyBndWFyYW50ZWVkIG5vdCB0byBjb2xsaWRlIHdpdGggYW4gZXhpc3Rpbmcgc3RyZWFtLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlU3RyZWFtCisgICAgICogQHJldHVybiBoYW5kbGUgZm9yIGlkZW50aWZ5aW5nIHRoZSBzdHJlYW0KKyAgICAgKi8KKyAgICBhYXVkaW9faGFuZGxlX3QgYWRkU3RyZWFtRm9ySGFuZGxlKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gc3RyaW5nIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGR1bXBzeXMKKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGFhdWRpb19oYW5kbGVfdCBidW1wSGFuZGxlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLy8gVHJhY2sgc3RyZWFtIHVzaW5nIGEgdW5pcXVlIGhhbmRsZSB0aGF0IHdyYXBzLiBPbmx5IHVzZSBwb3NpdGl2ZSBoYWxmLgorICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICBtSGFuZGxlTG9jazsKKyAgICBzdGQ6OmF0b21pYzxhYXVkaW9faGFuZGxlX3Q+ICAgICAgbVByZXZpb3VzSGFuZGxlezB9OworICAgIHN0ZDo6bWFwPGFhdWRpb19oYW5kbGVfdCwgYW5kcm9pZDo6c3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1TdHJlYW1zQnlIYW5kbGU7Cit9OworCisKK30gLyogbmFtZXNwYWNlIGFhdWRpbyAqLworCisjZW5kaWYgLyogQUFVRElPX0FBVURJT19TVFJFQU1fVFJBQ0tFUl9IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAppbmRleCBlYmI1MGY4Li5jNmZiNTdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKQEAgLTUzLDcgKzUzLDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RhcnQoUnVubmFibGUgKnJ1bm5hYmxlKSB7CiAgICAgaWYgKG1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1RocmVhZDo6c3RhcnQoKSAtIG1IYXNUaHJlYWQubG9hZCgpIGFscmVhZHkgdHJ1ZSIpOworICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdGFydCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICAvLyBtUnVubmFibGUgd2lsbCBiZSByZWFkIGJ5IHRoZSBuZXcgdGhyZWFkIHdoZW4gaXQgc3RhcnRzLgpAQCAtNzEsNiArNzEsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdG9wKCkgewogICAgIGlmICghbUhhc1RocmVhZCkgeworICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdG9wKCkgYnV0IG5vIHRocmVhZCBydW5uaW5nIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCBudWxscHRyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGE4OTZhN2EuLjU4NGIyZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNiBAQAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKIAogTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICAkKExJQkFBVURJT19TUkNfRElSKS91dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwIFwKICAgICBTaGFyZWRNZW1vcnlQcm94eS5jcHAgXAogICAgIFNoYXJlZFJpbmdCdWZmZXIuY3BwIFwKICAgICBBQXVkaW9DbGllbnRUcmFja2VyLmNwcCBcCkBAIC0zMSwxMCArMzAsMTMgQEAKICAgICBBQXVkaW9TZXJ2aWNlLmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgXAorICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBcCisgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwIFwKKyAgICBBQXVkaW9TdHJlYW1UcmFja2VyLmNwcCBcCiAgICAgVGltZXN0YW1wU2NoZWR1bGVyLmNwcCBcCiAgICAgQUF1ZGlvVGhyZWFkLmNwcAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL09XTkVSUwpAQCAtMCwwICsxIEBACitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggZmM0NTMyYy4uYzMxNTU3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMTYsMTIgKzE2LDExIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBTaGFyZWRNZW1vcnlQcm94eTo6flNoYXJlZE1lbW9yeVByb3h5KCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUwZGMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgUmFkaW9TZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnJhZGlvIFwKLSAgICBsaWJyYWRpb19tZXRhZGF0YQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgUmFkaW9IYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgSGlkbFV0aWxzLmNwcCBcCi0gICAgUmFkaW9IYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMAotZW5kaWYKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJyYWRpb3NlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTUzNzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiSGlkbFV0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgotCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhZGF0YVR5cGU7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRlZW1waGFzaXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJkczsKLQotLy9zdGF0aWMKLWludCBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCkKLXsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOgotICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpUSU1FT1VUOgotICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKEJhbmRDb25maWcgKmhhbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaGFsQ29uZmlnLT50eXBlID0gc3RhdGljX2Nhc3Q8QmFuZD4oY29uZmlnLT50eXBlKTsKLSAgICBoYWxDb25maWctPmFudGVubmFDb25uZWN0ZWQgPSBjb25maWctPmFudGVubmFfY29ubmVjdGVkOwotICAgIGhhbENvbmZpZy0+bG93ZXJMaW1pdCA9IGNvbmZpZy0+bG93ZXJfbGltaXQ7Ci0gICAgaGFsQ29uZmlnLT51cHBlckxpbWl0ID0gY29uZmlnLT51cHBlcl9saW1pdDsKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1bnNpZ25lZCBpbnQgKj4oJmNvbmZpZy0+c3BhY2luZ3NbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICAvLyBGSVhNRTogdHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcC4gc2hvdWxkIGhhdmUgYSBtZXRob2QgZm9yIHRoYXQgaW4gaGlkbF92ZWMKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnJlc2l6ZShjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmRlZW1waGFzaXMgPSBzdGF0aWNfY2FzdDxEZWVtcGhhc2lzPihjb25maWctPmZtLmRlZW1waGFzaXMpOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5zdGVyZW8gPSBjb25maWctPmZtLnN0ZXJlbzsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0ucmRzID0gc3RhdGljX2Nhc3Q8UmRzPihjb25maWctPmZtLnJkcyk7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnRhID0gY29uZmlnLT5mbS50YTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uYWYgPSBjb25maWctPmZtLmFmOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5lYSA9IGNvbmZpZy0+Zm0uZWE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvID0gY29uZmlnLT5hbS5zdGVyZW87Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9wZXJ0aWVzRnJvbUhhbChyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0aWVzICpoYWxQcm9wZXJ0aWVzKQotewotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gc3RhdGljX2Nhc3Q8cmFkaW9fY2xhc3NfdD4oaGFsUHJvcGVydGllcy0+Y2xhc3NJZCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdC5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT52ZXJzaW9uLCBoYWxQcm9wZXJ0aWVzLT52ZXJzaW9uLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtVHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtQXVkaW9Tb3VyY2VzOwotICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c0NhcHR1cmU7Ci0gICAgcHJvcGVydGllcy0+bnVtX2JhbmRzID0gaGFsUHJvcGVydGllcy0+YmFuZHMuc2l6ZSgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxQcm9wZXJ0aWVzLT5iYW5kcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJnByb3BlcnRpZXMtPmJhbmRzW2ldLCAmaGFsUHJvcGVydGllcy0+YmFuZHNbaV0pOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKQotewotICAgIGNvbmZpZy0+dHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX2JhbmRfdD4oaGFsQ29uZmlnLT50eXBlKTsKLSAgICBjb25maWctPmFudGVubmFfY29ubmVjdGVkID0gaGFsQ29uZmlnLT5hbnRlbm5hQ29ubmVjdGVkOwotICAgIGNvbmZpZy0+bG93ZXJfbGltaXQgPSBoYWxDb25maWctPmxvd2VyTGltaXQ7Ci0gICAgY29uZmlnLT51cHBlcl9saW1pdCA9IGhhbENvbmZpZy0+dXBwZXJMaW1pdDsKLSAgICBjb25maWctPm51bV9zcGFjaW5ncyA9IGhhbENvbmZpZy0+c3BhY2luZ3Muc2l6ZSgpOwotICAgIGlmIChjb25maWctPm51bV9zcGFjaW5ncyA+IFJBRElPX05VTV9TUEFDSU5HU19NQVgpIHsKLSAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgPSBSQURJT19OVU1fU1BBQ0lOR1NfTUFYOwotICAgIH0KLSAgICBtZW1jcHkoY29uZmlnLT5zcGFjaW5ncywgaGFsQ29uZmlnLT5zcGFjaW5ncy5kYXRhKCksCi0gICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiBjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGNvbmZpZy0+Zm0uZGVlbXBoYXNpcyA9IHN0YXRpY19jYXN0PHJhZGlvX2RlZW1waGFzaXNfdD4oaGFsQ29uZmlnLT5leHQuZm0uZGVlbXBoYXNpcyk7Ci0gICAgICAgIGNvbmZpZy0+Zm0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuZm0uc3RlcmVvOwotICAgICAgICBjb25maWctPmZtLnJkcyA9IHN0YXRpY19jYXN0PHJhZGlvX3Jkc190PihoYWxDb25maWctPmV4dC5mbS5yZHMpOwotICAgICAgICBjb25maWctPmZtLnRhID0gaGFsQ29uZmlnLT5leHQuZm0udGE7Ci0gICAgICAgIGNvbmZpZy0+Zm0uYWYgPSBoYWxDb25maWctPmV4dC5mbS5hZjsKLSAgICAgICAgY29uZmlnLT5mbS5lYSA9IGhhbENvbmZpZy0+ZXh0LmZtLmVhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbmZpZy0+YW0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvOwotICAgIH0KLX0KLQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtSW5mbyAqaGFsSW5mbykKLXsKLSAgICBpbmZvLT5jaGFubmVsID0gaGFsSW5mby0+Y2hhbm5lbDsKLSAgICBpbmZvLT5zdWJfY2hhbm5lbCA9IGhhbEluZm8tPnN1YkNoYW5uZWw7Ci0gICAgaW5mby0+dHVuZWQgPSBoYWxJbmZvLT50dW5lZDsKLSAgICBpbmZvLT5zdGVyZW8gPSBoYWxJbmZvLT5zdGVyZW87Ci0gICAgaW5mby0+ZGlnaXRhbCA9IGhhbEluZm8tPmRpZ2l0YWw7Ci0gICAgaW5mby0+c2lnbmFsX3N0cmVuZ3RoID0gaGFsSW5mby0+c2lnbmFsU3RyZW5ndGg7Ci0gICAgY29udmVydE1ldGFEYXRhRnJvbUhhbCgmaW5mby0+bWV0YWRhdGEsIGhhbEluZm8tPm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby0+Y2hhbm5lbCwgaGFsSW5mby0+c3ViQ2hhbm5lbCk7Ci19Ci0KLS8vIFRPRE8odHdhc2lsY3p5ayk6IGRyb3AgdW5uZWNlc3NhcnkgY2hhbm5lbCBpbmZvCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsIF9fdW51c2VkKQotewotCi0gICAgaWYgKG1ldGFkYXRhID09IG51bGxwdHIgfHwgKm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImRlc3RpbmF0aW9uIG1ldGFkYXRhIGJ1ZmZlciBpcyBhIG51bGxwdHIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbE1ldGFkYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX2tleV90IGtleSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS5rZXkpOwotICAgICAgICByYWRpb19tZXRhZGF0YV90eXBlX3QgdHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS50eXBlKTsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfY2xvY2tfdCBjbG9jazsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX0lOVDoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9pbnQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uaW50VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9URVhUOgotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX3RleHQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uc3RyaW5nVmFsdWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX1JBVzoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9yYXcobWV0YWRhdGEsIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0ucmF3VmFsdWUuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5yYXdWYWx1ZS5zaXplKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9DTE9DSzoKLSAgICAgICAgICAgIGNsb2NrLnV0Y19zZWNvbmRzX3NpbmNlX2Vwb2NoID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS51dGNTZWNvbmRzU2luY2VFcG9jaDsKLSAgICAgICAgICAgIGNsb2NrLnRpbWV6b25lX29mZnNldF9pbl9taW51dGVzID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS50aW1lem9uZU9mZnNldEluTWludXRlczsKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9jbG9jayhtZXRhZGF0YSwga2V5LCAmY2xvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBtZXRhZGF0YSB0eXBlICV1IixfX0ZVTkNUSU9OX18sIGhhbE1ldGFkYXRhW2ldLnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzcxMDYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJlc3VsdDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBIaWRsVXRpbHMgewotcHVibGljOgotICAgIHN0YXRpYyBpbnQgY29udmVydEhhbFJlc3VsdChSZXN1bHQgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydGllcyAqaGFsUHJvcGVydGllcyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbUluZm8gKmhhbEluZm8pOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNzI3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9SYWRpb01ldGFkYXRhV3JhcHBlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpb0ZhY3RvcnkuaD4KLQotI2luY2x1ZGUgIlJhZGlvSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SUJyb2FkY2FzdFJhZGlvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6Q2xhc3M7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRpcmVjdGlvbjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLQotCi0vKiBzdGF0aWMgKi8KLXNwPFJhZGlvSW50ZXJmYWNlPiBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpCi17Ci0gICAgcmV0dXJuIG5ldyBSYWRpb0hhbEhpZGwoY2xhc3NJZCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OmdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gbW9kdWxlID0gZ2V0U2VydmljZSgpOwotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIFJlc3VsdCBoYWxSZXN1bHQgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPmdldFByb3BlcnRpZXMoWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6Om9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1vZHVsZSA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBuZXcgVHVuZXIoY2FsbGJhY2ssIHRoaXMpOwotCi0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIHNwPElUdW5lcj4gaGFsVHVuZXI7Ci0KLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPm9wZW5UdW5lcihoYWxDb25maWcsIGF1ZGlvLCB0dW5lckltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SVR1bmVyPiYgdHVuZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyID0gdHVuZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIGlmIChoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgdHVuZXIgPSB0dW5lckltcGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IHN0YXRpY19jYXN0PFR1bmVyICo+KHR1bmVyLmdldCgpKTsKLSAgICBzcDxJVHVuZXI+IGNsZWFyVHVuZXI7Ci0gICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihjbGVhclR1bmVyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUmFkaW9IYWxIaWRsOjpSYWRpb0hhbEhpZGwocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotICAgIDogbUNsYXNzSWQoY2xhc3NJZCkKLXsKLX0KLQotUmFkaW9IYWxIaWRsOjp+UmFkaW9IYWxIaWRsKCkKLXsKLX0KLQotc3A8SUJyb2FkY2FzdFJhZGlvPiBSYWRpb0hhbEhpZGw6OmdldFNlcnZpY2UoKQotewotICAgIGlmIChtSGFsTW9kdWxlID09IDApIHsKLSAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvRmFjdG9yeT4gZmFjdG9yeSA9IElCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gMCkgewotICAgICAgICAgICAgZmFjdG9yeS0+Y29ubmVjdE1vZHVsZShzdGF0aWNfY2FzdDxDbGFzcz4obUNsYXNzSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgcmV0dmFsLCBjb25zdCA6OmFuZHJvaWQ6OnNwPElCcm9hZGNhc3RSYWRpbz4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtSGFsTW9kdWxlID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyBPVVQgbW9kdWxlICVwIiwgX19GVU5DVElPTl9fLCBtSGFsTW9kdWxlLmdldCgpKTsKLSAgICByZXR1cm4gbUhhbE1vZHVsZTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OmNsZWFyU2VydmljZSgpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1vZHVsZSAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbE1vZHVsZS5nZXQoKSk7Ci0gICAgbUhhbE1vZHVsZS5jbGVhcigpOwotfQotCi0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLQotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5zZXRDb25maWd1cmF0aW9uKGhhbENvbmZpZyk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPmdldENvbmZpZ3VyYXRpb24oWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykgewotICAgICAgICAgICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpICYmIGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKGNvbmZpZywgJmhhbENvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zY2FuKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zdGVwKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPnR1bmUoY2hhbm5lbCwgc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpjYW5jZWwoKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5jYW5jZWwoKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAoaW5mbyA9PSBudWxscHRyIHx8IGluZm8tPm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgUHJvZ3JhbUluZm8gaGFsSW5mbzsKLSAgICBSZXN1bHQgaGFsUmVzdWx0OwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0gbUhhbFR1bmVyLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oCi0gICAgICAgIFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykgewotICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgaGFsSW5mbyA9IGluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmIChoaWRsUmV0dXJuLmlzT2soKSAmJiBoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoaW5mbywgJmhhbEluZm8pOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYXJkd2FyZUZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgaGFuZGxlSHdGYWlsdXJlKCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6Y29uZmlnQ2hhbmdlKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05GSUc7Ci0gICAgZXZlbnQuc3RhdHVzID0gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KHJlc3VsdCk7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJmV2ZW50LmNvbmZpZywgJmNvbmZpZyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmVDb21wbGV0ZShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5pbmZvLm1ldGFkYXRhKTsKLQotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKLSAgICBldmVudC5zdGF0dXMgPSBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQocmVzdWx0KTsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoJmV2ZW50LmluZm8sICZpbmZvKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6YWZTd2l0Y2goY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQuaW5mby5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQUZfU1dJVENIOwotICAgIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbCgmZXZlbnQuaW5mbywgJmluZm8pOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjphbnRlbm5hU3RhdGVDaGFuZ2UoYm9vbCBjb25uZWN0ZWQpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQU5URU5OQTsKLSAgICBldmVudC5vbiA9IGNvbm5lY3RlZDsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnRyYWZmaWNBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVEE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjplbWVyZ2VuY3lBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfRUE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8TWV0YURhdGE+JiBtZXRhZGF0YSkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfTUVUQURBVEE7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0TWV0YURhdGFGcm9tSGFsKCZldmVudC5tZXRhZGF0YSwgbWV0YWRhdGEsIGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLQotUmFkaW9IYWxIaWRsOjpUdW5lcjo6VHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spLCBtUGFyZW50TW9kdWxlKG1vZHVsZSkKLXsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGhhbmRsZXIgd2UgYXJlIHBhc3NpbmcgaW4gb25seSBkZWFscyB3aXRoIGNvbnN0IG1lbWJlcnMsCi0gICAgLy8gYXMgaXQgY2FuIGJlIGNhbGxlZCBvbiBhbiBhcmJpdHJhcnkgdGhyZWFkLgotICAgIGNvbnN0IGF1dG8mIHNlbGYgPSB0aGlzOwotICAgIEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+cmVnaXN0ZXJBdEV4aXRIYW5kbGVyKAotICAgICAgICAgICAgdGhpcywgWyZzZWxmXSgpIHsgc2VsZi0+c2VuZEh3RmFpbHVyZUV2ZW50KCk7IH0pOwotfQotCi0KLVJhZGlvSGFsSGlkbDo6VHVuZXI6On5UdW5lcigpCi17Ci0gICAgSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT51bnJlZ2lzdGVyQXRFeGl0SGFuZGxlcih0aGlzKTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcikgewotICAgIGlmIChtSGFsVHVuZXIgIT0gMCkgewotICAgICAgICBtSGFsVHVuZXItPnVubGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpKTsKLSAgICB9Ci0gICAgbUhhbFR1bmVyID0gaGFsVHVuZXI7Ci0gICAgaWYgKG1IYWxUdW5lciAhPSAwKSB7Ci0gICAgICAgIG1IYWxUdW5lci0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYW5kbGVId0ZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8UmFkaW9IYWxIaWRsPiBwYXJlbnRNb2R1bGUgPSBtUGFyZW50TW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAocGFyZW50TW9kdWxlICE9IDApIHsKLSAgICAgICAgcGFyZW50TW9kdWxlLT5jbGVhclNlcnZpY2UoKTsKLSAgICB9Ci0gICAgc2VuZEh3RmFpbHVyZUV2ZW50KCk7Ci0gICAgbUhhbFR1bmVyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3QKLXsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfSFdfRkFJTFVSRTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6b25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudChoYWxFdmVudCk7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg0MjBkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpby5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lckNhbGxiYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UmVzdWx0OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJQnJvYWRjYXN0UmFkaW87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklUdW5lcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SVR1bmVyQ2FsbGJhY2s7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBSYWRpb0hhbEhpZGwgOiBwdWJsaWMgUmFkaW9JbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxIaWRsKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW9JbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKTsKLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLQotICAgICAgICBjbGFzcyBUdW5lciAgOiBwdWJsaWMgVHVuZXJJbnRlcmZhY2UsIHB1YmxpYyB2aXJ0dWFsIElUdW5lckNhbGxiYWNrCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgVHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVuZXJJbnRlcmZhY2UKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBjYW5jZWwoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElUdW5lckNhbGxiYWNrCi0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBoYXJkd2FyZUZhaWx1cmUoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbmZpZ0NoYW5nZShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gdHVuZUNvbXBsZXRlKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFmU3dpdGNoKGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFudGVubmFTdGF0ZUNoYW5nZShib29sIGNvbm5lY3RlZCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiB0cmFmZmljQW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGVtZXJnZW5jeUFubm91bmNlbWVudChib29sIGFjdGl2ZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzxNZXRhRGF0YT4mIG1ldGFkYXRhKTsKLQotICAgICAgICAgICAgdm9pZCBzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcik7Ci0gICAgICAgICAgICBzcDxJVHVuZXI+IGdldEhhbFR1bmVyKCkgeyByZXR1cm4gbUhhbFR1bmVyOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZpcnR1YWwgICAgICAgICAgflR1bmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0OwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICBoYW5kbGVId0ZhaWx1cmUoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgc2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHNwPElUdW5lcj4gbUhhbFR1bmVyOwotICAgICAgICAgICAgY29uc3Qgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrOwotICAgICAgICAgICAgd3A8UmFkaW9IYWxIaWRsPiBtUGFyZW50TW9kdWxlOwotICAgICAgICB9OwotCi0gICAgICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gZ2V0U2VydmljZSgpOwotICAgICAgICB2b2lkIGNsZWFyU2VydmljZSgpOwotCi1wcml2YXRlOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgflJhZGlvSGFsSGlkbCgpOwotCi0gICAgICAgICAgICAgICAgcmFkaW9fY2xhc3NfdCBtQ2xhc3NJZDsKLSAgICAgICAgICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1IYWxNb2R1bGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwY2NkNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9IYWxMZWdhY3kiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSAiUmFkaW9IYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jb25zdCBjaGFyICpSYWRpb0hhbExlZ2FjeTo6c0NsYXNzTW9kdWxlTmFtZXNbXSA9IHsKLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRk0sIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX0FNX0ZNICovCi0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NBVCwgIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX1NBVCAqLwotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9EVCwgICAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19EVCAqLwotfTsKLQotLyogc3RhdGljICovCi1zcDxSYWRpb0ludGVyZmFjZT4gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotewotICAgIHJldHVybiBuZXcgUmFkaW9IYWxMZWdhY3koY2xhc3NJZCk7Ci19Ci0KLVJhZGlvSGFsTGVnYWN5OjpSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpCi0gICAgOiBSYWRpb0ludGVyZmFjZSgpLCBtQ2xhc3NJZChjbGFzc0lkKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgUmFkaW9IYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotICAgIEFMT0dJKCIlcyBtQ2xhc3NJZCAlZCIsIF9fRlVOQ1RJT05fXywgbUNsYXNzSWQpOwotCi0gICAgbUh3RGV2aWNlID0gTlVMTDsKLQotICAgIGlmICgobUNsYXNzSWQgPCAwKSB8fAotICAgICAgICAgICAgKG1DbGFzc0lkID49IE5FTEVNKHNDbGFzc01vZHVsZU5hbWVzKSkpIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgY2xhc3MgSUQgJWQiLCBtQ2xhc3NJZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HSSgiJXMgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEICVzICVzIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgc0NsYXNzTW9kdWxlTmFtZXNbbUNsYXNzSWRdKTsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgcmFkaW8gbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSByYWRpb19od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHJhZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IFJBRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyByYWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgIH0KLX0KLQotUmFkaW9IYWxMZWdhY3k6On5SYWRpb0hhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIGludCByYyA9IG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHJldHVybiByYzsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gbmV3IFR1bmVyKGNhbGxiYWNrKTsKLQotICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXI7Ci0gICAgaW50IHJjID0gbUh3RGV2aWNlLT5vcGVuX3R1bmVyKG1Id0RldmljZSwgY29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjaywgdHVuZXJJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsVHVuZXIpOwotICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoaGFsVHVuZXIpOwotICAgICAgICB0dW5lciA9IHR1bmVySW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OmNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmICh0dW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gKFR1bmVyICopdHVuZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Y2xvc2VfdHVuZXIobUh3RGV2aWNlLCB0dW5lckltcGwtPmdldEhhbFR1bmVyKCkpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zZXRfY29uZmlndXJhdGlvbihtSGFsVHVuZXIsIGNvbmZpZyk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmdldF9jb25maWd1cmF0aW9uKG1IYWxUdW5lciwgY29uZmlnKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnNjYW4obUhhbFR1bmVyLCBkaXJlY3Rpb24sIHNraXBfc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c3RlcChtSGFsVHVuZXIsIGRpcmVjdGlvbiwgc2tpcF9zdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnR1bmUobUhhbFR1bmVyLCBjaGFubmVsLCBzdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmNhbmNlbCgpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5jYW5jZWwobUhhbFR1bmVyKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Z2V0X3Byb2dyYW1faW5mb3JtYXRpb24obUhhbFR1bmVyLCBpbmZvKTsKLX0KLQotdm9pZCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6Om9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoaGFsRXZlbnQpOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSkKLXsKLSAgICB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+IHdlYWsgPSB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+KChSYWRpb0hhbExlZ2FjeTo6VHVuZXIgKiljb29raWUpOwotICAgIHNwPFJhZGlvSGFsTGVnYWN5OjpUdW5lcj4gdHVuZXIgPSB3ZWFrLnByb21vdGUoKTsKLSAgICBpZiAodHVuZXIgIT0gMCkgewotICAgICAgICB0dW5lci0+b25DYWxsYmFjayhoYWxFdmVudCk7Ci0gICAgfQotfQotCi1SYWRpb0hhbExlZ2FjeTo6VHVuZXI6OlR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spCi17Ci19Ci0KLQotUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjp+VHVuZXIoKQotewotfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQ4MzFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0hhbExlZ2FjeSA6IHB1YmxpYyBSYWRpb0ludGVyZmFjZQotewotcHVibGljOgotICAgICAgICBSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgIC8vIFJhZGlvSW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcyk7Ci0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgIGNsYXNzIFR1bmVyICA6IHB1YmxpYyBUdW5lckludGVyZmFjZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKTsKLQotICAgICAgICAgICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOwotICAgICAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgICAgICAgICB2b2lkIHNldEhhbFR1bmVyKGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXIpIHsgbUhhbFR1bmVyID0gaGFsVHVuZXI7IH0KLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqZ2V0SGFsVHVuZXIoKSB7IHJldHVybiBtSGFsVHVuZXI7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgdmlydHVhbCAgICAgIH5UdW5lcigpOwotCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgICAgKm1IYWxUdW5lcjsKLSAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+ICBtQ2FsbGJhY2s7Ci0gICAgICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCAgICAgflJhZGlvSGFsTGVnYWN5KCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogc0NsYXNzTW9kdWxlTmFtZXNbXTsKLQotICAgICAgICByYWRpb19jbGFzc190IG1DbGFzc0lkOwotICAgICAgICBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICAqbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZiNGQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0ludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgLyogZ2V0IGEgc291bmQgdHJpZ2dlciBIQUwgaW5zdGFuY2UgKi8KLSAgICAgICAgc3RhdGljIHNwPFJhZGlvSW50ZXJmYWNlPiBjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcy4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIHByb3BlcnRpZXM6IHdoZXJlIHRvIHJldHVybiB0aGUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgbm8gZXJyb3IKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3BlbiBhIHR1bmVyIGludGVyZmFjZSBmb3IgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLgotICAgICAgICAgKiBJZiBubyBvdGhlciB0dW5lciBpcyBvcGVuZWQsIHRoaXMgd2lsbCBhY3RpdmF0ZSB0aGUgcmFkaW8gbW9kdWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB0aGUgYmFuZCBjb25maWd1cmF0aW9uIHRvIGFwcGx5Ci0gICAgICAgICAqIC0gYXVkaW86IHRoaXMgdHVuZXIgd2lsbCBiZSB1c2VkIGZvciBsaXZlIHJhZGlvIGxpc3RlbmluZyBhbmQgc2hvdWxkIGJlIGNvbm5lY3RlZCB0bwotICAgICAgICAgKiB0aGUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgICAgICAgKiAtIGNhbGxiYWNrOiB0aGUgZXZlbnQgY2FsbGJhY2sKLSAgICAgICAgICogLSBjb29raWU6IHRoZSBjb29raWUgdG8gcGFzcyB3aGVuIGNhbGxpbmcgdGhlIGNhbGxiYWNrCi0gICAgICAgICAqIC0gdHVuZXI6IHdoZXJlIHRvIHJldHVybiB0aGUgdHVuZXIgaW50ZXJmYWNlCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIEhXIHdhcyBwb3dlcmVkIHVwIGFuZCBjb25maWd1cmF0aW9uIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgaXMgaW52YWxpZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfQ09ORklHIE1VU1QgYmUgY2FsbGVkIG9uY2UgdGhlCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZCBvciBhIGZhaWx1cmUgb2NjdXJzIG9yIGFmdGVyIGEgdGltZSBvdXQuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDbG9zZSBhIHR1bmVyIGludGVyZmFjZS4KLSAgICAgICAgICogSWYgdGhlIGxhc3QgdHVuZXIgaXMgY2xvc2VkLCB0aGUgcmFkaW8gbW9kdWxlIGlzIGRlYWN0aXZhdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gdHVuZXI6IHRoZSB0dW5lciBpbnRlcmZhY2UgdG8gY2xvc2UKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgcG93ZXJlZCBkb3duIHN1Y2Nlc3NmdWxseS4KLSAgICAgICAgICogIC1FSU5WQUwgaWYgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBwYXNzZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgUmFkaW9JbnRlcmZhY2UoKSB7fQotICAgICAgICB2aXJ0dWFsICAgICB+UmFkaW9JbnRlcmZhY2UoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwZWU4My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxICAgIDg3NTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSAgICAxMDgwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTEgIDEwMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiAgICA4NzkwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIgICAgMTA3OTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyICAyMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOICAgIDc2MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4gICAgOTAwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOICAxMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQgICAgNjU4MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJUICAgIDc0MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTFcgICAgICAgICAxNTMKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9MVyAgICAgICAgIDI3OQotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTFcgICAgICAgOQotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSAgICA1MzEKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxICAgIDE2MTEKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTEgIDkKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIgICAgNTQwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiAgICAxNjEwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfU1cgICAgICAgICAyMzAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfU1cgICAgICAgICAyNjEwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfU1cgICAgICAgNQotCi0KLSNpZm5kZWYgQVJSQVlfU0laRQotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLSNlbmRpZgotCi1jb25zdCByYWRpb19iYW5kX2NvbmZpZ190IHNLbm93blJlZ2lvbkNvbmZpZ3NbXSA9IHsKLSAgICB7ICAgLy8gRk0gSVRVIDEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEFtZXJpY2FzCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBKYXBhbgotICAgICAgICBSQURJT19SRUdJT05fSkFQQU4sCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4sCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gS29yZWEKLSAgICAgICAgUkFESU9fUkVHSU9OX0tPUkVBLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIE9JUlQKLSAgICAgICAgUkFESU9fUkVHSU9OX09JUlQsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJULAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJULAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gVVMgSEQgcmFkaW8KLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0ZNX0hELAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBMVwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTFcsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0xXLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTFd9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gU1cKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX1NXLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9TVywKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX1NXfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTIKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX07Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI3YzA5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvUmVnaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lW10gPSAiUmFkaW8gdHVuZXIgc291cmNlIjsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IFJBRElPX1BFUk1JU1NJT04oImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRk1fUkFESU8iKTsKLQotUmFkaW9TZXJ2aWNlOjpSYWRpb1NlcnZpY2UoKQotICAgIDogQm5SYWRpb1NlcnZpY2UoKSwgbU5leHRVbmlxdWVJZCgxKQotewotICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgc3A8UmFkaW9JbnRlcmZhY2U+IGRldiA9IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKFJBRElPX0NMQVNTX0FNX0ZNKTsKLQotICAgIGlmIChkZXYgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0cnVjdCByYWRpb19oYWxfcHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIGludCByYyA9IGRldi0+Z2V0UHJvcGVydGllcygmaGFsUHJvcGVydGllcyk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJhZGlvX3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVzOwotICAgIHByb3BlcnRpZXMuaGFuZGxlID0KLSAgICAgICAgICAgIChyYWRpb19oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwotICAgIGNvbnZlcnRQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzLCAmaGFsUHJvcGVydGllcyk7Ci0KLSAgICBBTE9HSSgibG9hZGVkIGRlZmF1bHQgbW9kdWxlICVzLCB2ZXIgJXMsIGhhbmRsZSAlZCIsIHByb3BlcnRpZXMucHJvZHVjdCwKLSAgICAgICAgcHJvcGVydGllcy52ZXJzaW9uLCBwcm9wZXJ0aWVzLmhhbmRsZSk7Ci0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUoZGV2LCBwcm9wZXJ0aWVzKTsKLSAgICBtTW9kdWxlcy5hZGQocHJvcGVydGllcy5oYW5kbGUsIG1vZHVsZSk7Ci19Ci0KLVJhZGlvU2VydmljZTo6flJhZGlvU2VydmljZSgpCi17Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RNb2R1bGVzIik7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOwotICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgcHJvcGVydGllcyA9PSBOVUxMKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB1aW50MzJfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7Ci0gICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgewotICAgICAgICBwcm9wZXJ0aWVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+cHJvcGVydGllcygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEFMT0dWKCIlcyAlZCBjb25maWcgJXAgd2l0aEF1ZGlvICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUsIGNvbmZpZywgd2l0aEF1ZGlvKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgcmFkaW8uY2xlYXIoKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Nb2R1bGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgY29uZmlnID0gbW9kdWxlLT5nZXREZWZhdWx0Q29uZmlnKCk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyByZWdpb24gJWQgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgY29uZmlnLT5yZWdpb24sIGNvbmZpZy0+YmFuZC50eXBlKTsKLQotICAgIHJhZGlvID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50LCBjb25maWcsIHdpdGhBdWRpbyk7Ci0KLSAgICBpZiAocmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOwotCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKLXsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFJhZGlvU2VydmljZSIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBSYWRpb1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiUmFkaW9TZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQotLyogc3RhdGljICovCi12b2lkIFJhZGlvU2VydmljZTo6Y29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpCi17Ci0gICAgbWVtc2V0KHByb3BlcnRpZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gaGFsUHJvcGVydGllcy0+Y2xhc3NfaWQ7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5wcm9kdWN0LCBoYWxQcm9wZXJ0aWVzLT5wcm9kdWN0LAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbiwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHByb3BlcnRpZXMtPm51bV90dW5lcnMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fdHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXM7Ci0gICAgcHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZSA9IGhhbFByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc0tub3duUmVnaW9uQ29uZmlncyk7IGkrKykgewotICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqYmFuZCA9ICZzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQ7Ci0gICAgICAgIHNpemVfdCBqOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzOyBqKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpoYWxCYW5kID0gJmhhbFByb3BlcnRpZXMtPmJhbmRzW2pdOwotICAgICAgICAgICAgc2l6ZV90IGs7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSAhPSBoYWxCYW5kLT50eXBlKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT5sb3dlcl9saW1pdCA8IGhhbEJhbmQtPmxvd2VyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT51cHBlcl9saW1pdCA+IGhhbEJhbmQtPnVwcGVyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoYWxCYW5kLT5udW1fc3BhY2luZ3M7IGsrKykgewotICAgICAgICAgICAgICAgIGlmIChiYW5kLT5zcGFjaW5nc1swXSA9PSBoYWxCYW5kLT5zcGFjaW5nc1trXSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoayA9PSBoYWxCYW5kLT5udW1fc3BhY2luZ3MpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgPT0gUkFESU9fQkFORF9BTSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLmRlZW1waGFzaXMgJiBoYWxCYW5kLT5mbS5kZWVtcGhhc2lzKSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChoYWxCYW5kLT5mbS5yZHMgPT0gMCkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLnJkcyAmIGhhbEJhbmQtPmZtLnJkcykgIT0gMCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPT0gaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzKSBjb250aW51ZTsKLQotICAgICAgICBBTE9HSSgiY29udmVydFByb3BlcnRpZXMoKSBBZGRpbmcgYmFuZCB0eXBlICVkIHJlZ2lvbiAlZCIsCi0gICAgICAgICAgICAgIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZC50eXBlICwgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5yZWdpb24pOwotCi0gICAgICAgIG1lbWNweSgmcHJvcGVydGllcy0+YmFuZHNbcHJvcGVydGllcy0+bnVtX2JhbmRzKytdLAotICAgICAgICAgICAgICAgJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0sCi0gICAgICAgICAgICAgICBzaXplb2YocmFkaW9fYmFuZF9jb25maWdfdCkpOwotICAgIH0KLX0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZCIKLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6Q2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KQotICAgIDogbU1vZHVsZUNsaWVudChtb2R1bGVDbGllbnQpLCBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJSYWRpb1NlcnZpY2UiKSkKLXsKLX0KLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKLXsKLSAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQotewotICAgIHJ1bigiUmFkaW9TZXJ2aWNlIGNiayIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKLX0KLQotYm9vbCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7Ci0gICAgICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV2ZW50TWVtb3J5ID0gbUV2ZW50UXVldWVbMF07Ci0gICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKLSAgICAgICAgICAgIG1vZHVsZUNsaWVudCA9IG1Nb2R1bGVDbGllbnQucHJvbW90ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2R1bGVDbGllbnQgIT0gMCkgewotICAgICAgICAgICAgbW9kdWxlQ2xpZW50LT5vbkNhbGxiYWNrRXZlbnQoZXZlbnRNZW1vcnkpOwotICAgICAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKLX0KLQotc3A8SU1lbW9yeT4gUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6cHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKLQotICAgIC8vIFRoZSBldmVudCBsYXlvdXQgaW4gc2hhcmVkIG1lbW9yeSBpczoKLSAgICAvLyBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSBieXRlcyA6IHRoZSBldmVudCBpdHNlbGYKLSAgICAvLyA0IGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIHNpemUgb3IgMAotICAgIC8vIE4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgaWYgcHJlc2VudAotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKGhhbEV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6Ci0gICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+bWV0YWRhdGEpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICAgICAgfQotICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPm1ldGFkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShtZXRhZGF0YU9mZnNldCArIG1ldGFkYXRhU2l6ZSk7Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0KLSAgICAqKHVpbnQzMl90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpID0gbWV0YWRhdGFTaXplOwotCi0gICAgZXZlbnQtPnR5cGUgPSBoYWxFdmVudC0+dHlwZTsKLSAgICBldmVudC0+c3RhdHVzID0gaGFsRXZlbnQtPnN0YXR1czsKLQotICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKLSAgICAgICAgZXZlbnQtPmNvbmZpZy5iYW5kID0gaGFsRXZlbnQtPmNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgZXZlbnQtPmluZm8gPSBoYWxFdmVudC0+aW5mbzsKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0LCBoYWxFdmVudC0+aW5mby5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RBOgotICAgIGNhc2UgUkFESU9fRVZFTlRfRUE6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BTlRFTk5BOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQ09OVFJPTDoKLSAgICAgICAgZXZlbnQtPm9uID0gaGFsRXZlbnQtPm9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQsIGhhbEV2ZW50LT5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV2ZW50TWVtb3J5OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpCi0gewotICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVFdmVudChldmVudCk7Ci0gICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBBdXRvTXV0ZXggbG9jayhtQ2FsbGJhY2tMb2NrKTsKLSAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50TWVtb3J5KTsKLSAgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKLSAgICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotfQotCi0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlIgotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKHNwPFJhZGlvSW50ZXJmYWNlPiBod0RldmljZSwgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKQotIDogbUh3RGV2aWNlKGh3RGV2aWNlKSwgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1NdXRlKHRydWUpCi17Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlOjp+TW9kdWxlKCkgewotICAgIG1Id0RldmljZS5jbGVhcigpOwotICAgIG1Nb2R1bGVDbGllbnRzLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpkdW1wKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3A8UmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ+IFJhZGlvU2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQotewotICAgIEFMT0dWKCJhZGRDbGllbnQoKSAlcCBjb25maWcgJXAgcHJvZHVjdCAlcyIsIHRoaXMsIGNvbmZpZywgbVByb3BlcnRpZXMucHJvZHVjdCk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7Ci0gICAgaW50IHJldDsKLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5jbGllbnQoKSA9PSBjbGllbnQpIHsKLSAgICAgICAgICAgIC8vIGNsaWVudCBhbHJlYWR5IGNvbm5lY3RlZDogcmVqZWN0Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50LCBjb25maWcsIGF1ZGlvKTsKLQotICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKLQotICAgIC8vIFR1bmVyIHByZWVtcHRpb24gbG9naWM6Ci0gICAgLy8gVGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiB0dW5lcnMgYW5kIGEgbGltaXRlZCBhbW91bnQgb2YgcmFkaW8gYXVkaW8gc291cmNlcyBwZXIgbW9kdWxlLgotICAgIC8vIFRoZSBtaW5pbXVtIGlzIG9uZSB0dW5lciBhbmQgb25lIGF1ZGlvIHNvdXJjZS4KLSAgICAvLyBUaGUgbnVtYmVycyBvZiB0dW5lcnMgYW5kIHNvdXJjZXMgYXJlIGluZGljYXRlZCBpbiB0aGUgbW9kdWxlIHByb3BlcnRpZXMuCi0gICAgLy8gTk9URTogY3VycmVudCBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBvbmUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gbW9yZSB0aGFuIG9uZSB0dW5lciBhdCBhIHRpbWUgYnV0IG9ubHkgb25lIHR1bmVyIGNhbiBiZSBjb25uZWN0ZWQKLSAgICAvLyB0byB0aGUgcmFkaW8gYXVkaW8gc291cmNlIChBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLgotICAgIC8vIFRoZSBiYXNlIHJ1bGUgaXMgdGhhdCBhIG5ld2x5IGNvbm5lY3RlZCB0dW5lciBhbHdheXMgd2lucywgaS5lLiBhbHdheXMgZ2V0cyBhIHR1bmVyCi0gICAgLy8gYW5kIGNhbiB1c2UgdGhlIGF1ZGlvIHNvdXJjZSBpZiByZXF1ZXN0ZWQuCi0gICAgLy8gSWYgYW5vdGhlciBjbGllbnQgaXMgcHJlZW1wdGVkLCBpdCBpcyBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGggUkFESU9fRVZFTlRfQ09OVFJPTAotICAgIC8vIGluZGljYXRpbmcgbG9zcyBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgcmVxdWVzdHMgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gdHJ1ZSk6Ci0gICAgLy8gICAgLSBpZiBhbiBhdWRpbyBzb3VyY2UgaXMgYXZhaWxhYmxlCi0gICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQotICAgIC8vICAgIC0gaWYgbm90OgotICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IGluIHRoZSBsaXN0IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KLSAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IGRvZXMgbm90IHJlcXVlc3QgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gZmFsc2UpOgotICAgIC8vICAgIC0gaWYgYSB0dW5lciBpcyBhdmFpbGFibGUKLSAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCi0gICAgLy8gICAgLSBpZiBub3Q6Ci0gICAgLy8gICAgICAgICAgVGhlIG9sZGVzdCBjbGllbnQgbm90IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZCBmaXJzdCBhbmQgaWYgbm9uZSBpcyBmb3VuZCB0aGUKLSAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCi0gICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKLSAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KLQotICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0VHVuZXI7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RBdWRpbzsKLSAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKLSAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RUdW5lciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdFR1bmVyID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8VHVuZXJJbnRlcmZhY2U+IGhhbFR1bmVyOwotICAgIHNwPE1vZHVsZUNsaWVudD4gcHJlZW10ZWRDbGllbnQ7Ci0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA+PSBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcykgewotICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7Ci0gICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvICsgYWxsb2NhdGVkVHVuZXJzID49IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvY2F0ZWRUdW5lcnMgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdFR1bmVyICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRUdW5lcnMvb2xkZXN0VHVuZXIgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdFR1bmVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwcmVlbXRlZENsaWVudCAhPSAwKSB7Ci0gICAgICAgIGhhbFR1bmVyID0gcHJlZW10ZWRDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiBjbGVhcjsKLSAgICAgICAgcHJlZW10ZWRDbGllbnQtPnNldFR1bmVyKGNsZWFyKTsKLSAgICAgICAgbUh3RGV2aWNlLT5jbG9zZVR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHByZWVtdGVkQ2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgc2V0VHVuZXIgJXAiLCBoYWxUdW5lci5nZXQoKSk7Ci0gICAgICAgIG1vZHVsZUNsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOwotICAgICAgICBtTW9kdWxlQ2xpZW50cy5hZGQobW9kdWxlQ2xpZW50KTsKLSAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgRE9ORSBtb2R1bGVDbGllbnQgJXAiLCBtb2R1bGVDbGllbnQuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIlcyBvcGVuX3R1bmVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBtb2R1bGVDbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpyZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KSB7Ci0gICAgQUxPR1YoInJlbW92ZUNsaWVudCgpIik7Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGludCByZXQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IC0xOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0gPT0gbW9kdWxlQ2xpZW50KSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Nb2R1bGVDbGllbnRzLnJlbW92ZUF0KGluZGV4KTsKLSAgICBzcDxUdW5lckludGVyZmFjZT4gaGFsVHVuZXIgPSBtb2R1bGVDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgaWYgKGhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgIT0gMCkgewotICAgICAgICBtSHdEZXZpY2UtPmNsb3NlVHVuZXIoaGFsVHVuZXIpOwotICAgIH0KLQotICAgIGlmIChtb2R1bGVDbGllbnQtPmF1ZGlvKCkpIHsKLSAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOwotICAgIH0KLQotICAgIG1NdXRlID0gdHJ1ZTsKLQotICAgIGlmIChtTW9kdWxlQ2xpZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVHVuZXIgcmVhbGxvY2F0aW9uIGxvZ2ljOgotICAgIC8vIFdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCBhbmQgd2FzIGNvbnRyb2xsaW5nIGEgdHVuZXIsIHRoaXMgdHVuZXIgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gYQotICAgIC8vIHByZXZpb3VzbHkgcHJlZW1wdGVkIGNsaWVudC4gVGhpcyBjbGllbnQgd2lsbCBiZSBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGgKLSAgICAvLyBSQURJT19FVkVOVF9DT05UUk9MIGluZGljYXRpbmcgZ2FpbiBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgYSBwcmVlbXB0ZWQgY2xpZW50IGlzIHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZSBhbmQgb25lIGJlY29tZXMgYXZhaWxhYmxlOgotICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlCi0gICAgLy8gLSBJZiBub3Q6Ci0gICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudC4KLSAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcwotICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgotCi0gICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudDsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50QXVkaW87Ci0gICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKLSAgICBmb3IgKHNzaXplX3QgaSA9IG1Nb2R1bGVDbGllbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnRBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50ID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HX0FTU0VSVChhbGxvY2F0ZWRUdW5lcnMgKyBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMsCi0gICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IGJ1dCBubyB0dW5lciBhdmFpbGFibGUiKTsKLQotICAgIEFMT0dfQVNTRVJUKCFtb2R1bGVDbGllbnQtPmF1ZGlvKCkgfHwgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcywKLSAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBhdWRpbyBjbGllbnQgYnV0IG5vIHR1bmVyIHdpdGggYXVkaW8gYXZhaWxhYmxlIik7Ci0KLSAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcyAmJiB5b3VuZ2VzdENsaWVudEF1ZGlvICE9IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQgPSB5b3VuZ2VzdENsaWVudEF1ZGlvOwotICAgIH0KLQotICAgIEFMT0dfQVNTRVJUKHlvdW5nZXN0Q2xpZW50ICE9IDAsICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBubyBjYW5kaWRhdGUgZm91bmQgZm9yIHR1bmVyIik7Ci0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZyA9IHlvdW5nZXN0Q2xpZW50LT5oYWxDb25maWcoKTsKLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCB5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lcik7Ci0KLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG11dGUgIT0gbU11dGUpIHsKLSAgICAgICAgbU11dGUgPSBtdXRlOwotICAgICAgICAvL1RPRE8gbm90aWZpZnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2YgbWVkaWEgYWN0aXZpdHkgb24gcmFkaW8gYXVkaW8gZGV2aWNlCi0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICptdXRlID0gbU11dGU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLWNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldERlZmF1bHRDb25maWcoKSBjb25zdAotewotICAgIGlmIChtUHJvcGVydGllcy5udW1fYmFuZHMgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuICZtUHJvcGVydGllcy5iYW5kc1swXTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6bm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykgewotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID8gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWUpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotfQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudCIKLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Ok1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCi0gOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KSwgbUNvbmZpZygqY29uZmlnKSwgbUF1ZGlvKGF1ZGlvKSwgbVR1bmVyKDApCi17Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRmlyc3RSZWYoKQotewotICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzKTsKLSAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+bGlua1RvRGVhdGgodGhpcyk7Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp+TW9kdWxlQ2xpZW50KCkgewotICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoaGFsRXZlbnQpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZHVtcChpbnQgZmQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHN0cm9uZ01lID0gdGhpczsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtb2R1bGUtPnJlbW92ZUNsaWVudCh0aGlzKTsKLX0KLQotcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmhhbENvbmZpZygpIGNvbnN0Ci17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBtQ29uZmlnLmJhbmQ7Ci19Ci0KLXNwPFR1bmVySW50ZXJmYWNlPiYgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFR1bmVyKCkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIG1UdW5lcjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBBTE9HVigiJXMgJXAiLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1UdW5lciA9IHR1bmVyOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0NPTlRST0w7Ci0gICAgZXZlbnQuc3RhdHVzID0gMDsKLSAgICBldmVudC5vbiA9IG1UdW5lciAhPSAwOwotICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KCZldmVudCk7Ci0gICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotCi19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNldENvbmZpZ3VyYXRpb24oJmhhbENvbmZpZyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1Db25maWcgPSAqY29uZmlnOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRDb25maWd1cmF0aW9uKCZoYWxDb25maWcpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBoYWxDb25maWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmNvbmZpZyA9IG1Db25maWc7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobVR1bmVyID09IDAgfHwgIW1BdWRpbykgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwotICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZS0+c2V0TXV0ZShtdXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlLT5nZXRNdXRlKG11dGUpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dHVuZSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmNhbmNlbCgpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5jYW5jZWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKGluZm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgKmhhc0NvbnRyb2wgPSBtVHVuZXIgIT0gMDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCi17Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJhZGlvX2V2ZW50X3QgKmV2ZW50ID0gKHJhZGlvX2V2ZW50X3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgotICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gZXZlbnQtPmNvbmZpZy5iYW5kOwotICAgICAgICAgICAgZXZlbnQtPmNvbmZpZy5yZWdpb24gPSBtQ29uZmlnLnJlZ2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQgPSBtQ2xpZW50OwotICAgIH0KLSAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgY2xpZW50LT5vbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6YmluZGVyRGllZCgKLSAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7Ci0gICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgY2xpZW50ICVwIiwgdGhpcyk7Ci0gICAgZGV0YWNoKCk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlYjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLS8vI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5SGVhcEJhc2U7Ci0KLWNsYXNzIFJhZGlvU2VydmljZSA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5SYWRpb1NlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+OwotCi1wdWJsaWM6Ci0gICAgY2xhc3MgTW9kdWxlQ2xpZW50OwotICAgIGNsYXNzIE1vZHVsZTsKLQotICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yYWRpbyI7IH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlKCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAvLyBJUmFkaW9TZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLQotICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLQotICAgICAgIE1vZHVsZShzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UsCi0gICAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0gICAgICAgdmlydHVhbCB+TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgICAgICAgICAgdm9pZCByZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOwotCi0gICAgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAgICBzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbVByb3BlcnRpZXM7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmdldERlZmF1bHRDb25maWcoKSBjb25zdCA7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgdm9pZCBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLCBjb25zdCBjaGFyICphZGRyZXNzKTsKLQotICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgLy8gcHJvdGVjdHMgIG1Nb2R1bGVDbGllbnRzCi0gICAgICAgIHNwPFJhZGlvSW50ZXJmYWNlPiAgICAgICAgICAgIG1Id0RldmljZTsgICAgICAvLyBIQUwgaGFyZHdhcmUgZGV2aWNlCi0gICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIG1Qcm9wZXJ0aWVzOyAgICAvLyBjYWNoZWQgaGFyZHdhcmUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgVmVjdG9yPCBzcDxNb2R1bGVDbGllbnQ+ID4gICAgbU1vZHVsZUNsaWVudHM7IC8vIGxpc3Qgb2YgYXR0YWNoZWQgY2xpZW50cwotICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtTXV0ZTsgICAgICAgICAgLy8gcmFkaW8gYXVkaW8gc291cmNlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHVubXV0ZWQsIGF1ZGlvIGlzIHJvdXRlZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIG1lZGlhIHVzZSBjYXNlLgotICAgIH07IC8vIGNsYXNzIE1vZHVsZQotCi0gICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja1RocmVhZCgpOwotCi0KLSAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgICAgICAgICAgdm9pZCBleGl0KCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkIHNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgd3A8TW9kdWxlQ2xpZW50PiAgICAgIG1Nb2R1bGVDbGllbnQ7ICAgIC8vIGNsaWVudCBtb2R1bGUgdGhlIHRocmVhZCBiZWxvbmdzIHRvCi0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOyAgICAvLyBjb25kaXRpb24gc2lnbmFsZWQgd2hlbiBhIG5ldyBldmVudCBpcyBwb3N0ZWQKLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7ICAgIC8vIHByb3RlY3RzIG1FdmVudFF1ZXVlCi0gICAgICAgIFZlY3Rvcjwgc3A8SU1lbW9yeT4gPiBtRXZlbnRRdWV1ZTsgICAgICAvLyBwZW5kaW5nIGNhbGxiYWNrIGV2ZW50cwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgbU1lbW9yeURlYWxlcjsgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgY2FsbGJhY2sgZXZlbnQKLSAgICB9OyAvLyBjbGFzcyBDYWxsYmFja1RocmVhZAotCi0gICAgY2xhc3MgTW9kdWxlQ2xpZW50IDogcHVibGljIEJuUmFkaW8sCi0gICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICBNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgIHZpcnR1YWwgfk1vZHVsZUNsaWVudCgpOwotCi0gICAgICAgLy8gSVJhZGlvCi0gICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnQ7IH0KLSAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQotICAgICAgICAgICAgICAgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgaGFsQ29uZmlnKCkgY29uc3Q7Ci0gICAgICAgICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gY2FsbGJhY2tUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2tUaHJlYWQ7IH0KLSAgICAgICAgICAgICAgIHZvaWQgc2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIGdldFR1bmVyKCk7Ci0gICAgICAgICAgICAgICBib29sIGF1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvOyB9Ci0KLSAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudCk7Ci0KLSAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0KLSAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgICAgIC8vIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UKLSAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50LCBtQ29uZmlnIGFuZCBtVHVuZXIKLSAgICAgICAgd3A8TW9kdWxlPiAgICAgICAgICAgICAgICAgIG1Nb2R1bGU7ICAgICAgICAgLy8gVGhlIG1vZHVsZSB0aGlzIGNsaWVudCBpcyBhdHRhY2hlZCB0bwotICAgICAgICBzcDxJUmFkaW9DbGllbnQ+ICAgICAgICAgICAgbUNsaWVudDsgICAgICAgICAvLyBldmVudCBjYWxsYmFjayBiaW5kZXIgaW50ZXJmYWNlCi0gICAgICAgIHJhZGlvX2JhbmRfY29uZmlnX3QgICAgICAgICBtQ29uZmlnOyAgICAgICAgIC8vIGN1cnJlbnQgYmFuZCBjb25maWd1cmF0aW9uCi0gICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQ7IC8vIGV2ZW50IGNhbGxiYWNrIHRocmVhZAotICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUF1ZGlvOwotICAgICAgICBzcDxUdW5lckludGVyZmFjZT4gICAgICAgICAgbVR1bmVyOyAgICAgICAgLy8gSEFMIHR1bmVyIGludGVyZmFjZS4gTlVMTCBpbmRpY2F0ZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xpZW50IGRvZXMgbm90IGhhdmUgY29udHJvbCBvbiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dW5lcgotICAgIH07IC8vIGNsYXNzIE1vZHVsZUNsaWVudAotCi0KLSAgICBzdGF0aWMgdm9pZCBjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSk7Ci0KLXByaXZhdGU6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpOwotICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOyAgIC8vIHByb3RlY3RzIG1Nb2R1bGVzCi0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gZm9yIG1vZHVsZSBJRCBhbGxvY2F0aW9uCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCByYWRpb19oYW5kbGVfdCwgc3A8TW9kdWxlPiA+IG1Nb2R1bGVzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3M2NjZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgICAgICB+VHVuZXJDYWxsYmFja0ludGVyZmFjZSgpIHt9Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY1N2QzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHVuZXJJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IGN1cnJlbnQgcmFkaW8gYmFuZCBjb25maWd1cmF0aW9uIChiYW5kLCByYW5nZSwgY2hhbm5lbCBzcGFjaW5nIC4uLikuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBhcHBsaWVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGlzIGludmFsaWQKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX0NPTkZJRyBNVVNUIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgb3IgYSBmYWlsdXJlIG9jY3VycyBvciBhZnRlciBhIHRpbWUgb3V0LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHJhZGlvIGJhbmQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogd2hlcmUgdG8gcmV0dXJuIHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdmFsaWQgY29uZmlndXJhdGlvbiBpcyByZXR1cm5lZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHNjYW5uaW5nIHVwIHRvIG5leHQgdmFsaWQgc3RhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGRpcmVjdGlvbjogUkFESU9fRElSRUNUSU9OX1VQIG9yIFJBRElPX0RJUkVDVElPTl9ET1dOCi0gICAgICAgICAqIC0gc2tpcF9zdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IGlnbm9yZSBzdWIgY2hhbm5lbHMKLSAgICAgICAgICogIChlLmcgU1BTIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHNjYW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqICBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogIGxvY2tlZCBvbiBhIHN0YXRpb24gb3IgYWZ0ZXIgYSB0aW1lIG91dCBvciBmdWxsIGZyZXF1ZW5jeSBzY2FuIGlmCi0gICAgICAgICAqICBubyBzdGF0aW9uIGZvdW5kLiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZSBpZiBhIHZhbGlkIHN0YXRpb24KLSAgICAgICAgICogIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1vdmUgb25lIGNoYW5uZWwgc3BhY2luZyB1cCBvciBkb3duLgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gZGlyZWN0aW9uOiBSQURJT19ESVJFQ1RJT05fVVAgb3IgUkFESU9fRElSRUNUSU9OX0RPV04KLSAgICAgICAgICogLSBza2lwX3N1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogaWdub3JlIHN1YiBjaGFubmVscwotICAgICAgICAgKiAgKGUuZyBTUFMgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgc3RlcCBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqIHN0ZXAgY29tcGxldGVkIG9yIGFmdGVyIGEgdGltZSBvdXQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlCi0gICAgICAgICAqIGlmIGEgdmFsaWQgc3RhdGlvbiBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUdW5lIHRvIHNwZWNpZmllZCBmcmVxdWVuY3kuCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjaGFubmVsOiBjaGFubmVsIHRvIHR1bmUgdG8uIEEgZnJlcXVlbmN5IGluIGtIeiBmb3IgQU0vRk0vSEQgUmFkaW8gYmFuZHMuCi0gICAgICAgICAqIC0gc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiAoZS5nIFNQUyBudW1iZXIgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdHVuZSBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogdHVuZWQgb3IgYWZ0ZXIgYSB0aW1lIG91dC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUKLSAgICAgICAgICogaWYgYSB2YWxpZCBzdGF0aW9uIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2FuY2VsIGEgc2Nhbiwgc3RlcCBvciB0dW5lIG9wZXJhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgYSBzY2FuLCBzdGVwIG9yIHR1bmUgb3BlcmF0aW9uIGlzIHBlbmRpbmcKLSAgICAgICAgICogKGNhbGxiYWNrIG5vdCB5ZXQgc2VudCkuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgbm90IHNlbnQuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHN0YXRpb24gaW5mb3JtYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBpbmZvOiB3aGVyZSB0byByZXR1cm4gdGhlIHByb2dyYW0gaW5mby4KLSAgICAgICAgICogSWYgaW5mby0+bWV0YWRhdGEgaXMgTlVMTC4gbm8gbWV0YSBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAgICAgICogSWYgbWV0YSBkYXRhIG11c3QgYmUgcmV0dXJuZWQsIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvIG9yIGNsb25lZCB0bwotICAgICAgICAgKiBpbmZvLT5tZXRhZGF0YSwgbm90IHBhc3NlZCBmcm9tIGEgbmV3bHkgY3JlYXRlZCBtZXRhIGRhdGEgYnVmZmVyLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB0dW5lZCBhbmQgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICBUdW5lckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCAgICAgflR1bmVySW50ZXJmYWNlKCkge30KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL09XTkVSUyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZjZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9PV05FUlMKQEAgLTAsMCArMSwyIEBACitlbGF1cmVudEBnb29nbGUuY29tCit0aG9ybnRvbmNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCAxOWRkNDFlLi4yMjUxOWEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtODksNyArODksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKIHsKICAgICBBTE9HVigibGlzdE1vZHVsZXMiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTEwLDcgKzExMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlSW50ZXJmYWNlKQogewogICAgIEFMT0dWKCJhdHRhY2ggbW9kdWxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtODU2LDcgKzg1OCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBib29sIHN1cHBvcnRzX3N0b3BfYWxsID0KLSAgICAgICAgICAgICAgICAobUhhbEludGVyZmFjZSAhPSAwKSAmJiAobUhhbEludGVyZmFjZS0+c3RvcEFsbFJlY29nbml0aW9ucygpID09IEVOT1NZUyk7CisgICAgICAgICAgICAgICAgKG1IYWxJbnRlcmZhY2UgIT0gMCkgJiYgKG1IYWxJbnRlcmZhY2UtPnN0b3BBbGxSZWNvZ25pdGlvbnMoKSAhPSAtRU5PU1lTKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2RlbHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpKTsKQEAgLTk2MCw3ICs5NjIsOCBAQAogCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7CiAgICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTk4Myw3ICs5ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIEFMT0dWKCJsb2FkU291bmRNb2RlbCgpIGhhbmRsZSIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC05OTcsNyArMTAwMSw4IEBACiBzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQUxPR1YoInVubG9hZFNvdW5kTW9kZWwoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMDEyLDcgKzEwMTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpCiB7CiAgICAgQUxPR1YoInN0YXJ0UmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMDI2LDcgKzEwMzIsOCBAQAogc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQUxPR1YoInN0b3BSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9PV05FUlMgYi9zb3VuZHRyaWdnZXIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2Y2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQordGhvcm50b25jQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL09XTkVSUyBiL3Rvb2xzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGNiMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvT1dORVJTCkBAIC0wLDAgKzEgQEAKK2drYXN0ZW5AYW5kcm9pZC5jb20K