From mboxrd@z Thu Jan 1 00:00:00 1970 From: Manasi Navare Subject: Re: [PATCH i-g-t] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Fri, 2 Dec 2016 11:23:58 -0800 Message-ID: <20161202192358.GA23271@intel.com> References: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> <871sy2wb3b.fsf@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id DC4D76E9DA for ; Fri, 2 Dec 2016 19:21:15 +0000 (UTC) Content-Disposition: inline In-Reply-To: <871sy2wb3b.fsf@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBOb3YgMjMsIDIwMTYgYXQgMDM6NTk6NTJQTSArMDIwMCwgSmFuaSBOaWt1bGEgd3Jv dGU6Cj4gT24gVHVlLCAyMiBOb3YgMjAxNiwgTWFuYXNpIE5hdmFyZSA8bWFuYXNpLmQubmF2YXJl QGludGVsLmNvbT4gd3JvdGU6Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgZ2V0X3Rlc3RfdmlkZW9w YXR0ZXJuX2RhdGEodm9pZCkKPiA+ICt7Cj4gPiArCWludCBjb3VudCA9IDA7Cj4gPiArCXVpbnQx Nl90IHZpZGVvX3BhdHRlcm5fdmFsdWVbM107Cj4gPiArCWNoYXIgdmlkZW9fcGF0dGVybl9hdHRy aWJ1dGVbMTVdOwo+ID4gKwo+ID4gKwlpZiAoIXRlc3RfZGF0YV9mcCkKPiA+ICsJCWZwcmludGYo c3RkZXJyLCAiSW52YWxpZCBUZXN0IGRhdGEgRmlsZSBwb2ludGVyXHJcbiIpOwo+ID4gKwo+ID4g KwlyZXdpbmQodGVzdF9kYXRhX2ZwKTsKPiA+ICsJd2hpbGUgKCFmZW9mKHRlc3RfZGF0YV9mcCkg JiYgY291bnQgPCAzKQo+ID4gKwkJZnNjYW5mKHRlc3RfZGF0YV9mcCwgIiVzICV1XG4iLCB2aWRl b19wYXR0ZXJuX2F0dHJpYnV0ZSwKPiA+ICsJCSAgICAgICAodW5zaWduZWQgaW50ICopJnZpZGVv X3BhdHRlcm5fdmFsdWVbY291bnQrK10pOwo+ID4gKwo+ID4gKwloZGlzcGxheSA9IHZpZGVvX3Bh dHRlcm5fdmFsdWVbMF07Cj4gPiArCXZkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsK PiA+ICsJYml0ZGVwdGggPSB2aWRlb19wYXR0ZXJuX3ZhbHVlWzJdOwo+ID4gKwlpZ3RfaW5mbygi SGRpc3BsYXkgPSAlZFxyXG4iLCBoZGlzcGxheSk7Cj4gPiArCWlndF9pbmZvKCJWZGlzcGxheSA9 ICVkXHJcbiIsIHZkaXNwbGF5KTsKPiA+ICsJaWd0X2luZm8oIkJpdERlcHRoID0gJXVcclxuIiwg Yml0ZGVwdGgpOwo+ID4gKwo+ID4gK30KPiAKPiBJZiB5b3UgaGF2ZSB0aGlzIHdvcmtpbmcgbm93 LCBJIGd1ZXNzIHdlIGNhbiBnbyB3aXRoIHdoYXQncyBpbiBbMV0gc2luY2UKPiB0aGF0J3MgZmFp cmx5IGlzb2xhdGVkIGZvciBub3cuIEl0J3MgZGVidWdmcywgc28gd2UgY2FuIHJlbW92ZSBpdAo+ IGxhdGVyLiBJbiB0aGUgbG9uZyBydW4sIEkgZG8gd2FudCB0aGlzIHVzaW5nIERQQ0QgZGlyZWN0 bHkgdGhvdWdoLgo+IAo+IEJSLAo+IEphbmkuCj4gCj4gCj4gCj4gWzFdIGh0dHA6Ly9wYXRjaHdv cmsuZnJlZWRlc2t0b3Aub3JnL3BhdGNoL21zZ2lkLzE0Nzk4NTA3NjYtMzI3NDgtNi1naXQtc2Vu ZC1lbWFpbC1tYW5hc2kuZC5uYXZhcmVAaW50ZWwuY29tCj4gCj4gCj4gCj4KClRoYW5rcyBmb3Ig eW91ciBmZWVkYmFjayBKYW5pLgpZZXMsIEkgaGF2ZSB0aGUgZGVidWdmcyBpbnRlcmZhY2UgZnVs bHkgZnVuY3Rpb25hbCBhbmQgdmFsaWRhdGVkIHdpdGggRFBSLTEyMApjb21wbGlhbmNlIHVuaXQu IFNvIEkgYWdyZWUgdGhhdCB3ZSBjYW4gc3RpY2sgd2l0aCB0aGlzIGZvciBub3cgYW5kIHNpbmNl IGl0cwpkZWJ1Z2ZzIHdlIGNhbiByZXBsYWNlIGl0IGxhdGVyIHdpdGggcmVhZGluZyB0aGUgZHBj ZCBkaXJlY3RseSBpbiBJR1QgdG9vbAppZiBhbmQgd2hlbiB0aGUgbnVtYmVyIG9mIERQQ0QgcmVn aXN0ZXJzIGluY3JlYXNlcyBmb3IgbW9yZSB0ZXN0aW5nLiBGb3Igbm93IGl0cwpsaXRlcmFsbHkg b25seSAzIHZhbHVlcyAoZm9yIHZpZGVvKSBhbmQgMSBmb3IgRURJRCB0aGF0IHdlIGFyZSByZWFk aW5nIGZyb20gRFBDRCAKdGhyb3VnaCB0aGUgZGVidWdmcyBpbnRlcmZhY2UuCgpNYW5hc2kKCiAK PiA+ICsKPiA+ICtzdGF0aWMgaW50IHByb2Nlc3NfdGVzdF9yZXF1ZXN0KGludCB0ZXN0X3R5cGUp Cj4gPiArewo+ID4gKwlpbnQgbW9kZTsKPiA+ICsJdW5zaWduZWQgbG9uZyB0ZXN0X2RhdGFfZWRp ZDsKPiA+ICsJaW50IHN0YXR1cyA9IDA7Cj4gPiArCj4gPiArCXN3aXRjaCAodGVzdF90eXBlKSB7 Cj4gPiArCWNhc2UgRFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRFUk46Cj4gPiArCQl2aWRlb19wYXR0 ZXJuX2ZsYWcgPSB0cnVlOwo+ID4gKwkJZ2V0X3Rlc3RfdmlkZW9wYXR0ZXJuX2RhdGEoKTsKPiA+ ICsJCW1vZGUgPSBJTlRFTF9NT0RFX1ZJREVPX1BBVFRFUk5fVEVTVDsKPiA+ICsJCWJyZWFrOwo+ ID4gKwljYXNlIERQX1RFU1RfTElOS19FRElEX1JFQUQ6Cj4gPiArCQl0ZXN0X2RhdGFfZWRpZCA9 IGdldF90ZXN0X2VkaWRfZGF0YSgpOwo+ID4gKwkJbW9kZSA9ICh0ZXN0X2RhdGFfZWRpZCAmIERQ X0NPTVBMSUFOQ0VfVklERU9fTU9ERV9NQVNLKSA+Pgo+ID4gKwkJCUlOVEVMX0RQX1JFU09MVVRJ T05fU0hJRlRfTUFTSzsKPiA+ICsJCWJyZWFrOwo+ID4gKwlkZWZhdWx0Ogo+ID4gKwkJLyogVW5r bm93biB0ZXN0IHR5cGUgKi8KPiA+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0IHJl cXVlc3QuIElnbm9yZWQuXHJcbiIpOwo+ID4gKwkJYnJlYWs7Cj4gPiArCX0KPiA+ICsJc3RhdHVz ID0gdXBkYXRlX2Rpc3BsYXkobW9kZSwgdHJ1ZSk7Cj4gPiArCj4gPiArCS8qIFJldHVybiAwIG9u IHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUgKi8KPiA+ICsJcmV0dXJuIHN0YXR1czsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgZHVtcF9jb25uZWN0b3JzX2ZkKGludCBkcm1mZCkKPiA+ ICt7Cj4gPiArCWludCBpLCBqOwo+ID4gKwo+ID4gKwlkcm1Nb2RlUmVzICptb2RlX3Jlc291cmNl cyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZHJtZmQpOwo+ID4gKwo+ID4gKwlpZiAoIW1vZGVfcmVz b3VyY2VzKSB7Cj4gPiArCQlpZ3Rfd2FybigiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQ6ICVz XG4iLCBzdHJlcnJvcihlcnJubykpOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4gPiAr CWlndF9pbmZvKCJDb25uZWN0b3JzOlxuIik7Cj4gPiArCWlndF9pbmZvKCJpZFx0ZW5jb2Rlclx0 c3RhdHVzXHRcdHR5cGVcdHNpemUgKG1tKVx0bW9kZXNcbiIpOwo+ID4gKwlmb3IgKGkgPSAwOyBp IDwgbW9kZV9yZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykgewo+ID4gKwkJZHJtTW9k ZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ID4gKwo+ID4gKwkJY29ubmVjdG9yID0gZHJtTW9kZUdl dENvbm5lY3RvckN1cnJlbnQoZHJtZmQsCj4gPiArCQkJCQkJICAgICAgIG1vZGVfcmVzb3VyY2Vz LT5jb25uZWN0b3JzW2ldKTsKPiA+ICsJCWlmICghY29ubmVjdG9yKSB7Cj4gPiArCQkJaWd0X3dh cm4oImNvdWxkIG5vdCBnZXQgY29ubmVjdG9yICVpOiAlc1xuIiwgbW9kZV9yZXNvdXJjZXMtPmNv bm5lY3RvcnNbaV0sIHN0cmVycm9yKGVycm5vKSk7Cj4gPiArCQkJY29udGludWU7Cj4gPiArCQl9 Cj4gPiArCj4gPiArCQlpZ3RfaW5mbygiJWRcdCVkXHQlc1x0JXNcdCVkeCVkXHRcdCVkXG4iLCBj b25uZWN0b3ItPmNvbm5lY3Rvcl9pZCwgY29ubmVjdG9yLT5lbmNvZGVyX2lkLCBrbXN0ZXN0X2Nv bm5lY3Rvcl9zdGF0dXNfc3RyKGNvbm5lY3Rvci0+Y29ubmVjdGlvbiksIGttc3Rlc3RfY29ubmVj dG9yX3R5cGVfc3RyKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpLCBjb25uZWN0b3ItPm1tV2lk dGgsIGNvbm5lY3Rvci0+bW1IZWlnaHQsIGNvbm5lY3Rvci0+Y291bnRfbW9kZXMpOwo+ID4gKwo+ ID4gKwkJaWYgKCFjb25uZWN0b3ItPmNvdW50X21vZGVzKQo+ID4gKwkJCWNvbnRpbnVlOwo+ID4g Kwo+ID4gKwkJaWd0X2luZm8oIiAgbW9kZXM6XG4iKTsKPiA+ICsJCWlndF9pbmZvKCIgIG5hbWUg cmVmcmVzaCAoSHopIGhkaXNwIGhzcyBoc2UgaHRvdCB2ZGlzcCAiInZzcyB2c2UgdnRvdCBmbGFn cyB0eXBlIGNsb2NrXG4iKTsKPiA+ICsJCWZvciAoaiA9IDA7IGogPCBjb25uZWN0b3ItPmNvdW50 X21vZGVzOyBqKyspIHsKPiA+ICsJCQlpZ3RfaW5mbygiWyVkXSIsIGopOwo+ID4gKwkJCWttc3Rl c3RfZHVtcF9tb2RlKCZjb25uZWN0b3ItPm1vZGVzW2pdKTsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJ CWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gPiArCX0KPiA+ICsJaWd0X2luZm8o IlxuIik7Cj4gPiArCj4gPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVzb3VyY2VzKTsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgZHVtcF9jcnRjc19mZChpbnQgZHJtZmQpCj4g PiArewo+ID4gKwlpbnQgaTsKPiA+ICsJZHJtTW9kZVJlcyAqbW9kZV9yZXNvdXJjZXMgPSBkcm1N b2RlR2V0UmVzb3VyY2VzKGRybWZkKTsKPiA+ICsKPiA+ICsJaWd0X2luZm8oIkNSVENzOlxuIik7 Cj4gPiArCWlndF9pbmZvKCJpZFx0ZmJcdHBvc1x0c2l6ZVxuIik7Cj4gPiArCWZvciAoaSA9IDA7 IGkgPCBtb2RlX3Jlc291cmNlcy0+Y291bnRfY3J0Y3M7IGkrKykgewo+ID4gKwkJZHJtTW9kZUNy dGMgKmNydGM7Cj4gPiArCj4gPiArCQljcnRjID0gZHJtTW9kZUdldENydGMoZHJtZmQsIG1vZGVf cmVzb3VyY2VzLT5jcnRjc1tpXSk7Cj4gPiArCQlpZiAoIWNydGMpIHsKPiA+ICsJCQlpZ3Rfd2Fy bigiY291bGQgbm90IGdldCBjcnRjICVpOiAlc1xuIiwgbW9kZV9yZXNvdXJjZXMtPmNydGNzW2ld LCBzdHJlcnJvcihlcnJubykpOwo+ID4gKwkJCWNvbnRpbnVlOwo+ID4gKwkJfQo+ID4gKwkJaWd0 X2luZm8oIiVkXHQlZFx0KCVkLCVkKVx0KCVkeCVkKVxuIiwgY3J0Yy0+Y3J0Y19pZCwgY3J0Yy0+ YnVmZmVyX2lkLCBjcnRjLT54LCBjcnRjLT55LCBjcnRjLT53aWR0aCwgY3J0Yy0+aGVpZ2h0KTsK PiA+ICsJCWttc3Rlc3RfZHVtcF9tb2RlKCZjcnRjLT5tb2RlKTsKPiA+ICsKPiA+ICsJCWRybU1v ZGVGcmVlQ3J0YyhjcnRjKTsKPiA+ICsJfQo+ID4gKwlpZ3RfaW5mbygiXG4iKTsKPiA+ICsKPiA+ ICsJZHJtTW9kZUZyZWVSZXNvdXJjZXMobW9kZV9yZXNvdXJjZXMpOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgdm9pZCBkdW1wX2luZm8odm9pZCkKPiA+ICt7Cj4gPiArCWR1bXBfY29ubmVjdG9y c19mZChkcm1fZmQpOwo+ID4gKwlkdW1wX2NydGNzX2ZkKGRybV9mZCk7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9maW5kX3ByZWZlcnJlZF9tb2RlKHVpbnQzMl90IGNv bm5lY3Rvcl9pZCwKPiA+ICsJCQkJCSAgdW5zaWduZWQgbG9uZyBjcnRjX2lkeF9tYXNrLAo+ID4g KwkJCQkJICBzdHJ1Y3QgY29ubmVjdG9yICpjKQo+ID4gK3sKPiA+ICsJc3RydWN0IGttc3Rlc3Rf Y29ubmVjdG9yX2NvbmZpZyBjb25maWc7Cj4gPiArCWJvb2wgcmV0Owo+ID4gKwo+ID4gKwlyZXQg PSBrbXN0ZXN0X3Byb2JlX2Nvbm5lY3Rvcl9jb25maWcoZHJtX2ZkLCBjb25uZWN0b3JfaWQsCj4g PiArCQkJCQkgICAgIGNydGNfaWR4X21hc2ssICZjb25maWcpOwo+ID4gKwlpZiAoIXJldCkgewo+ ID4gKwkJYy0+bW9kZV92YWxpZCA9IDA7Cj4gPiArCQlyZXR1cm47Cj4gPiArCX0KPiA+ICsKPiA+ ICsJYy0+Y29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKPiA+ICsJYy0+ZW5jb2RlciA9IGNv bmZpZy5lbmNvZGVyOwo+ID4gKwljLT5jcnRjID0gY29uZmlnLmNydGMtPmNydGNfaWQ7Cj4gPiAr CWMtPnBpcGUgPSBjb25maWcucGlwZTsKPiA+ICsKPiA+ICsJaWYgKGMtPmNvbm5lY3Rvci0+Y29u bmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0IHx8Cj4gPiArCSAg ICBjLT5jb25uZWN0b3ItPmNvbm5lY3Rpb24gIT0gIERSTV9NT0RFX0NPTk5FQ1RFRCkgewo+ID4g KwkJYy0+bW9kZV92YWxpZCA9IDA7Cj4gPiArCQlyZXR1cm47Cj4gPiArCX0KPiA+ICsKPiA+ICsJ Yy0+bW9kZSA9IGNvbmZpZy5kZWZhdWx0X21vZGU7Cj4gPiArCWMtPm1vZGVfdmFsaWQgPSAxOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHNldHVwX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgY29u bmVjdG9yICpkcF9jb25uKQo+ID4gK3sKPiA+ICsKPiA+ICsJZHBfY29ubi0+ZmIgPSBpZ3RfY3Jl YXRlX2ZiKGRybV9mZCwKPiA+ICsJCQkJICAgIGRwX2Nvbm4tPmZiX3dpZHRoLCBkcF9jb25uLT5m Yl9oZWlnaHQsCj4gPiArCQkJCSAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ID4gKwkJCQkgICAg TE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiA+ICsJCQkJICAgICZkcF9jb25uLT5mYl92aWRl b19wYXR0ZXJuKTsKPiA+ICsJaWd0X2Fzc2VydChkcF9jb25uLT5mYik7Cj4gPiArCj4gPiArCS8q IE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBz cGFjZSAqLwo+ID4gKwlkcF9jb25uLT5waXhtYXAgPSBnZW1fbW1hcF9fZ3R0KGRybV9mZCwKPiA+ ICsJCQkJCWRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiA+ICsJCQkJCWRw X2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uc2l6ZSwKPiA+ICsJCQkJCVBST1RfUkVBRCB8IFBST1Rf V1JJVEUpOwo+ID4gKwlnZW1fc2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nvbm4tPmZiX3ZpZGVvX3Bh dHRlcm4uZ2VtX2hhbmRsZSwKPiA+ICsJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1 X0dFTV9ET01BSU5fR1RUKTsKPiA+ICsJZHBfY29ubi0+ZmJfc2l6ZSA9IGRwX2Nvbm4tPmZiX3Zp ZGVvX3BhdHRlcm4uc2l6ZTsKPiA+ICsKPiA+ICsJLyogQWZ0ZXIgZmlsbGluZyB0aGUgZGV2aWNl IG1lbW9yeSB3aXRoIDBzIGl0IG5lZWRzIHRvIGJlIHVubWFwcGVkICovCj4gPiArCW1lbXNldChk cF9jb25uLT5waXhtYXAsIDAsIGRwX2Nvbm4tPmZiX3NpemUpOwo+ID4gKwltdW5tYXAoZHBfY29u bi0+cGl4bWFwLCBkcF9jb25uLT5mYl9zaXplKTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc2V0dXBfZmFpbHNhZmVfZnJhbWVidWZmZXIoc3RydWN0 IGNvbm5lY3RvciAqZHBfY29ubikKPiA+ICt7Cj4gPiArCj4gPiArCWRwX2Nvbm4tPmZhaWxzYWZl X2ZiID0gaWd0X2NyZWF0ZV9mYihkcm1fZmQsCj4gPiArCQkJCQkgICAgIGRwX2Nvbm4tPmZhaWxz YWZlX3dpZHRoLAo+ID4gKwkJCQkJICAgICBkcF9jb25uLT5mYWlsc2FmZV9oZWlnaHQsCj4gPiAr CQkJCQkgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gPiArCQkJCQkgICAgIExPQ0FMX0RSTV9G T1JNQVRfTU9EX05PTkUsCj4gPiArCQkJCQkgICAgICZkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0 ZXJuKTsKPiA+ICsJaWd0X2Fzc2VydChkcF9jb25uLT5mYWlsc2FmZV9mYik7Cj4gPiArCj4gPiAr CS8qIE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhlIHZpcnR1YWwgYWRkcmVz cyBzcGFjZSAqLwo+ID4gKwlkcF9jb25uLT5mYWlsc2FmZV9waXhtYXAgPSBnZW1fbW1hcF9fZ3R0 KGRybV9mZCwKPiA+ICsJCQkJCQkgZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVybi5nZW1faGFu ZGxlLAo+ID4gKwkJCQkJCSBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLnNpemUsCj4gPiAr CQkJCQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ID4gKwlnZW1fc2V0X2RvbWFpbihkcm1f ZmQsIGRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiA+ICsJCSAgICAg ICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsKPiA+ICsJZHBfY29u bi0+ZmFpbHNhZmVfc2l6ZSA9IGRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4uc2l6ZTsKPiA+ ICsKPiA+ICsJLyogQWZ0ZXIgZmlsbGluZyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIHRoZSBtYXBw ZWQgbWVtb3J5IG5lZWRzIHRvIGJlIGZyZWVkICovCj4gPiArCW1lbXNldChkcF9jb25uLT5mYWls c2FmZV9waXhtYXAsIDAsIGRwX2Nvbm4tPmZhaWxzYWZlX3NpemUpOwo+ID4gKwltdW5tYXAoZHBf Y29ubi0+ZmFpbHNhZmVfcGl4bWFwLCBkcF9jb25uLT5mYWlsc2FmZV9zaXplKTsKPiA+ICsKPiA+ ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgc2V0dXBfdmlk ZW9fcGF0dGVybl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+ID4gK3sK PiA+ICsJdWludDMyX3QgIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQ7Cj4gPiArCj4gPiArCXZp ZGVvX3dpZHRoID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmhkaXNwbGF5Owo+ID4gKwl2aWRlb19o ZWlnaHQgPSBkcF9jb25uLT50ZXN0X3BhdHRlcm4udmRpc3BsYXk7Cj4gPiArCWRwX2Nvbm4tPnRl c3RfcGF0dGVybi5mYiA9IGlndF9jcmVhdGVfZmIoZHJtX2ZkLAo+ID4gKwkJCQkJCSB2aWRlb193 aWR0aCwgdmlkZW9faGVpZ2h0LAo+ID4gKwkJCQkJCSBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ID4g KwkJCQkJCSBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+ID4gKwkJCQkJCSAmZHBfY29ubi0+ dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4pOwo+ID4gKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPnRlc3Rf cGF0dGVybi5mYik7Cj4gPiArCj4gPiArCS8qIE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0 IGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLwo+ID4gKwlkcF9jb25uLT50ZXN0X3Bh dHRlcm4ucGl4bWFwID0gZ2VtX21tYXBfX2d0dChkcm1fZmQsCj4gPiArCQkJCQkJICAgICBkcF9j b25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5nZW1faGFuZGxlLAo+ID4gKwkJCQkJCSAgICAg ZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uc2l6ZSwKPiA+ICsJCQkJCQkgICAgIFBS T1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ID4gKwlnZW1fc2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nv bm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuLmdlbV9oYW5kbGUsCj4gPiArCQkgICAgICAgSTkx NV9HRU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7Cj4gPiArCj4gPiArCWRwX2Nv bm4tPnRlc3RfcGF0dGVybi5zaXplID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4u c2l6ZTsKPiA+ICsKPiA+ICsJbWVtc2V0KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAsIDAs IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplKTsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgZmlsbF9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9y ICpkcF9jb25uKQo+ID4gK3sKPiA+ICsJdWludDMyX3QgdGlsZV9oZWlnaHQsIHRpbGVfd2lkdGgs IHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQ7Cj4gPiArCXVpbnQzMl90ICpyZWRfcHRyLCAqZ3Jl ZW5fcHRyLCAqYmx1ZV9wdHIsICp3aGl0ZV9wdHIsICpzcmNfcHRyLCAqZHN0X3B0cjsKPiA+ICsJ aW50IHgsIHk7Cj4gPiArCWludDMyX3QgcGl4ZWxfdmFsOwo+ID4gKwo+ID4gKwl2aWRlb193aWR0 aCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheTsKPiA+ICsJdmlkZW9faGVpZ2h0ID0g ZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnZkaXNwbGF5Owo+ID4gKwo+ID4gKwl0aWxlX2hlaWdodCA9 IDY0Owo+ID4gKwl0aWxlX3dpZHRoID0gMSA8PCAgKGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5iaXRk ZXB0aCk7Cj4gPiArCj4gPiArCXJlZF9wdHIgPSBkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFw Owo+ID4gKwlncmVlbl9wdHIgPSByZWRfcHRyICsgKHZpZGVvX3dpZHRoICogdGlsZV9oZWlnaHQp Owo+ID4gKwlibHVlX3B0ciA9IGdyZWVuX3B0ciArICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0 KTsKPiA+ICsJd2hpdGVfcHRyID0gYmx1ZV9wdHIgKyAodmlkZW9fd2lkdGggKiB0aWxlX2hlaWdo dCk7Cj4gPiArCXggPSAwOwo+ID4gKwo+ID4gKwkvKiBGaWxsIHRoZSBmcmFtZSBidWZmZXIgd2l0 aCB2aWRlbyBwYXR0ZXJuIGZyb20gQ1RTIDMuMS41ICovCj4gPiArCXdoaWxlICh4IDwgdmlkZW9f d2lkdGgpIHsKPiA+ICsJCWZvciAocGl4ZWxfdmFsID0gMDsgcGl4ZWxfdmFsIDwgMjU2Owo+ID4g KwkJICAgICBwaXhlbF92YWwgPSBwaXhlbF92YWwgKyAoMjU2IC8gdGlsZV93aWR0aCkpIHsKPiA+ ICsJCQlyZWRfcHRyW3hdID0gcGl4ZWxfdmFsIDw8IDE2Owo+ID4gKwkJCWdyZWVuX3B0clt4XSA9 IHBpeGVsX3ZhbCA8PCA4Owo+ID4gKwkJCWJsdWVfcHRyW3hdID0gcGl4ZWxfdmFsIDw8IDA7Cj4g PiArCQkJd2hpdGVfcHRyW3hdID0gcmVkX3B0clt4XSB8IGdyZWVuX3B0clt4XSB8IGJsdWVfcHRy W3hdOwo+ID4gKwkJCWlmICgrK3ggPj0gdmlkZW9fd2lkdGgpCj4gPiArCQkJCWJyZWFrOwo+ID4g KwkJfQo+ID4gKwl9Cj4gPiArCWZvciAoeSA9IDA7IHkgPCB2aWRlb19oZWlnaHQ7IHkrKykgewo+ ID4gKwkJaWYgKHkgPT0gMCB8fCB5ID09IDY0IHx8IHkgPT0gMTI4IHx8IHkgPT0gMTkyKQo+ID4g KwkJCWNvbnRpbnVlOwo+ID4gKwkJc3dpdGNoICgoeSAvIHRpbGVfaGVpZ2h0KSAlIDQpIHsKPiA+ ICsJCWNhc2UgMDoKPiA+ICsJCQlzcmNfcHRyID0gcmVkX3B0cjsKPiA+ICsJCQlicmVhazsKPiA+ ICsJCWNhc2UgMToKPiA+ICsJCQlzcmNfcHRyID0gZ3JlZW5fcHRyOwo+ID4gKwkJCWJyZWFrOwo+ ID4gKwkJY2FzZSAyOgo+ID4gKwkJCXNyY19wdHIgPSBibHVlX3B0cjsKPiA+ICsJCQlicmVhazsK PiA+ICsJCWNhc2UgMzoKPiA+ICsJCQlzcmNfcHRyID0gd2hpdGVfcHRyOwo+ID4gKwkJCWJyZWFr Owo+ID4gKwkJfQo+ID4gKwkJZHN0X3B0ciA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAg KyAoeSAqIHZpZGVvX3dpZHRoKTsKPiA+ICsJCW1lbWNweShkc3RfcHRyLCBzcmNfcHRyLCAodmlk ZW9fd2lkdGggKiA0KSk7Cj4gPiArCX0KPiA+ICsJbXVubWFwKGRwX2Nvbm4tPnRlc3RfcGF0dGVy bi5waXhtYXAsCj4gPiArCSAgICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6ZSk7Cj4gPiAr CXJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHNldF90ZXN0X21vZGUoc3Ry dWN0IGNvbm5lY3RvciAqZHBfY29ubikKPiA+ICt7Cj4gPiArCWludCByZXQgPSAwOwo+ID4gKwlp bnQgaTsKPiA+ICsJYm9vbCBmb3VuZF9zdGQgPSBmYWxzZSwgZm91bmRfZnMgPSBmYWxzZTsKPiA+ ICsJZHJtTW9kZUNvbm5lY3RvciAqYyA9IGRwX2Nvbm4tPmNvbm5lY3RvcjsKPiA+ICsKPiA+ICsJ LyogSWdub3JlIGFueSBkaXNjb25uZWN0ZWQgZGV2aWNlcyAqLwo+ID4gKwlpZiAoYy0+Y29ubmVj dGlvbiAhPSBEUk1fTU9ERV9DT05ORUNURUQpIHsKPiA+ICsJCWlndF93YXJuKCJDb25uZWN0b3Ig JXUgZGlzY29ubmVjdGVkXHJcbiIsIGMtPmNvbm5lY3Rvcl9pZCk7Cj4gPiArCQlyZXR1cm4gLUVO T0VOVDsKPiA+ICsJfQo+ID4gKwlpZ3RfaW5mbygiQ29ubmVjdG9yIFNldHVwOlxyXG4iKTsKPiA+ ICsJLyogU2V0dXAgcHJlZmVycmVkIG1vZGUgLSBzaG91bGQgYmUgbW9kZVswXSBpbiB0aGUgbGlz dCAqLwo+ID4gKwlkcF9jb25uLT5tb2RlX3ByZWZlcnJlZCA9IGMtPm1vZGVzWzBdOwo+ID4gKwlk cF9jb25uLT5mYl93aWR0aCA9IGMtPm1vZGVzWzBdLmhkaXNwbGF5Owo+ID4gKwlkcF9jb25uLT5m Yl9oZWlnaHQgPSBjLT5tb2Rlc1swXS52ZGlzcGxheTsKPiA+ICsKPiA+ICsJZHBfY29ubi0+dGVz dF9wYXR0ZXJuLm1vZGUgPSBjLT5tb2Rlc1swXTsKPiA+ICsJZHBfY29ubi0+dGVzdF9wYXR0ZXJu Lm1vZGUuaGRpc3BsYXkgPSBjLT5tb2Rlc1swXS5oZGlzcGxheTsKPiA+ICsJZHBfY29ubi0+dGVz dF9wYXR0ZXJuLm1vZGUudmRpc3BsYXkgPSBjLT5tb2Rlc1swXS52ZGlzcGxheTsKPiA+ICsKPiA+ ICsJaWd0X2luZm8oIlByZWZlcnJlZCBtb2RlIChtb2RlIDApIGZvciBjb25uZWN0b3IgJXUgaXMg JXV4JXVcclxuIiwKPiA+ICsJCSBkcF9jb25uLT5pZCwgYy0+bW9kZXNbMF0uaGRpc3BsYXksIGMt Pm1vZGVzWzBdLnZkaXNwbGF5KTsKPiA+ICsJZmZsdXNoKHN0ZGluKTsKPiA+ICsKPiA+ICsJZm9y IChpID0gMTsgaSA8IGMtPmNvdW50X21vZGVzOyBpKyspIHsKPiA+ICsJCS8qIFN0YW5kYXJkIG1v ZGUgaXMgODAweDYwMEA2MCAqLwo+ID4gKwkJaWYgKGMtPm1vZGVzW2ldLmhkaXNwbGF5ID09IDgw MCAmJgo+ID4gKwkJICAgIGMtPm1vZGVzW2ldLnZkaXNwbGF5ID09IDYwMCAmJgo+ID4gKwkJICAg IGMtPm1vZGVzW2ldLnZyZWZyZXNoID09IDYwICYmCj4gPiArCQkgICAgZm91bmRfc3RkID09IGZh bHNlKSB7Cj4gPiArCQkJZHBfY29ubi0+bW9kZV9zdGFuZGFyZCA9IGMtPm1vZGVzW2ldOwo+ID4g KwkJCWlndF9pbmZvKCJTdGFuZGFyZCBtb2RlICglZCkgZm9yIGNvbm5lY3RvciAldSBpcyAldXgl dVxyXG4iLAo+ID4gKwkJCQkgaSwKPiA+ICsJCQkJIGMtPmNvbm5lY3Rvcl9pZCwKPiA+ICsJCQkJ IGMtPm1vZGVzW2ldLmhkaXNwbGF5LAo+ID4gKwkJCQkgYy0+bW9kZXNbaV0udmRpc3BsYXkpOwo+ ID4gKwkJCWZvdW5kX3N0ZCA9IHRydWU7Cj4gPiArCQl9Cj4gPiArCQkvKiBGYWlsc2FmZSBtb2Rl IGlzIDY0MHg0ODBANjAgKi8KPiA+ICsJCWlmIChjLT5tb2Rlc1tpXS5oZGlzcGxheSA9PSA2NDAg JiYKPiA+ICsJCSAgICBjLT5tb2Rlc1tpXS52ZGlzcGxheSA9PSA0ODAgJiYKPiA+ICsJCSAgICBj LT5tb2Rlc1tpXS52cmVmcmVzaCA9PSA2MCAmJgo+ID4gKwkJICAgIGZvdW5kX2ZzID09IGZhbHNl KSB7Cj4gPiArCQkJZHBfY29ubi0+bW9kZV9mYWlsc2FmZSA9IGMtPm1vZGVzW2ldOwo+ID4gKwkJ CWRwX2Nvbm4tPmZhaWxzYWZlX3dpZHRoID0gYy0+bW9kZXNbaV0uaGRpc3BsYXk7Cj4gPiArCQkJ ZHBfY29ubi0+ZmFpbHNhZmVfaGVpZ2h0ID0gYy0+bW9kZXNbaV0udmRpc3BsYXk7Cj4gPiArCQkJ aWd0X2luZm8oIkZhaWxzYWZlIG1vZGUgKCVkKSBmb3IgY29ubmVjdG9yICV1IGlzICV1eCV1XHJc biIsCj4gPiArCQkJCSBpLAo+ID4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLAo+ID4gKwkJCQkgYy0+ bW9kZXNbaV0uaGRpc3BsYXksCj4gPiArCQkJCSBjLT5tb2Rlc1tpXS52ZGlzcGxheSk7Cj4gPiAr CQkJZm91bmRfZnMgPSB0cnVlOwo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCXJldCA9IHNl dHVwX2ZyYW1lYnVmZmVycyhkcF9jb25uKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJaWd0X3dh cm4oIkNyZWF0ZSBmcmFtZWJ1ZmZlciBmb3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIs Cj4gPiArCQkJIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJaWYgKGZvdW5kX2ZzKSB7Cj4gPiArCQlyZXQgPSBzZXR1cF9mYWlsc2Fm ZV9mcmFtZWJ1ZmZlcihkcF9jb25uKTsKPiA+ICsJCWlmIChyZXQpIHsKPiA+ICsJCQlpZ3Rfd2Fy bigiQ3JlYXRlIGZhaWxzYWZlIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUiCj4gPiArCQkJ CSAiZmFpbGVkICglZClcclxuIiwKPiA+ICsJCQkJIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiA+ ICsJCQlyZXR1cm4gcmV0Owo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCWlmICh2aWRlb19w YXR0ZXJuX2ZsYWcpIHsKPiA+ICsJCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheSA9IGhk aXNwbGF5Owo+ID4gKwkJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnZkaXNwbGF5ID0gdmRpc3BsYXk7 Cj4gPiArCQlkcF9jb25uLT50ZXN0X3BhdHRlcm4uYml0ZGVwdGggPSBiaXRkZXB0aDsKPiA+ICsJ CXJldCA9IHNldHVwX3ZpZGVvX3BhdHRlcm5fZnJhbWVidWZmZXIoZHBfY29ubik7Cj4gPiArCQlp ZiAocmV0KSB7Cj4gPiArCQkJaWd0X3dhcm4oIkNyZWF0ZSBmcmFtZWJ1ZmZlciBmb3IgY29ubmVj dG9yICV1IGZhaWxlZCAoJWQpXHJcbiIsCj4gPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7 Cj4gPiArCQkJcmV0dXJuIHJldDsKPiA+ICsJCX0KPiA+ICsJCXJldCA9IGZpbGxfZnJhbWVidWZm ZXIoZHBfY29ubik7Cj4gPiArCQlpZiAocmV0KSB7Cj4gPiArCQkJaWd0X3dhcm4oIkZpbGwgZnJh bWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSBmYWlsZWQgKCVkKVxyXG4iLAo+ID4gKwkJCQkgYy0+ Y29ubmVjdG9yX2lkLCByZXQpOwo+ID4gKwkJCXJldHVybiByZXQ7Cj4gPiArCQl9Cj4gPiArCX0K PiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBzZXRf dmlkZW8oaW50IG1vZGUsIHN0cnVjdCBjb25uZWN0b3IgKnRlc3RfY29ubmVjdG9yKQo+ID4gK3sK PiA+ICsJZHJtTW9kZU1vZGVJbmZvICpyZXF1ZXN0ZWRfbW9kZTsKPiA+ICsJdWludDMyX3QgcmVx dWlyZWRfZmJfaWQ7Cj4gPiArCXN0cnVjdCBpZ3RfZmIgcmVxdWlyZWRfZmI7Cj4gPiArCWludCBy ZXQgPSAwOwo+ID4gKwo+ID4gKwlzd2l0Y2ggKG1vZGUpIHsKPiA+ICsJY2FzZSBJTlRFTF9NT0RF X05PTkU6Cj4gPiArCQlpZ3RfaW5mbygiTk9ORVxyXG4iKTsKPiA+ICsJCXJldCA9IGRybU1vZGVT ZXRDcnRjKGRybV9mZCwgdGVzdF9jb25uZWN0b3ItPmNydGMsCj4gPiArCQkJCSAgICAgLTEsIDAs IDAsIE5VTEwsIDAsIE5VTEwpOwo+ID4gKwkJZ290byBvdXQ7Cj4gPiArCWNhc2UgSU5URUxfTU9E RV9QUkVGRVJSRUQ6Cj4gPiArCQlpZ3RfaW5mbygiUFJFRkVSUkVEXHJcbiIpOwo+ID4gKwkJcmVx dWVzdGVkX21vZGUgPSAgJnRlc3RfY29ubmVjdG9yLT5tb2RlX3ByZWZlcnJlZDsKPiA+ICsJCXJl cXVpcmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3ItPmZiOwo+ID4gKwkJcmVxdWlyZWRfZmIgPSB0 ZXN0X2Nvbm5lY3Rvci0+ZmJfdmlkZW9fcGF0dGVybjsKPiA+ICsJCWJyZWFrOwo+ID4gKwljYXNl IElOVEVMX01PREVfU1RBTkRBUkQ6Cj4gPiArCQlpZ3RfaW5mbygiU1RBTkRBUkRcclxuIik7Cj4g PiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfc3RhbmRhcmQ7Cj4g PiArCQlyZXF1aXJlZF9mYl9pZCA9IHRlc3RfY29ubmVjdG9yLT5mYjsKPiA+ICsJCXJlcXVpcmVk X2ZiID0gdGVzdF9jb25uZWN0b3ItPmZiX3ZpZGVvX3BhdHRlcm47Cj4gPiArCQlicmVhazsKPiA+ ICsJY2FzZSBJTlRFTF9NT0RFX0ZBSUxTQUZFOgo+ID4gKwkJaWd0X2luZm8oIkZBSUxTQUZFXHJc biIpOwo+ID4gKwkJcmVxdWVzdGVkX21vZGUgPSAgJnRlc3RfY29ubmVjdG9yLT5tb2RlX2ZhaWxz YWZlOwo+ID4gKwkJcmVxdWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmFpbHNhZmVfZmI7 Cj4gPiArCQlyZXF1aXJlZF9mYiA9IHRlc3RfY29ubmVjdG9yLT5mYl9mYWlsc2FmZV9wYXR0ZXJu Owo+ID4gKwkJYnJlYWs7Cj4gPiArCWNhc2UgSU5URUxfTU9ERV9WSURFT19QQVRURVJOX1RFU1Q6 Cj4gPiArCQlpZ3RfaW5mbygiVklERU8gUEFUVEVSTiBURVNUXHJcbiIpOwo+ID4gKwkJcmVxdWVz dGVkX21vZGUgPSAmdGVzdF9jb25uZWN0b3ItPnRlc3RfcGF0dGVybi5tb2RlOwo+ID4gKwkJcmVx dWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLmZiOwo+ID4gKwkJcmVx dWlyZWRfZmIgPSB0ZXN0X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm47Cj4gPiAr CQlicmVhazsKPiA+ICsJY2FzZSBJTlRFTF9NT0RFX0lOVkFMSUQ6Cj4gPiArCWRlZmF1bHQ6Cj4g PiArCQlpZ3Rfd2FybigiSU5WQUxJRCEgKCUwOHgpIE1vZGUgc2V0IGFib3J0ZWQhXHJcbiIsIG1v ZGUpOwo+ID4gKwkJcmV0dXJuIC0xOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlndF9pbmZvKCJDUlRD KCV1KToiLCB0ZXN0X2Nvbm5lY3Rvci0+Y3J0Yyk7Cj4gPiArCWttc3Rlc3RfZHVtcF9tb2RlKHJl cXVlc3RlZF9tb2RlKTsKPiA+ICsJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCB0ZXN0X2Nv bm5lY3Rvci0+Y3J0YywgcmVxdWlyZWRfZmJfaWQsIDAsIDAsCj4gPiArCQkJICAgICAmdGVzdF9j b25uZWN0b3ItPmlkLCAxLCByZXF1ZXN0ZWRfbW9kZSk7Cj4gPiArCWlmIChyZXQpIHsKPiA+ICsJ CWlndF93YXJuKCJmYWlsZWQgdG8gc2V0IG1vZGUgKCVkeCVkQCVkSHopOiAlc1xuIiwKPiA+ICsJ CQkgcmVxdWVzdGVkX21vZGUtPmhkaXNwbGF5LCByZXF1ZXN0ZWRfbW9kZS0+dmRpc3BsYXksCj4g PiArCQkJIHJlcXVlc3RlZF9tb2RlLT52cmVmcmVzaCwgc3RyZXJyb3IoZXJybm8pKTsKPiA+ICsJ CWlndF9yZW1vdmVfZmIoZHJtX2ZkLCAmcmVxdWlyZWRfZmIpOwo+ID4gKwo+ID4gKwl9Cj4gPiAr CS8qIEtlZXAgdGhlIHBhdHRlcm4gb24gb3V0cHV0IGxpbmVzIGZvciBhdGxlYXN0IDAuNSBzZWNz IGZvcgo+ID4gKwkgKiBEUFItMTIwIHRvIGRldGVjdCBpdC4KPiA+ICsJICovCj4gPiArCXVzbGVl cCgxMDAwMDAwKTsKPiA+ICsKPiA+ICtvdXQ6Cj4gPiArCWlmIChyZXQpIHsKPiA+ICsJCWlndF93 YXJuKCJGYWlsZWQgdG8gc2V0IENSVEMgZm9yIGNvbm5lY3RvciAldVxyXG4iLAo+ID4gKwkJCSB0 ZXN0X2Nvbm5lY3Rvci0+aWQpOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQKPiA+ICtzZXRfZGVmYXVsdF9tb2RlKHN0cnVjdCBjb25u ZWN0b3IgKmMpCj4gPiArewo+ID4gKwl1bnNpZ25lZCBpbnQgZmJfaWQgPSAwOwo+ID4gKwlzdHJ1 Y3QgaWd0X2ZiIGZiX2luZm87Cj4gPiArCWludCByZXQgPSAwOwo+ID4gKwo+ID4gKwljLT5tb2Rl ID0gYy0+Y29ubmVjdG9yLT5tb2Rlc1swXTsKPiA+ICsKPiA+ICsJaWYgKCFjLT5tb2RlX3ZhbGlk KQo+ID4gKwkJcmV0dXJuIC0xOwo+ID4gKwo+ID4gKwl3aWR0aCA9IGMtPm1vZGUuaGRpc3BsYXk7 Cj4gPiArCWhlaWdodCA9IGMtPm1vZGUudmRpc3BsYXk7Cj4gPiArCj4gPiArCWZiX2lkID0gaWd0 X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRybV9mZCwgd2lkdGgsIGhlaWdodCwKPiA+ICsJCQkJICAgICAg RFJNX0ZPUk1BVF9YUkdCODg4OCwKPiA+ICsJCQkJICAgICAgdGlsaW5nLCAmZmJfaW5mbyk7Cj4g PiArCj4gPiArCWlndF9pbmZvKCJDUlRDKCV1KTpbJWRdIiwgYy0+Y3J0YywgMCk7Cj4gPiArCWtt c3Rlc3RfZHVtcF9tb2RlKCZjLT5tb2RlKTsKPiA+ICsJZHJtTW9kZVNldENydGMoZHJtX2ZkLCBj LT5jcnRjLCAtMSwgMCwgMCwgTlVMTCwgMCwgTlVMTCk7Cj4gPiArCXJldCA9IGRybU1vZGVTZXRD cnRjKGRybV9mZCwgYy0+Y3J0YywgZmJfaWQsIDAsIDAsCj4gPiArCQkJICAgICAmYy0+aWQsIDEs ICZjLT5tb2RlKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBz ZXQgbW9kZSAoJWR4JWRAJWRIeik6ICVzXG4iLCB3aWR0aCwgaGVpZ2h0LCBjLT5tb2RlLnZyZWZy ZXNoLCBzdHJlcnJvcihlcnJubykpOwo+ID4gKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZmYl9p bmZvKTsKPiA+ICsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsK PiA+ICsvKgo+ID4gKyAqIFJlLXByb2JlIGNvbm5lY3RvcnMgYW5kIGRvIGEgbW9kZXNldCBiYXNl ZCBvbiB0ZXN0IHJlcXVlc3Qgb3IKPiA+ICsgKiBpbiBjYXNlIG9mIGEgaG90cGx1ZyB1ZXZlbnQu Cj4gPiArICoKPiA+ICsgKiBAbW9kZTogVmlkZW8gbW9kZSByZXF1ZXN0ZWQgYnkgdGhlIHRlc3QK PiA+ICsgKiBAaXNfY29tcGxpYW5jZV90ZXN0OiAxOiBJZiBpdCBpcyBhIGNvbXBsaWFuY2UgdGVz dAo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgIDA6IElmIGl0IGlzIGEgaG90cGx1ZyBldmVu dAo+ID4gKyAqCj4gPiArICogUmV0dXJuczoKPiA+ICsgKiAwOiBPbiBTdWNjZXNzCj4gPiArICog LTE6IE9uIGZhaWx1cmUKPiA+ICsgKi8KPiA+ICtpbnQgdXBkYXRlX2Rpc3BsYXkoaW50IG1vZGUs IGJvb2wgaXNfY29tcGxpYW5jZV90ZXN0KQo+ID4gK3sKPiA+ICsJc3RydWN0IGNvbm5lY3RvciAq Y29ubmVjdG9yczsKPiA+ICsJaW50IGMsIHJldCA9IDA7Cj4gPiArCXVuc2lnbmVkIGxvbmcgY3J0 Y19pZHhfbWFzayA9IC0xVUw7Cj4gPiArCj4gPiArCXJlc291cmNlcyA9IGRybU1vZGVHZXRSZXNv dXJjZXMoZHJtX2ZkKTsKPiA+ICsJaWYgKCFyZXNvdXJjZXMpIHsKPiA+ICsJCWlndF93YXJuKCJk cm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cj4gPiAr CQlyZXR1cm4gLTE7Cj4gPiArCX0KPiA+ICsKPiA+ICsJY29ubmVjdG9ycyA9IGNhbGxvYyhyZXNv dXJjZXMtPmNvdW50X2Nvbm5lY3RvcnMsCj4gPiArCQkJICAgIHNpemVvZihzdHJ1Y3QgY29ubmVj dG9yKSk7Cj4gPiArCWlmICghY29ubmVjdG9ycykKPiA+ICsJCXJldHVybiAtMTsKPiA+ICsKPiA+ ICsJLyogRmluZCBhbnkgY29ubmVjdGVkIGRpc3BsYXlzICovCj4gPiArCWZvciAoYyA9IDA7IGMg PCByZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGMrKykgewo+ID4gKwo+ID4gKwkJc3RydWN0 IGNvbm5lY3RvciAqY29ubmVjdG9yID0gJmNvbm5lY3RvcnNbY107Cj4gPiArCj4gPiArCQljb25u ZWN0b3ItPmlkID0gcmVzb3VyY2VzLT5jb25uZWN0b3JzW2NdOwo+ID4gKwkJY29ubmVjdG9yX2Zp bmRfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLT5pZCwKPiA+ICsJCQkJCSAgICAgIGNydGNfaWR4 X21hc2ssCj4gPiArCQkJCQkgICAgICBjb25uZWN0b3IpOwo+ID4gKwkJaWYgKCFjb25uZWN0b3It Pm1vZGVfdmFsaWQpCj4gPiArCQkJY29udGludWU7Cj4gPiArCQlpZiAoaXNfY29tcGxpYW5jZV90 ZXN0KSB7Cj4gPiArCQkJc2V0X3Rlc3RfbW9kZShjb25uZWN0b3IpOwo+ID4gKwkJCXJldCA9IHNl dF92aWRlbyhJTlRFTF9NT0RFX05PTkUsIGNvbm5lY3Rvcik7Cj4gPiArCQkJcmV0ID0gc2V0X3Zp ZGVvKG1vZGUsIGNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCQl9IGVsc2UKPiA+ICsJCQlyZXQgPSBz ZXRfZGVmYXVsdF9tb2RlKGNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCQljcnRjX2lkeF9tYXNrICY9 IH4oMSA8PCBjb25uZWN0b3ItPnBpcGUpOwo+ID4gKwo+ID4gKwkJZHJtTW9kZUZyZWVFbmNvZGVy KGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiArCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0 b3ItPmNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCX0KPiA+ICsKPiA+ICsJLyogRXJyb3IgY29uZGl0 aW9uIGlmIG5vIGNvbm5lY3RlZCBkaXNwbGF5cyAqLwo+ID4gKwo+ID4gKwlmcmVlKGNvbm5lY3Rv cnMpOwo+ID4gKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNvdXJjZXMpOwo+ID4gKwlyZXR1cm4g cmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgY2hhciBvcHRzdHJbXSA9ICJoaSI7 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSB1c2FnZShj aGFyICpuYW1lLCBjaGFyIG9wdCkKPiA+ICt7Cj4gPiArCWlndF9pbmZvKCJ1c2FnZTogJXMgWy1o aV1cbiIsIG5hbWUpOwo+ID4gKwlpZ3RfaW5mbygiXHQtaVx0ZHVtcCBpbmZvXG4iKTsKPiA+ICsJ aWd0X2luZm8oIlx0RGVmYXVsdCBpcyB0byByZXNwb25kIHRvIERQUi0xMjAgdGVzdHMuXG4iKTsK PiA+ICsJZXhpdCgob3B0ICE9ICdoJykgPyAtMSA6IDApOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0 aWMgdm9pZCBjbGVhbnVwX2RlYnVnZnModm9pZCkKPiA+ICt7Cj4gPiArCWZjbG9zZSh0ZXN0X2Fj dGl2ZV9mcCk7Cj4gPiArCWZjbG9zZSh0ZXN0X2RhdGFfZnApOwo+ID4gKwlmY2xvc2UodGVzdF90 eXBlX2ZwKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9y ZXR1cm4pKSBjbGVhbnVwX2FuZF9leGl0KGludCByZXQpCj4gPiArewo+ID4gKwljbGVhbnVwX2Rl YnVnZnMoKTsKPiA+ICsJY2xvc2UoZHJtX2ZkKTsKPiA+ICsJaWd0X2luZm8oIkNvbXBsaWFuY2Ug dGVzdGluZyBBcHBsaWNhdGlvbiBFeGl0aW5nXG4iKTsKPiA+ICsJZXhpdChyZXQpOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBjbGVhbnVwX3Rlc3Qodm9pZCkKPiA+ICt7Cj4gPiArCXZp ZGVvX3BhdHRlcm5fZmxhZyA9IGZhbHNlOwo+ID4gKwloZGlzcGxheSA9IDA7Cj4gPiArCXZkaXNw bGF5ID0gMDsKPiA+ICsJYml0ZGVwdGggPSAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCByZWFkX3Rlc3RfcmVxdWVzdCh2b2lkKQo+ID4gK3sKPiA+ICsJdW5zaWduZWQgbG9uZyB0ZXN0 X3R5cGU7Cj4gPiArCj4gPiArCXRlc3RfdHlwZSA9IGdldF90ZXN0X3R5cGUoKTsKPiA+ICsJcHJv Y2Vzc190ZXN0X3JlcXVlc3QodGVzdF90eXBlKTsKPiA+ICsJY2xlYW51cF90ZXN0KCk7Cj4gPiAr CWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBnYm9vbGVhbiB0 ZXN0X2hhbmRsZXIoR0lPQ2hhbm5lbCAqc291cmNlLCBHSU9Db25kaXRpb24gY29uZGl0aW9uLAo+ ID4gKwkJCSAgICAgZ3BvaW50ZXIgZGF0YSkKPiA+ICt7Cj4gPiArCXVuc2lnbmVkIGxvbmcgdGVz dF9hY3RpdmU7Cj4gPiArCj4gPiArCXJld2luZCh0ZXN0X2FjdGl2ZV9mcCk7Cj4gPiArCWZzY2Fu Zih0ZXN0X2FjdGl2ZV9mcCwgIiVseCIsICZ0ZXN0X2FjdGl2ZSk7Cj4gPiArCWlmICh0ZXN0X2Fj dGl2ZSkKPiA+ICsJCXJlYWRfdGVzdF9yZXF1ZXN0KCk7Cj4gPiArCXJldHVybiBUUlVFOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgZ2Jvb2xlYW4gaW5wdXRfZXZlbnQoR0lPQ2hhbm5lbCAqc291 cmNlLCBHSU9Db25kaXRpb24gY29uZGl0aW9uLAo+ID4gKwkJCQlncG9pbnRlciBkYXRhKQo+ID4g K3sKPiA+ICsJZ2NoYXIgYnVmWzJdOwo+ID4gKwlnc2l6ZSBjb3VudDsKPiA+ICsKPiA+ICsJY291 bnQgPSByZWFkKGdfaW9fY2hhbm5lbF91bml4X2dldF9mZChzb3VyY2UpLCBidWYsIHNpemVvZihi dWYpKTsKPiA+ICsJaWYgKGJ1ZlswXSA9PSAncScgJiYgKGNvdW50ID09IDEgfHwgYnVmWzFdID09 ICdcbicpKSB7Cj4gPiArCQljbGVhbnVwX2FuZF9leGl0KDApOwo+ID4gKwl9Cj4gPiArCj4gPiAr CXJldHVybiBUUlVFOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBlbnRlcl9leGVjX3Bh dGgoY2hhciAqKmFyZ3YpCj4gPiArewo+ID4gKwljaGFyICpleGVjX3BhdGggPSBOVUxMOwo+ID4g KwljaGFyICpwb3MgPSBOVUxMOwo+ID4gKwlzaG9ydCBsZW5fcGF0aCA9IDA7Cj4gPiArCWludCBy ZXQ7Cj4gPiArCj4gPiArCWxlbl9wYXRoID0gc3RybGVuKGFyZ3ZbMF0pOwo+ID4gKwlleGVjX3Bh dGggPSAoY2hhciAqKSBtYWxsb2MobGVuX3BhdGgpOwo+ID4gKwo+ID4gKwltZW1jcHkoZXhlY19w YXRoLCBhcmd2WzBdLCBsZW5fcGF0aCk7Cj4gPiArCXBvcyA9IHN0cnJjaHIoZXhlY19wYXRoLCAn LycpOwo+ID4gKwlpZiAocG9zICE9IE5VTEwpCj4gPiArCQkqKHBvcysxKSA9ICdcMCc7Cj4gPiAr Cj4gPiArCXJldCA9IGNoZGlyKGV4ZWNfcGF0aCk7Cj4gPiArCWlndF9hc3NlcnRfZXEocmV0LCAw KTsKPiA+ICsJZnJlZShleGVjX3BhdGgpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBy ZXN0b3JlX3Rlcm1pb19tb2RlKGludCBzaWcpCj4gPiArewo+ID4gKwl0Y3NldGF0dHIodGlvX2Zk LCBUQ1NBTk9XLCAmc2F2ZWRfdGlvKTsKPiA+ICsJY2xvc2UodGlvX2ZkKTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHZvaWQgc2V0X3Rlcm1pb19tb2RlKHZvaWQpCj4gPiArewo+ID4gKwlzdHJ1 Y3QgdGVybWlvcyB0aW87Cj4gPiArCj4gPiArCS8qIGRvbid0IGF0dGVtcHQgdG8gc2V0IHRlcm1p bmFsIGF0dHJpYnV0ZXMgaWYgbm90IGluIHRoZSBmb3JlZ3JvdW5kCj4gPiArCSAqIHByb2Nlc3Mg Z3JvdXAKPiA+ICsJICovCj4gPiArCWlmIChnZXRwZ3JwKCkgIT0gdGNnZXRwZ3JwKFNURE9VVF9G SUxFTk8pKQo+ID4gKwkJcmV0dXJuOwo+ID4gKwo+ID4gKwl0aW9fZmQgPSBkdXAoU1RESU5fRklM RU5PKTsKPiA+ICsJdGNnZXRhdHRyKHRpb19mZCwgJnNhdmVkX3Rpbyk7Cj4gPiArCWlndF9pbnN0 YWxsX2V4aXRfaGFuZGxlcihyZXN0b3JlX3Rlcm1pb19tb2RlKTsKPiA+ICsJdGlvID0gc2F2ZWRf dGlvOwo+ID4gKwl0aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwo+ID4gKwl0Y3NldGF0 dHIodGlvX2ZkLCBUQ1NBTk9XLCAmdGlvKTsKPiA+ICt9Cj4gPiArCj4gPiAraW50IG1haW4oaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQo+ID4gK3sKPiA+ICsJaW50IGM7Cj4gPiArCWludCByZXQgPSAw Owo+ID4gKwlHSU9DaGFubmVsICpzdGRpbmNoYW5uZWwsICp0ZXN0YWN0aXZlX2NoYW5uZWw7Cj4g PiArCUdNYWluTG9vcCAqbWFpbmxvb3A7Cj4gPiArCWJvb2wgb3B0X2R1bXBfaW5mbyA9IGZhbHNl Owo+ID4gKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewo+ID4gKwkJeyJoZWxwLWRlc2Ny aXB0aW9uIiwgMCwgMCwgSEVMUF9ERVNDUklQVElPTn0sCj4gPiArCQl7ImhlbHAiLCAwLCAwLCAn aCd9LAo+ID4gKwl9Owo+ID4gKwo+ID4gKwlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9uKCk7Cj4gPiAr Cj4gPiArCWVudGVyX2V4ZWNfcGF0aChhcmd2KTsKPiA+ICsKPiA+ICsJd2hpbGUgKChjID0gZ2V0 b3B0X2xvbmcoYXJnYywgYXJndiwgb3B0c3RyLCBsb25nX29wdHMsIE5VTEwpKSAhPSAtMSkgewo+ ID4gKwkJc3dpdGNoIChjKSB7Cj4gPiArCQljYXNlICdpJzoKPiA+ICsJCQlvcHRfZHVtcF9pbmZv ID0gdHJ1ZTsKPiA+ICsJCQlicmVhazsKPiA+ICsJCWNhc2UgSEVMUF9ERVNDUklQVElPTjoKPiA+ ICsJCQlpZ3RfaW5mbygiRFAgQ29tcGxpYW5jZSBUZXN0IFN1aXRlIHVzaW5nIERQUi0xMjBcbiIp Owo+ID4gKwkJCWlndF9pbmZvKCJFRElEIFRlc3RzXG4iKTsKPiA+ICsJCQlpZ3RfaW5mbygiVmlk ZW8gUGF0dGVybiBHZW5lcmF0aW9uIFRlc3RzXG4iKTsKPiA+ICsJCQlleGl0KDApOwo+ID4gKwkJ CWJyZWFrOwo+ID4gKwkJZGVmYXVsdDoKPiA+ICsJCQkvKiBmYWxsIHRocm91Z2ggKi8KPiA+ICsJ CWNhc2UgJ2gnOgo+ID4gKwkJCXVzYWdlKGFyZ3ZbMF0sIGMpOwo+ID4gKwkJCWJyZWFrOwo+ID4g KwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCXNldF90ZXJtaW9fbW9kZSgpOwo+ID4gKwo+ID4gKwlp Z3RfaW5mbygiKioqKioqKioqKioqKkRQIENvbXBsaWFuY2UgVGVzdGluZyB1c2luZyBEUFItMTIw KioqKioqKioqKioqKlxuIik7Cj4gPiArCWlndF9pbmZvKCJXYWl0aW5nIGZvciBUZXN0IFJlcXVl c3QgSW5wdXQuLi4uLi5cbiIpOwo+ID4gKwlkcm1fZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVS X0FOWSk7Cj4gPiArCj4gPiArCWlmIChvcHRfZHVtcF9pbmZvKSB7Cj4gPiArCQlkdW1wX2luZm8o KTsKPiA+ICsJCWdvdG8gb3V0X2Nsb3NlOwo+ID4gKwl9Cj4gPiArCj4gPiArCWttc3Rlc3Rfc2V0 X3Z0X2dyYXBoaWNzX21vZGUoKTsKPiA+ICsJc2V0dXBfZGVidWdmc19maWxlcygpOwo+ID4gKwlj bGVhbnVwX3Rlc3QoKTsKPiA+ICsKPiA+ICsJbWFpbmxvb3AgPSBnX21haW5fbG9vcF9uZXcoTlVM TCwgRkFMU0UpOwo+ID4gKwlpZiAoIW1haW5sb29wKSB7Cj4gPiArCQlpZ3Rfd2FybigiZmFpbGVk IHRvIGNyZWF0ZSBnbGliIG1haW5sb29wXG4iKTsKPiA+ICsJCXJldCA9IC0xOwo+ID4gKwkJZ290 byBvdXRfY2xvc2U7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKCFpbnRlbF9kcF9jb21wbGlhbmNl X3NldHVwX2hvdHBsdWcoKSkgewo+ID4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBpbml0aWFsaXpl IGhvdHBsdWcgc3VwcG9ydFxuIik7Cj4gPiArCQlnb3RvIG91dF9tYWlubG9vcDsKPiA+ICsJfQo+ ID4gKwo+ID4gKwl0ZXN0YWN0aXZlX2NoYW5uZWwgPSBnX2lvX2NoYW5uZWxfdW5peF9uZXcoZmls ZW5vKHRlc3RfYWN0aXZlX2ZwKSk7Cj4gPiArCWlmICghdGVzdGFjdGl2ZV9jaGFubmVsKSB7Cj4g PiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBUZXN0IEFjdGl2ZSBHSU8gY2hhbm5lbFxu Iik7Cj4gPiArCQlnb3RvIG91dF9jbG9zZTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXQgPSBnX2lv X2FkZF93YXRjaCh0ZXN0YWN0aXZlX2NoYW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VSUiwgdGVzdF9o YW5kbGVyLAo+ID4gKwkJCSAgICAgTlVMTCk7Cj4gPiArCWlmIChyZXQgPCAwKSB7Cj4gPiArCQlp Z3Rfd2FybigiZmFpbGVkIHRvIGFkZCB3YXRjaCBvbiB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiA+ ICsJCWdvdG8gb3V0X2Nsb3NlOwo+ID4gKwl9Cj4gPiArCj4gPiArCXN0ZGluY2hhbm5lbCA9IGdf aW9fY2hhbm5lbF91bml4X25ldygwKTsKPiA+ICsJaWYgKCFzdGRpbmNoYW5uZWwpIHsKPiA+ICsJ CWlndF93YXJuKCJmYWlsZWQgdG8gY3JlYXRlIHN0ZGluIEdJTyBjaGFubmVsXG4iKTsKPiA+ICsJ CWdvdG8gb3V0X2hvdHBsdWc7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0ID0gZ19pb19hZGRfd2F0 Y2goc3RkaW5jaGFubmVsLCBHX0lPX0lOIHwgR19JT19FUlIsIGlucHV0X2V2ZW50LAo+ID4gKwkJ CSAgICAgTlVMTCk7Cj4gPiArCWlmIChyZXQgPCAwKSB7Cj4gPiArCQlpZ3Rfd2FybigiZmFpbGVk IHRvIGFkZCB3YXRjaCBvbiBzdGRpbiBHSU8gY2hhbm5lbFxuIik7Cj4gPiArCQlnb3RvIG91dF9z dGRpbzsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXQgPSAwOwo+ID4gKwo+ID4gKwlnX21haW5fbG9v cF9ydW4obWFpbmxvb3ApOwo+ID4gKwo+ID4gK291dF9zdGRpbzoKPiA+ICsJZ19pb19jaGFubmVs X3NodXRkb3duKHN0ZGluY2hhbm5lbCwgVFJVRSwgTlVMTCk7Cj4gPiArb3V0X2hvdHBsdWc6Cj4g PiArCWludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKCk7Cj4gPiArb3V0X21haW5s b29wOgo+ID4gKwlnX21haW5fbG9vcF91bnJlZihtYWlubG9vcCk7Cj4gPiArb3V0X2Nsb3NlOgo+ ID4gKwljbGVhbnVwX2RlYnVnZnMoKTsKPiA+ICsJY2xvc2UoZHJtX2ZkKTsKPiA+ICsKPiA+ICsJ aWd0X2Fzc2VydF9lcShyZXQsIDApOwo+ID4gKwo+ID4gKwlpZ3RfaW5mbygiQ29tcGxpYW5jZSB0 ZXN0aW5nIGFwcGxpY2F0aW9uIGV4aXRpbmcuXG4iKTsKPiA+ICsJaWd0X2V4aXQoKTsKPiA+ICt9 Cj4gPiBkaWZmIC0tZ2l0IGEvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5oIGIvdG9vbHMvaW50 ZWxfZHBfY29tcGxpYW5jZS5oCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAw MDAwMC4uYWRlMWUyZgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvdG9vbHMvaW50ZWxfZHBf Y29tcGxpYW5jZS5oCj4gPiBAQCAtMCwwICsxLDM1IEBACj4gPiArLyoKPiA+ICsgKiBDb3B5cmln aHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgo+ID4gKyAqIE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5k Lm5hdmFyZUBpbnRlbC5jb20+Cj4gPiArICoKPiA+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ID4gKyAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCj4gPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+ID4gKyAqIHRoZSBy aWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBz dWJsaWNlbnNlLAo+ID4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu ZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ID4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5p c2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gPiAr ICoKPiA+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u IG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+ID4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+ID4gKyAqCj4gPiArICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVY UFJFU1MgT1IKPiA+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiA+ICsgKiBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBU SEUKPiA+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gPiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFO IEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiA+ICsgKiBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SIE9USEVSIERFQUxJTkdTCj4gPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ID4gKyAqLwo+ID4g Kwo+ID4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ID4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiA+ICsj aW5jbHVkZSA8c3RkbGliLmg+Cj4gPiArI2luY2x1ZGUgPGdsaWIuaD4KPiA+ICsKPiA+ICtleHRl cm4gaW50IGRybV9mZDsKPiA+ICsKPiA+ICtnYm9vbGVhbiBpbnRlbF9kcF9jb21wbGlhbmNlX3Nl dHVwX2hvdHBsdWcodm9pZCk7Cj4gPiArdm9pZCBpbnRlbF9kcF9jb21wbGlhbmNlX2NsZWFudXBf aG90cGx1Zyh2b2lkKTsKPiA+ICsKPiA+ICsvKiBjYWxsZWQgYnkgdGhlIGhvdHBsdWcgY29kZSAq Lwo+ID4gK2ludCB1cGRhdGVfZGlzcGxheShpbnQgbW9kZSwgYm9vbCBpc19jb21wbGlhbmNlX3Rl c3QpOwo+ID4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5j IGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKPiA+IG5ldyBmaWxlIG1vZGUg MTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi5kNDg5MDI2Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiAr KysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlX2hvdHBsdWcuYwo+ID4gQEAgLTAsMCArMSwx MjMgQEAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uCj4g PiArICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+Cj4gPiArICoKPiA+ ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55 IHBlcnNvbiBvYnRhaW5pbmcgYQo+ID4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gPiArICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgo+ID4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1l cmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ID4gKyAqIGFuZC9vciBzZWxs IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRo ZQo+ID4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gPiArICoKPiA+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+ ID4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJl Lgo+ID4gKyAqCj4gPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiA+ICsgKiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSwKPiA+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklO R0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKPiA+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdI VCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gPiAr ICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBP VEhFUldJU0UsIEFSSVNJTkcKPiA+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4gPiArICogSU4g VEhFIFNPRlRXQVJFLgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlICJpZ3QuaCIKPiA+ICsj aW5jbHVkZSA8c3RkaW8uaD4KPiA+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4gPiArI2luY2x1ZGUg PHN0ZGxpYi5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ID4gKwo+ID4gKyNp bmNsdWRlICJpbnRlbF9kcF9jb21wbGlhbmNlLmgiCj4gPiArI2luY2x1ZGUgPGxpYnVkZXYuaD4K PiA+ICtzdGF0aWMgc3RydWN0IHVkZXZfbW9uaXRvciAqdWV2ZW50X21vbml0b3I7Cj4gPiArc3Rh dGljIHN0cnVjdCB1ZGV2ICp1ZGV2Owo+ID4gK3N0YXRpYyBHSU9DaGFubmVsICp1ZGV2Y2hhbm5l bDsKPiA+ICsKPiA+ICtzdGF0aWMgZ2Jvb2xlYW4gaG90cGx1Z19ldmVudChHSU9DaGFubmVsICpz b3VyY2UsIEdJT0NvbmRpdGlvbiBjb25kaXRpb24sCj4gPiArCQkJICAgICAgZ3BvaW50ZXIgZGF0 YSkKPiA+ICt7Cj4gPiArCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2Owo+ID4gKwlkZXZfdCB1ZGV2 X2Rldm51bTsKPiA+ICsJc3RydWN0IHN0YXQgczsKPiA+ICsJY29uc3QgY2hhciAqaG90cGx1ZzsK PiA+ICsKPiA+ICsJZGV2ID0gdWRldl9tb25pdG9yX3JlY2VpdmVfZGV2aWNlKHVldmVudF9tb25p dG9yKTsKPiA+ICsJaWYgKCFkZXYpCj4gPiArCQlnb3RvIG91dDsKPiA+ICsKPiA+ICsJdWRldl9k ZXZudW0gPSB1ZGV2X2RldmljZV9nZXRfZGV2bnVtKGRldik7Cj4gPiArCWZzdGF0KGRybV9mZCwg JnMpOwo+ID4gKwo+ID4gKwlob3RwbHVnID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVl KGRldiwgIkhPVFBMVUciKTsKPiA+ICsKPiA+ICsJaWYgKG1lbWNtcCgmcy5zdF9yZGV2LCAmdWRl dl9kZXZudW0sIHNpemVvZihkZXZfdCkpID09IDAgJiYKPiA+ICsJICAgIGhvdHBsdWcgJiYgYXRv aShob3RwbHVnKSA9PSAxKQo+ID4gKwkJdXBkYXRlX2Rpc3BsYXkoMCwgZmFsc2UpOwo+ID4gKwo+ ID4gKwl1ZGV2X2RldmljZV91bnJlZihkZXYpOwo+ID4gK291dDoKPiA+ICsJcmV0dXJuIFRSVUU7 Cj4gPiArfQo+ID4gKwo+ID4gKwo+ID4gK2dib29sZWFuIGludGVsX2RwX2NvbXBsaWFuY2Vfc2V0 dXBfaG90cGx1Zyh2b2lkKQo+ID4gK3sKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJdWRldiA9 IHVkZXZfbmV3KCk7Cj4gPiArCWlmICghdWRldikgewo+ID4gKwkJaWd0X3dhcm4oImZhaWxlZCB0 byBjcmVhdGUgdWRldiBvYmplY3RcbiIpOwo+ID4gKwkJZ290byBvdXQ7Cj4gPiArCX0KPiA+ICsK PiA+ICsJdWV2ZW50X21vbml0b3IgPSB1ZGV2X21vbml0b3JfbmV3X2Zyb21fbmV0bGluayh1ZGV2 LCAidWRldiIpOwo+ID4gKwlpZiAoIXVldmVudF9tb25pdG9yKSB7Cj4gPiArCQlpZ3Rfd2Fybigi ZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IGV2ZW50IG1vbml0b3JcbiIpOwo+ID4gKwkJZ290byBvdXQ7 Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0ID0gdWRldl9tb25pdG9yX2ZpbHRlcl9hZGRfbWF0Y2hf c3Vic3lzdGVtX2RldnR5cGUodWV2ZW50X21vbml0b3IsCj4gPiArCQkJCQkJCSAgICAgICJkcm0i LAo+ID4gKwkJCQkJCQkgICAgICAiZHJtX21pbm9yIik7Cj4gPiArCWlmIChyZXQgPCAwKSB7Cj4g PiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGZpbHRlciBmb3IgZHJtIGV2ZW50c1xuIik7Cj4gPiAr CQlnb3RvIG91dDsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXQgPSB1ZGV2X21vbml0b3JfZW5hYmxl X3JlY2VpdmluZyh1ZXZlbnRfbW9uaXRvcik7Cj4gPiArCWlmIChyZXQgPCAwKSB7Cj4gPiArCQlp Z3Rfd2FybigiZmFpbGVkIHRvIGVuYWJsZSB1ZGV2IGV2ZW50IHJlY2VwdGlvblxuIik7Cj4gPiAr CQlnb3RvIG91dDsKPiA+ICsJfQo+ID4gKwo+ID4gKwl1ZGV2Y2hhbm5lbCA9Cj4gPiArCQlnX2lv X2NoYW5uZWxfdW5peF9uZXcodWRldl9tb25pdG9yX2dldF9mZCh1ZXZlbnRfbW9uaXRvcikpOwo+ ID4gKwlpZiAoIXVkZXZjaGFubmVsKSB7Cj4gPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0 ZSB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiA+ICsJCWdvdG8gb3V0Owo+ID4gKwl9Cj4gPiArCj4g PiArCXJldCA9IGdfaW9fYWRkX3dhdGNoKHVkZXZjaGFubmVsLCBHX0lPX0lOIHwgR19JT19FUlIs IGhvdHBsdWdfZXZlbnQsCj4gPiArCQkJICAgICB1ZGV2KTsKPiA+ICsJaWYgKHJldCA8IDApIHsK PiA+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gYWRkIHdhdGNoIG9uIHVkZXYgR0lPIGNoYW5uZWxc biIpOwo+ID4gKwkJZ290byBvdXQ7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJuIFRSVUU7Cj4g PiArCj4gPiArb3V0Ogo+ID4gKwlpbnRlbF9kcF9jb21wbGlhbmNlX2NsZWFudXBfaG90cGx1Zygp Owo+ID4gKwlyZXR1cm4gRkFMU0U7Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgaW50ZWxfZHBfY29t cGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcodm9pZCkKPiA+ICt7Cj4gPiArCWlmICh1ZGV2Y2hhbm5l bCkKPiA+ICsJCWdfaW9fY2hhbm5lbF9zaHV0ZG93bih1ZGV2Y2hhbm5lbCwgVFJVRSwgTlVMTCk7 Cj4gPiArCWlmICh1ZXZlbnRfbW9uaXRvcikKPiA+ICsJCXVkZXZfbW9uaXRvcl91bnJlZih1ZXZl bnRfbW9uaXRvcik7Cj4gPiArCWlmICh1ZGV2KQo+ID4gKwkJdWRldl91bnJlZih1ZGV2KTsKPiA+ ICt9Cj4gCj4gLS0gCj4gSmFuaSBOaWt1bGEsIEludGVsIE9wZW4gU291cmNlIFRlY2hub2xvZ3kg Q2VudGVyCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCklu dGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=