LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKClRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gCm9yIGl0cyBhZmZpbGlhdGUocykgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIApKdW5lIDE5OTEgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSAKaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoIAppcyBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSAKRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IApvciBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KClRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCkRJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCmRpc2NsYWltZXIuCgooQykgQ29weXJpZ2h0IDIwMDQgLSAyMDA3IE1hcnZlbGwgU2VtaWNvbmR1Y3RvciBJc3JhZWwgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgooQykgQ29weXJpZ2h0IDE5OTkgLSAyMDA0IENoaXBpZGVhIE1pY3JvZWxlY3Ryb25pY2EsIFMuQS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAidXNiL2FwaS9tdlVzYkRldkFwaS5oIgojaW5jbHVkZSAidXNiL2RldmljZS9tdlVzYkRldlBydi5oIgoKCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX2luaXQKKiAgUmV0dXJuZWQgVmFsdWUgOiBVU0JfT0sgb3IgZXJyb3IgY29kZQoqICBDb21tZW50cyAgICAgICA6CiogICAgICAgIEluaXRpYWxpemVzIHRoZSBVU0IgZGV2aWNlIGNvbnRyb2xsZXIuCioKKkVORCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnVpbnRfOCBfdXNiX2RjaV92dXNiMjBfaW5pdAogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQiBkZXZpY2UgY29udHJvbGxlciB0byBpbml0aWFsaXplICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGRldm51bSwKCiAgICAgIC8qIFtPVVRdIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZQogICApCnsgLyogQm9keSAqLwogICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgIHVzYl9kZXZfcHRyOwogICAgdWludF8zMiAgICAgICAgICAgICAgICAgICAgIHRlbXA7CiAgICB1aW50XzgqICAgICAgICAgICAgICAgICAgICAgcEJ1ZjsKICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBwaHlBZGRyOwogICAgICAKICAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiloYW5kbGU7CgogICAgdXNiX2Rldl9wdHItPkNBUF9SRUdTX1BUUiA9IAogICAgICAgKFZVU0IyMF9SRUdfU1RSVUNUX1BUUilVU0JfZ2V0X2NhcF9yZWdfYWRkcihkZXZudW0pOwogICAgICAKICAgIC8qIEdldCB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBWVVNCX0hTIHJlZ2lzdGVycyAqLwogICAgdXNiX2Rldl9wdHItPkRFVl9QVFIgPSAKICAgICAgKFZVU0IyMF9SRUdfU1RSVUNUX1BUUikoKCh1aW50XzMyKXVzYl9kZXZfcHRyLT5DQVBfUkVHU19QVFIpICsgCiAgICAgICAoVVNCXzMyQklUX0xFKHVzYl9kZXZfcHRyLT5DQVBfUkVHU19QVFItPlJFR0lTVEVSUy5DQVBBQklMSVRZX1JFR0lTVEVSUy5DQVBMRU5HVEhfSENJVkVSKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUhDSV9DQVBfTEVOX01BU0spKTsKCiAgICAvKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVuZHBvaW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBVU0IgY29udHJvbGxlciAqLwogICAgdXNiX2Rldl9wdHItPk1BWF9FTkRQT0lOVFMgPSAKICAgICAgKFVTQl8zMkJJVF9MRSh1c2JfZGV2X3B0ci0+Q0FQX1JFR1NfUFRSLT5SRUdJU1RFUlMuQ0FQQUJJTElUWV9SRUdJU1RFUlMuRENDX1BBUkFNUykgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlVTQjIwX0RDQ19NQVhfRU5EUFRTX1NVUFBPUlRFRCk7CgogICAgVVNCX3ByaW50ZigiVVNCIGluaXQ6IENBUF9SRUdTPTB4JXgsIERFVl9SRUdTPTB4JXgsIE1BWF9FUD0lZFxuIiwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCl1c2JfZGV2X3B0ci0+Q0FQX1JFR1NfUFRSLCAodW5zaWduZWQpdXNiX2Rldl9wdHItPkRFVl9QVFIsIAogICAgICAgICAgICAgICAgdXNiX2Rldl9wdHItPk1BWF9FTkRQT0lOVFMpOwoKICAgIHRlbXAgPSAodXNiX2Rldl9wdHItPk1BWF9FTkRQT0lOVFMgKiAyKTsKICAgCiAgICBwQnVmID0gKHVpbnRfOCopVVNCX3VuY2FjaGVkX21lbWFsbG9jKHRlbXAqc2l6ZW9mKFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAmcGh5QWRkcik7ICAgICAgCiAgICBpZiAocEJ1ZiA9PSBOVUxMKSAKICAgIHsKICAgICAgICBVU0JfcHJpbnRmKCJfdXNiX2RjaV92dXNiMjBfaW5pdCwgbWFsbG9jIG9mICVkIGJ5dGVzIGluIFVuY2FjaGVkIGFyZWEgZmFpbGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wKnNpemVvZihWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1QpKTsKICAgICAgICByZXR1cm4gVVNCRVJSX0FMTE9DOwogICAgfQoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgCiAgICAgIEFzc2lnbiBRSCBiYXNlCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgIAogICAgdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfQkFTRSA9IHBCdWY7CiAgICB1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9QSFlTID0gKHVpbnRfMzIpcGh5QWRkcjsKCiAgICAvKiBBbGlnbiB0aGUgZW5kcG9pbnQgcXVldWUgaGVhZCB0byAySyBib3VuZGFyeSAqLyAgIAogICAgdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfUFRSID0gKFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVF9QVFIpCiAgICAgICAgICAgICAgICBVU0JfTUVNMjA0OF9BTElHTigodWludF8zMil1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9CQVNFKTsKCiAgICB1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9TSVpFID0gdGVtcCpzaXplb2YoVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50XzMyKXVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BUUiAtIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludF8zMil1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9CQVNFKTsKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIAogICAgICBaZXJvIG91dCB0aGUgbWVtb3J5IGFsbG9jYXRlZAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKICAgIFVTQl9tZW16ZXJvKCAodm9pZCopdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfUFRSLCAKICAgICAgICAgICAgICAgICB0ZW1wKnNpemVvZihWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1QpKTsKCiAgICBVU0JfcHJpbnRmKCJVU0IgRVBfUUg6IEJhc2U9JXAgKDB4JXgpLCBBbGlnbmVkKCVkKT0lcCwgU2l6ZT0lZFxuIiwKICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX0JBU0UsIHVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BIWVMsCiAgICAgICAgICAgICAgICAyMDQ4LCB1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9QVFIsIHVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1NJWkUpOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgCiAgICAgIEFzc2lnbiBEVEQgYmFzZQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKICAgIHBCdWYgPSAodWludF84KilVU0JfdW5jYWNoZWRfbWVtYWxsb2MoTUFYX0VQX1RSX0RFU0NSUypzaXplb2YoVlVTQjIwX0VQX1RSX1NUUlVDVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgJnBoeUFkZHIpOyAgICAgIAogICAgaWYgKHBCdWYgPT0gTlVMTCkgCiAgICB7CiAgICAgICAgVVNCX3ByaW50ZigiX3VzYl9kY2lfdnVzYjIwX2luaXQsIG1hbGxvYyBvZiAlZCBieXRlcyBpbiBVbmNhY2hlZCBhcmVhIGZhaWxlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0VQX1RSX0RFU0NSUypzaXplb2YoVlVTQjIwX0VQX1RSX1NUUlVDVCkpOwogICAgICAgIHJldHVybiBVU0JFUlJfQUxMT0M7CiAgICB9CgogICAgdXNiX2Rldl9wdHItPkRURF9CQVNFX1BUUiA9IHBCdWY7CiAgICB1c2JfZGV2X3B0ci0+RFREX0JBU0VfUEhZUyA9ICh1aW50XzMyKXBoeUFkZHI7CiAgICAKICAgIC8qIEFsaWduIHRoZSBkVEQgYmFzZSB0byAzMiBieXRlIGJvdW5kYXJ5ICovICAgCiAgICB1c2JfZGV2X3B0ci0+RFREX0FMSUdORURfQkFTRV9QVFIgPSAoVlVTQjIwX0VQX1RSX1NUUlVDVF9QVFIpCiAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9NRU0zMl9BTElHTigodWludF8zMil1c2JfZGV2X3B0ci0+RFREX0JBU0VfUFRSKTsKCiAgICB1c2JfZGV2X3B0ci0+RFREX1NJWkUgPSBNQVhfRVBfVFJfREVTQ1JTKnNpemVvZihWVVNCMjBfRVBfVFJfU1RSVUNUKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50XzMyKXVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BUUiAtIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludF8zMil1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9CQVNFKTsKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIAogICAgICBaZXJvIG91dCB0aGUgbWVtb3J5IGFsbG9jYXRlZAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKICAgIFVTQl9tZW16ZXJvKCh2b2lkKil1c2JfZGV2X3B0ci0+RFREX0FMSUdORURfQkFTRV9QVFIsIAogICAgICAgICAgICAgICAgTUFYX0VQX1RSX0RFU0NSUypzaXplb2YoVlVTQjIwX0VQX1RSX1NUUlVDVCkpOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgCiAgICAgIEFzc2lnbiBTQ1JBVENIIFN0cnVjdHVyZSBiYXNlCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgIAogICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBpbnRlcm5hbCBzY3JhdGNoIHN0cnVjdHVyZSAqLyAgIAogICAgcEJ1ZiA9IFVTQl9tZW1hbGxvYyhNQVhfRVBfVFJfREVTQ1JTKnNpemVvZihTQ1JBVENIX1NUUlVDVCkpOwogICAgaWYgKHBCdWYgPT0gTlVMTCkgCiAgICB7CiAgICAgICAgVVNCX3ByaW50ZigiX3VzYl9kY2lfdnVzYjIwX2luaXQsIG1hbGxvYyBvZiAlZCBieXRlcyBmYWlsZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9FUF9UUl9ERVNDUlMqc2l6ZW9mKFNDUkFUQ0hfU1RSVUNUKSk7CiAgICAgICAgcmV0dXJuIFVTQkVSUl9BTExPQzsKICAgIH0KICAgIHVzYl9kZXZfcHRyLT5TQ1JBVENIX1NUUlVDVF9CQVNFID0gKFNDUkFUQ0hfU1RSVUNUX1BUUilwQnVmOwogICAgVVNCX21lbXplcm8odXNiX2Rldl9wdHItPlNDUkFUQ0hfU1RSVUNUX0JBU0UsIAogICAgICAgICAgICBNQVhfRVBfVFJfREVTQ1JTKnNpemVvZihTQ1JBVENIX1NUUlVDVCkpOwoKICAgIFVTQl9wcmludGYoIlVTQiBkVEQoJWQpOiBCYXNlPSVwICgweCV4KSwgQWxpZ25lZCglZCk9JXAsIFNpemU9JWQsIFNjcmF0Y2g9JXBcbiIsCiAgICAgICAgICAgICAgICBNQVhfRVBfVFJfREVTQ1JTLCB1c2JfZGV2X3B0ci0+RFREX0JBU0VfUFRSLCB1c2JfZGV2X3B0ci0+RFREX0JBU0VfUEhZUywKICAgICAgICAgICAgICAgIDMyLCB1c2JfZGV2X3B0ci0+RFREX0FMSUdORURfQkFTRV9QVFIsIHVzYl9kZXZfcHRyLT5EVERfU0laRSwKICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5TQ1JBVENIX1NUUlVDVF9CQVNFKTsKCiNpZmRlZiBVU0JfVU5ERVJSVU5fV0EKICAgIHVzYlNyYW1CYXNlID0gKHVpbnRfOCopVVNCX2dldF9zcmFtX2FkZHIoJnVzYlNyYW1TaXplKTsKICAgIGlmICh1c2JTcmFtQmFzZSA9PSBOVUxMKSAKICAgIHsKICAgICAgICBVU0JfcHJpbnRmKCJfdXNiX2RjaV92dXNiMjBfaW5pdCwgU1JBTSBpcyBub3QgYXZhaWxhYmxlXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4gVVNCRVJSX0FMTE9DOwogICAgfQogICAgVVNCX21lbXplcm8odXNiU3JhbUJhc2UsIHVzYlNyYW1TaXplKTsKICAgIFVTQl9wcmludGYoIlVTQiBXQV9RdWV1ZTogYmFzZT0lcCwgc2l6ZT0lZCwgcGFydHM9JWRcbiIsIAogICAgICAgICAgICAgICAgICAgIHVzYlNyYW1CYXNlLCB1c2JTcmFtU2l6ZSwgZ2xvYmFsX3dhX3NyYW1fcGFydHMpOwojZW5kaWYgLyogVVNCX1VOREVSUlVOX1dBICovCgogICAgdXNiX2Rldl9wdHItPlVTQl9TVEFURSA9IEFSQ19VU0JfU1RBVEVfVU5LTk9XTjsKCiAgICAvKiBJbml0aWFsaXplIHRoZSBWVVNCX0hTIGNvbnRyb2xsZXIgKi8gICAKICAgIF91c2JfZGNpX3Z1c2IyMF9jaGlwX2luaXRpYWxpemUoKHBvaW50ZXIpdXNiX2Rldl9wdHIpOwoKICAgIHJldHVybiBVU0JfT0s7ICAgCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfY2hpcF9pbml0aWFsaXplCiogIFJldHVybmVkIFZhbHVlIDogVVNCX09LIG9yIGVycm9yIGNvZGUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBJbml0aWFsaXplcyB0aGUgVVNCIGRldmljZSBjb250cm9sbGVyLgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9jaGlwX2luaXRpYWxpemUKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZQogICApCnsgLyogQm9keSAqLwogICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICAgICAgdXNiX2Rldl9wdHI7CiAgICBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgICAgICBkZXZfcHRyOwogICAgVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUX1BUUiAgZXBfcXVldWVfaGVhZF9wdHI7CiAgICBWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUiAgICAgICAgICBkVERfcHRyOwogICAgdWludF8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcG9ydF9jb250cm9sOwogICAgU0NSQVRDSF9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgdGVtcF9zY3JhdGNoX3B0cjsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGRlbGF5OwoKICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19JTklULCAiY2hpcF9pbml0aWFsaXplXG4iKTsKICAgCiAgICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwoKICAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwogICAKICAgIC8qIFN0b3AgdGhlIGNvbnRyb2xsZXIgKi8KICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgJj0gfihVU0JfMzJCSVRfTEUoRUhDSV9DTURfUlVOX1NUT1ApKTsKICAgICAgCiAgICAvKiBSZXNldCB0aGUgY29udHJvbGxlciB0byBnZXQgZGVmYXVsdCB2YWx1ZXMgKi8KICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgPSBVU0JfMzJCSVRfTEUoRUhDSV9DTURfQ1RSTF9SRVNFVCk7CgogICAgVVNCX3ByaW50ZigiVVNCIEluaXQ6IFdhaXQgZm9yIFJFU0VUIGNvbXBsZXRlZFxuIik7CiAgIAogICAgZGVsYXkgPSAweDEwMDAwMDsKICAgIHdoaWxlIChkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfQ01EICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVU0JfMzJCSVRfTEUoRUhDSV9DTURfQ1RSTF9SRVNFVCkpKSAKICAgIHsKICAgICAgICAvKiBXYWl0IGZvciB0aGUgY29udHJvbGxlciByZXNldCB0byBjb21wbGV0ZSAqLwogICAgICAgIGRlbGF5LS07CiAgICAgICAgaWYoZGVsYXkgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9IC8qIEVuZFdoaWxlICovCgogICAgaWYoZGVsYXkgPT0gMCkKICAgIHsKICAgICAgICBVU0JfcHJpbnRmKCJVU0IgSW5pdDogV2FpdCBmb3IgUkVTRVQgY29tcGxldGVkIFRJTUVPVVRcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFVTQl9wcmludGYoIlVTQiBJbml0OiBSRVNFVCBjb21wbGV0ZWRcbiIpOwogICAgfQogICAgLyogQ2FsbCBCU1AgY2FsbGJhY2sgdG8gY29tcGxldGUgcmVzZXQgcHJvY2VzcyAqLwogICAgVVNCX3Jlc2V0X2NvbXBsZXRlKHVzYl9kZXZfcHRyLT5ERVZfTlVNKTsKCiAgICAvKiBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBkVEQgaGVhZCBhbmQgdGFpbCB0byBOVUxMICovICAgCiAgICB1c2JfZGV2X3B0ci0+RFREX0hFQUQgPSBOVUxMOwogICAgdXNiX2Rldl9wdHItPkRURF9UQUlMID0gTlVMTDsKICAgIHVzYl9kZXZfcHRyLT5EVERfRU5UUklFUyA9IDA7IAogICAgdXNiX2Rldl9wdHItPkVSUk9SX1NUQVRFID0gMDsKCiAgIC8qIE1ha2Ugc3VyZSB0aGUgMTYgTVNCcyBvZiB0aGlzIHJlZ2lzdGVyIGFyZSAwcyAqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVF9TRVRVUF9TVEFUID0gVVNCXzMyQklUX0xFKDApOwogICAKICAgZXBfcXVldWVfaGVhZF9wdHIgPSB1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9QVFI7CgogICAvKiBJbml0aWFsaXplIGFsbCBkZXZpY2UgcXVldWUgaGVhZHMgKi8KICAgZm9yIChpPTA7IGk8KHVzYl9kZXZfcHRyLT5NQVhfRU5EUE9JTlRTKjIpOyBpKyspIAogICB7CiAgICAgIC8qIEludGVycnVwdCBvbiBTZXR1cCBwYWNrZXQgKi8KICAgICAgKGVwX3F1ZXVlX2hlYWRfcHRyICsgaSktPk1BWF9QS1RfTEVOR1RIID0gKFVTQl8zMkJJVF9MRSgKICAgICAgICAgICgodWludF8zMilVU0JfTUFYX0NUUkxfUEFZTE9BRCA8PCBWVVNCX0VQX1FVRVVFX0hFQURfTUFYX1BLVF9MRU5fUE9TKSB8IAogICAgICAgICAgICBWVVNCX0VQX1FVRVVFX0hFQURfSU9TKSk7CgogICAgICAoZXBfcXVldWVfaGVhZF9wdHIgKyBpKS0+TkVYVF9EVERfUFRSID0gKFVTQl8zMkJJVF9MRShWVVNCX0VQX1FVRVVFX0hFQURfTkVYVF9URVJNSU5BVEUpKTsKICAgfSAvKiBFbmRmb3IgKi8KCiAgIC8qIENvbmZpZ3VyZSB0aGUgRW5kcG9pbnQgTGlzdCBBZGRyZXNzICovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVQX0xJU1RfQUREUiA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKFVTQl9FUF9RSF9WSVJUX1RPX1BIWVModXNiX2Rldl9wdHIsIGVwX3F1ZXVlX2hlYWRfcHRyKSk7CiAgICAgIAogICBwb3J0X2NvbnRyb2wgPSBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSk7CiAgIGlmICh1c2JfZGV2X3B0ci0+Q0FQX1JFR1NfUFRSLT5SRUdJU1RFUlMuQ0FQQUJJTElUWV9SRUdJU1RFUlMuSENTX1BBUkFNUyAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKFZVU0IyMF9IQ1NfUEFSQU1TX1BPUlRfUE9XRVJfQ09OVFJPTF9GTEFHKSkgCiAgIHsKICAgICAgcG9ydF9jb250cm9sICY9ICh+RUhDSV9QT1JUU0NYX1cxQ19CSVRTIHwgfkVIQ0lfUE9SVFNDWF9QT1JUX1BPV0VSKTsKICAgfSAvKiBFbmRpZiAqLwogICAKICAgaWYodXNiX2Rldl9wdHItPkZPUkNFX0ZTID09IFRSVUUpCiAgIHsKICAgICAgIHBvcnRfY29udHJvbCB8PSBFSENJX1BPUlRTQ1hfRk9SQ0VfRlVMTF9TUEVFRF9DT05ORUNUOwogICB9CiAgIGVsc2UKICAgewogICAgICAgcG9ydF9jb250cm9sICY9ICh+RUhDSV9QT1JUU0NYX0ZPUkNFX0ZVTExfU1BFRURfQ09OTkVDVCk7CiAgIH0KICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSA9IFVTQl8zMkJJVF9MRShwb3J0X2NvbnRyb2wpOwoKICAgZFREX3B0ciA9IHVzYl9kZXZfcHRyLT5EVERfQUxJR05FRF9CQVNFX1BUUjsKCiAgIHRlbXBfc2NyYXRjaF9wdHIgPSB1c2JfZGV2X3B0ci0+U0NSQVRDSF9TVFJVQ1RfQkFTRTsKCiAgIC8qIEVucXVldWUgYWxsIHRoZSBkVERzICovICAgCiAgIGZvciAoaT0wOyBpPE1BWF9FUF9UUl9ERVNDUlM7IGkrKykgCiAgIHsKICAgICAgZFREX3B0ci0+U0NSQVRDSF9QVFIgPSB0ZW1wX3NjcmF0Y2hfcHRyOwogICAgICBkVERfcHRyLT5TQ1JBVENIX1BUUi0+RlJFRSA9IF91c2JfZGNpX3Z1c2IyMF9mcmVlX2RURDsKICAgICAgLyogU2V0IHRoZSBkVEQgdG8gYmUgaW52YWxpZCAqLwogICAgICBkVERfcHRyLT5ORVhUX1RSX0VMRU1fUFRSID0gVVNCXzMyQklUX0xFKFZVU0JIU19URF9ORVhUX1RFUk1JTkFURSk7CiAgICAgIC8qIFNldCB0aGUgUmVzZXJ2ZWQgZmllbGRzIHRvIDAgKi8KICAgICAgZFREX3B0ci0+U0laRV9JT0NfU1RTICY9IH4oVVNCXzMyQklUX0xFKFZVU0JIU19URF9SRVNFUlZFRF9GSUVMRFMpKTsKICAgICAgZFREX3B0ci0+U0NSQVRDSF9QVFItPlBSSVZBVEUgPSAocG9pbnRlcil1c2JfZGV2X3B0cjsKICAgICAgX3VzYl9kY2lfdnVzYjIwX2ZyZWVfZFREKChwb2ludGVyKWRURF9wdHIpOwogICAgICBkVERfcHRyKys7CiAgICAgIHRlbXBfc2NyYXRjaF9wdHIrKzsKICAgfSAvKiBFbmRmb3IgKi8KfSAvKiBFbmRCb2R5ICovCgovKkZVTkNUSU9OKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKgoqICBGdW5jdGlvbiBOYW1lICA6IF91c2JfZGNpX3Z1c2IyMF9mcmVlX2RURAoqICBSZXR1cm5lZCBWYWx1ZSA6IHZvaWQKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBFbnF1ZXVlcyBhIGRURCBvbnRvIHRoZSBmcmVlIERURCByaW5nLgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZCBfdXNiX2RjaV92dXNiMjBfZnJlZV9kVEQKICAgKAogICAgICAvKiBbSU5dIHRoZSBkVEQgdG8gZW5xdWV1ZSAqLwogICAgICBwb2ludGVyICBkVERfcHRyCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgdXNiX2Rldl9wdHI7CiAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0tleTsKCiAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUikoKChWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUilkVERfcHRyKS0+U0NSQVRDSF9QVFItPlBSSVZBVEUpOwoKICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX1RSQUNFLCAiZnJlZV9kVEQ6IGRURF9wdHI9MHgleFxuIiwgKHVuc2lnbmVkKWRURF9wdHIpOwoKICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMuZnJlZV9kVERfY291bnQrKykpOwoKCiAgIC8qCiAgICoqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LCBhbmQgaXQgbmVlZHMgbXV0dWFsCiAgICoqIGV4Y2x1c2lvbiB3aXRoIGl0c2VsZi4KICAgKi8KICAgbG9ja0tleSA9IFVTQl9sb2NrKCk7CgogICAvKgogICAqKiBBZGQgdGhlIGRURCB0byB0aGUgZnJlZSBkVEQgcXVldWUgKGxpbmtlZCB2aWEgUFJJVkFURSkgYW5kCiAgICoqIGluY3JlbWVudCB0aGUgdGFpbCB0byB0aGUgbmV4dCBkZXNjcmlwdG9yCiAgICovCiAgIEVIQ0lfRFREX1FBREQodXNiX2Rldl9wdHItPkRURF9IRUFELCB1c2JfZGV2X3B0ci0+RFREX1RBSUwsIChWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUilkVERfcHRyKTsKICAgdXNiX2Rldl9wdHItPkRURF9FTlRSSUVTKys7CgogICBVU0JfdW5sb2NrKGxvY2tLZXkpOwoKfSAvKiBFbmRib2R5ICovCgoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfYWRkX2RURAoqICBSZXR1cm5lZCBWYWx1ZSA6IFVTQl9PSyBvciBlcnJvciBjb2RlCiogIENvbW1lbnRzICAgICAgIDoKKiAgICAgICAgQWRkcyBhIGRldmljZSB0cmFuc2ZlciBkZXNyaXB0b3IocykgdG8gdGhlIHF1ZXVlLgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp1aW50XzggX3VzYl9kY2lfdnVzYjIwX2FkZF9kVEQKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZSwKICAgICAKICAgICAgLyogW0lOXSBUaGUgdHJhbnNmZXIgZGVzY3JpcHRvciBhZGRyZXNzICovCiAgICAgIFhEX1NUUlVDVF9QVFIgICAgICAgICAgICAgIHhkX3B0cgogICApCnsgLyogQm9keSAqLwogICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgICAgICB1c2JfZGV2X3B0cjsKICAgVlVTQjIwX1JFR19TVFJVQ1RfUFRSICAgICAgICAgICAgZGV2X3B0cjsKICAgVlVTQjIwX0VQX1RSX1NUUlVDVF9QVFIgICAgICAgICAgZFREX3B0ciwgdGVtcF9kVERfcHRyLCBmaXJzdF9kVERfcHRyID0gTlVMTDsKICAgVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUX1BUUiAgZXBfcXVldWVfaGVhZF9wdHI7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfcGt0X2xlbiwgcmVtYWluaW5nX2xlbjsgCiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfb2Zmc2V0LCB0ZW1wLCBiaXRfcG9zOwogICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgICAgICAgICB0aW1lb3V0OwogICAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBGb3IgYSBvcHRpbWFsIGltcGxlbWVudGF0aW9uLCB3ZSBuZWVkIHRvIGRldGVjdCB0aGUgZmFjdCB0aGF0CiAgIHdlIGFyZSBhZGRpbmcgRFREIHRvIGFuIGVtcHR5IGxpc3QuIElmIGxpc3QgaXMgZW1wdHksIHdlIGNhbgogICBhY3R1YWxseSBza2lwIHNldmVyYWwgcHJvZ3JhbW1pbmcgc3RlcHMgZXNwLiB0aG9zZSBmb3IgZW5zdXJpbmcKICAgdGhhdCB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbi5UaGUgZm9sbG93aW5nIGJvb2xlYW4gd2lsbCBiZSB1c2VmdWwKICAgaW4gc2tpcHBpbmcgc29tZSBjb2RlIGhlcmUuCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgYm9vbGVhbiAgICAgICAgICAgbGlzdF9lbXB0eSA9IEZBTFNFOwogICAKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CgogICByZW1haW5pbmdfbGVuID0geGRfcHRyLT5XVE9UQUxMRU5HVEg7CiAgIAogICBjdXJyX29mZnNldCA9IDA7CiAgIHRlbXAgPSAoMip4ZF9wdHItPkVQX05VTSArIHhkX3B0ci0+QkRJUkVDVElPTik7CiAgIGJpdF9wb3MgPSAoMSA8PCAoMTYgKiB4ZF9wdHItPkJESVJFQ1RJT04gKyB4ZF9wdHItPkVQX05VTSkpOwogICAKICAgZXBfcXVldWVfaGVhZF9wdHIgPSAoVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUX1BUUil1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9QVFIgKyB0ZW1wOwoKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBUaGlzIGxvb3BzIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgYW5kIGRpdmlkZXMKICAgdGhlIGRhdGEgaW4gdG8gRFREcyBlYWNoIGhhbmRsaW5nIHRoZSBhIG1heCBvZiAweDQwMDAgYnl0ZXMgb2YgZGF0YS4KICAgVGhlIGZpcnN0IERURCBpbiB0aGUgbGlzdCBpcyBzdG9yZWQgaW4gYSBwb2ludGVyIGNhbGxlZCBmaXJzdF9kVERfcHRyLgogICBUaGlzIHBvaW50ZXIgaXMgbGF0ZXIgbGlua2VkIGluIHRvIFFIIGZvciBwcm9jZXNzaW5nIGJ5IHRoZSBoYXJkd2FyZS4gICAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIGRvIAogICAgewogICAgICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHRyYW5zZmVyIGludG8gbXVsdGlwbGUgZFREcyAqLwogICAgICAgIGlmIChyZW1haW5pbmdfbGVuID4gVlVTQl9FUF9NQVhfTEVOR1RIX1RSQU5TRkVSKSAKICAgICAgICB7CiAgICAgICAgICAgIGN1cnJfcGt0X2xlbiA9IFZVU0JfRVBfTUFYX0xFTkdUSF9UUkFOU0ZFUjsKICAgICAgICB9IAogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBjdXJyX3BrdF9sZW4gPSByZW1haW5pbmdfbGVuOwogICAgICAgIH0gLyogRW5kaWYgKi8KICAgCiAgICAgICAgLyogR2V0IGEgZFREIGZyb20gdGhlIHF1ZXVlICovICAgCiAgICAgICAgRUhDSV9EVERfUUdFVCh1c2JfZGV2X3B0ci0+RFREX0hFQUQsIHVzYl9kZXZfcHRyLT5EVERfVEFJTCwgZFREX3B0cik7CiAgIAogICAgICAgIGlmICghZFREX3B0cikgCiAgICAgICAgewogICAgICAgICAgICBVU0JfcHJpbnRmKCJFcnJvcjogQ2FuJ3QgZ2V0IGRURFxuIik7CiAgICAgICAgICAgIHJldHVybiBVU0JFUlJfVFJfRkFJTEVEOwogICAgICAgIH0gLyogRW5kaWYgKi8KCiAgICAgICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2FkZF9jb3VudCsrKSk7CgogICAgICAgIHJlbWFpbmluZ19sZW4gLT0gY3Vycl9wa3RfbGVuOwoKICAgICAgICB1c2JfZGV2X3B0ci0+RFREX0VOVFJJRVMtLTsKCiAgICAgICAgaWYgKGN1cnJfb2Zmc2V0ID09IDApIAogICAgICAgIHsKICAgICAgICAgICAgZmlyc3RfZFREX3B0ciA9IGRURF9wdHI7CiAgICAgICAgfSAvKiBFbmRpZiAqLwoKICAgICAgICAvKiBaZXJvIHRoZSBkVEQuIExlYXZlIHRoZSBsYXN0IDQgYnl0ZXMgYXMgdGhhdCBpcyB0aGUgc2NyYXRjaCBwb2ludGVyICovCiAgICAgICAgVVNCX21lbXplcm8oKHZvaWQgKikgZFREX3B0ciwoc2l6ZW9mKFZVU0IyMF9FUF9UUl9TVFJVQ1QpIC0gNCkpOwoKICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBkVEQgKi8KICAgICAgICBkVERfcHRyLT5TQ1JBVENIX1BUUi0+UFJJVkFURSA9IGhhbmRsZTsKICAgCiAgICAgICAgLyogU2V0IHRoZSBUZXJtaW5hdGUgYml0ICovCiAgICAgICAgZFREX3B0ci0+TkVYVF9UUl9FTEVNX1BUUiA9IFVTQl8zMkJJVF9MRShWVVNCX0VQX1FVRVVFX0hFQURfTkVYVF9URVJNSU5BVEUpOwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEZJWCBNRTogRm9yIGhpZy1zcGVlZCBhbmQgaGlnaC1iYW5kd2lkdGggSVNPIElOIGVuZHBvaW50cywKICAgICAgICB3ZSBtdXN0IGluaXRpYWxpemUgdGhlIG11bHRpcGxpZWQgZmllbGQgc28gdGhhdCBIb3N0IGNhbiBpc3N1ZXMKICAgICAgICBtdWx0aXBsZSBJTiB0cmFuc2FjdGlvbnMgb24gdGhlIGVuZHBvaW50LiBTZWUgdGhlIERURCBkYXRhCiAgICAgICAgc3RydWN0dXJlIGZvciBNdWx0aUlPIGZpZWxkLgogICAgICAKICAgICAgICBTIEdhcmcgMTEvMDYvMjAwMwogICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIAogICAgICAgIC8qIEZpbGwgaW4gdGhlIHRyYW5zZmVyIHNpemUgKi8KICAgICAgICBpZiAoIXJlbWFpbmluZ19sZW4pIAogICAgICAgIHsKICAgICAgICAgICAgZFREX3B0ci0+U0laRV9JT0NfU1RTID0gVVNCXzMyQklUX0xFKChjdXJyX3BrdF9sZW4gPDwgCiAgICAgICAgICAgICAgICAgICAgVlVTQkhTX1REX0xFTkdUSF9CSVRfUE9TKSB8IChWVVNCSFNfVERfSU9DKSB8IChWVVNCSFNfVERfU1RBVFVTX0FDVElWRSkpOwogICAgICAgIH0gCiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIGRURF9wdHItPlNJWkVfSU9DX1NUUyA9IFVTQl8zMkJJVF9MRSgoY3Vycl9wa3RfbGVuIDw8IFZVU0JIU19URF9MRU5HVEhfQklUX1BPUykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVlVTQkhTX1REX1NUQVRVU19BQ1RJVkUpOwogICAgICAgIH0gLyogRW5kaWYgKi8KICAgCiAgICAgICAgLyogU2V0IHRoZSByZXNlcnZlZCBmaWVsZCB0byAwICovCiAgICAgICAgZFREX3B0ci0+U0laRV9JT0NfU1RTICY9IH5VU0JfMzJCSVRfTEUoVlVTQkhTX1REX1JFU0VSVkVEX0ZJRUxEUyk7CgogICAgICAgIC8qIDRLIGFwYXJ0IGJ1ZmZlciBwYWdlIHBvaW50ZXJzICovCiAgICAgICAgaWYoeGRfcHRyLT5XU1RBUlRBRERSRVNTICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICB1aW50XzMyIHBoeXNBZGRyID0gVVNCX3ZpcnRfdG9fcGh5cygodWludF84Kil4ZF9wdHItPldTVEFSVEFERFJFU1MgKyBjdXJyX29mZnNldCk7CgogICAgICAgICAgICBkVERfcHRyLT5CVUZGX1BUUjAgPSBVU0JfMzJCSVRfTEUocGh5c0FkZHIpOwogICAgICAgICAgICAKICAgICAgICAgICAgcGh5c0FkZHIgKz0gNDA5NjsKICAgICAgICAgICAgZFREX3B0ci0+QlVGRl9QVFIxID0gVVNCXzMyQklUX0xFKHBoeXNBZGRyKTsKCiAgICAgICAgICAgIHBoeXNBZGRyICs9IDQwOTY7CiAgICAgICAgICAgIGRURF9wdHItPkJVRkZfUFRSMiA9IFVTQl8zMkJJVF9MRShwaHlzQWRkcik7CgogICAgICAgICAgICBwaHlzQWRkciArPSA0MDk2OwogICAgICAgICAgICBkVERfcHRyLT5CVUZGX1BUUjMgPSBVU0JfMzJCSVRfTEUocGh5c0FkZHIpOwoKICAgICAgICAgICAgcGh5c0FkZHIgKz0gNDA5NjsKICAgICAgICAgICAgZFREX3B0ci0+QlVGRl9QVFI0ID0gVVNCXzMyQklUX0xFKHBoeXNBZGRyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZFREX3B0ci0+QlVGRl9QVFIwID0gZFREX3B0ci0+QlVGRl9QVFIxID0gZFREX3B0ci0+QlVGRl9QVFIyID0gMDsKICAgICAgICAgICAgZFREX3B0ci0+QlVGRl9QVFIzID0gZFREX3B0ci0+QlVGRl9QVFI0ID0gMDsKICAgICAgICB9CiAgICAgICAgY3Vycl9vZmZzZXQgKz0gY3Vycl9wa3RfbGVuOwoKICAgICAgLyogTWFpbnRhaW4gdGhlIGZpcnN0IGFuZCBsYXN0IGRldmljZSB0cmFuc2ZlciBkZXNjcmlwdG9yIHBlciAKICAgICAgKiogZW5kcG9pbnQgYW5kIGRpcmVjdGlvbiAKICAgICAgKi8KICAgICAgaWYgKCF1c2JfZGV2X3B0ci0+RVBfRFREX0hFQURTW3RlbXBdKSAKICAgICAgewogICAgICAgICB1c2JfZGV2X3B0ci0+RVBfRFREX0hFQURTW3RlbXBdID0gZFREX3B0cjsKICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgIElmIGxpc3QgZG9lcyBub3QgaGF2ZSBhIGhlYWQsIGl0IG1lYW5zIHRoYXQgbGlzdAogICAgICAgICBpcyBlbXB0eS4gQW4gZW1wdHkgY29uZGl0aW9uIGlzIGRldGVjdGVkLgogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgbGlzdF9lbXB0eSA9IFRSVUU7CiAgICAgIH0gLyogRW5kaWYgKi8gCiAgIAogICAgICAvKiBDaGVjayBpZiB0aGUgdHJhbnNmZXIgaXMgdG8gYmUgcXVldWVkIGF0IHRoZSBlbmQgb3IgYmVnaW5uaW5nICovCiAgICAgIHRlbXBfZFREX3B0ciA9IHVzYl9kZXZfcHRyLT5FUF9EVERfVEFJTFNbdGVtcF07CiAgICAgIAogICAgICAvKiBSZW1lbWJlciB3aGljaCBYRCB0byB1c2UgZm9yIHRoaXMgZFREICovCiAgICAgIGRURF9wdHItPlNDUkFUQ0hfUFRSLT5YRF9GT1JfVEhJU19EVEQgPSAocG9pbnRlcil4ZF9wdHI7CiAgICAgIAogICAgICAvKiBOZXcgdGFpbCAqLwogICAgICB1c2JfZGV2X3B0ci0+RVBfRFREX1RBSUxTW3RlbXBdID0gZFREX3B0cjsKICAgICAgaWYgKHRlbXBfZFREX3B0cikgCiAgICAgIHsKICAgICAgICAgLyogU2hvdWxkIG5vdCBkbyB8PS4gVGhlIFRlcm1pbmF0ZSBiaXQgc2hvdWxkIGJlIHplcm8gKi8KICAgICAgICAgdGVtcF9kVERfcHRyLT5ORVhUX1RSX0VMRU1fUFRSID0gVVNCXzMyQklUX0xFKFVTQl9EVERfVklSVF9UT19QSFlTKHVzYl9kZXZfcHRyLCBkVERfcHRyKSk7CiAgICAgIH0gLyogRW5kaWYgKi8KICAgfSB3aGlsZSAocmVtYWluaW5nX2xlbik7IC8qIEVuZFdoaWxlICovCgoKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIEluIHRoZSBsb29wIGFib3ZlIERURCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBsaXN0CiAgIEhvd2V2ZXIgZW5kcG9pbnQgaGFzIG5vdCBiZWVuIHByaW1lZCB5ZXQuIElmIGxpc3QgaXMgbm90IGVtcHR5IAogICB3ZSBuZWVkIHNhZnRlciB3YXlzIHRvIGFkZCBEVEQgdG8gdGhlIGV4aXN0aW5nIGxpc3QuIAogICBFbHNlIHdlIGp1c3Qgc2tpcCB0byBhZGRpbmcgRFREIHRvIFFIIHNhZmVseS4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIAogICAgaWYobGlzdF9lbXB0eSA9PSBGQUxTRSkKICAgIHsKICAgICAgICB2b2xhdGlsZSBib29sZWFuICAgIHJlYWRfc2FmZSA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB1aW50XzMyICAgICAgICAgICAgIHByaW1lLCB0ZW1wX2VwX3N0YXQ9MDsKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEhhcmR3YXJlIHYzLjIrIHJlcXVpcmUgdGhlIHVzZSBvZiBzZW1hcGhvcmUgdG8gZW5zdXJlIHRoYXQKICAgICAgICBRSCBpcyBzYWZlbHkgdXBkYXRlZC4KICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2FkZF9ub3RfZW1wdHlfY291bnQrKykpOwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgQ2hlY2sgdGhlIHByaW1lIGJpdC4gSWYgc2V0IGdvdG8gZG9uZQogICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBwcmltZSA9IFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFBSSU1FKTsKLyoKICAgICAgICBVU0JfcHJpbnRmKCIlMDNkOiBBZGQgbm90IGVtcHR5OiBiaXRfcG9zPSV4LCBwcmltZT0weCV4LCBzdGF0dXM9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2FkZF9ub3RfZW1wdHlfY291bnQsIHByaW1lLCBiaXRfcG9zLAogICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFNUQVRVUyksCiAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGVwX3F1ZXVlX2hlYWRfcHRyLT5TSVpFX0lPQ19JTlRfU1RTKSApOwoqLwogICAgICAgIGlmKHByaW1lICYgYml0X3BvcykKICAgICAgICB7CiAgICAgICAgICAgIHRpbWVvdXQgPSAweDEwMDA7CiAgICAgICAgICAgIHdoaWxlKCBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFBSSU1FCiAgICAgICAgICAgICAgICAgICAgJiBVU0JfMzJCSVRfTEUoYml0X3BvcykgKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgRU5EUFRQUklNRSB0byBnbyB0byB6ZXJvICovCiAgICAgICAgICAgICAgICB0aW1lb3V0LS07CiAgICAgICAgICAgICAgICBpZih0aW1lb3V0IDw9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVVNCX3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQ6IENUUkw9JXgsIFBSSU1FPSV4LCBTVEFUPSV4LCBJTlRSPSV4LCBBRERSPSV4LCBQT1JUU0M9JXgsIGRURD0lcCwgdGVtcF9kVEQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVENUUkxYWzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUU1RBVFVTKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfU1RTKSwKICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkRFVklDRV9BRERSKSwKICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlBPUlRTQ1hbMF0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZFREX3B0ciwgdGVtcF9kVERfcHRyKTsKCiAgICAgICAgICAgICAgICAgICAgX3VzYl9lcF9zdGF0dXMoaGFuZGxlLCB4ZF9wdHItPkVQX05VTSwgeGRfcHRyLT5CRElSRUNUSU9OKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVTQkVSUl9UUl9GQUlMRUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gLyogRW5kV2hpbGUgKi8KCiAgICAgICAgICAgIC8qQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX1RSQU5TRkVSLCovCiAgICAgICAgICAgIGlmKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUU1RBVFVTICYgVVNCXzMyQklUX0xFKGJpdF9wb3MpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJlYWRfc2FmZSA9IEZBTFNFOwogICAgICAgIHRpbWVvdXQgPSAxMDAwMDAwOwogICAgICAgIHdoaWxlKHJlYWRfc2FmZSA9PSBGQUxTRSkKICAgICAgICB7CiAgICAgICAgICAgIHRpbWVvdXQtLTsKICAgICAgICAgICAgaWYodGltZW91dCA8PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVU0JfcHJpbnRmKCIlczogVGltZW91dCBmb3IgQVREVFdfVFJJUFdJUkUgcmVnID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCAKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBVU0JFUlJfVFJfRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICBzdGFydCB3aXRoIHNldHRpbmcgdGhlIHNlbWFwaG9yZXMKICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0NNRCB8PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEVIQ0lfQ01EX0FURFRXX1RSSVBXSVJFX1NFVCk7CiAgICAgICAgICAgICAgIAogICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICBSZWFkIHRoZSBlbmRwb2ludCBzdGF0dXMKICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgdGVtcF9lcF9zdGF0ID0gVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUU1RBVFVTKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYml0X3BvczsgCgogICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICBSZXJlYWQgdGhlIEFURFRXIHNlbWFwaG9yZSBiaXQgdG8gY2hlY2sgaWYgaXQgaXMgY2xlYXJlZC4KICAgICAgICAgICBXaGVuIGhhcmR3YXJlIHNlZSBhIGhhemFyZCwgaXQgd2lsbCBjbGVhciB0aGUgYml0IG9yCiAgICAgICAgICAgZWxzZSB3ZSByZW1haW4gc2V0IHRvIDEgYW5kIHdlIGNhbiBwcm9jZWVkIHdpdGggcHJpbWluZwogICAgICAgICAgIG9mIGVuZHBvaW50IGlmIG5vdCBhbHJlYWR5IHByaW1lZC4KICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgaWYoIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEVIQ0lfQ01EX0FURFRXX1RSSVBXSVJFX1NFVCkpCiAgICAgICAgICAgewogICAgICAgICAgICAgICByZWFkX3NhZmUgPSBUUlVFOwogICAgICAgICAgIH0KCiAgICAgICAgfS8qZW5kIHdoaWxlIGxvb3AgKi8KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENsZWFyIHRoZSBzZW1hcGhvcmUKICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0NNRCAmPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEVIQ0lfQ01EX0FURFRXX1RSSVBXSVJFX0NMRUFSKTsKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAqIElmIGVuZHBvaW50IGlzIG5vdCBhY3RpdmUsIHdlIGFjdGl2YXRlIGl0IG5vdy4gICAgICAgICAgICAgICAKICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICBpZighdGVtcF9lcF9zdGF0KQogICAgICAgICB7CiAgICAgICAgICAgIC8qIE5vIG90aGVyIHRyYW5zZmVycyBvbiB0aGUgcXVldWUgKi8KICAgICAgICAgICAgZXBfcXVldWVfaGVhZF9wdHItPk5FWFRfRFREX1BUUiA9IFVTQl8zMkJJVF9MRSgKICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RURF9WSVJUX1RPX1BIWVModXNiX2Rldl9wdHIsIGZpcnN0X2RURF9wdHIpKTsKICAgICAgICAgICAgZXBfcXVldWVfaGVhZF9wdHItPlNJWkVfSU9DX0lOVF9TVFMgPSAwOwoKICAgICAgICAgICAgLyogUHJpbWUgdGhlIEVuZHBvaW50ICovCiAgICAgICAgICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUgPSBVU0JfMzJCSVRfTEUoYml0X3Bvcyk7CiAgICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAgLyogTm8gb3RoZXIgdHJhbnNmZXJzIG9uIHRoZSBxdWV1ZSAqLwogICAgICAgICBlcF9xdWV1ZV9oZWFkX3B0ci0+TkVYVF9EVERfUFRSID0gVVNCXzMyQklUX0xFKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RURF9WSVJUX1RPX1BIWVModXNiX2Rldl9wdHIsIGZpcnN0X2RURF9wdHIpKTsKICAgICAgICAgZXBfcXVldWVfaGVhZF9wdHItPlNJWkVfSU9DX0lOVF9TVFMgPSAwOwogICAKICAgICAgICAgLyogUHJpbWUgdGhlIEVuZHBvaW50ICovCiAgICAgICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUgPSBVU0JfMzJCSVRfTEUoYml0X3Bvcyk7CiAgICAgICAgIC8qIGRlbGF5ICovCiAgICAgICAgIHRpbWVvdXQgPSAweDEwMDsKICAgICAgICAgd2hpbGUodGltZW91dCA+IDApCiAgICAgICAgICAgICB0aW1lb3V0LS07CgogICAgICAgICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFBSSU1FID0gVVNCXzMyQklUX0xFKGJpdF9wb3MpOwogICAgfQoKZG9uZToKICAgaWYoZmlyc3RfZFREX3B0ciA9PSBOVUxMKQogICAgICAgVVNCX3ByaW50ZigiRVJST1IgISEhISBmaXJzdF9kVERfcHRyPU5VTExcbiIpOwoKICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX1RSQU5TRkVSLAogICAgICAgICAgICAgICAiIGFkZF8lZDogZnJpPTB4JXgsIGVwPSVkJXMsIGJ1Zj0lcCwgc2l6ZT0lZCwgeGQ9JXAsIGRURD0lcCAlcCwgZW1wdHk9JWRcbiIsCiAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5TVEFUUy51c2JfYWRkX2NvdW50ICYgMHhGRkZGLCAKICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9GUklOREVYKSwgCiAgICAgICAgICAgICAgIHhkX3B0ci0+RVBfTlVNLCB4ZF9wdHItPkJESVJFQ1RJT04gPyAiaW4iIDogIm91dCIsIAogICAgICAgICAgICAgICB4ZF9wdHItPldTVEFSVEFERFJFU1MsIChpbnQpeGRfcHRyLT5XVE9UQUxMRU5HVEgsIAogICAgICAgICAgICAgICB4ZF9wdHIsICh1bnNpZ25lZClmaXJzdF9kVERfcHRyLCAKICAgICAgICAgICAgICAgdXNiX2Rldl9wdHItPkVQX0RURF9IRUFEU1t0ZW1wXSwgbGlzdF9lbXB0eSk7CgoKICAgcmV0dXJuIFVTQl9PSzsKICAgLyogRW5kIENSIDEwMTUgKi8KfSAvKiBFbmRCb2R5ICovCgoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc190cl9jb21wbGV0ZQoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTZXJ2aWNlcyB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc190cl9jb21wbGV0ZQogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyOwogICB2b2xhdGlsZSBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgICAgICAgICBkZXZfcHRyOwogICB2b2xhdGlsZSBWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUiAgICAgICAgICAgICBkVERfcHRyOyAKICAgVlVTQjIwX0VQX1RSX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kVERfcHRyOwogICBWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1RfUFRSICAgICAgICAgICAgICBlcF9xdWV1ZV9oZWFkX3B0cjsKICAgdWludF8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgaSwgZXBfbnVtID0gMCwgZGlyZWN0aW9uID0gMCwgYml0X3BvczsKICAgdWludF8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX2xlbmd0aCA9IDA7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF90cmFuc2Zlcl9sZW5ndGggPSAwOwogICB1aW50XzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLCBlcnJvcnMgPSAwOwogICBYRF9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZF9wdHI7CiAgIFhEX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfeGRfcHRyID0gTlVMTDsKICAgdWludF84X3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZl9zdGFydF9hZGRyZXNzID0gTlVMTDsKICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfZGV0ZWN0ZWQgPSBGQUxTRTsKICAgCiAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiloYW5kbGU7CiAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwoKICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2NvbXBsZXRlX2lzcl9jb3VudCsrKSk7CgogICAvKiBXZSB1c2Ugc2VwYXJhdGUgbG9vcHMgZm9yIEVORFBUU0VUVVBTVEFUIGFuZCBFTkRQVENPTVBMRVRFIGJlY2F1c2UgdGhlIAogICAqKiBzZXR1cCBwYWNrZXRzIGFyZSB0byBiZSByZWFkIEFTQVAgCiAgICovCiAgIAogICAvKiBQcm9jZXNzIGFsbCBTZXR1cCBwYWNrZXQgcmVjZWl2ZWQgaW50ZXJydXB0cyAqLwogICBiaXRfcG9zID0gVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUX1NFVFVQX1NUQVQpOwogICAKICAgaWYgKGJpdF9wb3MpIAogICB7CiAgICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19TRVRVUCwgInNldHVwX2lzcjogYml0X3Bvcz0weCV4XG4iLCAodW5zaWduZWQpYml0X3Bvcyk7CiAgICAgIGZvcihpPTA7IGk8VVNCX01BWF9DT05UUk9MX0VORFBPSU5UUzsgaSsrKSAKICAgICAgewogICAgICAgICBpZiAoYml0X3BvcyAmICgxIDw8IGkpKSAKICAgICAgICAgewogICAgICAgICAgICBBUkNfREVCVUdfQ09ERShBUkNfREVCVUdfRkxBR19TVEFUUywgKHVzYl9kZXZfcHRyLT5TVEFUUy51c2Jfc2V0dXBfY291bnQrKykpOwogICAgICAgICAgICBfdXNiX2RldmljZV9jYWxsX3NlcnZpY2UoaGFuZGxlLCBpLCBUUlVFLCAwLCAwLCA4LCAwKTsKICAgICAgICAgfSAvKiBFbmRpZiAqLwogICAgICB9IC8qIEVuZGZvciAqLwogICB9IC8qIEVuZGlmICovCiAgIAogICAvKiBEb24ndCBjbGVhciB0aGUgZW5kcG9pbnQgc2V0dXAgc3RhdHVzIHJlZ2lzdGVyIGhlcmUuIEl0IGlzIGNsZWFyZWQgYXMgYSAKICAgKiogc2V0dXAgcGFja2V0IGlzIHJlYWQgb3V0IG9mIHRoZSBidWZmZXIgCiAgICovCgogICAvKiBQcm9jZXNzIG5vbi1zZXR1cCB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHRzICovICAgCiAgIGJpdF9wb3MgPSBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDT01QTEVURSk7CgogICAvKiBDbGVhciB0aGUgYml0cyBpbiB0aGUgcmVnaXN0ZXIgKi8KICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDT01QTEVURSA9IFVTQl8zMkJJVF9MRShiaXRfcG9zKTsKICAgCiAgIGlmIChiaXRfcG9zKSAKICAgewogICAgICAgIEFSQ19ERUJVR19DT0RFKEFSQ19ERUJVR19GTEFHX1NUQVRTLCAodXNiX2Rldl9wdHItPlNUQVRTLnVzYl9jb21wbGV0ZV9jb3VudCsrKSk7CgogICAgICAgIC8qIEdldCB0aGUgZW5kcG9pbnQgbnVtYmVyIGFuZCB0aGUgZGlyZWN0aW9uIG9mIHRyYW5zZmVyICovCiAgICAgICAgY291bnRlciA9IDA7CiAgICAgICAgZm9yIChpPTA7IGk8KEFSQ19VU0JfTUFYX0VORFBPSU5UUyoyKTsgaSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIGVuZHBvaW50X2RldGVjdGVkID0gRkFMU0U7CiAgICAgICAgICAgIGlmICgoaSA8IEFSQ19VU0JfTUFYX0VORFBPSU5UUykgJiYgKGJpdF9wb3MgJiAoMSA8PCBpKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVwX251bSA9IGk7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBBUkNfVVNCX1JFQ1Y7CiAgICAgICAgICAgICAgICBlbmRwb2ludF9kZXRlY3RlZCA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiggKGkgPj0gQVJDX1VTQl9NQVhfRU5EUE9JTlRTKSAmJiAKICAgICAgICAgICAgICAgICAgICAoYml0X3BvcyAmICgxIDw8IChpKzE2LUFSQ19VU0JfTUFYX0VORFBPSU5UUykpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcF9udW0gPSAoaSAtIEFSQ19VU0JfTUFYX0VORFBPSU5UUyk7CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQVJDX1VTQl9TRU5EOwogICAgICAgICAgICAgICAgICAgIGVuZHBvaW50X2RldGVjdGVkID0gVFJVRTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoZW5kcG9pbnRfZGV0ZWN0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRlbXAgPSAoMiplcF9udW0gKyBkaXJlY3Rpb24pOwoKICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZmlyc3QgZFREICovICAgICAgCiAgICAgICAgICAgICAgICBkVERfcHRyID0gdXNiX2Rldl9wdHItPkVQX0RURF9IRUFEU1t0ZW1wXTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlcF9xdWV1ZV9oZWFkX3B0ciA9IChWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BUUiArIHRlbXA7CgogICAgICAgICAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGRURHMgZm9yIHJlc3BlY3RpdmUgdHJhbnNmZXJzICovCiAgICAgICAgICAgICAgICB3aGlsZSAoZFREX3B0cikgCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKFVTQl8zMkJJVF9MRShkVERfcHRyLT5TSVpFX0lPQ19TVFMpICYgVlVTQkhTX1REX1NUQVRVU19BQ1RJVkUpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbW9yZSBkVERzIHRvIHByb2Nlc3MuIE5leHQgb25lIGlzIG93bmVkIGJ5IFZVU0IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnRlciA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNfREVCVUdfVFJBQ0UoQVJDX0RFQlVHX0ZMQUdfSVNSLCAidHJfY29tcGxldGUgLSBicmVhazogZXA9JWQgJXMsIGJpdF9wb3M9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWVwX251bSwgZGlyZWN0aW9uID8gIlNFTkQiIDogIlJFQ1YiLCAodW5zaWduZWQpYml0X3Bvcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2VtcHR5X2NvbXBsZXRlX2NvdW50KyspKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IC8qIEVuZGlmICovCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgY29ycmVjdCBpbnRlcm5hbCB0cmFuc2ZlciBkZXNjcmlwdG9yICovCiAgICAgICAgICAgICAgICAgICAgeGRfcHRyID0gKFhEX1NUUlVDVF9QVFIpZFREX3B0ci0+U0NSQVRDSF9QVFItPlhEX0ZPUl9USElTX0RURDsKICAgICAgICAgICAgICAgICAgICBpZiAoeGRfcHRyKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfc3RhcnRfYWRkcmVzcyA9IHhkX3B0ci0+V1NUQVJUQUREUkVTUzsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX3RyYW5zZmVyX2xlbmd0aCA9IHhkX3B0ci0+V1RPVEFMTEVOR1RIOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3hkX3B0ciA9IHhkX3B0cjsKICAgICAgICAgICAgICAgICAgICB9IC8qIEVuZGlmICovCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBkVEQgKi8KICAgICAgICAgICAgICAgICAgICB0ZW1wX2RURF9wdHIgPSAoVlVTQjIwX0VQX1RSX1NUUlVDVF9QVFIpVVNCX0RURF9QSFlTX1RPX1ZJUlQodXNiX2Rldl9wdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50XzMyKShVU0JfMzJCSVRfTEUoZFREX3B0ci0+TkVYVF9UUl9FTEVNX1BUUikgJiBWVVNCSFNfVERfQUREUl9NQVNLKSApOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBlcnJvcnMgKi8KICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAoVVNCXzMyQklUX0xFKGRURF9wdHItPlNJWkVfSU9DX1NUUykgJiBWVVNCSFNfVERfRVJST1JfTUFTSyk7ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcnMpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gZXJyb3JzICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRyYW5zZmVyIGZyb20gdGhlIGN1cnJlbnQgZFREICovICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19sZW5ndGggKz0gKChVU0JfMzJCSVRfTEUoZFREX3B0ci0+U0laRV9JT0NfU1RTKSAmIFZVU0JfRVBfVFJfUEFDS0VUX1NJWkUpID4+IDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX3RyYW5zZmVyX2xlbmd0aCAtPSByZW1haW5pbmdfbGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMgJiBWVVNCSFNfVERfU1RBVFVTX0hBTFRFRCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBlcnJvcnMgYW5kIEhhbHQgY29uZGl0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9xdWV1ZV9oZWFkX3B0ci0+U0laRV9JT0NfSU5UX1NUUyAmPSBVU0JfMzJCSVRfTEUofmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogRW5kaWYgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19FUlJPUiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxldGVfdHIgRVJST1I6IGVwPSVkICVzOiBTVFM9MHgleCwgZFREPSVwLCBkVERfbmV4dD0lcCwgeGQ9JXAsIHFoLT5zdHM9MHgleFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCllcF9udW0sIGRpcmVjdGlvbiA/ICJTRU5EIiA6ICJSRUNWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkVERfcHRyLT5TSVpFX0lPQ19TVFMsIGRURF9wdHIsIHRlbXBfZFREX3B0ciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkX3B0ciwgZXBfcXVldWVfaGVhZF9wdHItPlNJWkVfSU9DX0lOVF9TVFMpOwogICAgICAgICAgICAgICAgICAgIH0gLyogRW5kaWYgKi8KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyogUmV0aXJlIHRoZSBwcm9jZXNzZWQgZFREICovCiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOwogICAgICAgICAgICAgICAgICAgIF91c2JfZGNpX3Z1c2IyMF9jYW5jZWxfdHJhbnNmZXIoaGFuZGxlLCBlcF9udW0sIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgaWYoICh0ZW1wX2RURF9wdHIgPT0gTlVMTCkgfHwgCiAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wX2RURF9wdHItPlNDUkFUQ0hfUFRSLT5YRF9GT1JfVEhJU19EVEQgIT0gdGVtcF94ZF9wdHIpICkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZS4gQ2FsbCB0aGUgcmVnaXN0ZXIgc2VydmljZSBmdW5jdGlvbiBmb3IgdGhlIGVuZHBvaW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgIEFSQ19ERUJVR19DT0RFKEFSQ19ERUJVR19GTEFHX1NUQVRTLCAodXNiX2Rldl9wdHItPlNUQVRTLnVzYl9jb21wbGV0ZV9lcF9jb3VudFt0ZW1wXSsrKSk7CgojaWYgZGVmaW5lZChVU0JfVU5ERVJSVU5fV0EpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoZGlyZWN0aW9uID09IEFSQ19VU0JfU0VORCkgJiYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChlcF9xdWV1ZV9oZWFkX3B0ci0+TUFYX1BLVF9MRU5HVEggPj4gMTYpICYgMHg3RkYpID4gZ2xvYmFsX3dhX3RocmVzaG9sZCkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiU2VuZENvbXBsZXRlKGhhbmRsZSwgZXBfbnVtLCBGQUxTRSwgZGlyZWN0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmX3N0YXJ0X2FkZHJlc3MsIGFjdHVhbF90cmFuc2Zlcl9sZW5ndGgsIGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKI2VuZGlmIC8qIFVTQl9VTkRFUlJVTl9XQSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VzYl9kZXZpY2VfY2FsbF9zZXJ2aWNlKGhhbmRsZSwgZXBfbnVtLCBGQUxTRSwgZGlyZWN0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmX3N0YXJ0X2FkZHJlc3MsIGFjdHVhbF90cmFuc2Zlcl9sZW5ndGgsIGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX1RSQU5TRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBfJWQ6IGZyaT0weCV4LCBlcD0lZCVzLCBidWY9JXAsIHNpemU9JWQsIHhkPSVwLCBkVEQ9JXAgJXAgJXAsIENPTVA9MHgleFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2NvbXBsZXRlX2NvdW50ICYgMHhGRkZGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfRlJJTkRFWCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWVwX251bSwgZGlyZWN0aW9uID8gImluIiA6ICJvdXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfc3RhcnRfYWRkcmVzcywgYWN0dWFsX3RyYW5zZmVyX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfeGRfcHRyLCBkVERfcHRyLCB0ZW1wX2RURF9wdHIsIHVzYl9kZXZfcHRyLT5FUF9EVERfSEVBRFNbdGVtcF0sICh1bnNpZ25lZCliaXRfcG9zKTsKCiAgICAgICAgICAgICAgICAgICAgfSAvKiBFbmRpZiAqLwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19UUkFOU0ZFUiwgInRyX2NvbXBsZXRlIG5vdCBjb21wbGV0ZWQ6IGVwPSVkICVzXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpZXBfbnVtLCBkaXJlY3Rpb24gPyAiU0VORCIgOiAiUkVDViIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiggKHRlbXBfZFREX3B0ciA9PSBOVUxMKSAmJiAodXNiX2Rldl9wdHItPkVQX0RURF9IRUFEU1t0ZW1wXSAhPSBOVUxMKSApCiAgICAgICAgICAgICAgICAgICAgewovKgogICAgICAgICAgICAgICAgICAgICAgICBVU0JfcHJpbnRmKCJ0cl9jb21wbGV0ZTogZXA9JWQsIHRlbXBfZFREPSVwLCBkVERfcHRyPSVwICglcCksIERURF9IRUFEUz0lcCwgcmVtYWluPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCB0ZW1wX2RURF9wdHIsIGRURF9wdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRFREX1BIWVNfVE9fVklSVCh1c2JfZGV2X3B0ciwgKHVpbnRfMzIpKFVTQl8zMkJJVF9MRShkVERfcHRyLT5ORVhUX1RSX0VMRU1fUFRSKSAmIFZVU0JIU19URF9BRERSX01BU0spICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5FUF9EVERfSEVBRFNbdGVtcF0sIHJlbWFpbmluZ19sZW5ndGgpOwoqLwogICAgICAgICAgICAgICAgICAgICAgICBkVERfcHRyID0gdXNiX2Rldl9wdHItPkVQX0RURF9IRUFEU1t0ZW1wXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZFREX3B0ciA9IHRlbXBfZFREX3B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gMDsKICAgICAgICAgICAgICAgIH0gLyogRW5kd2hpbGUgKi8KICAgICAgICAgICAgfSAvKiBFbmRpZiAqLwogICAgICAgIH0gLyogRW5kZm9yICovCiAgICAgICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsIAogICAgICAgICAgICAgICAoIHtpZih1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2NvbXBsZXRlX21heF9jb3VudCA8IGNvdW50ZXIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHItPlNUQVRTLnVzYl9jb21wbGV0ZV9tYXhfY291bnQgPSBjb3VudGVyO30pKTsKICAgfSAvKiBFbmRpZiAqLwp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX2lzcgoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTZXJ2aWNlcyBhbGwgdGhlIFZVU0JfSFMgaW50ZXJydXB0IHNvdXJjZXMKKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfaXNyCiAgICgKICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlIGhhbmRsZQogICApCnsgLyogQm9keSAqLwogICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgIHVzYl9kZXZfcHRyOwogICBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgIGRldl9wdHI7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwoKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKCiAgIEFSQ19ERUJVR19DT0RFKEFSQ19ERUJVR19GTEFHX1NUQVRTLCAodXNiX2Rldl9wdHItPlNUQVRTLnVzYl9pc3JfY291bnQrKykpOwoKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CgogICBzdGF0dXMgPSBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX1NUUyk7CiAgIAogICBzdGF0dXMgJj0gVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9JTlRSKTsKCiAgIGlmKHN0YXR1cyA9PSAwKSAKICAgewogICAgICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX2VtcHR5X2lzcl9jb3VudCsrKSk7CiAgICAgICByZXR1cm47CiAgIH0gLyogRW5kaWYgKi8KLyoKICAgIFVTQl9wcmludGYoIlVTQl9JU1I6IEZSSU5ERVg9MHgleCwgc3RhdHVzPTB4JXgsIFBPUlRTQz0weCV4LCBFUF9TRVRVUD0weCV4LCBFUF9DT01QTEVURT0weCV4XG4iLCAKICAgICAgICAgICAgICAgICAgICBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0ZSSU5ERVgpLAogICAgICAgICAgICAgICAgICAgIHN0YXR1cywgCiAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlBPUlRTQ1hbMF0pLAogICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVF9TRVRVUF9TVEFUKSwKICAgICAgICAgICAgICAgICAgICBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDT01QTEVURSkgKTsKKi8KICAgLyogQ2xlYXIgYWxsIHRoZSBpbnRlcnJ1cHRzIG9jY3VyZWQgKi8KICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX1NUUyA9IFVTQl8zMkJJVF9MRShzdGF0dXMpOwogICAKICAgaWYgKHN0YXR1cyAmIEVIQ0lfU1RTX0VSUikgCiAgIHsKICAgICAgICB1c2JfZGV2X3B0ci0+RVJST1JfU1RBVEUgPSAoc3RhdHVzICYgMHhGRkZGKTsKCiAgICAgIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX2Vycm9yKChwb2ludGVyKXVzYl9kZXZfcHRyKTsKICAgICAgICAvKiBkbyB0cl9jb21wbGV0ZSBpZiBubyBTVFNfSU5UIHNldCAqLwogICAgICAgIGlmKCAoc3RhdHVzICYgRUhDSV9TVFNfSU5UKSA9PSAwKQogICAgICAgICAgICBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc190cl9jb21wbGV0ZSgocG9pbnRlcil1c2JfZGV2X3B0cik7CgogICAgICAgIC8qVVNCX3ByaW50ZigiVVNCIHByb2Nlc3MgZXJyb3I6IHN0YXR1cz0weCV4XG4iLCBzdGF0dXMpOyovCiAgIH0gLyogRW5kaWYgKi8KCiAgIGlmIChzdGF0dXMgJiBFSENJX1NUU19SRVNFVCkgCiAgIHsKICAgICAgIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX3Jlc2V0KChwb2ludGVyKXVzYl9kZXZfcHRyKTsKICAgfSAvKiBFbmRpZiAqLwogICAKICAgaWYgKHN0YXR1cyAmIEVIQ0lfU1RTX1BPUlRfQ0hBTkdFKSAKICAgewogICAgICBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc19wb3J0X2NoYW5nZSgocG9pbnRlcil1c2JfZGV2X3B0cik7CiAgIH0gLyogRW5kaWYgKi8KICAgICAgCiAgIGlmIChzdGF0dXMgJiBFSENJX1NUU19TT0YpIAogICB7CiAgICAgIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX1NPRigocG9pbnRlcil1c2JfZGV2X3B0cik7CiAgIH0gLyogRW5kaWYgKi8KICAgCiAgIGlmIChzdGF0dXMgJiBFSENJX1NUU19JTlQpIAogICB7CiAgICAgIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX3RyX2NvbXBsZXRlKChwb2ludGVyKXVzYl9kZXZfcHRyKTsKICAgfSAvKiBFbmRpZiAqLwogICAKICAgIGlmIChzdGF0dXMgJiBFSENJX1NUU19TVVNQRU5EKSAKICAgIHsKICAgICAgICBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc19zdXNwZW5kKChwb2ludGVyKXVzYl9kZXZfcHRyKTsKICAgIH0gLyogRW5kaWYgKi8KCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc19yZXNldAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTZXJ2aWNlcyByZXNldCBpbnRlcnJ1cHQKKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc19yZXNldAogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgdXNiX2Rldl9wdHI7CiAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgZGV2X3B0cjsKICAgdWludF8zMiAgICAgICAgICAgICAgICAgICAgICB0ZW1wOwogICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgICAgIHRpbWVvdXQ7CgogICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwoKICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX0lTUiwgInByb2Nlc3NfcmVzZXRcbiIpOwogICBBUkNfREVCVUdfQ09ERShBUkNfREVCVUdfRkxBR19TVEFUUywgKHVzYl9kZXZfcHRyLT5TVEFUUy51c2JfcmVzZXRfY291bnQrKykpOwogICAKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CgogICAvKiBJbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHNvIHRoYXQgaXQgY2FuIGNhbmNlbCBhbGwgcHJldmlvdXNseSBxdWV1ZWQgdHJhbnNmZXJzICovCiAgIF91c2JfZGV2aWNlX2NhbGxfc2VydmljZSh1c2JfZGV2X3B0ciwgQVJDX1VTQl9TRVJWSUNFX0JVU19SRVNFVCwgMCwgMCwgMCwgMCwgMCk7CgojaWYgZGVmaW5lZChVU0JfVU5ERVJSVU5fV0EpCiAgICBfdXNiX3Jlc2V0X3NlbmRfcXVldWUoKTsKI2VuZGlmIC8qIFVTQl9VTkRFUlJVTl9XQSAqLwogICAKICAgLyogVGhlIGFkZHJlc3MgYml0cyBhcmUgcGFzdCBiaXQgMjUtMzEuIFNldCB0aGUgYWRkcmVzcyAqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5ERVZJQ0VfQUREUiAmPSB+VVNCXzMyQklUX0xFKDB4RkUwMDAwMDApOwogICAKICAgLyogQ2xlYXIgYWxsIHRoZSBzZXR1cCB0b2tlbiBzZW1hcGhvcmVzICovCiAgIHRlbXAgPSBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRfU0VUVVBfU1RBVCk7CiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUX1NFVFVQX1NUQVQgPSBVU0JfMzJCSVRfTEUodGVtcCk7CgogICAvKiBDbGVhciBhbGwgdGhlIGVuZHBvaW50IGNvbXBsZXRlIHN0YXR1cyBiaXRzICovICAgCiAgIHRlbXAgPSBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDT01QTEVURSk7CiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUQ09NUExFVEUgPSBVU0JfMzJCSVRfTEUodGVtcCk7CiAgIAogICAgdGltZW91dCA9IDB4MTAwMDA7CiAgICB3aGlsZSAoVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUpICYgMHhGRkZGRkZGRikgCiAgICB7CiAgICAgICAgdGltZW91dC0tOwogICAgICAgIGlmKHRpbWVvdXQgPD0gMCkKICAgICAgICB7CiAgICAgICAgICAgIFVTQl9wcmludGYoIiVzOiBUaW1lb3V0IGZvciBFTkRQVFBSSU1FID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCAKICAgICAgICAgICAgICAgICh1bnNpZ25lZClVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRQUklNRSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAvKiBXYWl0IHVudGlsIGFsbCBFTkRQVFBSSU1FIGJpdHMgY2xlYXJlZCAqLwogICAgfSAvKiBFbmRpZiAqLwogICAKICAgLyogV3JpdGUgMXMgdG8gdGhlIEZsdXNoIHJlZ2lzdGVyICovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBURkxVU0ggPSBVU0JfMzJCSVRfTEUoMHhGRkZGRkZGRik7CiAgIAogICAgaWYoICh1c2JfZGV2X3B0ci0+RVJST1JfU1RBVEUgPT0gMHgwKSAmJgogICAgICAgIChVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUhDSV9QT1JUU0NYX1BPUlRfUkVTRVQpICkKICAgIHsKICAgICAgICBBUkNfREVCVUdfVFJBQ0UoQVJDX0RFQlVHX0ZMQUdfUkVTRVQsCiAgICAgICAgICAgICAgICAgICAgIlVTQiBCdXMgUmVzZXQ6IGZyaT0weCV4LCBkZXZfcHRyPSVwLCBTVEFURT0lZCwgUE9SVFNDPTB4JXgsIENNRD0weCV4LCBFTkRQVFswXT0weCV4XG4iLCAKICAgICAgICAgICAgICAgICAgICBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0ZSSU5ERVgpLCAKICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ciwgdXNiX2Rldl9wdHItPlVTQl9TVEFURSwKICAgICAgICAgICAgICAgICAgICBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSksCiAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQpLAogICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVENUUkxYWzBdKSk7CgogICAgICAgIHVzYl9kZXZfcHRyLT5CVVNfUkVTRVRUSU5HID0gVFJVRTsKICAgICAgICB1c2JfZGV2X3B0ci0+VVNCX1NUQVRFID0gQVJDX1VTQl9TVEFURV9QT1dFUkVEOwogICAgfSAKICAgIGVsc2UgCiAgICB7IAogICAgICAgIFVTQl9wcmludGYoIlVTQiBDaGlwIHJlaW5pdDogUE9SVFNDPTB4JXhcbiIsIAogICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlBPUlRTQ1hbMF0pKTsKCiAgICAgICAgLyogcmUtaW5pdGlhbGl6ZSAqLyAgICAgIAogICAgICAgIF91c2JfZGNpX3Z1c2IyMF9jaGlwX2luaXRpYWxpemUoKHBvaW50ZXIpdXNiX2Rldl9wdHIpOwogICAgICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19JTklULCAicHJvY2Vzc19yZXNldCwgQ2hpcCByZWluaXQgaHdcbiIpOwogICAgfSAvKiBFbmRpZiAqLwogICAKICAgIF91c2JfZGV2aWNlX2NhbGxfc2VydmljZSh1c2JfZGV2X3B0ciwgQVJDX1VTQl9TRVJWSUNFX0JVU19SRVNFVCwgMSwgMCwgMCwgMCwgMCk7Cgp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX3Byb2Nlc3Nfc3VzcGVuZAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTZXJ2aWNlcyBzdXNwZW5kIGludGVycnVwdAoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX3N1c3BlbmQKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZQogICApCnsgLyogQm9keSAqLwogICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICB1c2JfZGV2X3B0cjsKICAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgZGV2X3B0cjsKICAgCiAgICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwoKICAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwoKICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19JU1IsICJwcm9jZXNzX3N1c3BlbmRcbiIpOwogICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX3N1c3BlbmRfY291bnQrKykpOwogICAKICAgIHVzYl9kZXZfcHRyLT5VU0JfREVWX1NUQVRFX0I0X1NVU1BFTkQgPSB1c2JfZGV2X3B0ci0+VVNCX1NUQVRFOwogICAKICAgIHVzYl9kZXZfcHRyLT5VU0JfU1RBVEUgPSBBUkNfVVNCX1NUQVRFX1NVU1BFTkQ7CgogICAgLyogSW5mb3JtIHRoZSB1cHBlciBsYXllcnMgKi8KICAgIF91c2JfZGV2aWNlX2NhbGxfc2VydmljZSh1c2JfZGV2X3B0ciwgQVJDX1VTQl9TRVJWSUNFX1NMRUVQLCAwLCAwLCAwLCAwLCAwKTsKICAgCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfcHJvY2Vzc19TT0YKKiAgUmV0dXJuZWQgVmFsdWUgOiBOb25lCiogIENvbW1lbnRzICAgICAgIDoKKiAgICAgICAgU2VydmljZXMgU09GIGludGVycnVwdAoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX1NPRgogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyOwogICBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICAgICBkZXZfcHRyOwoKICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX0lTUiwgInByb2Nlc3NfU09GXG4iKTsKICAgCiAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiloYW5kbGU7CiAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwoKICAgLyogSW5mb3JtIHRoZSB1cHBlciBsYXllciAqLyAgIAogICBfdXNiX2RldmljZV9jYWxsX3NlcnZpY2UodXNiX2Rldl9wdHIsIEFSQ19VU0JfU0VSVklDRV9TT0YsIDAsIDAsIDAsIAogICAgICBVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0ZSSU5ERVgpLCAwKTsKCn0gLyogRW5kQm9keSAqLwoKCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX3Byb2Nlc3NfcG9ydF9jaGFuZ2UKKiAgUmV0dXJuZWQgVmFsdWUgOiBOb25lCiogIENvbW1lbnRzICAgICAgIDoKKiAgICAgICAgU2VydmljZXMgcG9ydCBjaGFuZ2UgZGV0ZWN0IGludGVycnVwdAoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9wcm9jZXNzX3BvcnRfY2hhbmdlCiAgICgKICAgICAgLyogW0lOXSB0aGUgVVNCX2Rldl9pbml0aWFsaXplIHN0YXRlIHN0cnVjdHVyZSAqLwogICAgICBfdXNiX2RldmljZV9oYW5kbGUgICAgICAgICBoYW5kbGUKICAgKQp7IC8qIEJvZHkgKi8KICAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyOwogICAgVlVTQjIwX1JFR19TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3B0cjsKCiAgICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwoKICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19JU1IsICJwcm9jZXNzX3BvcnRfY2hhbmdlXG4iKTsKICAgIEFSQ19ERUJVR19DT0RFKEFSQ19ERUJVR19GTEFHX1NUQVRTLCAodXNiX2Rldl9wdHItPlNUQVRTLnVzYl9wb3J0X2NoYW5nZV9jb3VudCsrKSk7CgogICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7Ci8qCiAgICBVU0JfcHJpbnRmKCJwb3J0X2NoYW5nZTogUE9SVFNDPTB4JXgsIERURF9FTlRSSUVTPSVkLCBYRF9FTlRSSUVTPSVkXG4iLCAKICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5QT1JUU0NYWzBdKSwKICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5EVERfRU5UUklFUywgdXNiX2Rldl9wdHItPlhEX0VOVFJJRVMpOwoqLwogICAgaWYgKHVzYl9kZXZfcHRyLT5CVVNfUkVTRVRUSU5HKSAKICAgIHsKICAgICAgICAvKiBCdXMgcmVzZXQgb3BlcmF0aW9uIGNvbXBsZXRlICovCiAgICAgICAgdXNiX2Rldl9wdHItPkJVU19SRVNFVFRJTkcgPSBGQUxTRTsKICAgIH0gLyogRW5kaWYgKi8KICAgCiAgICBpZiAoIShVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUhDSV9QT1JUU0NYX1BPUlRfUkVTRVQpKSAKICAgIHsKICAgICAgICAvKiBHZXQgdGhlIHNwZWVkICovCiAgICAgICAgaWYgKFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5QT1JUU0NYWzBdKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVIQ0lfUE9SVFNDWF9QT1JUX0hJR0hfU1BFRUQpIAogICAgICAgIHsKICAgICAgICAgICAgdXNiX2Rldl9wdHItPlNQRUVEID0gQVJDX1VTQl9TUEVFRF9ISUdIOwogICAgICAgIH0gCiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5TUEVFRCA9IEFSQ19VU0JfU1BFRURfRlVMTDsKICAgICAgICB9IC8qIEVuZGlmICovCi8qCiAgICAgICAgVVNCX3ByaW50ZigiVVNCICVzIHNwZWVkIGRldmljZSBkZXRlY3RlZFxuIiwgCiAgICAgICAgICAgICAgICAodXNiX2Rldl9wdHItPlNQRUVEID09IEFSQ19VU0JfU1BFRURfSElHSCkgPyAiSGlnaCIgOiAiRnVsbCIpOwoqLwogICAgICAgIC8qIEluZm9ybSB0aGUgdXBwZXIgbGF5ZXJzIG9mIHRoZSBzcGVlZCBvZiBvcGVyYXRpb24gKi8gICAgICAKICAgICAgICBfdXNiX2RldmljZV9jYWxsX3NlcnZpY2UodXNiX2Rldl9wdHIsIEFSQ19VU0JfU0VSVklDRV9TUEVFRF9ERVRFQ1RJT04sIDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHVzYl9kZXZfcHRyLT5TUEVFRCwgMCk7CiAgICB9IC8qIEVuZGlmICovCiAgICAgIAogICAgaWYgKFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5QT1JUU0NYWzBdKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSENJX1BPUlRTQ1hfUE9SVF9TVVNQRU5EKSAKICAgIHsgICAKICAgICAgICB1c2JfZGV2X3B0ci0+VVNCX0RFVl9TVEFURV9CNF9TVVNQRU5EID0gdXNiX2Rldl9wdHItPlVTQl9TVEFURTsKICAgICAgICB1c2JfZGV2X3B0ci0+VVNCX1NUQVRFID0gQVJDX1VTQl9TVEFURV9TVVNQRU5EOwoKICAgICAgICAvKiBJbmZvcm0gdGhlIHVwcGVyIGxheWVycyAqLwogICAgICAgIFVTQl9wcmludGYoIlVTQiBzdXNwZW5kXG4iKTsKICAgICAgICBfdXNiX2RldmljZV9jYWxsX3NlcnZpY2UodXNiX2Rldl9wdHIsIEFSQ19VU0JfU0VSVklDRV9TVVNQRU5ELCAwLCAwLCAwLCAwLCAwKTsKICAgIH0gLyogRW5kaWYgKi8KICAgCiAgICBpZiAoIShVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFswXSkgJiBFSENJX1BPUlRTQ1hfUE9SVF9TVVNQRU5EKSAKICAgICAgICAgICAgICAgICAgICAmJiAodXNiX2Rldl9wdHItPlVTQl9TVEFURSA9PSBBUkNfVVNCX1NUQVRFX1NVU1BFTkQpKSAKICAgIHsKICAgICAgICBVU0JfcHJpbnRmKCJVU0IgcmVzdW1lXG4iKTsKICAgICAgICB1c2JfZGV2X3B0ci0+VVNCX1NUQVRFID0gdXNiX2Rldl9wdHItPlVTQl9ERVZfU1RBVEVfQjRfU1VTUEVORDsKICAgICAgICAvKiBJbmZvcm0gdGhlIHVwcGVyIGxheWVycyAqLwogICAgICAgIF91c2JfZGV2aWNlX2NhbGxfc2VydmljZSh1c2JfZGV2X3B0ciwgQVJDX1VTQl9TRVJWSUNFX1JFU1VNRSwgMCwgMCwgMCwgMCwgMCk7CgogICAgICAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19TVVNQRU5ELCAicHJvY2Vzc19wb3J0X2NoYW5nZSwgU1VDQ0VTU0ZVTCwgcmVzdW1lZFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSAvKiBFbmRpZiAqLwogICAKICAgIHVzYl9kZXZfcHRyLT5VU0JfU1RBVEUgPSBBUkNfVVNCX1NUQVRFX0RFRkFVTFQ7CiAgICAgIAp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX3Byb2Nlc3NfZXJyb3IKKiAgUmV0dXJuZWQgVmFsdWUgOiBOb25lCiogIENvbW1lbnRzICAgICAgIDoKKiAgICAgICAgU2VydmljZXMgZXJyb3IgaW50ZXJydXB0CioKKkVORCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgX3VzYl9kY2lfdnVzYjIwX3Byb2Nlc3NfZXJyb3IKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZQogICApCnsgLyogQm9keSAqLwogICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgICAgICAgdXNiX2Rldl9wdHI7CiAgIAogICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwogICAKICAgLyogSW5jcmVtZW50IHRoZSBlcnJvciBjb3VudCAqLwogICB1c2JfZGV2X3B0ci0+RVJST1JTKys7CiAgIAogICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX0VSUk9SLCAKICAgICAgICAgICAgICAgICJwcm9jZXNzX2Vycm9yXyVkOiBzdGF0ZT0weCV4XG4iLCAKICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ci0+RVJST1JTLCB1c2JfZGV2X3B0ci0+RVJST1JfU1RBVEUpOyAKfSAvKiBFbmRCb2R5ICovCgovKkZVTkNUSU9OKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKgoqICBGdW5jdGlvbiBOYW1lICA6IF91c2JfZGNpX3Z1c2IyMF9zZXRfc3BlZWRfZnVsbAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBGb3JjZSB0aGUgY29udHJvbGxlciBwb3J0IGluIGZ1bGwgc3BlZWQgbW9kZS4KKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfc2V0X3NwZWVkX2Z1bGwKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZSwKICAgICAKICAgICAgLyogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBkZXZpY2UgKi8KICAgICAgdWludF84ICAgICAgICAgICAgICAgICAgICAgcG9ydF9udW1iZXIKICAgKQp7IC8qIEJvZHkgKi8KICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHI7CiAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgIGRldl9wdHI7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfY29udHJvbDsKICAgCiAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19BTlksICJGT1JDRSBzZXRfc3BlZWRfZnVsbFxuIik7CiAgIAogICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwogICBkZXZfcHRyID0gKFZVU0IyMF9SRUdfU1RSVUNUX1BUUil1c2JfZGV2X3B0ci0+REVWX1BUUjsKCiAgIHBvcnRfY29udHJvbCA9IFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5QT1JUU0NYW3BvcnRfbnVtYmVyXSk7ICAgCiAgIHBvcnRfY29udHJvbCB8PSBFSENJX1BPUlRTQ1hfRk9SQ0VfRlVMTF9TUEVFRF9DT05ORUNUOwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5QT1JUU0NYW3BvcnRfbnVtYmVyXSA9IFVTQl8zMkJJVF9MRShwb3J0X2NvbnRyb2wpOwogIAp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX3N1c3BlbmRfcGh5CiogIFJldHVybmVkIFZhbHVlIDogTm9uZQoqICBDb21tZW50cyAgICAgICA6CiogICAgICAgIFN1c3BlbmRzIHRoZSBQSFkgaW4gbG93IHBvd2VyIG1vZGUKKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfc3VzcGVuZF9waHkKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZSwKICAgICAKICAgICAgLyogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBkZXZpY2UgKi8KICAgICAgdWludF84ICAgICAgICAgICAgICAgICAgICAgcG9ydF9udW1iZXIKICAgKQp7IC8qIEJvZHkgKi8KICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHI7CiAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgIGRldl9wdHI7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfY29udHJvbDsKICAgICAgCiAgIEFSQ19ERUJVR19UUkFDRShBUkNfREVCVUdfRkxBR19TVVNQRU5ELCAic2V0X3N1c3BlbmRfcGh5XG4iKTsKICAgCiAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiloYW5kbGU7CiAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwoKICAgcG9ydF9jb250cm9sID0gVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlBPUlRTQ1hbcG9ydF9udW1iZXJdKTsgICAKICAgcG9ydF9jb250cm9sIHw9IEVIQ0lfUE9SVFNDWF9QSFlfQ0xPQ0tfRElTQUJMRTsKICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuUE9SVFNDWFtwb3J0X251bWJlcl0gPSBVU0JfMzJCSVRfTEUocG9ydF9jb250cm9sKTsKICAgCn0gLyogRW5kQm9keSAqLwoKCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX3NldF9hZGRyZXNzCiogIFJldHVybmVkIFZhbHVlIDogTm9uZQoqICBDb21tZW50cyAgICAgICA6CiogICAgICAgIFNldHMgdGhlIG5ld2x5IGFzc2lnbmVkIGRldmljZSBhZGRyZXNzCioKKkVORCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgX3VzYl9kY2lfdnVzYjIwX3NldF9hZGRyZXNzCiAgICgKICAgICAgLyogW0lOXSB0aGUgVVNCX2Rldl9pbml0aWFsaXplIHN0YXRlIHN0cnVjdHVyZSAqLwogICAgICBfdXNiX2RldmljZV9oYW5kbGUgICAgICAgICBoYW5kbGUsCiAgICAgCiAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRldmljZSBhc3NpZ25lZCBieSB0aGUgaG9zdCAqLwogICAgICB1aW50XzggICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICB1c2JfZGV2X3B0cjsKICAgVlVTQjIwX1JFR19TVFJVQ1RfUFRSICAgICAgICAgICAgIGRldl9wdHI7CgogICBBUkNfREVCVUdfVFJBQ0UoQVJDX0RFQlVHX0ZMQUdfQUREUiwgInNldF9hZGRyZXNzOiBhZGRyZXNzPSVkXG4iLGFkZHJlc3MpOwogICAKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CiAgIAojaWZkZWYgU0VUX0FERFJFU1NfSEFSRFdBUkVfQVNTSVNUQU5DRSAgIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgSGFyZHdhcmUgUmV2IDQuMCBvbndhcmRzIGhhdmUgc3BlY2lhbCBhc3Npc3RhbmNlIGJ1aWx0IGluCiAgIGZvciBoYW5kbGluZyB0aGUgc2V0X2FkZHJlc3MgY29tbWFuZC4gQXMgcGVyIHRoZSBVU0Igc3BlY3MKICAgYSBkZXZpY2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2Ugb24gYSBuZXcKICAgYWRkcmVzcywgd2l0aGluIDIgbXNlY3MgYWZ0ZXIgc3RhdHVzIHBoYXNlIG9mIHNldF9hZGRyZXNzIGlzCiAgIGNvbXBsZXRlZC4gU2luY2UgMiBtaWxpIHNlY29uZCBtYXkgYmUgYSB2ZXJ5IHNtYWxsIHRpbWUgd2luZG93CiAgIChvbiBoaWdoIGludGVycnVwdCBsYXRlbmN5IHN5c3RlbXMpIGJlZm9yZSBzb2Z0d2FyZSBjb3VsZCAKICAgY29tZSB0byB0aGUgY29kZSBiZWxvdyBhbmQgd3JpdGUgdGhlIGRldmljZSByZWdpc3RlciwKICAgdGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIGluIGFkdmFuY2Ugd2hlbiBzdGF0dXMgcGhhc2Ugb2YKICAgc2V0X2FkZHJlc3MgaXMgc3RpbGwgbm90IGZpbmlzaGVkLiBUaGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlCiAgIGNvZGUgd2lsbCBzZXQgdGhlIGJpdCAyNCB0byAnMScgYW5kIGhhcmR3YXJlIHdpbGwgdGFrZQogICB0aGUgYWRkcmVzcyBhbmQgcXVldWUgaXQgaW4gYW4gaW50ZXJuYWwgYnVmZmVyLiBGcm9tIHdoaWNoCiAgIGl0IHdpbGwgdXNlIGl0IHRvIGRlY29kZSB0aGUgbmV4dCBVU0IgdG9rZW4uIFBsZWFzZSBsb29rCiAgIGF0IGhhcmR3YXJlIHJldiBkZXRhaWxzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcwogICBhc3Npc3RhbmNlLgogICAKICAgQWxzbyBub3RlIHRoYXQgd3JpdGluZyBiaXQgMjQgdG8gMHgwMSB3aWxsIG5vdCBicmVhawogICBhbnkgb2xkIGhhcmR3YXJlIHJldnMgYmVjYXVzZSBpdCB3YXMgYW4gdW51c2VkIGJpdC4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qIFRoZSBhZGRyZXNzIGJpdHMgYXJlIHBhc3QgYml0IDI1LTMxLiBTZXQgdGhlIGFkZHJlc3MgCiAgIGFsc28gc2V0IHRoZSBiaXQgMjQgdG8gMHgwMSB0byBzdGFydCBoYXJkd2FyZSBhc3NpdGFuY2UqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5ERVZJQ0VfQUREUiA9IAogICAgICBVU0JfMzJCSVRfTEUoKHVpbnRfMzIpYWRkcmVzcyA8PCBWVVNCSFNfQUREUkVTU19CSVRfU0hJRlQpIHwgCiAgICAgICgweDAxIDw8IChWVVNCSFNfQUREUkVTU19CSVRfU0hJRlQgLTEpKTsgCiNlbHNlCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkRFVklDRV9BRERSID0gCiAgICAgIFVTQl8zMkJJVF9MRSgodWludF8zMilhZGRyZXNzIDw8IFZVU0JIU19BRERSRVNTX0JJVF9TSElGVCk7IAojZW5kaWYgLyogU0VUX0FERFJFU1NfSEFSRFdBUkVfQVNTSVNUQU5DRSAqLwogICAKICAgdXNiX2Rldl9wdHItPlVTQl9TVEFURSA9IEFSQ19VU0JfU1RBVEVfQUREUkVTUzsKICAgICAgCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfZ2V0X3NldHVwX2RhdGEKKiAgUmV0dXJuZWQgVmFsdWUgOiBOb25lCiogIENvbW1lbnRzICAgICAgIDoKKiAgICAgICAgUmVhZHMgdGhlIFNldHVwIGRhdGEgZnJvbSB0aGUgOC1ieXRlIHNldHVwIGJ1ZmZlcgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9nZXRfc2V0dXBfZGF0YQogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlLAogICAgICAgICAgICAKICAgICAgLyogW0lOXSB0aGUgRW5kcG9pbnQgbnVtYmVyICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGVwX251bSwKICAgICAgICAgICAgCiAgICAgIC8qIFtPVVRdIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byByZWFkIHRoZSBzZXR1cCBkYXRhIGludG8gKi8KICAgICAgdWludF84X3B0ciAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9wdHIKICAgKQp7IC8qIEJvZHkgKi8KICAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHI7CiAgICB2b2xhdGlsZSBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgICAgICAgIGRldl9wdHI7CiAgICB2b2xhdGlsZSBWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1RfUFRSICAgIGVwX3F1ZXVlX2hlYWRfcHRyOwogICAgdm9sYXRpbGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NhZmUgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgCiAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ7CgogICAKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CgogICAvKiBHZXQgdGhlIGVuZHBvaW50IHF1ZXVlIGhlYWQgKi8KICAgZXBfcXVldWVfaGVhZF9wdHIgPSAoVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUX1BUUil1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9QVFIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqZXBfbnVtICsgQVJDX1VTQl9SRUNWOwoKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIENSIDEyMTkuIEhhcmR3YXJlIHZlcnNpb25zIDIuMysgaGF2ZSBhIGltcGxlbWVudGF0aW9uIG9mIHRyaXB3aXJlIAogICBzZW1hcGhvcmUgbWVjaGFuaXNtIHRoYXQgcmVxdWlyZXMgdGhhdCB3ZSByZWFkIHRoZSBjb250ZW50cyBvZiAKICAgUUggc2FmZWx5IGJ5IHVzaW5nIHRoZSBzZW1hcGhvcmUuIFJlYWQgdGhlIFVTQkhTIGRvY3VtZW50IHRvIHVuZGVyCiAgIHN0YW5kIGhvdyB0aGUgY29kZSB1c2VzIHRoZSBzZW1hcGhvcmUgbWVjaGFuaXNtLiBUaGUgZm9sbG93aW5nIGFyZQogICB0aGUgc3RlcHMgaW4gYnJpZWYKICAgCiAgIDEuIFVTQkNNRCBXcml0ZSCRMZIgdG8gU2V0dXAgVHJpcHdpcmUgaW4gcmVnaXN0ZXIuCiAgIDIuIER1cGxpY2F0ZSBjb250ZW50cyBvZiBkUUguU3RhdHVzQnVmZmVyIGludG8gbG9jYWwgc29mdHdhcmUgYnl0ZQogICAgICBhcnJheS4KICAgMyAgUmVhZCBTZXR1cCBUcmlwV2lyZSBpbiByZWdpc3Rlci4gKGlmIHNldCAtIGNvbnRpbnVlOyBpZgogICAgICBjbGVhcmVkIGdvdG8gMS4pCiAgIDQuIFdyaXRlICcwJyB0byBjbGVhciBTZXR1cCBUcmlwd2lyZSBpbiByZWdpc3Rlci4KICAgNS4gUHJvY2VzcyBzZXR1cCBwYWNrZXQgdXNpbmcgbG9jYWwgc29mdHdhcmUgYnl0ZSBhcnJheSBjb3B5IGFuZAogICAgICBleGVjdXRlIHN0YXR1cy9oYW5kc2hha2UgcGhhc2VzLgogICAKICAgICAgICAgICAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICB0aW1lb3V0ID0gMHgxMDAwMDA7CiAgICB3aGlsZSghcmVhZF9zYWZlKQogICAgewogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBzdGFydCB3aXRoIHNldHRpbmcgdGhlIHNlbWFwaG9yZXMKICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgfD0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl8zMkJJVF9MRShFSENJX0NNRF9TRVRVUF9UUklQV0lSRV9TRVQpOwoKICAgICAgICAvKiBDb3B5IHRoZSBzZXR1cCBwYWNrZXQgdG8gcHJpdmF0ZSBidWZmZXIgKi8KICAgICAgICBVU0JfbWVtY29weSgodWludF84X3B0cillcF9xdWV1ZV9oZWFkX3B0ci0+U0VUVVBfQlVGRkVSLCBidWZmZXJfcHRyLCA4KTsKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIElmIHNldHVwIHRyaXB3aXJlIHNlbWFwaG9yZSBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIGl0IG1lYW5zCiAgICAgICAgdGhhdCB3ZSBoYXZlIGEgZGFuZ2VyIGFuZCB3ZSBuZWVkIHRvIHJlc3RhcnQuCiAgICAgICAgZWxzZSB3ZSBjYW4gZXhpdCBvdXQgb2YgbG9vcCBzYWZlbHkuCiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIGlmKFVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfQ01EKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVIQ0lfQ01EX1NFVFVQX1RSSVBXSVJFX1NFVCkKICAgICAgICB7CiAgICAgICAgICAgIHJlYWRfc2FmZSA9IFRSVUU7IC8qIHdlIGNhbiBwcm9jZWVkIGV4aXRpbmcgb3V0IG9mIGxvb3AqLwogICAgICAgIH0KICAgICAgICBpZih0aW1lb3V0IDw9IDApCiAgICAgICAgewogICAgICAgICAgICBVU0JfcHJpbnRmKCIlczogVGltZW91dCBmb3IgU0VUVVBfVFJJUFdJUkUgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIAogICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgQVJDX0RFQlVHX0NPREUoQVJDX0RFQlVHX0ZMQUdfU1RBVFMsICh1c2JfZGV2X3B0ci0+U1RBVFMudXNiX3JlYWRfc2V0dXBfY291bnQrKykpOwogIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIENsZWFyIHRoZSBzZW1hcGhvcmUgYml0IG5vdwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgJj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEVIQ0lfQ01EX1NFVFVQX1RSSVBXSVJFX0NMRUFSKTsgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIAogICAvKiBDbGVhciB0aGUgYml0IGluIHRoZSBFTkRQVFNFVFVQU1RBVCAqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVF9TRVRVUF9TVEFUID0gVVNCXzMyQklUX0xFKDEgPDwgZXBfbnVtKTsKICAgCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfaW5pdF9lbmRwb2ludAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IGFuZCB0aGUgZW5kcG9pbnQgcXVldWUgaGVhZAoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp1aW50XzggX3VzYl9kY2lfdnVzYjIwX2luaXRfZW5kcG9pbnQKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZSwKICAgICAgICAgICAgCiAgICAgIC8qIFtJTl0gdGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0b3IgYWRkcmVzcyAqLwogICAgICBYRF9TVFJVQ1RfUFRSICAgICAgICAgICAgICB4ZF9wdHIKICAgKQp7IC8qIEJvZHkgKi8KICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHI7CiAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgIGRldl9wdHI7CiAgIFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVCBfUFRSXyAgICAgICAgICAgIGVwX3F1ZXVlX2hlYWRfcHRyOwogICB1aW50XzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIGJpdF9wb3M7CiAgIAogICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwogICBkZXZfcHRyID0gKFZVU0IyMF9SRUdfU1RSVUNUX1BUUil1c2JfZGV2X3B0ci0+REVWX1BUUjsKCiAgIC8qIEdldCB0aGUgZW5kcG9pbnQgcXVldWUgaGVhZCBhZGRyZXNzICovCiAgIGVwX3F1ZXVlX2hlYWRfcHRyID0gKFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfUFRSICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKnhkX3B0ci0+RVBfTlVNICsgeGRfcHRyLT5CRElSRUNUSU9OOwogICAgICAKICAgYml0X3BvcyA9ICgxIDw8ICgxNiAqIHhkX3B0ci0+QkRJUkVDVElPTiArIHhkX3B0ci0+RVBfTlVNKSk7CgogICAvKiBDaGVjayBpZiB0aGUgRW5kcG9pbnQgaXMgUHJpbWVkICovCiAgIGlmICgoIShVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRQUklNRSkgJiBiaXRfcG9zKSkgJiYgCiAgICAgICAoIShVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRTVEFUVVMpICYgYml0X3BvcykpKSAKICAgeyAKICAgICAgLyogU2V0IHRoZSBtYXggcGFja2V0IGxlbmd0aCwgaW50ZXJydXB0IG9uIFNldHVwIGFuZCBNdWx0IGZpZWxkcyAqLwogICAgICBpZiAoeGRfcHRyLT5FUF9UWVBFID09IEFSQ19VU0JfSVNPQ0hST05PVVNfRU5EUE9JTlQpIAogICAgICB7CiAgICAgICAgIC8qIE11bHQgYml0IHNob3VsZCBiZSBzZXQgZm9yIGlzb2Nocm9ub3VzIGVuZHBvaW50cyAqLwogICAgICAgICBlcF9xdWV1ZV9oZWFkX3B0ci0+TUFYX1BLVF9MRU5HVEggPSBVU0JfMzJCSVRfTEUoKHhkX3B0ci0+V01BWFBBQ0tFVFNJWkUgPDwgMTYpIHwgCiAgICAgICAgICAgICgoeGRfcHRyLT5NQVhfUEtUU19QRVJfVUZSQU1FID8gIHhkX3B0ci0+TUFYX1BLVFNfUEVSX1VGUkFNRSA6IDEpIDw8IAogICAgICAgICAgICBWVVNCX0VQX1FVRVVFX0hFQURfTVVMVF9QT1MpKTsKICAgICAgfSAKICAgICAgZWxzZSAKICAgICAgewogICAgICAgICBpZiAoeGRfcHRyLT5FUF9UWVBFICE9IEFSQ19VU0JfQ09OVFJPTF9FTkRQT0lOVCkgCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIEJVTEsgb3IgSU5URVJSVVBUICovCiAgICAgICAgICAgIGVwX3F1ZXVlX2hlYWRfcHRyLT5NQVhfUEtUX0xFTkdUSCA9IFVTQl8zMkJJVF9MRSgoeGRfcHRyLT5XTUFYUEFDS0VUU0laRSA8PCAxNikgfCAKICAgICAgICAgICAgICAgKHhkX3B0ci0+RE9OVF9aRVJPX1RFUk1JTkFURSA/IFZVU0JfRVBfUVVFVUVfSEVBRF9aRVJPX0xFTl9URVJfU0VMIDogMCkpOwogICAgICAgICB9IAogICAgICAgICBlbHNlIAogICAgICAgICB7CiAgICAgICAgICAgICAvKiBDT05UUk9MICovCiAgICAgICAgICAgIGVwX3F1ZXVlX2hlYWRfcHRyLT5NQVhfUEtUX0xFTkdUSCA9IFVTQl8zMkJJVF9MRSgoeGRfcHRyLT5XTUFYUEFDS0VUU0laRSA8PCAxNikgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVU0JfRVBfUVVFVUVfSEVBRF9JT1MpOwogICAgICAgICB9IC8qIEVuZGlmICovCiAgICAgIH0gLyogRW5kaWYgKi8KICAgICAgCiAgICAgIC8qIEVuYWJsZSB0aGUgZW5kcG9pbnQgZm9yIFJ4IG9yIFR4IGFuZCBzZXQgdGhlIGVuZHBvaW50IHR5cGUgKi8KICAgICAgdmFsID0gZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDVFJMWFt4ZF9wdHItPkVQX05VTV07CiAgICAgIGlmKHhkX3B0ci0+QkRJUkVDVElPTiAgPT0gQVJDX1VTQl9TRU5EKQogICAgICB7CiAgICAgICAgICB2YWwgJj0gfihVU0JfMzJCSVRfTEUoRUhDSV9FUENUUkxfVFhfQUxMX01BU0spKTsKICAgICAgICAgIHZhbCB8PSBVU0JfMzJCSVRfTEUoKEVIQ0lfRVBDVFJMX1RYX0VOQUJMRSB8IEVIQ0lfRVBDVFJMX1RYX0RBVEFfVE9HR0xFX1JTVCkgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAoeGRfcHRyLT5FUF9UWVBFIDw8IEVIQ0lfRVBDVFJMX1RYX0VQX1RZUEVfU0hJRlQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHZhbCAmPSB+KFVTQl8zMkJJVF9MRShFSENJX0VQQ1RSTF9SWF9BTExfTUFTSykpOwogICAgICAgICAgdmFsIHw9IFVTQl8zMkJJVF9MRSgoRUhDSV9FUENUUkxfUlhfRU5BQkxFIHwgRUhDSV9FUENUUkxfUlhfREFUQV9UT0dHTEVfUlNUKSB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICh4ZF9wdHItPkVQX1RZUEUgPDwgRUhDSV9FUENUUkxfUlhfRVBfVFlQRV9TSElGVCkpOwogICAgICB9CiAgICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUQ1RSTFhbeGRfcHRyLT5FUF9OVU1dID0gdmFsOwogICAgICAKICAgICAgLyogSW1wbGVtZW50IEd1aWRlbGluZSAoR0wjIFVTQi03KSBUaGUgdW51c2VkIGVuZHBvaW50IHR5cGUgbXVzdCAgKi8KICAgICAgLyogYmUgcHJvZ3JhbW1lZCB0byBidWxrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgaWYoIChkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVENUUkxYW3hkX3B0ci0+RVBfTlVNXSAmIAogICAgICAgICAgICBVU0JfMzJCSVRfTEUoRUhDSV9FUENUUkxfUlhfRU5BQkxFKSkgPT0gMCkKICAgICAgewogICAgICAgICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDVFJMWFt4ZF9wdHItPkVQX05VTV0gfD0gCiAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEFSQ19VU0JfQlVMS19FTkRQT0lOVCA8PCBFSENJX0VQQ1RSTF9SWF9FUF9UWVBFX1NISUZUKTsKICAgICAgfQoKICAgICAgaWYoIChkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVENUUkxYW3hkX3B0ci0+RVBfTlVNXSAmIAogICAgICAgICAgICBVU0JfMzJCSVRfTEUoRUhDSV9FUENUUkxfVFhfRU5BQkxFKSkgPT0gMCkKICAgICAgewogICAgICAgICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDVFJMWFt4ZF9wdHItPkVQX05VTV0gfD0gCiAgICAgICAgICAgICAgVVNCXzMyQklUX0xFKEFSQ19VU0JfQlVMS19FTkRQT0lOVCA8PCBFSENJX0VQQ1RSTF9UWF9FUF9UWVBFX1NISUZUKTsKICAgICAgfQoKICAgICAgQVJDX0RFQlVHX1RSQUNFKEFSQ19ERUJVR19GTEFHX0lOSVQsCiAgICAgICAgICAgICAgICAgICAgImluaXQgZXAgIyVkICVzOiB0eXBlPTB4JXgsIEVQQ1RSTFg9MHgleCwgU0VUVVA9MHgleCwgUFJJTUU9MHgleCwgU1RBVFVTPTB4JXgsIENPTVBMPTB4JXhcbiIsIAogICAgICAgICAgICAgICAgICAgICAgICB4ZF9wdHItPkVQX05VTSwgeGRfcHRyLT5CRElSRUNUSU9OID8gIlNFTkQiIDogIlJFQ1YiLCB4ZF9wdHItPkVQX1RZUEUsIAogICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUQ1RSTFhbeGRfcHRyLT5FUF9OVU1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKVVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVF9TRVRVUF9TVEFUKSwKICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKVVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFBSSU1FKSwKICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKVVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFNUQVRVUyksCiAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDT01QTEVURSkgKTsKICAgfSAKICAgZWxzZSAKICAgeyAKICAgICAgVVNCX3ByaW50ZigiZXA9JWQgJXM6IEluaXQgRVJST1I6IEVORFBUUFJJTUU9MHgleCwgRU5EUFRTVEFUVVM9MHgleCwgYml0X3Bvcz0weCV4XG4iLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkKXhkX3B0ci0+RVBfTlVNLCB4ZF9wdHItPkJESVJFQ1RJT04gPyAiU0VORCIgOiAiUkVDViIsCiAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUpLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkKVVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFNUQVRVUyksIAogICAgICAgICAgICAgICAgKHVuc2lnbmVkKWJpdF9wb3MpOwogICAgICAgIHJldHVybiBVU0JFUlJfRVBfSU5JVF9GQUlMRUQ7CiAgIH0gLyogRW5kaWYgKi8KICAgICAgCiAgIHJldHVybiBVU0JfT0s7CiAgIAp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX2dldF90cmFuc2Zlcl9zdGF0dXMKKiAgUmV0dXJuZWQgVmFsdWUgOiBVU0JfT0sgb3IgZXJyb3IgY29kZQoqICBDb21tZW50cyAgICAgICA6CiogICAgICAgIEdldHMgdGhlIHN0YXR1cyBvZiBhIHRyYW5zZmVyCioKKkVORCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnVpbnRfOCBfdXNiX2RjaV92dXNiMjBfZ2V0X3RyYW5zZmVyX3N0YXR1cwogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlLAogICAgIAogICAgICAvKiBbSU5dIHRoZSBFbmRwb2ludCBudW1iZXIgKi8KICAgICAgdWludF84ICAgICAgICAgICAgICAgICAgICAgZXBfbnVtLAogICAgICAgICAgICAKICAgICAgLyogW0lOXSBkaXJlY3Rpb24gKi8KICAgICAgdWludF84ICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uCiAgICkKeyAvKiBCb2R5ICovCiAgIFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyOwogICBWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgICBkVERfcHRyOwogICBYRF9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZF9wdHI7CiAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKICAgCiAgIHVzYl9kZXZfcHRyID0gKFVTQl9ERVZfU1RBVEVfU1RSVUNUX1BUUiloYW5kbGU7CiAgCiAgIC8qIFVubGluayB0aGUgZFREICovCiAgIGRURF9wdHIgPSB1c2JfZGV2X3B0ci0+RVBfRFREX0hFQURTWzIqZXBfbnVtICsgZGlyZWN0aW9uXTsKCiAgIGlmIChkVERfcHRyKSAKICAgewogICAgICAvKiBHZXQgdGhlIHRyYW5zZmVyIGRlc2NyaXB0b3IgZm9yIHRoZSBkVEQgKi8KICAgICAgeGRfcHRyID0gKFhEX1NUUlVDVF9QVFIpZFREX3B0ci0+U0NSQVRDSF9QVFItPlhEX0ZPUl9USElTX0RURDsKICAgICAgc3RhdHVzID0geGRfcHRyLT5CU1RBVFVTOwogICB9IAogICBlbHNlIAogICB7CiAgICAgIHN0YXR1cyA9IEFSQ19VU0JfU1RBVFVTX0lETEU7CiAgIH0gLyogRW5kaWYgKi8KICAgCiAgIHJldHVybiAoc3RhdHVzKTsKCn0gLyogRW5kQm9keSAqLwoKLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfZ2V0X3RyYW5zZmVyX2RldGFpbHMKKiAgUmV0dXJuZWQgVmFsdWUgOiBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IGhhcyBkZXRhaWxzIGZvciB0cmFuc2ZlcgoqICAgICAgICBHZXRzIHRoZSBzdGF0dXMgb2YgYSB0cmFuc2ZlcgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpYRF9TVFJVQ1RfUFRSICBfdXNiX2RjaV92dXNiMjBfZ2V0X3RyYW5zZmVyX2RldGFpbHMKICAgKAogICAgICAvKiBbSU5dIHRoZSBVU0JfZGV2X2luaXRpYWxpemUgc3RhdGUgc3RydWN0dXJlICovCiAgICAgIF91c2JfZGV2aWNlX2hhbmRsZSAgICAgICAgIGhhbmRsZSwKICAgICAKICAgICAgLyogW0lOXSB0aGUgRW5kcG9pbnQgbnVtYmVyICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGVwX251bSwKICAgICAgICAgICAgCiAgICAgIC8qIFtJTl0gZGlyZWN0aW9uICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbgogICApCnsgLyogQm9keSAqLwogICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0cjsKICAgVlVTQjIwX1JFR19TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3B0cjsKICAgVlVTQjIwX0VQX1RSX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICAgZFREX3B0ciwgdGVtcF9kVERfcHRyOwogICBYRF9TVFJVQ1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZF9wdHI7CiAgIHVpbnRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHJlbWFpbmluZ19ieXRlczsKICAgVlVTQjIwX0VQX1FVRVVFX0hFQURfU1RSVUNUX1BUUiAgICAgICAgICAgICAgZXBfcXVldWVfaGVhZF9wdHI7CgogICAKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CiAgIHRlbXAgPSAoMiplcF9udW0gKyBkaXJlY3Rpb24pOwoKICAgLyogZ2V0IGEgcG9pbnRlciB0byBRSCBmb3IgdGhpcyBlbmRwb2ludCAqLyAgIAogICBlcF9xdWV1ZV9oZWFkX3B0ciA9IChWVVNCMjBfRVBfUVVFVUVfSEVBRF9TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BUUiArIHRlbXA7CgogICBBUkNfREVCVUdfVFJBQ0UoQVJDX0RFQlVHX0ZMQUdfVFJBQ0UsICJnZXRfdHJhbnNmZXJfZGV0YWlsc1xuIik7CiAgIAogICAvKiBVbmxpbmsgdGhlIGRURCAqLwogICBkVERfcHRyID0gdXNiX2Rldl9wdHItPkVQX0RURF9IRUFEU1syKmVwX251bSArIGRpcmVjdGlvbl07CgogICBpZiAoZFREX3B0cikgCiAgIHsgICAgICAKICAgICAgLyogR2V0IHRoZSB0cmFuc2ZlciBkZXNjcmlwdG9yIGZvciB0aGUgZFREICovCiAgICAgIHhkX3B0ciA9IChYRF9TVFJVQ1RfUFRSKWRURF9wdHItPlNDUkFUQ0hfUFRSLT5YRF9GT1JfVEhJU19EVEQ7CiAgICAgIGlmKCF4ZF9wdHIpIHJldHVybiBOVUxMOwogICAgICAKICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhbnNmZXIgbGVuZ3RoIGZpZWxkICovCiAgICAgIHhkX3B0ci0+V1NPRkFSID0wOwogICAgICByZW1haW5pbmdfYnl0ZXMgPTA7CiAgICAgIAogICAgICAvKmlmIGxlbmd0aCBvZiB0aGlzIHRyYW5zZmVyIGlzIGdyZWF0ZXIgdGhhbiAyMEsKICAgICAgd2UgaGF2ZSBtdWx0aXBsZSBEVERzIHRvIGNvdW50ICovCiAgICAgIGlmKHhkX3B0ci0+V1RPVEFMTEVOR1RIID4gVlVTQl9FUF9NQVhfTEVOR1RIX1RSQU5TRkVSKQogICAgICB7CiAgICAgICAgIC8qIGl0IGlzIGEgdmFsaWQgRFRELiBXZSBzaG91bGQgcGFyc2UgYWxsIERURHMgZm9yIHRoaXMgWEQKICAgICAgICAgYW5kIGZpbmQgdGhlIHRvdGFsIGJ5dGVzIHVzZWQgc28gZmFyICovCiAgICAgICAgIHRlbXBfZFREX3B0ciA9IGRURF9wdHI7CiAgICAgIAogICAgICAgICAvKmxvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBEVERTIHVudGlsIGFuIGFjdGl2ZSBEVEQgaXMgZm91bmQKICAgICAgICAgb3IgbGlzdCBoYXMgZmluaXNoZWQgKi8KICAgICAgICAgd2hpbGUoIShVU0JfMzJCSVRfTEUoZFREX3B0ci0+TkVYVF9UUl9FTEVNX1BUUikgJiBWVVNCSFNfVERfTkVYVF9URVJNSU5BVEUpKSAgICAgICAgIAogICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICBJZiB0aGlzIERURCBoYXMgYmVlbiBvdmVybGF5ZWQsIHdlIHRha2UgdGhlIGFjdHVhbCBsZW5ndGggCiAgICAgICAgICAgIGZyb20gUUguCiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgICAgICBpZiAoKHVpbnRfMzIpKFVTQl8zMkJJVF9MRShlcF9xdWV1ZV9oZWFkX3B0ci0+Q1VSUl9EVERfUFRSKSAmIFZVU0JIU19URF9BRERSX01BU0spID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRFREX1ZJUlRfVE9fUEhZUyh1c2JfZGV2X3B0ciwgdGVtcF9kVERfcHRyKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlbWFpbmluZ19ieXRlcyArPSAKICAgICAgICAgICAgICAgICAgKChVU0JfMzJCSVRfTEUoZXBfcXVldWVfaGVhZF9wdHItPlNJWkVfSU9DX0lOVF9TVFMpICYgVlVTQl9FUF9UUl9QQUNLRVRfU0laRSkgPj4gMTYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiB0YWtlIHRoZSBsZW5ndGggZnJvbSBEVEQgaXRzZWxmICovCiAgICAgICAgICAgICAgICByZW1haW5pbmdfYnl0ZXMgKz0gCiAgICAgICAgICAgICAgICAgICgoVVNCXzMyQklUX0xFKHRlbXBfZFREX3B0ci0+U0laRV9JT0NfU1RTKSAmIFZVU0JfRVBfVFJfUEFDS0VUX1NJWkUpID4+IDE2KTsKICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgZFREX3B0ciA9IHRlbXBfZFREX3B0cjsKICAgICAgICAgICAgIAogICAgICAgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgZFREICovCiAgICAgICAgICAgIHRlbXBfZFREX3B0ciA9IChWVVNCMjBfRVBfVFJfU1RSVUNUX1BUUilVU0JfRFREX1BIWVNfVE9fVklSVCh1c2JfZGV2X3B0ciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnRfMzIpKFVTQl8zMkJJVF9MRSh0ZW1wX2RURF9wdHItPk5FWFRfVFJfRUxFTV9QVFIpICYgVlVTQkhTX1REX0FERFJfTUFTSykgKTsKICAgICAgICAgfQogICAgICAgICB4ZF9wdHItPldTT0ZBUiA9IHhkX3B0ci0+V1RPVEFMTEVOR1RIIC0gcmVtYWluaW5nX2J5dGVzOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAvKmxvb2sgYXQgYWN0dWFsIGxlbmd0aCBmcm9tIFFIKi8KICAgICAgICAgeGRfcHRyLT5XU09GQVIgPSB4ZF9wdHItPldUT1RBTExFTkdUSCAtIAogICAgICAgICAgICAoKFVTQl8zMkJJVF9MRShlcF9xdWV1ZV9oZWFkX3B0ci0+U0laRV9JT0NfSU5UX1NUUykgJiBWVVNCX0VQX1RSX1BBQ0tFVF9TSVpFKSA+PiAxNik7ICAgICAgICAgCiAgICAgIH0gICAgICAKICAgfSAKICAgZWxzZSAKICAgewogICAgICB4ZF9wdHIgPSBOVUxMOwogICB9IC8qIEVuZGlmICovCiAgIAogICByZXR1cm4gKHhkX3B0cik7Cgp9IC8qIEVuZEJvZHkgKi8KCi8qRlVOQ1RJT04qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqCiogIEZ1bmN0aW9uIE5hbWUgIDogX3VzYl9kY2lfdnVzYjIwX2RlaW5pdF9lbmRwb2ludAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBEaXNhYmxlcyB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IGFuZCB0aGUgZW5kcG9pbnQgcXVldWUgaGVhZAoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp1aW50XzggX3VzYl9kY2lfdnVzYjIwX2RlaW5pdF9lbmRwb2ludAogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlLAogICAgICAgICAgICAKICAgICAgLyogW0lOXSB0aGUgRW5kcG9pbnQgbnVtYmVyICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGVwX251bSwKICAgICAgICAgICAgCiAgICAgIC8qIFtJTl0gZGlyZWN0aW9uICovCiAgICAgIHVpbnRfOCAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbgogICApCnsgLyogQm9keSAqLwogICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICAgICB1c2JfZGV2X3B0cjsKICAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgICAgZGV2X3B0cjsKICAgIFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVCogICAgZXBfcXVldWVfaGVhZF9wdHI7CiAgICB1aW50XzMyICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9wb3M7CiAgICB1aW50XzggICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVTQl9PSzsKICAgCiAgICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwogICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CiAgIAogICAgLyogR2V0IHRoZSBlbmRwb2ludCBxdWV1ZSBoZWFkIGFkZHJlc3MgKi8KICAgIGVwX3F1ZXVlX2hlYWRfcHRyID0gKFZVU0IyMF9FUF9RVUVVRV9IRUFEX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfUFRSICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiplcF9udW0gKyBkaXJlY3Rpb24pOwogICAgICAKICAgIGJpdF9wb3MgPSAoMSA8PCAoMTYgKiBkaXJlY3Rpb24gKyBlcF9udW0pKTsKCiAgICBBUkNfREVCVUdfVFJBQ0UoQVJDX0RFQlVHX0ZMQUdfSU5JVCwKICAgICAgICAgICAgICAgImRlaW5pdCBlcCAjJWQtJXM6IGJpdF9wb3M9MHgleCwgRVBDVFJMWD0weCV4LCBTRVRVUD0weCV4LCBQUklNRT0weCV4LCBTVEFUVVM9MHgleCwgQ09NUEw9MHgleFxuIiwgCiAgICAgICAgICAgICAgICAgICBlcF9udW0sIGRpcmVjdGlvbiA/ICJTRU5EIiA6ICJSRUNWIiwgYml0X3BvcywKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRDVFJMWFtlcF9udW1dKSwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRfU0VUVVBfU1RBVCksCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUpLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKVVTQl8zMkJJVF9MRShkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5FTkRQVFNUQVRVUyksCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUQ09NUExFVEUpICk7CiAgICAgIAogICAgLyogQ2hlY2sgaWYgdGhlIEVuZHBvaW50IGlzIFByaW1lZCAqLwogICAgaWYoICgoVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUUFJJTUUpICYgYml0X3BvcykpIHx8IAogICAgICAgICgoVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUU1RBVFVTKSAmIGJpdF9wb3MpKSApIAogICAgeyAKICAgICAgICBVU0JfcHJpbnRmKCJlcD0lZCAlczogRGVpbml0IEVSUk9SOiBFTkRQVFBSSU1FPTB4JXgsIEVORFBUU1RBVFVTPTB4JXgsIGJpdF9wb3M9MHgleFxuIiwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCllcF9udW0sIGRpcmVjdGlvbiA/ICJTRU5EIiA6ICJSRUNWIiwKICAgICAgICAgICAgICAgICh1bnNpZ25lZClVU0JfMzJCSVRfTEUoZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuRU5EUFRQUklNRSksCiAgICAgICAgICAgICAgICAodW5zaWduZWQpVVNCXzMyQklUX0xFKGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUU1RBVFVTKSwgCiAgICAgICAgICAgICAgICAodW5zaWduZWQpYml0X3Bvcyk7CiAgICAgICAgc3RhdHVzID0gVVNCRVJSX0VQX0RFSU5JVF9GQUlMRUQ7CiAgICB9CgogICAgLyogUmVzZXQgdGhlIG1heCBwYWNrZXQgbGVuZ3RoIGFuZCB0aGUgaW50ZXJydXB0IG9uIFNldHVwICovCiAgICBlcF9xdWV1ZV9oZWFkX3B0ci0+TUFYX1BLVF9MRU5HVEggPSAwOwogICAgICAKICAgIC8qIERpc2FibGUgdGhlIGVuZHBvaW50IGZvciBSeCBvciBUeCBhbmQgcmVzZXQgdGhlIGVuZHBvaW50IHR5cGUgKi8KICAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLkVORFBUQ1RSTFhbZXBfbnVtXSAmPSAKICAgICAgICAgVVNCXzMyQklUX0xFKCB+KChkaXJlY3Rpb24gPyBFSENJX0VQQ1RSTF9UWF9FTkFCTEUgOiBFSENJX0VQQ1RSTF9SWF9FTkFCTEUpIHwgCiAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPyBFSENJX0VQQ1RSTF9UWF9UWVBFIDogRUhDSV9FUENUUkxfUlhfVFlQRSkpKTsKICAgICAgCiAgIHJldHVybiBzdGF0dXM7Cn0KCgovKkZVTkNUSU9OKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKgoqICBGdW5jdGlvbiBOYW1lICA6IF91c2JfZGNpX3Z1c2IyMF9zaHV0ZG93bgoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTaHV0cyBkb3duIHRoZSBWVVNCX0hTIERldmljZQoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9zaHV0ZG93bgogICAoCiAgICAgIC8qIFtJTl0gdGhlIFVTQl9kZXZfaW5pdGlhbGl6ZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KICAgICAgX3VzYl9kZXZpY2VfaGFuZGxlICAgICAgICAgaGFuZGxlCiAgICkKeyAvKiBCb2R5ICovCiAgICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0cjsKICAgIFZVU0IyMF9SRUdfU1RSVUNUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgIGRldl9wdHI7CiAgIAogICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgIGRldl9wdHIgPSAoVlVTQjIwX1JFR19TVFJVQ1RfUFRSKXVzYl9kZXZfcHRyLT5ERVZfUFRSOwogICAKICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0lOVFIgJj0gCiAgICAgIH4oVVNCXzMyQklUX0xFKEVIQ0lfSU5UUl9JTlRfRU4gfCBFSENJX0lOVFJfRVJSX0lOVF9FTiB8CiAgICAgIEVIQ0lfSU5UUl9QT1JUX0NIQU5HRV9ERVRFQ1RfRU4gfCBFSENJX0lOVFJfUkVTRVRfRU4pKTsKICAgICAgCiAgICBVU0JfdW5jYWNoZWRfbWVtZnJlZSh1c2JfZGV2X3B0ci0+RVBfUVVFVUVfSEVBRF9CQVNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2Rldl9wdHItPkVQX1FVRVVFX0hFQURfU0laRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZfcHRyLT5FUF9RVUVVRV9IRUFEX1BIWVMpOwoKICAgIFVTQl91bmNhY2hlZF9tZW1mcmVlKHVzYl9kZXZfcHRyLT5EVERfQkFTRV9QVFIsIAogICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ci0+RFREX1NJWkUsIAogICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2X3B0ci0+RFREX0JBU0VfUEhZUyk7CgogICAgVVNCX21lbWZyZWUodXNiX2Rldl9wdHItPlNDUkFUQ0hfU1RSVUNUX0JBU0UpOwoKICAgIFVTQl9wcmludGYoIlVTQiBzaHV0ZG93bjogdXNiX2Rldl9wdHI9JXBcbiIsIHVzYl9kZXZfcHRyKTsKCiAgIC8qIFJlc2V0IHRoZSBSdW4gdGhlIGJpdCBpbiB0aGUgY29tbWFuZCByZWdpc3RlciB0byBzdG9wIFZVU0IgKi8KICAgZGV2X3B0ci0+UkVHSVNURVJTLk9QRVJBVElPTkFMX0RFVklDRV9SRUdJU1RFUlMuVVNCX0NNRCAmPSB+VVNCXzMyQklUX0xFKEVIQ0lfQ01EX1JVTl9TVE9QKTsKICAgCiAgIC8qIFJlc2V0IHRoZSBjb250cm9sbGVyIHRvIGdldCBkZWZhdWx0IHZhbHVlcyAqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfQ01EID0gVVNCXzMyQklUX0xFKEVIQ0lfQ01EX0NUUkxfUkVTRVQpOwogICAgICAgICAgICAgIAp9IC8qIEVuZEJvZHkgKi8KLypGVU5DVElPTiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioKKiAgRnVuY3Rpb24gTmFtZSAgOiBfdXNiX2RjaV92dXNiMjBfc3RvcAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTdG9wIFVTQiBkZXZpY2UgY29udHJvbGxlcgoqCipFTkQqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIF91c2JfZGNpX3Z1c2IyMF9zdG9wKF91c2JfZGV2aWNlX2hhbmRsZSBoYW5kbGUpCnsKICAgVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSICAgICB1c2JfZGV2X3B0cjsKICAgVlVTQjIwX1JFR19TVFJVQ1RfUFRSICAgICAgICBkZXZfcHRyOwogICAKICAgdXNiX2Rldl9wdHIgPSAoVVNCX0RFVl9TVEFURV9TVFJVQ1RfUFRSKWhhbmRsZTsKICAgZGV2X3B0ciA9IChWVVNCMjBfUkVHX1NUUlVDVF9QVFIpdXNiX2Rldl9wdHItPkRFVl9QVFI7CgogICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9JTlRSICY9IAogICAgICAgICAgICB+KFVTQl8zMkJJVF9MRShFSENJX0lOVFJfSU5UX0VOIHwgRUhDSV9JTlRSX0VSUl9JTlRfRU4gfAogICAgICAgICAgICAgICAgICAgICAgICAgICBFSENJX0lOVFJfUE9SVF9DSEFOR0VfREVURUNUX0VOIHwgRUhDSV9JTlRSX1JFU0VUX0VOKSk7CgogICAvKiBSZXNldCB0aGUgUnVuIHRoZSBiaXQgaW4gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8gc3RvcCBWVVNCICovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9DTUQgJj0gflVTQl8zMkJJVF9MRShFSENJX0NNRF9SVU5fU1RPUCk7Cn0KCgovKkZVTkNUSU9OKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKgoqICBGdW5jdGlvbiBOYW1lICA6IF91c2JfZGNpX3Z1c2IyMF9zdGFydAoqICBSZXR1cm5lZCBWYWx1ZSA6IE5vbmUKKiAgQ29tbWVudHMgICAgICAgOgoqICAgICAgICBTdGFydCBVU0IgZGV2aWNlIGNvbnRyb2xsZXIKKgoqRU5EKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBfdXNiX2RjaV92dXNiMjBfc3RhcnQoX3VzYl9kZXZpY2VfaGFuZGxlIGhhbmRsZSkKewogICBVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIgICAgIHVzYl9kZXZfcHRyOwogICBWVVNCMjBfUkVHX1NUUlVDVF9QVFIgICAgICAgIGRldl9wdHI7CiAgIAogICB1c2JfZGV2X3B0ciA9IChVU0JfREVWX1NUQVRFX1NUUlVDVF9QVFIpaGFuZGxlOwogICBkZXZfcHRyID0gKFZVU0IyMF9SRUdfU1RSVUNUX1BUUil1c2JfZGV2X3B0ci0+REVWX1BUUjsKCiAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgIGRldl9wdHItPlJFR0lTVEVSUy5PUEVSQVRJT05BTF9ERVZJQ0VfUkVHSVNURVJTLlVTQl9JTlRSID0gVVNCXzMyQklUX0xFKAogICAgICAgICAgICAgICAgICAgICAgICAgICBFSENJX0lOVFJfSU5UX0VOCiAgICAgICAgICAgICAgICAgICAgICAgICB8IEVIQ0lfSU5UUl9FUlJfSU5UX0VOIAogICAgICAgICAgICAgICAgICAgICAgICAgfCBFSENJX0lOVFJfUE9SVF9DSEFOR0VfREVURUNUX0VOIAogICAgICAgICAgICAgICAgICAgICAgICAgfCBFSENJX0lOVFJfUkVTRVRfRU4gCiAgICAgICAgICAgICAgICAgICAgICAgICB8IEVIQ0lfSU5UUl9ERVZJQ0VfU1VTUEVORAogICAgICAgICAgICAgICAgICAgICAgIC8qICAKICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUhDSV9JTlRSX1NPRl9VRlJBTUVfRU4gCiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAKICAgdXNiX2Rldl9wdHItPlVTQl9TVEFURSA9IEFSQ19VU0JfU1RBVEVfVU5LTk9XTjsKICAgCiAgIC8qIFNldCB0aGUgUnVuIGJpdCBpbiB0aGUgY29tbWFuZCByZWdpc3RlciAqLwogICBkZXZfcHRyLT5SRUdJU1RFUlMuT1BFUkFUSU9OQUxfREVWSUNFX1JFR0lTVEVSUy5VU0JfQ01EID0gVVNCXzMyQklUX0xFKEVIQ0lfQ01EX1JVTl9TVE9QKTsKfQoKLyogRU9GICovCgo=