LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgRXRoZXJuZXQgZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxMzkgY2hpcHMKICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGUgUlRMODEzOUMrLCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudAogICAgICAgICAgICAgICAgVHggZGVzY3JpcHRvciBoYW5kbGluZy4KCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydjgxMzkuYyx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwOC8wMi8wNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImdsb2JhbC5oIgojaW5jbHVkZSAiRXBsSW5jLmgiCiNpbmNsdWRlICJlZHJ2LmgiCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIEJ1ZmZlciBoYW5kbGluZzoKLy8gQWxsIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgc3RhdGljYWxseSAoaS5lLiBhdCBjb21waWxlIHRpbWUgcmVzcC4gYXQKLy8gaW5pdGlhbGlzYXRpb24gdmlhIGttYWxsb2MoKSApIGFuZCBub3QgZHluYW1pY2FsbHkgb24gcmVxdWVzdCAoaS5lLiB2aWEKLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKS4KLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKSBzZWFyY2hlcyBmb3IgYW4gdW51c2VkIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2guCi8vIEVkcnZJbml0KCkgbWF5IGFsbG9jYXRlIHNvbWUgYnVmZmVycyB3aXRoIHNpemVzIGxlc3MgdGhhbiBtYXhpbXVtIGZyYW1lCi8vIHNpemUgKGkuZS4gMTUxNCBieXRlcyksIGUuZy4gZm9yIFNvQywgU29BLCBTdGF0dXNSZXNwb25zZSwgSWRlbnRSZXNwb25zZSwKLy8gTk1UIHJlcXVlc3RzIC8gY29tbWFuZHMuIFRoZSBsZXNzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhlIGxlc3MgdGhlCi8vIG51bWJlciBvZiB0aGUgYnVmZmVyLgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmbmRlZiBFRFJWX01BWF9UWF9CVUZGRVJTCiNkZWZpbmUgRURSVl9NQVhfVFhfQlVGRkVSUyAgICAgMjAKI2VuZGlmCgojZGVmaW5lIEVEUlZfTUFYX0ZSQU1FX1NJWkUgICAgIDB4NjAwCgojZGVmaW5lIEVEUlZfUlhfQlVGRkVSX1NJWkUgICAgIDB4ODYxMAkvLyAzMiBrQiArIDE2IEJ5dGUgKyAxLDUga0IgKFdSQVAgaXMgZW5hYmxlZCkKI2RlZmluZSBFRFJWX1JYX0JVRkZFUl9MRU5HVEggICAoRURSVl9SWF9CVUZGRVJfU0laRSAmIDB4RjgwMCkJLy8gYnVmZmVyIHNpemUgY3V0IGRvd24gdG8gMiBrQiBhbGlnbm1lbnQKCiNkZWZpbmUgRURSVl9UWF9CVUZGRVJfU0laRSAgICAgKEVEUlZfTUFYX1RYX0JVRkZFUlMgKiBFRFJWX01BWF9GUkFNRV9TSVpFKQkvLyBuICogKE1UVSArIDE0ICsgNCkKCiNkZWZpbmUgRFJWX05BTUUgICAgICAgICAgICAgICAgImVwbCIKCiNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLICAgICAgMHgzQwkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfU1RBVFVTICAgIDB4M0UJLy8gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfUk9LICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfUkVSICAgICAgIDB4MDAwMgkvLyBSZWNlaXZlIGVycm9yIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfVE9LICAgICAgIDB4MDAwNAkvLyBUcmFuc21pdCBPSyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RFUiAgICAgICAweDAwMDgJLy8gVHJhbnNtaXQgZXJyb3IgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9SWE9WVyAgICAgMHgwMDEwCS8vIFJ4IGJ1ZmZlciBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1BVTiAgICAgICAweDAwMjAJLy8gUGFja2V0IHVuZGVycnVuLyBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0ZPVlcgICAgICAweDAwNDAJLy8gUnggRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0xFTkNIRyAgICAweDIwMDAJLy8gQ2FibGUgbGVuZ3RoIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RJTUVPVVQgICAweDQwMDAJLy8gVGltZSBvdXQgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9TRVJSICAgICAgMHg4MDAwCS8vIFN5c3RlbSBlcnJvciBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX01BU0tfREVGICAoRURSVl9SRUdXX0lOVF9ST0sgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUkVSIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RPSyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9URVIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUlhPVlcgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfRk9WVyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9QVU4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVElNRU9VVCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9TRVJSKQkvLyBkZWZhdWx0IGludGVycnVwdCBtYXNrCgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EICAgICAgIDB4MzcJLy8gY29tbWFuZCByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JTVCAgIDB4MTAKI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9SRSAgICAweDA4CiNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfVEUgICAgMHgwNAojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUgIDB4MDEKCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDYgICAgICAgMHg1MAkvLyA5M0M0NiBjb21tYW5kIHJlZ2lzdGVyCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyAgMHgwMAkvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLIDB4QzAJLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSICAgICAgICAgIDB4NDQJLy8gUnggY29uZmlndXJhdGlvbiByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PX0ZUSCAgIDB4MDAwMEUwMDAJLy8gbm8gcmVjZWl2ZSBGSUZPIHRocmVzaG9sZAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIDB4MDAwMDEwMDAJLy8gMzIga0IgcmVjZWl2ZSBidWZmZXIKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIHVubGltaXRlZCBtYXhpbXVtIERNQSBidXJzdCBzaXplCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTk9XUkFQICAgMHgwMDAwMDA4MAkvLyBkbyBub3Qgd3JhcCBmcmFtZSBhdCBlbmQgb2YgYnVmZmVyCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUVSICAgICAgMHgwMDAwMDAyMAkvLyBhY2NlcHQgZXJyb3IgZnJhbWVzIChDUkMsIGFsaWdubWVudCwgY29sbGlkZWQpCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVIgICAgICAgMHgwMDAwMDAxMAkvLyBhY2NlcHQgcnVudAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FCICAgICAgIDB4MDAwMDAwMDgJLy8gYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BTSAgICAgICAweDAwMDAwMDA0CS8vIGFjY2VwdCBtdWx0aWNhc3QgZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVBNICAgICAgMHgwMDAwMDAwMgkvLyBhY2NlcHQgcGh5c2ljYWwgbWF0Y2ggZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUFQICAgICAgMHgwMDAwMDAwMQkvLyBhY2NlcHQgYWxsIGZyYW1lcwojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0RFRiAgICAgIChFRFJWX1JFR0RXX1JDUl9OT19GVEggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTk9XUkFQIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BQiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQU0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FQTSkJLy8gZGVmYXVsdCB2YWx1ZQoKI2RlZmluZSBFRFJWX1JFR0RXX1RDUiAgICAgICAgICAweDQwCS8vIFR4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSyAweDdDQzAwMDAwCS8vIG1hc2sgZm9yIGhhcmR3YXJlIHZlcnNpb24KI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfQyAgICAweDc0MDAwMDAwCS8vIFJUTDgxMzlDCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX0QgICAgMHg3NDQwMDAwMAkvLyBSVEw4MTM5RAojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0lGRzk2ICAgIDB4MDMwMDAwMDAJLy8gZGVmYXVsdCBpbnRlcmZyYW1lIGdhcCAoOTYwIG5zKQojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0NSQyAgICAgIDB4MDAwMTAwMDAJLy8gZGlzYWJsZSBhcHBlbmRpbmcgb2YgQ1JDIGJ5IHRoZSBjb250cm9sbGVyCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgMHgwMDAwMDcwMAkvLyBtYXhpbXVtIERNQSBidXJzdCBzaXplIG9mIDIwNDggYgojZGVmaW5lIEVEUlZfUkVHRFdfVENSX1RYUkVUUlkgIDB4MDAwMDAwMDAJLy8gMTYgcmV0cmllcwojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0RFRiAgICAgIChFRFJWX1JFR0RXX1RDUl9JRkc5NiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX1RYUkVUUlkpCgojZGVmaW5lIEVEUlZfUkVHV19NVUxJTlQgICAgICAgIDB4NUMJLy8gbXVsdGlwbGUgaW50ZXJydXB0IHNlbGVjdCByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX01QQyAgICAgICAgICAweDRDCS8vIG1pc3NlZCBwYWNrZXQgY291bnRlciByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQwICAgICAgICAweDIwCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0FEMSAgICAgICAgMHgyNAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMQojZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDIgICAgICAgIDB4MjgJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDIKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQzICAgICAgICAweDJDCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAzCiNkZWZpbmUgRURSVl9SRUdEV19UU0QwICAgICAgICAgMHgxMAkvLyBUcmFuc21pdCBzdGF0dXMgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfQ1JTICAgICAgMHg4MDAwMDAwMAkvLyBDYXJyaWVyIHNlbnNlIGxvc3QKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UQUJUICAgICAweDQwMDAwMDAwCS8vIFRyYW5zbWl0IEFib3J0CiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dDICAgICAgMHgyMDAwMDAwMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgojZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIDB4MDAwMjAwMDAJLy8gVHJhbnNtaXQgRklGTyB0aHJlc2hvbGQgb2YgNjQgYnl0ZXMKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UT0sgICAgICAweDAwMDA4MDAwCS8vIFRyYW5zbWl0IE9LCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFVOICAgICAgMHgwMDAwNDAwMAkvLyBUcmFuc21pdCBGSUZPIHVuZGVycnVuCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dOICAgICAgMHgwMDAwMjAwMAkvLyBPd25lcgoKI2RlZmluZSBFRFJWX1JFR0RXX1JCU1RBUlQgICAgICAweDMwCS8vIFJlY2VpdmUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKCiNkZWZpbmUgRURSVl9SRUdXX0NBUFIgICAgICAgICAgMHgzOAkvLyBDdXJyZW50IGFkZHJlc3Mgb2YgcGFja2V0IHJlYWQKCiNkZWZpbmUgRURSVl9SRUdEV19JRFIwICAgICAgICAgMHgwMAkvLyBJRCByZWdpc3RlciAwCiNkZWZpbmUgRURSVl9SRUdEV19JRFI0ICAgICAgICAgMHgwNAkvLyBJRCByZWdpc3RlciA0CgojZGVmaW5lIEVEUlZfUkVHRFdfTUFSMCAgICAgICAgIDB4MDgJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgMAojZGVmaW5lIEVEUlZfUkVHRFdfTUFSNCAgICAgICAgIDB4MEMJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgNAoKLy8gZGVmaW5lcyBmb3IgdGhlIHN0YXR1cyB3b3JkIGluIHRoZSByZWNlaXZlIGJ1ZmZlcgojZGVmaW5lIEVEUlZfUlhTVEFUX01BUiAgICAgICAgIDB4ODAwMAkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWNlaXZlZAojZGVmaW5lIEVEUlZfUlhTVEFUX1BBTSAgICAgICAgIDB4NDAwMAkvLyBQaHlzaWNhbCBhZGRyZXNzIG1hdGNoZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9CQVIgICAgICAgICAweDIwMDAJLy8gQnJvYWRjYXN0IGFkZHJlc3MgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9JU0UgICAgICAgICAweDAwMjAJLy8gSW52YWxpZCBzeW1ib2wgZXJyb3IKI2RlZmluZSBFRFJWX1JYU1RBVF9SVU5UICAgICAgICAweDAwMTAJLy8gUnVudCBwYWNrZXQgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9MT05HICAgICAgICAweDAwMDgJLy8gTG9uZyBwYWNrZXQKI2RlZmluZSBFRFJWX1JYU1RBVF9DUkMgICAgICAgICAweDAwMDQJLy8gQ1JDIGVycm9yCiNkZWZpbmUgRURSVl9SWFNUQVRfRkFFICAgICAgICAgMHgwMDAyCS8vIEZyYW1lIGFsaWdubWVudCBlcnJvcgojZGVmaW5lIEVEUlZfUlhTVEFUX1JPSyAgICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LCgojZGVmaW5lIEVEUlZfUkVHRFdfV1JJVEUoZHdSZWcsIGR3VmFsKSAgd3JpdGVsKGR3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR1dfV1JJVEUoZHdSZWcsIHdWYWwpICAgIHdyaXRldyh3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0JfV1JJVEUoZHdSZWcsIGJWYWwpICAgIHdyaXRlYihiVmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0RXX1JFQUQoZHdSZWcpICAgICAgICAgIHJlYWRsKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQojZGVmaW5lIEVEUlZfUkVHV19SRUFEKGR3UmVnKSAgICAgICAgICAgcmVhZHcoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCiNkZWZpbmUgRURSVl9SRUdCX1JFQUQoZHdSZWcpICAgICAgICAgICByZWFkYihFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKCi8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCiNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18Kdm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwp2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CiNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCiNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQojZWxzZQojZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCiNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCiNlbmRpZgoKI2RlZmluZSBFRFJWX0NPVU5UX1NFTkQgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIpCiNkZWZpbmUgRURSVl9DT1VOVF9USU1FT1VUICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgzKQojZGVmaW5lIEVEUlZfQ09VTlRfUENJX0VSUiAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNCkKI2RlZmluZSBFRFJWX0NPVU5UX1RYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDUpCiNkZWZpbmUgRURSVl9DT1VOVF9SWCAgICAgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg2KQojZGVmaW5lIEVEUlZfQ09VTlRfTEFURUNPTExJU0lPTiAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTApCiNkZWZpbmUgRURSVl9DT1VOVF9UWF9DT0xfUkwgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMSkKI2RlZmluZSBFRFJWX0NPVU5UX1RYX0ZVTiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEyKQojZGVmaW5lIEVEUlZfQ09VTlRfVFhfRVJSICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTMpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9DUkMgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNCkKI2RlZmluZSBFRFJWX0NPVU5UX1JYX0VSUiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE1KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfRk9WVyAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTYpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9QVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNykKI2RlZmluZSBFRFJWX0NPVU5UX1JYX0ZBRSAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE4KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfT1ZXICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTkpCgojZGVmaW5lIEVEUlZfVFJBQ0VfQ0FQUih4KSAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwNjAwMDAwMCkKI2RlZmluZSBFRFJWX1RSQUNFX1JYX0NSQyh4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MEUwMDAwMDApCiNkZWZpbmUgRURSVl9UUkFDRV9SWF9FUlIoeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDBGMDAwMDAwKQojZGVmaW5lIEVEUlZfVFJBQ0VfUlhfUFVOKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgxMTAwMDAwMCkKI2RlZmluZSBFRFJWX1RSQUNFKHgpICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGMDAwMCkgfCAweDAwMDBGRUMwKQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoKdHlwZWRlZiBzdHJ1Y3QKewogICAgQk9PTCAgICAgICAgICAgIG1fZlVzZWQ7CiAgICB1bnNpZ25lZCBpbnQgICAgbV91aVNpemU7CiAgICBNQ0RfYnVmRGVzY0ZlYyAqbV9wQnVmRGVzY3I7Cgp9IHRFZHJ2VHhCdWZmZXJJbnRlcm47CiovCgovLyBQcml2YXRlIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCB7CglzdHJ1Y3QgcGNpX2RldiAqbV9wUGNpRGV2OwkvLyBwb2ludGVyIHRvIFBDSSBkZXZpY2Ugc3RydWN0dXJlCgl2b2lkICptX3BJb0FkZHI7CS8vIHBvaW50ZXIgdG8gcmVnaXN0ZXIgc3BhY2Ugb2YgRXRoZXJuZXQgY29udHJvbGxlcgoJQllURSAqbV9wYlJ4QnVmOwkvLyBwb2ludGVyIHRvIFJ4IGJ1ZmZlcgoJZG1hX2FkZHJfdCBtX3BSeEJ1ZkRtYTsKCUJZVEUgKm1fcGJUeEJ1ZjsJLy8gcG9pbnRlciB0byBUeCBidWZmZXIKCWRtYV9hZGRyX3QgbV9wVHhCdWZEbWE7CglCT09MIG1fYWZUeEJ1ZlVzZWRbRURSVl9NQVhfVFhfQlVGRkVSU107Cgl1bnNpZ25lZCBpbnQgbV91aUN1clR4RGVzYzsKCgl0RWRydkluaXRQYXJhbSBtX0luaXRQYXJhbTsKCXRFZHJ2VHhCdWZmZXIgKm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyOwoKfSB0RWRydkluc3RhbmNlOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIGludCBFZHJ2SW5pdE9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldiwKCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBJZCk7CgpzdGF0aWMgdm9pZCBFZHJ2UmVtb3ZlT25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2KTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG1vZHVsIGdsb2JhbGUgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBidWZmZXJzIGFuZCBidWZmZXIgZGVzY3JpcHRvcnMgYW5kIHBvaW50ZXJzCgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYUVkcnZQY2lUYmxbXSA9IHsKCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCgl7MCx9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYUVkcnZQY2lUYmwpOwoKc3RhdGljIHRFZHJ2SW5zdGFuY2UgRWRydkluc3RhbmNlX2w7CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgRWRydkRyaXZlciA9IHsKCS5uYW1lID0gRFJWX05BTUUsCgkuaWRfdGFibGUgPSBhRWRydlBjaVRibCwKCS5wcm9iZSA9IEVkcnZJbml0T25lLAoJLnJlbW92ZSA9IEVkcnZSZW1vdmVPbmUsCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICBDIEwgQSBTIFMgIDxlZHJ2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLwovLyBEZXNjcmlwdGlvbjoKLy8KLy8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBjb25zdCBkZWZpbmVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCB0eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEJZVEUgRWRydkNhbGNIYXNoKEJZVEUgKiBwYk1BQ19wKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2SW5pdAovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZm9yIGluaXQgb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKLy8KLy8gUGFyYW1ldGVyczogIHBFZHJ2SW5pdFBhcmFtX3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBpbmNsdWRpbmcgdGhlIGluaXQtcGFyYW1ldGVycwovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgICAgICA9IGtFcGxTdWNjZXNzZnVsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ga0VwbE5vUmVzb3VyY2UKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydkluaXQodEVkcnZJbml0UGFyYW0gKiBwRWRydkluaXRQYXJhbV9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCWludCBpUmVzdWx0OwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGNsZWFyIGluc3RhbmNlIHN0cnVjdHVyZQoJRVBMX01FTVNFVCgmRWRydkluc3RhbmNlX2wsIDAsIHNpemVvZihFZHJ2SW5zdGFuY2VfbCkpOwoKCS8vIHNhdmUgdGhlIGluaXQgZGF0YQoJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0gPSAqcEVkcnZJbml0UGFyYW1fcDsKCgkvLyByZWdpc3RlciBQQ0kgZHJpdmVyCglpUmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CglpZiAoaVJlc3VsdCAhPSAwKSB7CgkJcHJpbnRrKCIlcyBwY2lfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgaVJlc3VsdCk7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPT0gTlVMTCkgewoJCXByaW50aygiJXMgbV9wUGNpRGV2PU5VTExcbiIsIF9fZnVuY19fKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyByZWFkIE1BQyBhZGRyZXNzIGZyb20gY29udHJvbGxlcgoJcHJpbnRrKCIlcyBsb2NhbCBNQUMgPSAiLCBfX2Z1bmNfXyk7Cglmb3IgKGlSZXN1bHQgPSAwOyBpUmVzdWx0IDwgNjsgaVJlc3VsdCsrKSB7CgkJcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSA9CgkJICAgIEVEUlZfUkVHQl9SRUFEKChFRFJWX1JFR0RXX0lEUjAgKyBpUmVzdWx0KSk7CgkJcHJpbnRrKCIlMDJYICIsCgkJICAgICAgICh1bnNpZ25lZCBpbnQpcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSk7Cgl9CglwcmludGsoIlxuIik7CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2U2h1dGRvd24KLy8KLy8gRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCi8vCi8vIFBhcmFtZXRlcnM6ICB2b2lkCi8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZTaHV0ZG93bih2b2lkKQp7CgoJLy8gdW5yZWdpc3RlciBQQ0kgZHJpdmVyCglwcmludGsoIiVzIGNhbGxpbmcgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKClcbiIsIF9fZnVuY19fKTsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CgoJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5Ci8vCi8vIERlc2NyaXB0aW9uOiBTZXQgYSBtdWx0aWNhc3QgZW50cnkgaW50byB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgovLwovLyBQYXJhbWV0ZXJzOiAgcGJNYWNBZGRyX3AgICAgID0gcG9pbnRlciB0byBtdWx0aWNhc3QgZW50cnkgdG8gc2V0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJRFdPUkQgZHdEYXRhOwoJQllURSBiSGFzaDsKCgliSGFzaCA9IEVkcnZDYWxjSGFzaChwYk1hY0FkZHJfcCk7Ci8qCiAgICBkd0RhdGEgPSBldGhlcl9jcmMoNiwgcGJNYWNBZGRyX3ApOwoKICAgIHByaW50aygiRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KCclMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCcpIGhhc2ggPSAldSAvICV1ICBldGhlcl9jcmMgPSAweCUwOGxYXG4iLAogICAgICAgIChXT1JEKSBwYk1hY0FkZHJfcFswXSwgKFdPUkQpIHBiTWFjQWRkcl9wWzFdLCAoV09SRCkgcGJNYWNBZGRyX3BbMl0sCiAgICAgICAgKFdPUkQpIHBiTWFjQWRkcl9wWzNdLCAoV09SRCkgcGJNYWNBZGRyX3BbNF0sIChXT1JEKSBwYk1hY0FkZHJfcFs1XSwKICAgICAgICAoV09SRCkgYkhhc2gsIChXT1JEKSAoZHdEYXRhID4+IDI2KSwgZHdEYXRhKTsKKi8KCWlmIChiSGFzaCA+IDMxKSB7CgkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CgkJZHdEYXRhIHw9IDEgPDwgKGJIYXNoIC0gMzIpOwoJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVI0LCBkd0RhdGEpOwoJfSBlbHNlIHsKCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKCQlkd0RhdGEgfD0gMSA8PCBiSGFzaDsKCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKCX0KCglyZXR1cm4gUmV0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkKLy8KLy8gRGVzY3JpcHRpb246IFJlc2V0IGEgbXVsdGljYXN0IGVudHJ5IGluIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCi8vCi8vIFBhcmFtZXRlcnM6ICBwYk1hY0FkZHJfcCAgICAgPSBwb2ludGVyIHRvIG11bHRpY2FzdCBlbnRyeSB0byByZXNldAovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJRFdPUkQgZHdEYXRhOwoJQllURSBiSGFzaDsKCgliSGFzaCA9IEVkcnZDYWxjSGFzaChwYk1hY0FkZHJfcCk7CgoJaWYgKGJIYXNoID4gMzEpIHsKCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCQlkd0RhdGEgJj0gfigxIDw8IChiSGFzaCAtIDMyKSk7CgkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7Cgl9IGVsc2UgewoJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOwoJCWR3RGF0YSAmPSB+KDEgPDwgYkhhc2gpOwoJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCBkd0RhdGEpOwoJfQoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcgovLwovLyBEZXNjcmlwdGlvbjogUmVnaXN0ZXIgYSBUeC1CdWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gcG9pbnRlciB0byBCdWZmZXIgc3RydWN0dXJlCi8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnkKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydkFsbG9jVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKewoJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCURXT1JEIGk7CgoJaWYgKHBCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbiA+IEVEUlZfTUFYX0ZSQU1FX1NJWkUpIHsKCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OwoJCWdvdG8gRXhpdDsKCX0KCS8vIHNlYXJjaCBhIGZyZWUgVHggYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgc2l6ZQoJZm9yIChpID0gMDsgaSA8IEVEUlZfTUFYX1RYX0JVRkZFUlM7IGkrKykgewoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID09IEZBTFNFKSB7CgkJCS8vIGZyZWUgY2hhbm5lbCBmb3VuZAoJCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID0gVFJVRTsKCQkJcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyID0gaTsKCQkJcEJ1ZmZlcl9wLT5tX3BiQnVmZmVyID0KCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiArCgkJCSAgICAoaSAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpOwoJCQlwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPSBFRFJWX01BWF9GUkFNRV9TSVpFOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoaSA+PSBFRFJWX01BWF9UWF9CVUZGRVJTKSB7CgkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKCQlnb3RvIEV4aXQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyCi8vCi8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgovLwovLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBwb2ludGVyIHRvIEJ1ZmZlciBzdHJ1Y3R1cmUKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CgoJdWlCdWZmZXJOdW1iZXIgPSBwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXI7CgoJaWYgKHVpQnVmZmVyTnVtYmVyIDwgRURSVl9NQVhfVFhfQlVGRkVSUykgewoJCUVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID0gRkFMU0U7Cgl9CgoJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZTZW5kVHhNc2cKLy8KLy8gRGVzY3JpcHRpb246IGltbWVkaWF0ZWx5IHN0YXJ0cyB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBidWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gYnVmZmVyIGRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlNlbmRUeE1zZyh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOwoJRFdPUkQgZHdUZW1wOwoKCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOwoKCWlmICgodWlCdWZmZXJOdW1iZXIgPj0gRURSVl9NQVhfVFhfQlVGRkVSUykKCSAgICB8fCAoRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFt1aUJ1ZmZlck51bWJlcl0gPT0gRkFMU0UpKSB7CgkJUmV0ID0ga0VwbEVkcnZCdWZOb3RFeGlzdGluZzsKCQlnb3RvIEV4aXQ7Cgl9CgoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyICE9IE5VTEwpIHsJLy8gdHJhbnNtaXNzaW9uIGlzIGFscmVhZHkgYWN0aXZlCgkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CgkJZHdUZW1wID0KCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKwoJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCgkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOwoJCXByaW50aygiJXMgSW52T3AgVFNEJXUgPSAweCUwOGxYIiwgX19mdW5jX18sCgkJICAgICAgIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CgkJcHJpbnRrKCIgIENtZCA9IDB4JTAyWFxuIiwKCQkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgkJZ290byBFeGl0OwoJfQoJLy8gc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIFR4SGFuZGxlcgoJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBwQnVmZmVyX3A7CgoJRURSVl9DT1VOVF9TRU5EOwoKCS8vIHBhZCB3aXRoIHplcm9zIGlmIG5lY2Vzc2FyeSwgYmVjYXVzZSBjb250cm9sbGVyIGRvZXMgbm90IGRvIGl0CglpZiAocEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPCBNSU5fRVRIX1NJWkUpIHsKCQlFUExfTUVNU0VUKHBCdWZmZXJfcC0+bV9wYkJ1ZmZlciArIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuLCAwLAoJCQkgICBNSU5fRVRIX1NJWkUgLSBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbik7CgkJcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBNSU5fRVRIX1NJWkU7Cgl9CgkvLyBzZXQgRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCglFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTQUQwICsKCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSwKCQkJIChFZHJ2SW5zdGFuY2VfbC5tX3BUeEJ1ZkRtYSArCgkJCSAgKHVpQnVmZmVyTnVtYmVyICogRURSVl9NQVhfRlJBTUVfU0laRSkpKTsKCWR3VGVtcCA9CgkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTQUQwICsKCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7Ci8vICAgIHByaW50aygiJXMgVFNBRCV1ID0gMHglMDhsWCIsIF9fZnVuY19fLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOwoKCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbgoJRURSVl9SRUdEV19XUklURSgoRURSVl9SRUdEV19UU0QwICsKCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSwKCQkJIChFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7Cglkd1RlbXAgPQoJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7Ci8vICAgIHByaW50aygiIFRTRCV1ID0gMHglMDhsWCAvIDB4JTA4bFhcbiIsIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCwgKERXT1JEKShFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKfQoKI2lmIDAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZUeE1zZ1JlYWR5Ci8vCi8vIERlc2NyaXB0aW9uOiBzdGFydHMgY29weWluZyB0aGUgYnVmZmVyIHRvIHRoZSBldGhlcm5ldCBjb250cm9sbGVyJ3MgRklGTwovLwovLyBQYXJhbWV0ZXJzOiAgcGJCdWZmZXJfcCAtIGJ1ZmZlcmRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAtIGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZUeE1zZ1JlYWR5KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCnsKCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cgl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZUeE1zZ1N0YXJ0Ci8vCi8vIERlc2NyaXB0aW9uOiBzdGFydHMgdHJhbnNtaXNzaW9uIG9mIHRoZSBldGhlcm5ldCBjb250cm9sbGVyJ3MgRklGTwovLwovLyBQYXJhbWV0ZXJzOiAgcGJCdWZmZXJfcCAtIGJ1ZmZlcmRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAtIGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZUeE1zZ1N0YXJ0KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCnsKCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJcmV0dXJuIFJldDsKfQojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVpbml0UngKLy8KLy8gRGVzY3JpcHRpb246IHJlaW5pdGlhbGl6ZSB0aGUgUnggcHJvY2VzcywgYmVjYXVzZSBvZiBlcnJvcgovLwovLyBQYXJhbWV0ZXJzOiAgdm9pZAovLwovLyBSZXR1cm5zOiAgICAgdm9pZAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgRWRydlJlaW5pdFJ4KHZvaWQpCnsKCUJZVEUgYkNtZDsKCgkvLyBzaW1wbHkgc3dpdGNoIG9mZiBhbmQgb24gdGhlIHJlY2VpdmVyCgkvLyB0aGlzIHdpbGwgcmVzZXQgdGhlIENBUFIgcmVnaXN0ZXIKCWJDbWQgPSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChiQ21kICYgfkVEUlZfUkVHQl9DT01NQU5EX1JFKSk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIGJDbWQpOwoKCS8vIHNldCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICAgRWRydkludGVycnVwdEhhbmRsZXIKLy8KLy8gRGVzY3JpcHRpb246ICBpbnRlcnJ1cHQgaGFuZGxlcgovLwovLyBQYXJhbWV0ZXJzOiAgIHZvaWQKLy8KLy8gUmV0dXJuczogICAgICB2b2lkCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojaWYgMAp2b2lkIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKHZvaWQpCnsKfQojZW5kaWYKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KQpzdGF0aWMgaW50IFRndEV0aElzcihpbnQgbklycU51bV9wLCB2b2lkICpwcERldkluc3REYXRhX3ApCiNlbHNlCnN0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCwKCQkgICAgIHN0cnVjdCBwdF9yZWdzICpwdFJlZ3NfcCkKI2VuZGlmCnsKLy8gICAgRWRydkludGVycnVwdEhhbmRsZXIoKTsKCXRFZHJ2UnhCdWZmZXIgUnhCdWZmZXI7Cgl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXI7CglXT1JEIHdTdGF0dXM7CglEV09SRCBkd1R4U3RhdHVzOwoJRFdPUkQgZHdSeFN0YXR1czsKCVdPUkQgd0N1clJ4OwoJQllURSAqcGJSeEJ1ZjsKCXVuc2lnbmVkIGludCB1aUxlbmd0aDsKCWludCBpSGFuZGxlZCA9IElSUV9IQU5ETEVEOwoKLy8gICAgcHJpbnRrKCKkIik7CgoJLy8gcmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cwoJd1N0YXR1cyA9IEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKTsKCgkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLCB3U3RhdHVzKTsKCglpZiAod1N0YXR1cyA9PSAwKSB7CgkJaUhhbmRsZWQgPSBJUlFfTk9ORTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBwcm9jZXNzIHRhc2tzCglpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9URVIgfCBFRFJWX1JFR1dfSU5UX1RPSykpICE9IDApIHsJLy8gdHJhbnNtaXQgaW50ZXJydXB0CgoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgewoJCQlwcmludGsoIiVzIFR4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCgkJCSAgICAgICBfX2Z1bmNfXyk7CgkJCWdvdG8gRXhpdDsKCQl9CgkJLy8gcmVhZCB0cmFuc21pdCBzdGF0dXMKCQlkd1R4U3RhdHVzID0KCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKwoJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCgkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOwoJCWlmICgoZHdUeFN0YXR1cyAmIChFRFJWX1JFR0RXX1RTRF9UT0sgfCBFRFJWX1JFR0RXX1RTRF9UQUJUIHwgRURSVl9SRUdEV19UU0RfVFVOKSkgIT0gMCkgewkvLyB0cmFuc21pdCBmaW5pc2hlZAoJCQlFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjID0KCQkJICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICsgMSkgJiAweDAzOwoJCQlwVHhCdWZmZXIgPSBFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlcjsKCQkJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBOVUxMOwoKCQkJaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVE9LKSAhPSAwKSB7CgkJCQlFRFJWX0NPVU5UX1RYOwoJCQl9IGVsc2UgaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVFVOKSAhPSAwKSB7CgkJCQlFRFJWX0NPVU5UX1RYX0ZVTjsKCQkJfSBlbHNlIHsJLy8gYXNzdW1lIEVEUlZfUkVHRFdfVFNEX1RBQlQKCQkJCUVEUlZfQ09VTlRfVFhfQ09MX1JMOwoJCQl9CgovLyAgICAgICAgICAgIHByaW50aygiVCIpOwoJCQlpZiAocFR4QnVmZmVyICE9IE5VTEwpIHsKCQkJCS8vIGNhbGwgVHggaGFuZGxlciBvZiBEYXRhIGxpbmsgbGF5ZXIKCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgoJCQkJICAgIG1fcGZuVHhIYW5kbGVyKHBUeEJ1ZmZlcik7CgkJCX0KCQl9IGVsc2UgewoJCQlFRFJWX0NPVU5UX1RYX0VSUjsKCQl9Cgl9CgoJaWYgKCh3U3RhdHVzICYgKEVEUlZfUkVHV19JTlRfUkVSIHwgRURSVl9SRUdXX0lOVF9GT1ZXIHwgRURSVl9SRUdXX0lOVF9SWE9WVyB8IEVEUlZfUkVHV19JTlRfUFVOKSkgIT0gMCkgewkvLyByZWNlaXZlIGVycm9yIGludGVycnVwdAoKCQlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX0ZPVlcpICE9IDApIHsKCQkJRURSVl9DT1VOVF9SWF9GT1ZXOwoJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JYT1ZXKSAhPSAwKSB7CgkJCUVEUlZfQ09VTlRfUlhfT1ZXOwoJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1BVTikgIT0gMCkgewkvLyBQYWNrZXQgdW5kZXJydW4KCQkJRURSVl9UUkFDRV9SWF9QVU4od1N0YXR1cyk7CgkJCUVEUlZfQ09VTlRfUlhfUFVOOwoJCX0gZWxzZSB7CS8qaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9SRVIpICE9IDApICovCgoJCQlFRFJWX1RSQUNFX1JYX0VSUih3U3RhdHVzKTsKCQkJRURSVl9DT1VOVF9SWF9FUlI7CgkJfQoKCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcwoJCUVkcnZSZWluaXRSeCgpOwoJfQoKCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUk9LKSAhPSAwKSB7CS8vIHJlY2VpdmUgaW50ZXJydXB0CgoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgewoJCQlwcmludGsoIiVzIFJ4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCgkJCSAgICAgICBfX2Z1bmNfXyk7CgkJCWdvdG8gRXhpdDsKCQl9CgkJLy8gcmVhZCBjdXJyZW50IG9mZnNldCBpbiByZWNlaXZlIGJ1ZmZlcgoJCXdDdXJSeCA9CgkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKwoJCSAgICAgMHgxMCkgJSBFRFJWX1JYX0JVRkZFUl9MRU5HVEg7CgoJCXdoaWxlICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfQlVGRSkgPT0gMCkgewkvLyBmcmFtZSBhdmFpbGFibGUKCgkJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIGN1cnJlbnQgZnJhbWUgaW4gcmVjZWl2ZSBidWZmZXIKCQkJcGJSeEJ1ZiA9IEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiArIHdDdXJSeDsKCgkJCS8vIHJlYWQgcmVjZWl2ZSBzdGF0dXMgRFdPUkQKCQkJZHdSeFN0YXR1cyA9IGxlMzJfdG9fY3B1KCooKERXT1JEICopIHBiUnhCdWYpKTsKCgkJCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUKCQkJdWlMZW5ndGggPSBkd1J4U3RhdHVzID4+IDE2OwoKCQkJaWYgKHVpTGVuZ3RoID09IDB4RkZGMCkgewkvLyBmcmFtZSBpcyB1bmZpbmlzaGVkIChtYXliZSBlYXJseSBSeCBpbnRlcnJ1cHQgaXMgYWN0aXZlKQoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX1JPSykgPT0gMCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlY2VpdmluZyB0aGlzIGZyYW1lCgkJCQkvLyBpZ25vcmUgaXQKCQkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0ZBRSkgIT0gMCkgewoJCQkJCUVEUlZfQ09VTlRfUlhfRkFFOwoJCQkJfSBlbHNlIGlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0NSQykgIT0gMCkgewoJCQkJCUVEUlZfVFJBQ0VfUlhfQ1JDKGR3UnhTdGF0dXMpOwoJCQkJCUVEUlZfQ09VTlRfUlhfQ1JDOwoJCQkJfSBlbHNlIHsKCQkJCQlFRFJWX1RSQUNFX1JYX0VSUihkd1J4U3RhdHVzKTsKCQkJCQlFRFJWX0NPVU5UX1JYX0VSUjsKCQkJCX0KCgkJCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcwoJCQkJRWRydlJlaW5pdFJ4KCk7CgoJCQkJYnJlYWs7CgkJCX0gZWxzZSB7CS8vIGZyYW1lIGlzIE9LCgkJCQlSeEJ1ZmZlci5tX0J1ZmZlckluRnJhbWUgPQoJCQkJICAgIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU7CgkJCQlSeEJ1ZmZlci5tX3VpUnhNc2dMZW4gPSB1aUxlbmd0aCAtIEVUSF9DUkNfU0laRTsKCQkJCVJ4QnVmZmVyLm1fcGJCdWZmZXIgPQoJCQkJICAgIHBiUnhCdWYgKyBzaXplb2YoZHdSeFN0YXR1cyk7CgovLyAgICAgICAgICAgICAgICBwcmludGsoIlIiKTsKCQkJCUVEUlZfQ09VTlRfUlg7CgoJCQkJLy8gY2FsbCBSeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgoJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCgkJCQkgICAgbV9wZm5SeEhhbmRsZXIoJlJ4QnVmZmVyKTsKCQkJfQoKCQkJLy8gY2FsdWxhdGUgbmV3IG9mZnNldCAoRFdPUkQgYWxpZ25lZCkKCQkJd0N1clJ4ID0KCQkJICAgIChXT1JEKSAoKHdDdXJSeCArIHVpTGVuZ3RoICsgc2l6ZW9mKGR3UnhTdGF0dXMpICsKCQkJCSAgICAgMykgJiB+MHgzKTsKCQkJRURSVl9UUkFDRV9DQVBSKHdDdXJSeCAtIDB4MTApOwoJCQlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0NBUFIsIHdDdXJSeCAtIDB4MTApOwoKCQkJLy8gcmVyZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCgkJCXdDdXJSeCA9CgkJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKCQkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKCgkJfQoJfQoKCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfU0VSUikgIT0gMCkgewkvLyBQQ0kgZXJyb3IKCQlFRFJWX0NPVU5UX1BDSV9FUlI7Cgl9CgoJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9USU1FT1VUKSAhPSAwKSB7CS8vIFRpbWVvdXQKCQlFRFJWX0NPVU5UX1RJTUVPVVQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIGlIYW5kbGVkOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkluaXRPbmUKLy8KLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIG9uZSBQQ0kgZGV2aWNlCi8vCi8vIFBhcmFtZXRlcnM6ICBwUGNpRGV2ICAgICAgICAgICAgID0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2Ugc3RydWN0dXJlCi8vICAgICAgICAgICAgICBwSWQgICAgICAgICAgICAgICAgID0gUENJIGRldmljZSBJRAovLwovLyBSZXR1cm5zOiAgICAgKGludCkgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgaW50IEVkcnZJbml0T25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKQp7CglpbnQgaVJlc3VsdCA9IDA7CglEV09SRCBkd1RlbXA7CgoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBOVUxMKSB7CS8vIEVkcnYgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBQQ0kgZGV2aWNlCgkJcHJpbnRrKCIlcyBkZXZpY2UgJXMgZGlzY2FyZGVkXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgcGNpX25hbWUocFBjaURldikpOwoJCWlSZXN1bHQgPSAtRU5PREVWOwoJCWdvdG8gRXhpdDsKCX0KCglpZiAocFBjaURldi0+cmV2aXNpb24gPj0gMHgyMCkgewoJCXByaW50awoJCSAgICAoIiVzIGRldmljZSAlcyBpcyBhbiBlbmhhbmNlZCA4MTM5QysgdmVyc2lvbiwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKCQkgICAgIF9fZnVuY19fLCBwY2lfbmFtZShwUGNpRGV2KSk7CgkJaVJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBFeGl0OwoJfQoKCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IHBQY2lEZXY7CgoJLy8gZW5hYmxlIGRldmljZQoJcHJpbnRrKCIlcyBlbmFibGUgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CglpUmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocFBjaURldik7CglpZiAoaVJlc3VsdCAhPSAwKSB7CgkJZ290byBFeGl0OwoJfQoKCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBQY2lEZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pID09IDApIHsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgoJcHJpbnRrKCIlcyByZXF1ZXN0IHJlZ2lvbnNcbiIsIF9fZnVuY19fKTsKCWlSZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBQY2lEZXYsIERSVl9OQU1FKTsKCWlmIChpUmVzdWx0ICE9IDApIHsKCQlnb3RvIEV4aXQ7Cgl9CgoJcHJpbnRrKCIlcyBpb3JlbWFwXG4iLCBfX2Z1bmNfXyk7CglFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPQoJICAgIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBQY2lEZXYsIDEpLAoJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBQY2lEZXYsIDEpKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPT0gTlVMTCkgewkvLyByZW1hcCBvZiBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UgZmFpbGVkCgkJaVJlc3VsdCA9IC1FSU87CgkJZ290byBFeGl0OwoJfQoJLy8gZW5hYmxlIFBDSSBidXNtYXN0ZXIKCXByaW50aygiJXMgZW5hYmxlIGJ1c21hc3RlclxuIiwgX19mdW5jX18pOwoJcGNpX3NldF9tYXN0ZXIocFBjaURldik7CgoJLy8gcmVzZXQgY29udHJvbGxlcgoJcHJpbnRrKCIlcyByZXNldCBjb250cm9sbGVyXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIEVEUlZfUkVHQl9DT01NQU5EX1JTVCk7CgoJLy8gd2FpdCB1bnRpbCByZXNldCBoYXMgZmluaXNoZWQKCWZvciAoaVJlc3VsdCA9IDUwMDsgaVJlc3VsdCA+IDA7IGlSZXN1bHQtLSkgewoJCWlmICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfUlNUKQoJCSAgICA9PSAwKSB7CgkJCWJyZWFrOwoJCX0KCgkJc2NoZWR1bGVfdGltZW91dCgxMCk7Cgl9CgoJLy8gY2hlY2sgaGFyZHdhcmUgdmVyc2lvbiwgaS5lLiBjaGlwIElECglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpOwoJaWYgKCgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9DKQoJICAgICYmICgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9EKSkgewkvLyB1bnN1cHBvcnRlZCBjaGlwCgkJcHJpbnRrKCIlcyBVbnN1cHBvcnRlZCBjaGlwISBUQ1IgPSAweCUwOGxYXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgZHdUZW1wKTsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBkaXNhYmxlIGludGVycnVwdHMKCXByaW50aygiJXMgZGlzYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKCS8vIGFja25vd2xlZGdlIGFsbCBwZW5kaW5nIGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywKCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKCgkvLyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyCglwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fZnVuY19fKTsKCWlSZXN1bHQgPQoJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKCQkJRFJWX05BTUUgLypwUGNpRGV2LT5kZXYubmFtZSAqLyAsIHBQY2lEZXYpOwoJaWYgKGlSZXN1bHQgIT0gMCkgewoJCWdvdG8gRXhpdDsKCX0KCi8qCiAgICAvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKICAgIHByaW50aygiJXMgdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NNRDkzNDYsIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyk7CgogICAgLy8gY2hlY2sgaWYgdXNlciBzcGVjaWZpZWQgYSBNQUMgYWRkcmVzcwogICAgcHJpbnRrKCIlcyBjaGVjayBzcGVjaWZpZWQgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCiAgICB7CiAgICAgICAgaWYgKEVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50aygiJXMgc2V0IGxvY2FsIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgIC8vIHdyaXRlIHRoaXMgTUFDIGFkZHJlc3MgdG8gY29udHJvbGxlcgogICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSMCwKICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkclswXSkpKTsKICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSMCk7CgogICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSNCwKICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcls0XSkpKTsKICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSNCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGlSZXN1bHQgPSAwOwoKICAgIC8vIGxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyk7CiovCgoJLy8gYWxsb2NhdGUgYnVmZmVycwoJcHJpbnRrKCIlcyBhbGxvY2F0ZSBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CglFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPQoJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCgkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgewoJCWlSZXN1bHQgPSAtRU5PTUVNOwoJCWdvdG8gRXhpdDsKCX0KCglFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPQoJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfUlhfQlVGRkVSX1NJWkUsCgkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgewoJCWlSZXN1bHQgPSAtRU5PTUVNOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlc2V0IHBvaW50ZXJzIGZvciBUeCBidWZmZXJzCglwcmludGsoIiVzIHJlc2V0IHBvaW50ZXJzIGZvIFR4IGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMCwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMCk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVFNBRDEsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDEpOwoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQyLCAwKTsKCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RTQUQyKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMywgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMyk7CgoJcHJpbnRrKCIgICAgQ29tbWFuZCA9IDB4JTAyWFxuIiwKCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKCgkvLyBzZXQgcG9pbnRlciBmb3IgcmVjZWl2ZSBidWZmZXIgaW4gY29udHJvbGxlcgoJcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQlNUQVJULCBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CgoJLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgoJcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19mdW5jX18pOwoJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELAoJCQkoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOwoJcHJpbnRrKCIgIENvbW1hbmQgPSAweCUwMlhcbiIsCgkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgoJLy8gY2xlYXIgbWlzc2VkIHBhY2tldCBjb3VudGVyIHRvIGVuYWJsZSBSeC9UeCBwcm9jZXNzCglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTVBDLCAwKTsKCgkvLyBzZXQgdHJhbnNtaXQgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgVHggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UQ1IsIEVEUlZfUkVHRFdfVENSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKSk7CgoJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgUnggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfUkNSKSk7CgoJLy8gcmVzZXQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCi8qCiAgICAvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCiAgICBwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CiAgICBwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CiovCgkvLyBkaXNhYmxlIGVhcmx5IGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfTVVMSU5ULCAwKTsKCgkvLyBlbmFibGUgaW50ZXJydXB0cwoJcHJpbnRrKCIlcyBlbmFibGUgaW50ZXJydXB0c1xuIiwgX19mdW5jX18pOwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgRURSVl9SRUdXX0lOVF9NQVNLX0RFRik7CgogICAgICBFeGl0OgoJcHJpbnRrKCIlcyBmaW5pc2hlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywgaVJlc3VsdCk7CglyZXR1cm4gaVJlc3VsdDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZSZW1vdmVPbmUKLy8KLy8gRGVzY3JpcHRpb246IHNodXRzIGRvd24gb25lIFBDSSBkZXZpY2UKLy8KLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKLy8KLy8gUmV0dXJuczogICAgICh2b2lkKQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyB2b2lkIEVkcnZSZW1vdmVPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYpCnsKCglpZiAoRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ICE9IHBQY2lEZXYpIHsJLy8gdHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIGRldmljZQoJCUJVR19PTihFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldik7CgkJZ290byBFeGl0OwoJfQoJLy8gZGlzYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgMCk7CgoJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKCgkvLyByZW1vdmUgaW50ZXJydXB0IGhhbmRsZXIKCWZyZWVfaXJxKHBQY2lEZXYtPmlycSwgcFBjaURldik7CgoJLy8gZnJlZSBidWZmZXJzCglpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmICE9IE5VTEwpIHsKCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCgkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlR4QnVmLAoJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKCQlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPSBOVUxMOwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgIT0gTlVMTCkgewoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYsCgkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOwoJCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9IE5VTEw7Cgl9CgkvLyB1bm1hcCBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgIT0gTlVMTCkgewoJCWlvdW5tYXAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyKTsKCX0KCS8vIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UKCXBjaV9kaXNhYmxlX2RldmljZShwUGNpRGV2KTsKCgkvLyByZWxlYXNlIG1lbW9yeSByZWdpb25zCglwY2lfcmVsZWFzZV9yZWdpb25zKHBQY2lEZXYpOwoKCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IE5VTEw7CgogICAgICBFeGl0OjsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZDYWxjSGFzaAovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW50cnkgZm9yIHRoZSBoYXNoLXRhYmxlIGZyb20gTUFDCi8vICAgICAgICAgICAgICBhZGRyZXNzCi8vCi8vIFBhcmFtZXRlcnM6ICBwYk1BQ19wIC0gcG9pbnRlciB0byBNQUMgYWRkcmVzcwovLwovLyBSZXR1cm5zOiAgICAgaGFzaCB2YWx1ZQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2RlZmluZSBIQVNIX0JJVFMgICAgICAgICAgICAgIDYJLy8gdXNlZCBiaXRzIGluIGhhc2gKI2RlZmluZSBDUkMzMl9QT0xZICAgIDB4MDRDMTFEQjYJLy8KLy8jZGVmaW5lIENSQzMyX1BPTFkgICAgMHhFREI4ODMyMCAgLy8KLy8gRyh4KSA9IHgzMiArIHgyNiArIHgyMyArIHgyMiArIHgxNiArIHgxMiArIHgxMSArIHgxMCArIHg4ICsgeDcgKyB4NSArIHg0ICsgeDIgKyB4ICsgMQoKc3RhdGljIEJZVEUgRWRydkNhbGNIYXNoKEJZVEUgKiBwYk1BQ19wKQp7CglEV09SRCBkd0J5dGVDb3VudGVyOwoJRFdPUkQgZHdCaXRDb3VudGVyOwoJRFdPUkQgZHdEYXRhOwoJRFdPUkQgZHdDcmM7CglEV09SRCBkd0NhcnJ5OwoJQllURSAqcGJEYXRhOwoJQllURSBiSGFzaDsKCglwYkRhdGEgPSBwYk1BQ19wOwoKCS8vIGNhbGN1bGF0ZSBjcmMzMiB2YWx1ZSBvZiBtYWMgYWRkcmVzcwoJZHdDcmMgPSAweEZGRkZGRkZGOwoKCWZvciAoZHdCeXRlQ291bnRlciA9IDA7IGR3Qnl0ZUNvdW50ZXIgPCA2OyBkd0J5dGVDb3VudGVyKyspIHsKCQlkd0RhdGEgPSAqcGJEYXRhOwoJCXBiRGF0YSsrOwoJCWZvciAoZHdCaXRDb3VudGVyID0gMDsgZHdCaXRDb3VudGVyIDwgODsKCQkgICAgIGR3Qml0Q291bnRlcisrLCBkd0RhdGEgPj49IDEpIHsKCQkJZHdDYXJyeSA9ICgoKGR3Q3JjID4+IDMxKSBeIGR3RGF0YSkgJiAxKTsKCQkJZHdDcmMgPSBkd0NyYyA8PCAxOwoJCQlpZiAoZHdDYXJyeSAhPSAwKSB7CgkJCQlkd0NyYyA9IChkd0NyYyBeIENSQzMyX1BPTFkpIHwgZHdDYXJyeTsKCQkJfQoJCX0KCX0KCi8vICAgIHByaW50aygiTXlDUkMgPSAweCUwOGxYXG4iLCBkd0NyYyk7CgkvLyBvbmx5IHVwcGVyIDYgYml0cyAoSEFTSF9CSVRTKSBhcmUgdXNlZAoJLy8gd2hpY2ggcG9pbnQgdG8gc3BlY2lmaWMgYml0IGluIHRoZSBoYXNoIHJlZ2lzdGVycwoJYkhhc2ggPSAoQllURSkgKChkd0NyYyA+PiAoMzIgLSBIQVNIX0JJVFMpKSAmIDB4M2YpOwoKCXJldHVybiBiSGFzaDsKfQo=