ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4MDg0ODNiLi40OWYzNTg0IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOCBAQAorTW9uIE5vdiAgOCAxODo1NDo1MiBDRVQgMjAwNCBEYW5pZWwgVmVpbGxhcmQgPGRhbmllbEB2ZWlsbGFyZC5jb20+CisKKwkqIHRlc3RhcGkuYzogbW9yZSB0eXBlcy4KKwkqIHBhcnNlckludGVybmFscy5jIHhwYXRoLmM6IG1vcmUgZml4ZXMKKwogTW9uIE5vdiAgOCAxODoxNjo0MyBDRVQgMjAwNCBEYW5pZWwgVmVpbGxhcmQgPGRhbmllbEB2ZWlsbGFyZC5jb20+CiAKIAkqIGdlbnRlc3QucHkgdGVzdGFwaS5jOiBiZXR0ZXIgcGFyc2VyIG9wdGlvbnMgY292ZXJhZ2UKZGlmZiAtLWdpdCBhL3BhcnNlckludGVybmFscy5jIGIvcGFyc2VySW50ZXJuYWxzLmMKaW5kZXggZWU0MTM1My4uM2ZmZmNkMSAxMDA2NDQKLS0tIGEvcGFyc2VySW50ZXJuYWxzLmMKKysrIGIvcGFyc2VySW50ZXJuYWxzLmMKQEAgLTU3Nyw3ICs1NzcsOCBAQAogICAgIF9feG1sRXJyRW5jb2RpbmcoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCiAJCSAgICJJbnB1dCBpcyBub3QgcHJvcGVyIFVURi04LCBpbmRpY2F0ZSBlbmNvZGluZyAhXG4iLAogCQkgICBOVUxMLCBOVUxMKTsKLSAgICBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5lcnJvciAhPSBOVUxMKSkgeworICAgIGlmICgoY3R4dC0+c2F4ICE9IE5VTEwpICYmIChjdHh0LT5zYXgtPmVycm9yICE9IE5VTEwpICYmCisgICAgICAgIChjdHh0LT5pbnB1dCAhPSBOVUxMKSkgewogICAgICAgICBjdHh0LT5zYXgtPmVycm9yKGN0eHQtPnVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCeXRlczogMHglMDJYIDB4JTAyWCAweCUwMlggMHglMDJYXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmlucHV0LT5jdXJbMF0sIGN0eHQtPmlucHV0LT5jdXJbMV0sCkBAIC03MjQsNyArNzI1LDggQEAKICAgICBfX3htbEVyckVuY29kaW5nKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9DSEFSLAogCQkgICAiSW5wdXQgaXMgbm90IHByb3BlciBVVEYtOCwgaW5kaWNhdGUgZW5jb2RpbmcgIVxuIiwKIAkJICAgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+ZXJyb3IgIT0gTlVMTCkpIHsKKyAgICBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5lcnJvciAhPSBOVUxMKSAmJgorICAgICAgICAoY3R4dC0+aW5wdXQgIT0gTlVMTCkpIHsKIAljdHh0LT5zYXgtPmVycm9yKGN0eHQtPnVzZXJEYXRhLCAiQnl0ZXM6IDB4JTAyWCAweCUwMlggMHglMDJYIDB4JTAyWFxuIiwKIAkJCWN0eHQtPmlucHV0LT5jdXJbMF0sIGN0eHQtPmlucHV0LT5jdXJbMV0sCiAJCQljdHh0LT5pbnB1dC0+Y3VyWzJdLCBjdHh0LT5pbnB1dC0+Y3VyWzNdKTsKQEAgLTgyNSw3ICs4MjcsOCBAQAogICAgIF9feG1sRXJyRW5jb2RpbmcoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCiAJCSAgICJJbnB1dCBpcyBub3QgcHJvcGVyIFVURi04LCBpbmRpY2F0ZSBlbmNvZGluZyAhXG4iLAogCQkgICBOVUxMLCBOVUxMKTsKLSAgICBpZiAoKGN0eHQgIT0gTlVMTCkgJiYgKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5lcnJvciAhPSBOVUxMKSkgeworICAgIGlmICgoY3R4dCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4ICE9IE5VTEwpICYmIChjdHh0LT5zYXgtPmVycm9yICE9IE5VTEwpICYmCisgICAgICAgIChjdHh0LT5pbnB1dCAhPSBOVUxMKSkgewogCWN0eHQtPnNheC0+ZXJyb3IoY3R4dC0+dXNlckRhdGEsCiAJCQkgIkJ5dGVzOiAweCUwMlggMHglMDJYIDB4JTAyWCAweCUwMlhcbiIsCiAJCQkgY3R4dC0+aW5wdXQtPmN1clswXSwgY3R4dC0+aW5wdXQtPmN1clsxXSwKZGlmZiAtLWdpdCBhL3Rlc3RhcGkuYyBiL3Rlc3RhcGkuYwppbmRleCA3OWJjMmMwLi5lYTdiNDBjIDEwMDY0NAotLS0gYS90ZXN0YXBpLmMKKysrIGIvdGVzdGFwaS5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIH0KIAogI2lmIDAKLSNkZWZpbmUgZ2VuX25iX2xvbmcgNAorI2RlZmluZSBnZW5fbmJfbG9uZyA1CiAKIHN0YXRpYyBsb25nIGdlbl9sb25nKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwpAQCAtMjQ3LDYgKzI0NywxOCBAQAogfQogI2VuZGlmCiAKKyNkZWZpbmUgZ2VuX25iX3htbENoYXIgNAorCitzdGF0aWMgeG1sQ2hhciBnZW5feG1sQ2hhcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgaWYgKG5vID09IDApIHJldHVybignYScpOworICAgIGlmIChubyA9PSAxKSByZXR1cm4oJyAnKTsKKyAgICBpZiAobm8gPT0gMikgcmV0dXJuKCf4Jyk7CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhcihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogI2RlZmluZSBnZW5fbmJfdW5zaWduZWRfaW50IDMKIAogc3RhdGljIHVuc2lnbmVkIGludCBnZW5fdW5zaWduZWRfaW50KGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKQEAgLTY1Miw2ICs2NjQsOCBAQAogCiBzdGF0aWMgdm9pZCBkZXNyZXRfaW50KGludCB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewogfQorc3RhdGljIHZvaWQgZGVzcmV0X3htbENoYXIoeG1sQ2hhciB2YWwgQVRUUklCVVRFX1VOVVNFRCkgeworfQogc3RhdGljIHZvaWQgZGVzcmV0X2xvbmcobG9uZyB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewogfQogc3RhdGljIHZvaWQgZGVzcmV0X2RvdWJsZShkb3VibGUgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKQEAgLTcyNiw2ICs3NDAsOSBAQAogc3RhdGljIHZvaWQgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHhtbFhQYXRoT2JqZWN0UHRyIHZhbCkgewogICAgIHhtbFhQYXRoRnJlZU9iamVjdCh2YWwpOwogfQorc3RhdGljIHZvaWQgZGVzcmV0X3htbE5vZGVTZXRQdHIoeG1sTm9kZVNldFB0ciB2YWwpIHsKKyAgICB4bWxYUGF0aEZyZWVOb2RlU2V0KHZhbCk7Cit9CiAjZW5kaWYKIHN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHhtbFBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICAgeG1sRnJlZVBhcnNlckN0eHQodmFsKTsKQEAgLTE2MTU5LDggKzE2MTc2LDMwIEBACiB0ZXN0X3htbFBvcElucHV0KHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXIgcmV0X3ZhbDsKKyAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sUG9wSW5wdXQoY3R4dCk7CisgICAgICAgIGRlc3JldF94bWxDaGFyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQb3BJbnB1dCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtMTYzMDgsOCArMTYzNDcsNjUgQEAKIHRlc3RfeG1sU3RyaW5nRGVjb2RlRW50aXRpZXModm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgcGFyc2VyIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBpbnB1dCBzdHJpbmcgKi8KKyAgICBpbnQgbl9zdHI7CisgICAgaW50IHdoYXQ7IC8qIGNvbWJpbmF0aW9uIG9mIFhNTF9TVUJTVElUVVRFX1JFRiBhbmQgWE1MX1NVQlNUSVRVVEVfUEVSRUYgKi8KKyAgICBpbnQgbl93aGF0OworICAgIHhtbENoYXIgZW5kOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLworICAgIGludCBuX2VuZDsKKyAgICB4bWxDaGFyIGVuZDI7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCisgICAgaW50IG5fZW5kMjsKKyAgICB4bWxDaGFyIGVuZDM7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCisgICAgaW50IG5fZW5kMzsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgeworICAgIGZvciAobl93aGF0ID0gMDtuX3doYXQgPCBnZW5fbmJfaW50O25fd2hhdCsrKSB7CisgICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZCsrKSB7CisgICAgZm9yIChuX2VuZDIgPSAwO25fZW5kMiA8IGdlbl9uYl94bWxDaGFyO25fZW5kMisrKSB7CisgICAgZm9yIChuX2VuZDMgPSAwO25fZW5kMyA8IGdlbl9uYl94bWxDaGFyO25fZW5kMysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOworICAgICAgICB3aGF0ID0gZ2VuX2ludChuX3doYXQsIDIpOworICAgICAgICBlbmQgPSBnZW5feG1sQ2hhcihuX2VuZCwgMyk7CisgICAgICAgIGVuZDIgPSBnZW5feG1sQ2hhcihuX2VuZDIsIDQpOworICAgICAgICBlbmQzID0gZ2VuX3htbENoYXIobl9lbmQzLCA1KTsKKworICAgICAgICByZXRfdmFsID0geG1sU3RyaW5nRGVjb2RlRW50aXRpZXMoY3R4dCwgc3RyLCB3aGF0LCBlbmQsIGVuZDIsIGVuZDMpOworICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCBzdHIsIDEpOworICAgICAgICBkZXNfaW50KG5fd2hhdCwgd2hhdCwgMik7CisgICAgICAgIGRlc194bWxDaGFyKG5fZW5kLCBlbmQsIDMpOworICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDIsIGVuZDIsIDQpOworICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDMsIGVuZDMsIDUpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nRGVjb2RlRW50aXRpZXMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93aGF0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZDIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZDMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybih0ZXN0X3JldCk7CiB9CiAKQEAgLTE2MzE4LDggKzE2NDE0LDcyIEBACiB0ZXN0X3htbFN0cmluZ0xlbkRlY29kZUVudGl0aWVzKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXIgKiByZXRfdmFsOworICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIHBhcnNlciBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKKyAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgaW5wdXQgc3RyaW5nICovCisgICAgaW50IG5fc3RyOworICAgIGludCBsZW47IC8qIHRoZSBzdHJpbmcgbGVuZ3RoICovCisgICAgaW50IG5fbGVuOworICAgIGludCB3aGF0OyAvKiBjb21iaW5hdGlvbiBvZiBYTUxfU1VCU1RJVFVURV9SRUYgYW5kIFhNTF9TVUJTVElUVVRFX1BFUkVGICovCisgICAgaW50IG5fd2hhdDsKKyAgICB4bWxDaGFyIGVuZDsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KKyAgICBpbnQgbl9lbmQ7CisgICAgeG1sQ2hhciBlbmQyOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLworICAgIGludCBuX2VuZDI7CisgICAgeG1sQ2hhciBlbmQzOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLworICAgIGludCBuX2VuZDM7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKKyAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgeworICAgIGZvciAobl93aGF0ID0gMDtuX3doYXQgPCBnZW5fbmJfaW50O25fd2hhdCsrKSB7CisgICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZCsrKSB7CisgICAgZm9yIChuX2VuZDIgPSAwO25fZW5kMiA8IGdlbl9uYl94bWxDaGFyO25fZW5kMisrKSB7CisgICAgZm9yIChuX2VuZDMgPSAwO25fZW5kMyA8IGdlbl9uYl94bWxDaGFyO25fZW5kMysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOworICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKKyAgICAgICAgd2hhdCA9IGdlbl9pbnQobl93aGF0LCAzKTsKKyAgICAgICAgZW5kID0gZ2VuX3htbENoYXIobl9lbmQsIDQpOworICAgICAgICBlbmQyID0gZ2VuX3htbENoYXIobl9lbmQyLCA1KTsKKyAgICAgICAgZW5kMyA9IGdlbl94bWxDaGFyKG5fZW5kMywgNik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmluZ0xlbkRlY29kZUVudGl0aWVzKGN0eHQsIHN0ciwgbGVuLCB3aGF0LCBlbmQsIGVuZDIsIGVuZDMpOworICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCBzdHIsIDEpOworICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOworICAgICAgICBkZXNfaW50KG5fd2hhdCwgd2hhdCwgMyk7CisgICAgICAgIGRlc194bWxDaGFyKG5fZW5kLCBlbmQsIDQpOworICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDIsIGVuZDIsIDUpOworICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDMsIGVuZDMsIDYpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nTGVuRGVjb2RlRW50aXRpZXMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3doYXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kMik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kMyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybih0ZXN0X3JldCk7CiB9CiAKQEAgLTE2NDUxLDcgKzE2NjExLDcgQEAKIHRlc3RfcGFyc2VySW50ZXJuYWxzKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHBhcnNlckludGVybmFscyA6IDMwIG9mIDkwIGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyBwYXJzZXJJbnRlcm5hbHMgOiAzMyBvZiA5MCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCgpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEluaXRBdXRvQ2xvc2UoKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X2lucHV0UG9wKCk7CkBAIC0zMjc2Niw4ICszMjkyNiwzNyBAQAogdGVzdF94bWxTdHJjaHIodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAqLworICAgIGludCBuX3N0cjsKKyAgICB4bWxDaGFyIHZhbDsgLyogdGhlIHhtbENoYXIgdG8gc2VhcmNoICovCisgICAgaW50IG5fdmFsOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CisgICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sQ2hhcjtuX3ZhbCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CisgICAgICAgIHZhbCA9IGdlbl94bWxDaGFyKG5fdmFsLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sU3RyY2hyKHN0ciwgdmFsKTsKKyAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgc3RyLCAwKTsKKyAgICAgICAgZGVzX3htbENoYXIobl92YWwsIHZhbCwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJjaHIiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtMzM0NDUsNyArMzM2MzQsNyBAQAogdGVzdF94bWxzdHJpbmcodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgeG1sc3RyaW5nIDogMjUgb2YgMzAgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHhtbHN0cmluZyA6IDI2IG9mIDMwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hhclN0cmR1cCgpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hhclN0cm5kdXAoKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoZWNrVVRGOCgpOwpAQCAtNDI4ODQsOCArNDMwNzMsMzIgQEAKIHRlc3RfeG1sWFBhdGhOb2RlU2V0Q3JlYXRlKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOworICAgIHhtbE5vZGVQdHIgdmFsOyAvKiBhbiBpbml0aWFsIHhtbE5vZGVQdHIsIG9yIE5VTEwgKi8KKyAgICBpbnQgbl92YWw7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVQdHI7bl92YWwrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICB2YWwgPSBnZW5feG1sTm9kZVB0cihuX3ZhbCwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZSh2YWwpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbCwgdmFsLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldENyZWF0ZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybih0ZXN0X3JldCk7CiB9CiAKQEAgLTQyOTYxLDcgKzQzMTc0LDcgQEAKIHRlc3RfeHBhdGgodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgeHBhdGggOiAyNyBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgeHBhdGggOiAyOCBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcigpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKCk7CiAgICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuKCk7CkBAIC00MzQ1Niw4ICs0MzY2OSwzOSBAQAogdGVzdF94bWxYUGF0aERpZmZlcmVuY2Uodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KKyAgICBpbnQgbl9ub2RlczE7CisgICAgeG1sTm9kZVNldFB0ciBub2RlczI7IC8qIGEgbm9kZS1zZXQgKi8KKyAgICBpbnQgbl9ub2RlczI7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgeworICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CisgICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhEaWZmZXJlbmNlKG5vZGVzMSwgbm9kZXMyKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCBub2RlczIsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEaWZmZXJlbmNlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDM0NjYsOCArNDM3MTAsMzIgQEAKIHRlc3RfeG1sWFBhdGhEaXN0aW5jdCh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbm9kZXM7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ub2RlcyA9IDA7bl9ub2RlcyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aERpc3RpbmN0KG5vZGVzKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEaXN0aW5jdCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDM0NzYsOCArNDM3NDQsMzIgQEAKIHRlc3RfeG1sWFBhdGhEaXN0aW5jdFNvcnRlZCh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KKyAgICBpbnQgbl9ub2RlczsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRGlzdGluY3RTb3J0ZWQobm9kZXMpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aERpc3RpbmN0U29ydGVkIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4odGVzdF9yZXQpOwogfQogCkBAIC00Mzg0Miw4ICs0NDEzNCwzOSBAQAogdGVzdF94bWxYUGF0aEludGVyc2VjdGlvbih2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25vZGVzMTsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25vZGVzMjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CisgICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKKyAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEludGVyc2VjdGlvbihub2RlczEsIG5vZGVzMik7CisgICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCBub2RlczEsIDApOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoSW50ZXJzZWN0aW9uIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDM5NjQsOCArNDQyODcsMzkgQEAKIHRlc3RfeG1sWFBhdGhMZWFkaW5nKHZvaWQpIHsKICAgICBpbnQgdGVzdF9yZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOworICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbm9kZXMxOworICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbm9kZXMyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKKyAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOworICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTGVhZGluZyhub2RlczEsIG5vZGVzMik7CisgICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCBub2RlczEsIDApOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTGVhZGluZyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczEpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybih0ZXN0X3JldCk7CiB9CiAKQEAgLTQzOTc0LDggKzQ0MzI4LDM5IEBACiB0ZXN0X3htbFhQYXRoTGVhZGluZ1NvcnRlZCh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCisgICAgaW50IG5fbm9kZXMxOworICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KKyAgICBpbnQgbl9ub2RlczI7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgeworICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CisgICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhMZWFkaW5nU29ydGVkKG5vZGVzMSwgbm9kZXMyKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCBub2RlczIsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhMZWFkaW5nU29ydGVkIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDQ4NzMsOCArNDUyNTgsMzkgQEAKIHRlc3RfeG1sWFBhdGhOb2RlTGVhZGluZyh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbm9kZXM7CisgICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KKyAgICBpbnQgbl9ub2RlOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAwKTsKKyAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZUxlYWRpbmcobm9kZXMsIG5vZGUpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMCk7CisgICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVMZWFkaW5nIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDQ4ODMsOCArNDUyOTksMzkgQEAKIHRlc3RfeG1sWFBhdGhOb2RlTGVhZGluZ1NvcnRlZCh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KKyAgICBpbnQgbl9ub2RlczsKKyAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLworICAgIGludCBuX25vZGU7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ub2RlcyA9IDA7bl9ub2RlcyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMrKykgeworICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOworICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlTGVhZGluZ1NvcnRlZChub2Rlcywgbm9kZSk7CisgICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZUxlYWRpbmdTb3J0ZWQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4odGVzdF9yZXQpOwogfQogCkBAIC00NTA5Nyw4ICs0NTU0NCwzOSBAQAogdGVzdF94bWxYUGF0aE5vZGVTZXRNZXJnZSh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIHZhbDE7IC8qIHRoZSBmaXJzdCBOb2RlU2V0IG9yIE5VTEwgKi8KKyAgICBpbnQgbl92YWwxOworICAgIHhtbE5vZGVTZXRQdHIgdmFsMjsgLyogdGhlIHNlY29uZCBOb2RlU2V0ICovCisgICAgaW50IG5fdmFsMjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3ZhbDEgPSAwO25fdmFsMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fdmFsMSsrKSB7CisgICAgZm9yIChuX3ZhbDIgPSAwO25fdmFsMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fdmFsMisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHZhbDEgPSBnZW5feG1sTm9kZVNldFB0cihuX3ZhbDEsIDApOworICAgICAgICB2YWwyID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwyLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlU2V0TWVyZ2UodmFsMSwgdmFsMik7CisgICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fdmFsMSwgdmFsMSwgMCk7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fdmFsMiwgdmFsMiwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRNZXJnZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwxKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDUxNzgsOCArNDU2NTYsMzkgQEAKIHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmcodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25vZGVzOworICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CisgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CisgICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVUcmFpbGluZyhub2Rlcywgbm9kZSk7CisgICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVRyYWlsaW5nIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDUxODgsOCArNDU2OTcsMzkgQEAKIHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCisgICAgaW50IG5fbm9kZXM7CisgICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KKyAgICBpbnQgbl9ub2RlOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAwKTsKKyAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVRyYWlsaW5nU29ydGVkKG5vZGVzLCBub2RlKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4odGVzdF9yZXQpOwogfQogCkBAIC00NTUyNiw4ICs0NjA2NiwzMiBAQAogdGVzdF94bWxYUGF0aFBvcE5vZGVTZXQodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CisgICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIGFuIFhQYXRoIHBhcnNlciBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhQb3BOb2RlU2V0KGN0eHQpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFBvcE5vZGVTZXQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHRlc3RfcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDYzNzIsOCArNDY5MzYsMzkgQEAKIHRlc3RfeG1sWFBhdGhUcmFpbGluZyh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25vZGVzMTsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25vZGVzMjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CisgICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKKyAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFRyYWlsaW5nKG5vZGVzMSwgbm9kZXMyKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCBub2RlczIsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhUcmFpbGluZyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgdGVzdF9yZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczEpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybih0ZXN0X3JldCk7CiB9CiAKQEAgLTQ2MzgyLDggKzQ2OTc3LDM5IEBACiB0ZXN0X3htbFhQYXRoVHJhaWxpbmdTb3J0ZWQodm9pZCkgewogICAgIGludCB0ZXN0X3JldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLworICAgIGludCBuX25vZGVzMTsKKyAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCisgICAgaW50IG5fbm9kZXMyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKKyAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOworICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoVHJhaWxpbmdTb3J0ZWQobm9kZXMxLCBub2RlczIpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKKyAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRyYWlsaW5nU29ydGVkIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICB0ZXN0X3JldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHRlc3RfcmV0KTsKIH0KIApAQCAtNDY3NDUsNyArNDczNzEsNyBAQAogdGVzdF94cGF0aEludGVybmFscyh2b2lkKSB7CiAgICAgaW50IHRlc3RfcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB4cGF0aEludGVybmFscyA6IDkyIG9mIDExNyBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgeHBhdGhJbnRlcm5hbHMgOiAxMDYgb2YgMTE3IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfdmFsdWVQb3AoKTsKICAgICB0ZXN0X3JldCArPSB0ZXN0X3ZhbHVlUHVzaCgpOwogICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhBZGRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL3hwYXRoLmMgYi94cGF0aC5jCmluZGV4IGY0NDVlZDIuLjk2ODM4MzIgMTAwNjQ0Ci0tLSBhL3hwYXRoLmMKKysrIGIveHBhdGguYwpAQCAtMTI0MCw2ICsxMjQwLDcgQEAKICAgICB4bWxYUGF0aE9iamVjdFB0ciBvYmo7CiAgICAgeG1sTm9kZVNldFB0ciByZXQ7CiAKKyAgICBpZiAoY3R4dCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAgICAgaWYgKGN0eHQtPnZhbHVlID09IE5VTEwpIHsKIAl4bWxYUGF0aFNldEVycm9yKGN0eHQsIFhQQVRIX0lOVkFMSURfT1BFUkFORCk7CiAJcmV0dXJuKE5VTEwpOwo=