From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Arnd Bergmann To: cbe-oss-dev@ozlabs.org, maynardj@us.ibm.com Subject: Re: [Cbe-oss-dev] [RFC, PATCH 4/4] Add support to OProfile for profiling Cell BE SPUs -- update Date: Tue, 30 Jan 2007 08:39:04 +0100 References: <45BE4ED0.5030808@us.ibm.com> <45BE4FA4.9020105@us.ibm.com> In-Reply-To: <45BE4FA4.9020105@us.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Message-Id: <200701300839.05144.arnd@arndb.de> Cc: linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org, oprofile-list@lists.sourceforge.net List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , T24gTW9uZGF5IDI5IEphbnVhcnkgMjAwNyAyMDo0OCwgTWF5bmFyZCBKb2huc29uIHdyb3RlOgo+ IFN1YmplY3Q6IEFkZCBzdXBwb3J0IHRvIE9Qcm9maWxlIGZvciBwcm9maWxpbmcgQ2VsbCBCRSBT UFVzCj4gCj4gRnJvbTogTWF5bmFyZCBKb2huc29uIDxtYXluYXJkakB1cy5pYm0uY29tPgo+IAo+ IFRoaXMgcGF0Y2ggdXBkYXRlcyB0aGUgZXhpc3RpbmcgYXJjaC9wb3dlcnBjL29wcm9maWxlL29w X21vZGVsX2NlbGwuYwo+IHRvIGFkZCBpbiB0aGUgU1BVIHByb2ZpbGluZyBjYXBhYmlsaXRpZXMu IKBJbiBhZGRpdGlvbiwgYSAnY2VsbCcgc3ViZGlyZWN0b3J5Cj4gd2FzIGFkZGVkIHRvIGFyY2gv cG93ZXJwYy9vcHJvZmlsZSB0byBob2xkIENlbGwtc3BlY2lmaWMgU1BVIHByb2ZpbGluZwo+IGNv ZGUuCj4gCj4gU2lnbmVkLW9mZi1ieTogQ2FybCBMb3ZlIDxjYXJsbEB1cy5pYm0uY29tPgo+IFNp Z25lZC1vZmYtYnk6IE1heW5hcmQgSm9obnNvbiA8bXBqb2huQHVzLmlibS5jb20+CgpJIGNhbid0 IHJlYWxseSBzYXkgbXVjaCBhYm91dCB0aGUgY29tbW9uIG9wcm9maWxlIGZpbGVzIHRoYXQgeW91 IGFyZQp0b3VjaGluZywgbWF5YmUgc29tZW9uZSBmcm9tIG9wcm9maWxlLWxpc3QgKFBoaWxpcHBl PykgdG8gbG9vayBvdmVyIHRoZW0KYW5kIGFjay9uYWNrIHRoZW0uCgo+ICsjZGVmaW5lIG51bWJl cl9vZl9vbmxpbmVfbm9kZXMobm9kZXMpIHsgoCCgIKAgoFwKPiArIKAgoCCgIKB1MzIgY3B1OyB1 MzIgdG1wOyCgIKAgoCCgIKAgoCCgIKAgoCCgIKBcCj4gKyCgIKAgoCCgbm9kZXMgPSAwOyCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgXAo+ICsgoCCgIKAgoGZvcl9lYWNoX29ubGluZV9jcHUo Y3B1KSB7IKAgoCCgIKAgoCCgIFwKPiArIKAgoCCgIKAgoCCgIKAgoHRtcCA9IGNiZV9jcHVfdG9f bm9kZShjcHUpICsgMTtcCj4gKyCgIKAgoCCgIKAgoCCgIKBpZiAodG1wID4gbm9kZXMpIKAgoCCg IKAgoCCgIKAgXAo+ICsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKBub2RlcysrOyCgIKAgoCCgIKAg oCCgIFwKPiAroKCgoKCgoH0goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoFwK PiArfQoKSSd2ZSBiZWVuIGRpc2N1c3Npbmcgd2l0aCBiZW5oIGFib3V0IGEgYmV0dGVyIHdheSB0 byBkbyB0aGlzLiBXZSBzaG91bGQKY2hhbmdlIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBub2RlcyBh bmQgY3B1IG51bWJlcnMgdG8gc29tZXRoaW5nIG1vcmUKY29ycmVjdCBpbiB0aGUgZnV0dXJlLCBz byB3ZSBnZXQgcmlkIG9mIHRoZSBhc3N1bXB0aW9uIHRoYXQgZWFjaApudW1hIG5vZGUgaXMgYSBj ZWxsIGNoaXAuIEl0J3MgcHJvYmFibHkgYmVzdCB0byBsZWF2ZSB5b3VyIGNvZGUgYXMKaXMgZm9y IG5vdywgYnV0IHdlIG5lZWQgdG8gcmVtZW1iZXIgdGhpcyBvbmUgd2hlbiBjbGVhbmluZyBpdCB1 cC4KCllvdSBzaG91bGQgaG93ZXZlciBjb252ZXJ0IHRoaXMgaW50byBhbiBpbmxpbmUgZnVuY3Rp b24Kb2YgcHJvdG90eXBlIAoKc3RhdGljIGlubGluZSBpbnQgbnVtYmVyX29mX29ubGluZV9ub2Rl cyh2b2lkKQoKaW5zdGVhZCBvZiBhIG1hY3JvLgoKPiArLyogRGVmaW5lcyB1c2VkIGZvciBzeW5j X3N0YXJ0ICovCj4gKyNkZWZpbmUgU0tJUF9HRU5FUklDX1NZTkMgMAo+ICsjZGVmaW5lIFNZTkNf U1RBUlRfRVJST1IgLTEKPiArI2RlZmluZSBET19HRU5FUklDX1NZTkMgMQo+ICsKPiArdHlwZWRl ZiBzdHJ1Y3Qgdm1hX21hcAo+ICt7Cj4gK6CgoKCgoKBzdHJ1Y3Qgdm1hX21hcCAqbmV4dDsKPiAr oKCgoKCgoHVuc2lnbmVkIGludCB2bWE7Cj4gK6CgoKCgoKB1bnNpZ25lZCBpbnQgc2l6ZTsKPiAr oKCgoKCgoHVuc2lnbmVkIGludCBvZmZzZXQ7Cj4gK6CgoKCgoKB1bnNpZ25lZCBpbnQgZ3VhcmRf cHRyOwo+ICugoKCgoKCgdW5zaWduZWQgaW50IGd1YXJkX3ZhbDsKPiArfSB2bWFfbWFwX3Q7Cgpw bGVhc2UgZG9uJ3QgdHlwZWRlZiBzdHJ1Y3R1cmVzLgoKPiArLyogVGhlIHRocmVlIGZ1bmN0aW9u cyBiZWxvdyBhcmUgZm9yIG1haW50YWluaW5nIGFuZCBhY2Nlc3NpbmcKPiArICogdGhlIHZtYS10 by1maWxlIG9mZnNldCBtYXAuCj4gKyAqLwo+ICt2bWFfbWFwX3QgKiBjcmVhdGVfdm1hX21hcChj b25zdCBzdHJ1Y3Qgc3B1ICogc3B1LCB1NjQgb2JqZWN0aWQpOwo+ICt1bnNpZ25lZCBpbnQgdm1h X21hcF9sb29rdXAodm1hX21hcF90ICptYXAsIHVuc2lnbmVkIGludCB2bWEsCj4gK6CgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIKAgoGNvbnN0IHN0cnVjdCBzcHUgKiBhU3B1KTsKPiArdm9pZCB2bWFf bWFwX2ZyZWUoc3RydWN0IHZtYV9tYXAgKm1hcCk7Cj4gKwo+ICsvKgo+ICsgKiBFbnRyeSBwb2lu dCBmb3IgU1BVIHByb2ZpbGluZy4KPiArICogY3ljbGVzX3Jlc2V0IGlzIHRoZSBTUFVfQ1lDTEVT IGNvdW50IHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KPiArICovCj4gK3ZvaWQgc3RhcnRf c3B1X3Byb2ZpbGluZyh1bnNpZ25lZCBpbnQgY3ljbGVzX3Jlc2V0KTsKPiArCj4gK3ZvaWQgc3Rv cF9zcHVfcHJvZmlsaW5nKHZvaWQpOwo+ICsKPiArIAo+ICsvKiBhZGQgdGhlIG5lY2Vzc2FyeSBw cm9maWxpbmcgaG9va3MgKi8KPiAraW50IHNwdV9zeW5jX3N0YXJ0KHZvaWQpOwo+ICsKPiArLyog cmVtb3ZlIHRoZSBob29rcyAqLwo+ICtpbnQgc3B1X3N5bmNfc3RvcCh2b2lkKTsKPiArIAo+ICsv KiBSZWNvcmQgU1BVIHByb2dyYW0gY291bnRlciBzYW1wbGVzIHRvIHRoZSBvcHJvZmlsZSBldmVu dCBidWZmZXIuICovCj4gK3ZvaWQgc3B1X3N5bmNfYnVmZmVyKGludCBzcHVfbnVtLCB1bnNpZ25l ZCBpbnQgKiBzYW1wbGVzLCAKPiAroKCgoKCgoKCgoKCgoKCgIKAgoCBpbnQgbnVtX3NhbXBsZXMp Owo+ICsKPiArI2VuZGlmIKAgoC8vIFBSX1VUSUxfSCAKPiBJbmRleDogbGludXgtMi42LjIwLXJj MS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfcHJvZmlsZXIuYwo+ID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K PiAtLS0gL2Rldi9udWxsoKCgMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKPiAr KysgbGludXgtMi42LjIwLXJjMS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfcHJvZmls ZXIuY6CgMjAwNy0wMS0yOSAxMDozMjowMy4zOTI3ODg2OTYgLTA2MDAKPiBAQCAtMCwwICsxLDIw NCBAQAo+ICsvKgo+ICsgKiBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgT1Byb2ZpbGUgU3VwcG9ydAo+ ICsgKgo+ICsgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2Cj4gKyAqCj4gKyAq IEF1dGhvcnM6IE1heW5hcmQgSm9obnNvbiA8bWF5bmFyZGpAdXMuaWJtLmNvbT4KPiArICogoCCg IKAgoCCgQ2FybCBMb3ZlIDxjYXJsbEB1cy5pYm0uY29tPgo+ICsgKgo+ICsgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCj4gKyAq IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCj4gKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbgo+ICsgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p IGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVy Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K PiArI2luY2x1ZGUgPGFzbS9jZWxsLXBtdS5oPgo+ICsjaW5jbHVkZSAicHJfdXRpbC5oIgo+ICsK PiArI2RlZmluZSBUUkFDRV9BUlJBWV9TSVpFIDEwMjQKPiArc3RhdGljIHUzMiAqIHNhbXBsZXM7 Cj4gK3N0YXRpYyB1MzIgKiBzYW1wbGVzX3Blcl9ub2RlOwo+ICsKPiArc3RhdGljIGludCBzcHVf cHJvZl9ydW5uaW5nID0gMDsKPiArc3RhdGljIHVuc2lnbmVkIGludCBwcm9maWxpbmdfaW50ZXJ2 YWwgPSAwOwo+ICsKPiArZXh0ZXJuIGludCBudW1fbm9kZXM7Cj4gK2V4dGVybiB1bnNpZ25lZCBp bnQga2h6ZnJlcTsKCllvdSByZWFsbHkgY2FuJ3QgaGF2ZSBnbG9iYWwgdmFyaWFibGUgd2l0aCBz dWNoIGdlbmVyaWMgbmFtZXMuIEZvcgpzdGF0aWMgdmFyaWFibGVzLCBpdCdzIGxlc3Mgb2YgYSBw cm9ibGVtLCBzaW5jZSB0aGV5IGFyZSBub3QgaW4gdGhlCnNhbWUgbmFtZSBzcGFjZSwgYnV0IGZv ciBlYXNpZXIgZGVidWdnaW5nLCBpdCdzIGdvb2QgdG8gYWx3YXlzIGhhdmUKdGhlIG5hbWUgb2Yg eW91ciBtb2R1bGUgKGUuZy4gc3B1X3Byb2ZfKSBhcyBhIHByZWZpeCB0byB0aGUgaWRlbnRpZmll ci4KCk9mIGNvdXJzZSwgdGhlIGJlc3Qgd2F5IHdvdWxkIGJlIHRvIGF2b2lkIGdsb2JhbCBhbmQg c3RhdGljIHZhcmlhYmxlcwplbnRpcmVseSwgYnV0IHRoYXQncyBub3QgYWx3YXlzIHBvc3NpYmxl LgoKPiArLyoKPiArICogT3Byb2ZpbGUgc2V0dXAgZnVuY3Rpb25zCj4gKyAqLwo+ICsKPiArI2Rl ZmluZSBOVU1fU1BVX0JJVFNfVFJCVUYgMTYKPiArI2RlZmluZSBTUFVTX1BFUl9UQl9FTlRSWSCg IDQKPiArI2RlZmluZSBTUFVTX1BFUl9OT0RFIKAgoCCgIDgKPiArCj4gKy8qIAo+ICsgKiBDb2xs ZWN0IHRoZSBTUFUgcHJvZ3JhbSBjb3VudGVyIHNhbXBsZXMgZnJvbSB0aGUgdHJhY2UgYnVmZmVy Lgo+ICsgKiBUaGUgZ2xvYmFsIHZhcmlhYmxlIHVzYWdlIGlzIGFzIGZvbGxvd3M6Cj4gKyAqIKAg oHNhbXBsZXNbPHRvdGFsLXNwdXM+XVtUUkFDRV9BUlJBWV9TSVpFXSAtIGFycmF5IHRvIHN0b3Jl IFNQVSBQQyBzYW1wbGVzCj4gKyAqIKAgoCCgIKAgoCBBc3N1bXB0aW9uLCB0aGUgYXJyYXkgd2ls bCBiZSBhbGwgemVyb3Mgb24gZW50cnkuCj4gKyAqIKAgoHUzMiBzYW1wbGVzX3Blcl9ub2RlW251 bV9ub2Rlc10gLSBhcnJheSBvZiBob3cgbWFueSB2YWxpZCBzYW1wbGVzIHBlciBub2RlCj4gKyAq Lwo+ICtzdGF0aWMgdm9pZCBjZWxsX3NwdV9wY19jb2xsZWN0aW9uKHZvaWQpCj4gK3sKPiAroKCg oKCgoGludCBjcHU7Cj4gK6CgoKCgoKBpbnQgbm9kZTsKPiAroKCgoKCgoGludCBzcHU7Cj4gK6Cg oKCgoKB1MzIgdHJhY2VfYWRkcjsKPiArIKAgoCCgIKAvKiB0aGUgdHJhY2UgYnVmZmVyIGlzIDEy OCBiaXRzICovCj4gK6CgoKCgoKB1NjQgdHJhY2VfYnVmZmVyWzJdOwo+ICugoKCgoKCgdTY0IHNw dV9wY19sb3dlcjsgoAo+ICugoKCgoKCgdTY0IHNwdV9wY191cHBlcjsKPiAroKCgoKCgoHU2NCBz cHVfbWFzazsKPiAroKCgoKCgoGludCBlbnRyeSwgbm9kZV9mYWN0b3I7Cj4gK6CgoKCgoKAvLyBw cm9jZXNzIHRoZSBjb2xsZWN0ZWQgU1BVIFBDIGZvciBlYWNoIG5vZGUKPiAroKCgoKCgoGZvcl9l YWNoX29ubGluZV9jcHUoY3B1KSB7Cj4gK6CgoKCgoKCgoKCgoKCgoGlmIChjYmVfZ2V0X2h3X3Ro cmVhZF9pZChjcHUpKQo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoGNvbnRpbnVlOwo+ICsKPiAr oKCgoKCgoKCgoKCgoKCgbm9kZSA9IGNiZV9jcHVfdG9fbm9kZShjcHUpOwo+ICugoKCgoKCgoKCg oKCgoKBub2RlX2ZhY3RvciA9IG5vZGUgKiBTUFVTX1BFUl9OT0RFOwo+ICsgoCCgIKAgoCCgIKAg oCCgLyogbnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgZm9yIHRoaXMgbm9kZSAqLwo+ICugoKCgoKCg oKCgoKCgoKBlbnRyeSA9IDA7Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKB0cmFjZV9hZGRyID0gY2Jl X3JlYWRfcG0oY3B1LCB0cmFjZV9hZGRyZXNzKTsKPiAroKCgoKCgoKCgoKCgoKCgd2hpbGUgKCh0 cmFjZV9hZGRyICYgQ0JFX1BNX1RSQUNFX0JVRl9FTVBUWSkgIT0gMHg0MDApCj4gK6CgoKCgoKCg oKCgoKCgoHsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAvKiB0aGVyZSBpcyBkYXRhIGluIHRo ZSB0cmFjZSBidWZmZXIgdG8gcHJvY2VzcyAqLwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoGNi ZV9yZWFkX3RyYWNlX2J1ZmZlcihjcHUsIHRyYWNlX2J1ZmZlcik7IKAKPiAroKCgoKCgoKCgoKCg oKCgoKCgoKCgoKBzcHVfbWFzayA9IDB4RkZGRjAwMDAwMDAwMDAwMDsKPiArCj4gK6CgoKCgoKCg oKCgoKCgoKCgoKCgoKCgLyogRWFjaCBTUFUgUEMgaXMgMTYgYml0czsgaGVuY2UsIGZvdXIgc3B1 cyBpbiBlYWNoIG9mIAo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAqIHRoZSB0d28gNjQtYml0 IGJ1ZmZlciBlbnRyaWVzIHRoYXQgbWFrZSB1cCB0aGUKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCg oKAgKiAxMjgtYml0IHRyYWNlX2J1ZmZlciBlbnRyeS4goFByb2Nlc3MgdGhlIHVwcGVyIGFuZAo+ ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAqIGxvd2VyIDY0LWJpdCB2YWx1ZXMgc2ltdWx0YW5l b3VzbHkuCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgICovCj4gK6CgoKCgoKCgoKCgoKCgoKCg oKCgoKCgZm9yIChzcHUgPSAwOyBzcHUgPCBTUFVTX1BFUl9UQl9FTlRSWTsgc3B1KyspIHsKPiAr oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoHNwdV9wY19sb3dlciA9IHNwdV9tYXNrICYg dHJhY2VfYnVmZmVyWzBdOwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgc3B1X3Bj X2xvd2VyID0gc3B1X3BjX2xvd2VyID4+IChOVU1fU1BVX0JJVFNfVFJCVUYKPiAroKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgKiAo U1BVU19QRVJfVEJfRU5UUlktc3B1LTEpKTsKPiArCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKBzcHVfcGNfdXBwZXIgPSBzcHVfbWFzayAmIHRyYWNlX2J1ZmZlclsxXTsKPiAroKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoHNwdV9wY191cHBlciA9IHNwdV9wY191cHBlciA+ PiAoTlVNX1NQVV9CSVRTX1RSQlVGCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCogKFNQVVNfUEVSX1RCX0VOVFJZLXNwdS0x KSk7Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgc3B1X21hc2sgPSBzcHVf bWFzayA+PiBOVU1fU1BVX0JJVFNfVFJCVUY7Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgLyogc3B1IFBDIHRyYWNlIGVudHJ5IGlzIHVwcGVyIDE2IGJpdHMgb2YgdGhlCj4g K6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKiAxOCBiaXQgU1BVIHByb2dyYW0gY291 bnRlciAKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAqLwo+ICugoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgc3B1X3BjX2xvd2VyID0gc3B1X3BjX2xvd2VyIDw8IDI7Cj4g K6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBzcHVfcGNfdXBwZXIgPSBzcHVfcGNfdXBw ZXIgPDwgMjsKPiArCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBzYW1wbGVzWygo bm9kZV9mYWN0b3IgKyBzcHUpICogVFJBQ0VfQVJSQVlfU0laRSkgKyBlbnRyeV0KPiAroKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgPSAodTMyKSBzcHVfcGNfbG93ZXI7Cj4g K6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBzYW1wbGVzWygobm9kZV9mYWN0b3IgKyBz cHUgKyBTUFVTX1BFUl9UQl9FTlRSWSkgKiBUUkFDRV9BUlJBWV9TSVpFKSArIGVudHJ5XQo+ICug oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKA9ICh1MzIpIHNwdV9wY191cHBl cjsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB9Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKCgoKCg oKCgoGVudHJ5Kys7Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoGlmIChlbnRyeSA+PSBU UkFDRV9BUlJBWV9TSVpFKSAKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoC8qIHNw dV9zYW1wbGVzIGlzIGZ1bGwgKi8KPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoGJy ZWFrOwo+ICsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB0cmFjZV9hZGRyID0gY2JlX3JlYWRf cG0oY3B1LCB0cmFjZV9hZGRyZXNzKTsKPiAroKCgoKCgoKCgoKCgoKCgfQo+ICugoKCgoKCgoKCg oKCgoKBzYW1wbGVzX3Blcl9ub2RlW25vZGVdID0gZW50cnk7Cj4gK6CgoKCgoKB9Cj4gK30KCldo aWxlIEkgY2FuJ3Qgc2VlIGFueXRoaW5nIHRlY2huaWNhbGx5IHdyb25nIHdpdGggdGhpcyBmdW5j dGlvbiwgaXQgd291bGQgYmUKZ29vZCB0byBzcGxpdCBpdCBpbnRvIHNtYWxsZXIgZnVuY3Rpb25z LiBTaW5jZSB5b3UgYXJlIG5lc3RpbmcgdGhyZWUKbG9vcHMsIGl0IHNob3VsZCBiZSBwb3NzaWJs ZSB0byBtYWtlIGEgc2VwYXJhdGUgZnVuY3Rpb24gZnJvbSBvbmUgb2YgdGhlCmlubmVyIGxvb3Bz IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFjdHVhbCBsb2dpYyBiZWhpbmQgaXQuCgo+ICsKPiArc3Rh dGljIGludCBwcm9maWxlX3NwdXMoc3RydWN0IGhydGltZXIgKiB0aW1lcikKPiArewo+ICugoKCg oKCga3RpbWVfdCBrdDsKPiArIKAgoCCgIKBpbnQgY3B1LCBub2RlLCBrLCBudW1fc2FtcGxlcywg c3B1X251bTsKCndoaXRlc3BhY2UgZGFtYWdlCgo+ICugoKCgoKCgCj4gK6CgoKCgoKBpZiAoIXNw dV9wcm9mX3J1bm5pbmcpCj4gK6CgoKCgoKCgoKCgoKCgoGdvdG8gU1RPUDsKPiArCj4gK6CgoKCg oKBjZWxsX3NwdV9wY19jb2xsZWN0aW9uKCk7Cj4gK6CgoKCgoKBmb3JfZWFjaF9vbmxpbmVfY3B1 KGNwdSkgewo+ICugoKCgoKCgoKCgoKCgoKBpZiAoY2JlX2dldF9od190aHJlYWRfaWQoY3B1KSkK PiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBjb250aW51ZTsKCkhlcmUsIHlvdSBlbnRlciB0aGUg c2FtZSB0b3AtbGV2ZWwgbG9vcCBhZ2Fpbiwgd2h5IG5vdCBtYWtlIGl0Cglmb3JfZWFjaF9vbmxp bmVfY3B1KGNwdSkgewoJCWlmIChjYmVfZ2V0X2h3X3RocmVhZF9pZChjcHUpKQogICAgICAgICAg ICAgICAgICAgICAgICAgY29udGludWU7CgkJbnVtX3NhbXBsZXMgPSBjZWxsX3NwdV9wY19jb2xs ZWN0aW9uKGNwdSk7CgkJLi4uCgo+ICugoKCgoKCga3QgPSBrdGltZV9zZXQoMCwgcHJvZmlsaW5n X2ludGVydmFsKTsKPiAroKCgoKCgoGlmICghc3B1X3Byb2ZfcnVubmluZykKPiAroKCgoKCgoKCg oKCgoKCgZ290byBTVE9QOwo+ICugoKCgoKCgaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCB0aW1lci0+ YmFzZS0+Z2V0X3RpbWUoKSwga3QpOwo+ICugoKCgoKCgcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsK CmlzIGhydGltZXJfZm9yd2FyZCByZWFsbHkgdGhlIHJpZ2h0IGludGVyZmFjZSBoZXJlPyBZb3Ug YXJlIGlnbm9yaW5nCnRoZSBudW1iZXIgb2Ygb3ZlcnJ1bnMgYW55d2F5LCBzbyBocnRpbWVyX3N0 YXJ0KCwsKSBzb3VuZHMgbW9yZQpjb3JyZWN0IHRvIG1lLgoKPiArCj4gKyBTVE9QOgoKbGFiZWxz IHNob3VsZCBiZSBpbiBzbWFsbCBsZXR0ZXJzLgoKPiAroKCgoKCgoHByaW50ayhLRVJOX0lORk8g IlNQVV9QUk9GOiBzcHUtcHJvZiB0aW1lciBlbmRpbmdcbiIpOwo+ICugoKCgoKCgcmV0dXJuIEhS VElNRVJfTk9SRVNUQVJUOwo+ICt9Cgo+ICt2b2lkIHN0YXJ0X3NwdV9wcm9maWxpbmcodW5zaWdu ZWQgaW50IGN5Y2xlc19yZXNldCkgewo+ICsKPiAroKCgoKCgoGt0aW1lX3Qga3Q7Cj4gKwo+ICsg oCCgIKAgoC8qIFRvIGNhbGN1bGF0ZSBhIHRpbWVvdXQgaW4gbmFub3NlY29uZHMsIHRoZSBiYXNp Ywo+ICugoKCgoKCgICogZm9ybXVsYSBpcyBucyA9IGN5Y2xlc19yZXNldCAqIChOU0VDX1BFUl9T RUMgLyBjcHUgZnJlcXVlbmN5KS4KPiAroKCgoKCgoCAqIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50 IG1hdGgsIHdlIHVzZSB0aGUgc2NhbGUgbWF0aAo+ICugoKCgoKCgICogdGVjaG5pcXVlIGFzIGRl c2NyaWJlZCBpbiBsaW51eC9qaWZmaWVzLmguIKBXZSB1c2UKPiAroKCgoKCgoCAqIGEgc2NhbGUg ZmFjdG9yIG9mIFNDQUxFX1NISUZULHdoaWNoIHByb3ZpZGVzIDQgZGVjaW1hbCBwbGFjZXMKPiAr oKCgoKCgoCAqIG9mIHByZWNpc2lvbiwgd2hpY2ggaXMgY2xvc2UgZW5vdWdoIGZvciB0aGUgcHVy cG9zZSBhdCBoYW5kLgo+ICugoKCgoKCgICovCj4gKwo+ICugoKCgoKCgLyogU2luY2UgY3B1ZnJl cV9xdWlja19nZXQgcmV0dXJucyBmcmVxdWVuY3kgaW4ga0h6LCB3ZSB1c2UKPiAroKCgoKCgoCAq IFVTRUNfUEVSX1NFQyBoZXJlIHZzIE5TRUNfUEVSX1NFQy4KPiAroKCgoKCgoCAqLwo+ICugoKCg oKCgdW5zaWduZWQgbG9uZyBuc1BlckN5YyA9IChVU0VDX1BFUl9TRUMgPDwgU0NBTEVfU0hJRlQp L2toemZyZXE7Cj4gK6CgoKCgoKBwcm9maWxpbmdfaW50ZXJ2YWwgPSAobnNQZXJDeWMgKiBjeWNs ZXNfcmVzZXQpID4+IFNDQUxFX1NISUZUOwo+ICugoKCgoKCgCj4gK6CgoKCgoKBwcl9kZWJ1Zygi dGltZXIgcmVzb2x1dGlvbjogJWx1XG4iLCAKPiAroKCgoKCgoKCgoKCgoKCgIFRJQ0tfTlNFQyk7 CgpEb24ndCB5b3UgbmVlZCB0byBhZGFwdCB0aGUgcHJvZmlsaW5nX2ludGVydmFsIGF0IHJ1biB0 aW1lLCB3aGVuIGNwdWZyZXEKY2hhbmdlcyB0aGUgY29yZSBmcmVxdWVuY3k/IFlvdSBzaG91bGQg cHJvYmFibHkgdXNlCmNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoKSB0byB1cGRhdGUgdGhpcy4K Cj4gK6CgoKCgoKBrdCA9IGt0aW1lX3NldCgwLCBwcm9maWxpbmdfaW50ZXJ2YWwpOwo+ICugoKCg oKCgaHJ0aW1lcl9pbml0KCZ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX1JFTCk7Cj4g K6CgoKCgoKB0aW1lci5leHBpcmVzID0ga3Q7Cj4gK6CgoKCgoKB0aW1lci5mdW5jdGlvbiA9IHBy b2ZpbGVfc3B1czsKPiArCj4gKyCgIKAgoCCgLyogQWxsb2NhdGUgYXJyYXlzIGZvciBjb2xsZWN0 aW5nIFNQVSBQQyBzYW1wbGVzICovCj4gK6CgoKCgoKBzYW1wbGVzID0gKHUzMiAqKSBremFsbG9j KG51bV9ub2RlcyAqIFNQVVNfUEVSX05PREUgKiBUUkFDRV9BUlJBWV9TSVpFICogc2l6ZW9mKHUz MiksIEdGUF9BVE9NSUMpOwoKVHJ5IHRvIGF2b2lkIGF0b21pYyBhbGxvY2F0aW9ucy4gSSBkb24n dCB0aGluayB5b3UgYXJlIGluIGFuIGF0b21pYwpjb250ZXh0IGhlcmUgYXQgYWxsLCBzbyB5b3Ug Y2FuIGp1c3QgdXNlIEdGUF9LRVJORUwuCgo+ICugoKCgoKCgc2FtcGxlc19wZXJfbm9kZSA9ICh1 MzIgKikga3phbGxvYyhudW1fbm9kZXMgKiBzaXplb2YodTMyKSwgR0ZQX0FUT01JQyk7CgpTaW5j ZSBNQVhfTlVNTk9ERVMgaXMgc21hbGwsIGl0J3MgcHJvYmFibHkgbW9yZSBlZmZpY2llbnQgdG8g anVzdCBhbGxvY2F0ZSB0aGlzCnN0YXRpY2FsbHkuCgo+ICsKPiAroKCgoKCgoHNwdV9wcm9mX3J1 bm5pbmcgPSAxOwo+ICugoKCgoKCgaHJ0aW1lcl9zdGFydCgmdGltZXIsIGt0LCBIUlRJTUVSX1JF TCk7Cj4gK30KPgo+ICsKPiArdm9pZCBzdG9wX3NwdV9wcm9maWxpbmcodm9pZCkgCj4gK3sKPiAr Cj4gK6CgoKCgoKBocnRpbWVyX2NhbmNlbCgmdGltZXIpOwo+ICugoKCgoKCga2ZyZWUoc2FtcGxl cyk7Cj4gK6CgoKCgoKBrZnJlZShzYW1wbGVzX3Blcl9ub2RlKTsKPiAroKCgoKCgoHByX2RlYnVn KCJTUFVfUFJPRjogc3RvcF9zcHVfcHJvZmlsaW5nIGlzc3VlZFxuIik7Cj4gK6CgoKCgoKBzcHVf cHJvZl9ydW5uaW5nID0gMDsKPiArfQoKc2hvdWxkbid0IHlvdSBzZXQgc3B1X3Byb2ZfcnVubmlu ZyA9IDAgYmVmb3JlIGRvaW5nIGFueSBvZiB0aGUgb3RoZXIgdGhpbmdzPwpJdCBsb29rcyB0byBt ZSBsaWtlIHlvdSBjb3VsZCBvdGhlcndpc2UgZ2V0IGludG8gYSB1c2UtYWZ0ZXItZnJlZQpzaXR1 YXRpb24uIElmIEknbSB3cm9uZyB3aXRoIHRoYXQsIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHNw dV9wcm9mX3J1bm5pbmcKYXQgYWxsIDstKQoKPiArLyogQ29uYWluZXIgZm9yIGNhY2hpbmcgaW5m b3JtYXRpb24gYWJvdXQgYW4gYWN0aXZlIFNQVSB0YXNrLgo+ICsgKiCgIDptYXAgLS0gcG9pbnRl ciB0byBhIGxpc3Qgb2Ygdm1hX21hcHMKPiArICogoCA6c3B1IC0tIHRoZSBzcHUgZm9yIHRoaXMg YWN0aXZlIFNQVSB0YXNrCj4gKyAqIKAgOmxpc3QgLS0gcG90ZW50aWFsbHkgY291bGQgYmUgdXNl ZCB0byBjb250YWluIHRoZSBjYWNoZWRfaW5mb3MKPiArICogoCCgIKAgoCCgIKBmb3IgaW5hY3Rp dmUgU1BVIHRhc2tzLgoKRG9jdW1lbnRpbmcgc3RydWN0dXJlcyBpcyBnb29kLCBidXQgcGxlYXNl IHVzZSB0aGUgY29tbW9uIGtlcm5lbGRvYyBmb3JtYXQKZm9yIGl0LiBUaGVyZSBhcmUgYSBudW1i ZXIgb2YgZXhhbXBsZXMgZm9yIHRoaXMgaW4gaW5jbHVkZS9saW51eC8KCj4gKyAqIAo+ICsgKiBJ ZGVhbGx5LCB3ZSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gY3JlYXRlIHRoZSBjYWNoZWRfaW5m byBmb3IKPiArICogYW4gU1BVIHRhc2sganVzdCBvbmUgdGltZSAtLSB3aGVuIGxpYnNwZSBmaXJz dCBsb2FkcyB0aGUgU1BVIAo+ICsgKiBiaW5hcnkgZmlsZS4goFdlIHdvdWxkIHN0b3JlIHRoZSBj YWNoZWRfaW5mbyBpbiBhIGxpc3QuIKBUaGVuLCBhcwo+ICsgKiBTUFUgdGFza3MgYXJlIHN3aXRj aGVkIG91dCBhbmQgbmV3IG9uZXMgc3dpdGNoZWQgaW4sIHRoZSBjYWNoZWRfaW5mbwo+ICsgKiBm b3IgaW5hY3RpdmUgdGFza3Mgd291bGQgYmUga2VwdCwgYW5kIHRoZSBhY3RpdmUgb25lIHdvdWxk IGJlIHBsYWNlZAo+ICsgKiBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4goEJ1dCB0aGlzIHRlY2hu aXF1ZSBtYXkgbm90IHdpdGgKPiArICogY3VycmVudCBzcHVmcyBmdW5jdGlvbmFsaXR5IHNpbmNl IHRoZSBzcHUgdXNlZCBpbiBiaW5kX2NvbnRleHQgbWF5Cj4gKyAqIGJlIGEgZGlmZmVyZW50IHNw dSB0aGFuIHdhcyB1c2VkIGluIGEgcHJldmlvdXMgYmluZF9jb250ZXh0IGZvciBhCj4gKyAqIHJl YWN0aXZhdGVkIFNQVSB0YXNrLiCgQWRkaXRpb25hbGx5LCBhIHJlYWN0aXZhdGVkIFNQVSB0YXNr IG1heSBiZQo+ICsgKiBhc3NpZ25lZCB0byBydW4gb24gYSBkaWZmZXJlbnQgcGh5c2ljYWwgU1BF LiCgV2Ugd2lsbCBpbnZlc3RpZ2F0ZQo+ICsgKiBmdXJ0aGVyIGlmIHRoaXMgY2FuIGJlIGRvbmUu Cj4gKyAqCj4gKyAqLwoKWW91IHNob3VsZCBzdHVmZiBhIHBvaW50ZXIgdG8gY2FjaGVkX2luZm8g aW50byBzdHJ1Y3Qgc3B1X2NvbnRleHQsCmUuZy4gJ3ZvaWQgKnByb2ZpbGVfcHJpdmF0ZScuCgo+ ICtzdHJ1Y3QgY2FjaGVkX2luZm8gewo+ICugoKCgoKCgdm1hX21hcF90ICogbWFwOwo+ICugoKCg oKCgc3RydWN0IHNwdSAqIHRoZV9zcHU7Cj4gK6CgoKCgoKBzdHJ1Y3Qga3JlZiBjYWNoZV9yZWY7 Cj4gK6CgoKCgoKBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4gK307CgpBbmQgcmVwbGFjZSB0aGUg J3RoZV9zcHUnIG1lbWJlciB3aXRoIGEgYmFjayBwb2ludGVyIHRvIHRoZQpzcHVfY29udGV4dCBp ZiB5b3UgbmVlZCBpdC4KCj4gKwo+ICsvKiBBIGRhdGEgc3RydWN0dXJlIGZvciBjYWNoZWQgaW5m b3JtYXRpb24gYWJvdXQgYWN0aXZlIFNQVSB0YXNrcy4KPiArICogU3RvcmFnZSBpcyBkeW5hbWlj YWxseSBhbGxvY2F0ZWQsIHNpemVkIGFzCj4gKyAqICJudW1iZXIgb2YgYWN0aXZlIG5vZGVzIG11 bHRwbGllZCBieSA4Ii4gCj4gKyAqIFRoZSBpbmZvX2xpc3Rbbl0gbWVtYmVyIGhvbGRzIDAgb3Ig bW9yZSAKPiArICogJ3N0cnVjdCBjYWNoZWRfaW5mbycgb2JqZWN0cyBmb3IgU1BVIz1uLiAKPiAr ICoKPiArICogQXMgY3VycmVudGx5IGltcGxlbWVudGVkLCB0aGVyZSB3aWxsIG9ubHkgZXZlciBi ZSBvbmUgY2FjaGVkX2luZm8gCj4gKyAqIGluIHRoZSBsaXN0IGZvciBhIGdpdmVuIFNQVS4goElm IHdlIGNhbiBkZXZpc2UgYSB3YXkgdG8gbWFpbnRhaW4KPiArICogbXVsdGlwbGUgY2FjaGVkX2lu Zm9zIGluIG91ciBsaXN0LCB0aGVuIGl0IHdvdWxkIG1ha2Ugc2Vuc2UKPiArICogdG8gYWxzbyBj YWNoZSB0aGUgZGNvb2tpZSByZXByZXNlbnRpbmcgdGhlIFBQVSB0YXNrIGFwcGxpY2F0aW9uLgo+ ICsgKiBTZWUgYWJvdmUgZGVzY3JpcHRpb24gb2Ygc3RydWN0IGNhY2hlZF9pbmZvIGZvciBtb3Jl IGRldGFpbHMuCj4gKyAqLwo+ICtzdHJ1Y3Qgc3B1X2luZm9fc3RhY2tzIHsKPiAroKCgoKCgoHN0 cnVjdCBsaXN0X2hlYWQgKiBpbmZvX2xpc3Q7Cj4gK307CgpXaHkgZG8geW91IHN0b3JlIHBvaW50 ZXJzIHRvIGxpc3RfaGVhZCBzdHJ1Y3R1cmVzPyBJZiB5b3Ugd2FudCB0byBzdG9yZQpsaXN0cywg eW91IHNob3VsZCBoYXZlIGEgbGlzdHNfaGVhZCBpdHNlbGYgaW4gaGVyZS4KCldoeSBkbyB5b3Ug c3RvcmUgdGhlbSBwZXIgc3B1IGluIHRoZSBmaXJzdCBwbGFjZT8gVGhlIHBoeXNpY2FsIHNwdQpk b2Vzbid0IGhhdmUgYW55IHJlbGV2YW5jZSB0byB0aGlzIGF0IGFsbCwgdGhlIG9ubHkgZGF0YSB0 aGF0IGlzCnBlciBzcHUgaXMgdGhlIHNhbXBsZSBkYXRhIGNvbGxlY3RlZCBvbiBhIHByb2ZpbGlu ZyBpbnRlcnJ1cHQsCndoaWNoIHlvdSBjYW4gdGhlbiBjb3B5IGluIHRoZSBwZXItY29udGV4dCBk YXRhIG9uIGEgY29udGV4dCBzd2l0Y2guCgoKPiArLyogTG9va3MgZm9yIGNhY2hlZCBpbmZvIGZv ciB0aGUgcGFzc2VkIHNwdS4goElmIG5vdCBmb3VuZCwgdGhlCj4gKyAqIGNhY2hlZCBpbmZvIGlz IGNyZWF0ZWQgZm9yIHRoZSBwYXNzZWQgc3B1Lgo+ICsgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3M7 IG90aGVyd2lzZSwgLTEgZm9yIGVycm9yLiCgCj4gKyAqLyAKPiArc3RhdGljIGludAo+ICtwcmVw YXJlX2NhY2hlZF9zcHVfaW5mbyhzdHJ1Y3Qgc3B1ICogc3B1LCB1bnNpZ25lZCBpbnQgb2JqZWN0 SWQpCj4gK3sKCnNlZSBhYm92ZSwgdGhpcyBzaG91bGQgZ2V0IHRoZSBzcHVfY29udGV4dCBwb2lu dGVyIGFzIGl0cyBhcmd1bWVudCwKbm90IHRoZSBzcHUuCgo+ICugoKCgoKCgdm1hX21hcF90ICog bmV3X21hcDsKPiAroKCgoKCgoHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwo+ICugoKCgoKCgaW50 IHJldHZhbCA9IDA7Cj4gK6CgoKCgoKAvKiBzcHUtPm51bWJlciBpcyBhIHN5c3RlbS13aWRlIHZh bHVlLCBub3QgYSBwZXItbm9kZSB2YWx1ZS4gKi8KPiAroKCgoKCgoHN0cnVjdCBjYWNoZWRfaW5m byAqIGluZm8gPSBnZXRfY2FjaGVkX2luZm8oc3B1LT5udW1iZXIpOwo+ICugoKCgoKCgaWYgKGlu Zm8gPT0gTlVMTCkgewoKaWYgeW91IHJldmVydCB0aGUgbG9naWMgdG8KCglpZiAoaW5mbykKCQln b3RvIG91dDsKCnRoZW4gdGhlIGJ1bGsgb2YgeW91ciBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8g Z2V0IGluZGVudGVkLAp3aGljaCBoZWxwcyByZWFkYWJpbGl0eS4KCj4gK6CgoKCgoKCgoKCgoKCg oC8qIGNyZWF0ZSBjYWNoZWRfaW5mbyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IGZvciBTUFUgIzxu Pi4qLwo+ICugoKCgoKCgoKCgoKCgoKBpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhY2hl ZF9pbmZvKSwgR0ZQX0FUT01JQyk7CgpHRlBfS0VSTkVMCgo+ICugoKCgoKCgoKCgoKCgoKBpZiAo IWluZm8pIHsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBwcmludGsoS0VSTl9FUlIgIlNQVV9Q Uk9GOiAiCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIKAgoCCgICIlcywgbGluZSAlZDogY3Jl YXRlIHZtYV9tYXAgZmFpbGVkXG4iLAo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCCgIKAgoCBf X0ZVTkNUSU9OX18sIF9fTElORV9fKTsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKBnb3RvIEVS Ul9BTExPQzsKPiAroKCgoKCgoKCgoKCgoKCgfQo+ICugoKCgoKCgoKCgoKCgoKBuZXdfbWFwID0g Y3JlYXRlX3ZtYV9tYXAoc3B1LCBvYmplY3RJZCk7Cj4gK6CgoKCgoKCgoKCgoKCgoGlmICghbmV3 X21hcCkgewo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoHByaW50ayhLRVJOX0VSUiAiU1BVX1BS T0Y6ICIKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgoCCgIKAgIiVzLCBsaW5lICVkOiBjcmVh dGUgdm1hX21hcCBmYWlsZWRcbiIsCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIKAgoCCgIF9f RlVOQ1RJT05fXywgX19MSU5FX18pOwo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoGdvdG8gRVJS X0FMTE9DOwo+ICugoKCgoKCgoKCgoKCgoKB9Cj4gKwo+ICugoKCgoKCgoKCgoKCgoKBwcl9kZWJ1 ZygiQ3JlYXRlZCB2bWFfbWFwXG4iKTsKPiArIKCgoKCgoKCgoKCgoKCgaW5mby0+bWFwID0gbmV3 X21hcDsKPiAroKCgoKCgoKCgoKCgoKCgaW5mby0+dGhlX3NwdSA9IHNwdTsKPiAroKCgoKCgoKCg oKCgoKCga3JlZl9pbml0KCZpbmZvLT5jYWNoZV9yZWYpOwo+ICugoKCgoKCgoKCgoKCgoKBzcGlu X2xvY2tfaXJxc2F2ZSgmY2FjaGVfbG9jaywgZmxhZ3MpOwo+ICugoKCgoKCgoKCgoKCgoKBsaXN0 X2FkZCgmaW5mby0+bGlzdCwgJnNwdV9pbmZvLT5pbmZvX2xpc3Rbc3B1LT5udW1iZXJdKTsKPiAr oKCgoKCgoKCgoKCgoKCgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FjaGVfbG9jaywgZmxhZ3Mp Owo+ICugoKCgoKCgoKCgoKCgoKBnb3RvIE9VVDsKPiAroKCgoKCgoH0gZWxzZSB7Cj4gKyCgIKAg oCCgLyogSW1tZWRpZGF0ZWx5IHB1dCBiYWNrIHJlZmVyZW5jZSB0byBjYWNoZWRfaW5mbyBzaW5j ZSB3ZSBkb24ndAo+ICugoKCgoKCgICogcmVhbGx5IG5lZWQgaXQgLS0ganVzdCBjaGVja2luZyB3 aGV0aGVyIHdlIGhhdmUgaXQuCj4gK6CgoKCgoKAgKi8KPiAroKCgoKCgoKCgoKCgoKCgcHV0X2Nh Y2hlZF9pbmZvKGluZm8pOwo+ICugoKCgoKCgoKCgoKCgoKBwcl9kZWJ1ZygiRm91bmQgY2FjaGVk IFNQVSBpbmZvLlxuIik7Cj4gK6CgoKCgoKB9Cj4gK6CgoKCgoKAKPiArRVJSX0FMTE9DOgo+ICug oKCgoKCgcmV0dmFsID0gLTE7Cj4gK09VVDoKPiAroKCgoKCgoHJldHVybiByZXR2YWw7Cj4gK30K Cj4gKy8qIExvb2sgdXAgdGhlIGRjb29raWUgZm9yIHRoZSB0YXNrJ3MgZmlyc3QgVk1fRVhFQ1VU QUJMRSBtYXBwaW5nLAo+ICsgKiB3aGljaCBjb3JyZXNwb25kcyBsb29zZWx5IHRvICJhcHBsaWNh dGlvbiBuYW1lIi4gQWxzbywgZGV0ZXJtaW5lCj4gKyAqIHRoZSBvZmZzZXQgZm9yIHRoZSBTUFUg RUxGIG9iamVjdC4goElmIGNvbXB1dGVkIG9mZnNldCBpcyAKPiArICogbm9uLXplcm8sIGl0IGlt cGxpZXMgYW4gZW1iZWRkZWQgU1BVIG9iamVjdDsgb3RoZXJ3aXNlLCBpdCdzIGEKPiArICogc2Vw YXJhdGUgU1BVIGJpbmFyeSwgaW4gd2hpY2ggY2FzZSB3ZSByZXRyaWV2ZSBpdCdzIGRjb29raWUu Cj4gKyAqLwo+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyAKPiArZ2V0X2V4ZWNfZGNvb2tpZV9hbmRf b2Zmc2V0KAo+ICugoKCgoKCgc3RydWN0IHNwdSAqIHNwdSwgdW5zaWduZWQgaW50ICogb2Zmc2V0 cCwKPiAroKCgoKCgoHVuc2lnbmVkIGxvbmcgKiBzcHVfYmluX2Rjb29raWUsCj4gK6CgoKCgoKB1 bnNpZ25lZCBpbnQgc3B1X3JlZikKPiArewo+ICsgoCCgIKAgoHVuc2lnbmVkIGxvbmcgY29va2ll ID0gMDsKPiAroKCgoKCgoHVuc2lnbmVkIGludCBteV9vZmZzZXQgPSAwOwo+ICsgoCCgIKAgoHN0 cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKPiAroKCgoKCgoHN0cnVjdCBtbV9zdHJ1Y3QgKiBt bSA9IHNwdS0+bW07CgppbmRlbnRpbmcKCj4gKyCgIKAgoCCgaWYgKCFtbSkKPiArIKAgoCCgIKAg oCCgIKAgoGdvdG8gT1VUOwo+ICsKPiArIKAgoCCgIKBmb3IgKHZtYSA9IG1tLT5tbWFwOyB2bWE7 IHZtYSA9IHZtYS0+dm1fbmV4dCkgewo+ICsgoCCgIKAgoCCgIKAgoCCgaWYgKCF2bWEtPnZtX2Zp bGUpCj4gKyCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoGNvbnRpbnVlOwo+ICsgoCCgIKAgoCCgIKAg oCCgaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpKQo+ICsgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKBjb250aW51ZTsKPiArIKAgoCCgIKAgoCCgIKAgoGNvb2tpZSA9IGZhc3RfZ2V0 X2Rjb29raWUodm1hLT52bV9maWxlLT5mX2RlbnRyeSwKPiArIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgdm1hLT52bV9maWxlLT5mX3Zmc21udCk7Cj4gK6CgoKCgoKCgoKCgoKCgoHByX2RlYnVnKCJn b3QgZGNvb2tpZSBmb3IgJXNcbiIsCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIKB2bWEtPnZt X2ZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7Cj4gKyCgIKAgoCCgIKAgoCCgIKBicmVhazsK PiArIKAgoCCgIKB9Cj4gKwo+ICugoKCgoKCgZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEg PSB2bWEtPnZtX25leHQpIHsKPiAroKCgoKCgoKCgoKCgoKCgaWYgKHZtYS0+dm1fc3RhcnQgPiBz cHVfcmVmIHx8IHZtYS0+dm1fZW5kIDwgc3B1X3JlZikKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCg oKBjb250aW51ZTsKPiAroKCgoKCgoKCgoKCgoKCgbXlfb2Zmc2V0ID0gc3B1X3JlZiAtIHZtYS0+ dm1fc3RhcnQ7Cj4gK6CgoKCgoKCgoKCgoKCgoHByX2RlYnVnKCJGb3VuZCBzcHUgRUxGIGF0ICIK PiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgoCIgJVggZm9yIGZpbGUgJXNcbiIsIG15X29mZnNl dCwKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgoHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRf bmFtZS5uYW1lKTsKPiAroKCgoKCgoKCgoKCgoKCgKm9mZnNldHAgPSBteV9vZmZzZXQ7Cj4gK6Cg oKCgoKCgoKCgoKCgoGlmIChteV9vZmZzZXQgPT0gMCkgewo+ICugoKCgoKCgoKCgoKCgoKCgoKCg oKCgoGlmICghdm1hLT52bV9maWxlKSB7Cj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKBnb3RvIEZBSUxfTk9fU1BVX0NPT0tJRTsKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB9Cj4g K6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgKnNwdV9iaW5fZGNvb2tpZSA9IGZhc3RfZ2V0X2Rjb29r aWUoCj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKB2bWEtPnZtX2ZpbGUtPmZfZGVu dHJ5LAo+ICugoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgdm1hLT52bV9maWxlLT5mX3Zm c21udCk7Cj4gK6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgcHJfZGVidWcoImdvdCBkY29va2llIGZv ciAlc1xuIiwKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCCgdm1hLT52bV9maWxl LT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwo+ICugoKCgoKCgoKCgoKCgoKB9Cj4gK6CgoKCgoKCg oKCgoKCgoGJyZWFrOwo+ICugoKCgoKCgfQo+ICugoKCgoKCgCj4gK09VVDoKPiArIKAgoCCgIKBy ZXR1cm4gY29va2llOwo+ICsKPiArRkFJTF9OT19TUFVfQ09PS0lFOgo+ICugoKCgoKCgcHJpbnRr KEtFUk5fRVJSICJTUFVfUFJPRjogIgo+ICugoKCgoKCgIKAgoCCgICIlcywgbGluZSAlZDogQ2Fu bm90IGZpbmQgZGNvb2tpZSBmb3IgU1BVIGJpbmFyeVxuIiwKPiAroKCgoKCgoCCgIKAgoCBfX0ZV TkNUSU9OX18sIF9fTElORV9fKTsKPiAroKCgoKCgoGdvdG8gT1VUOwo+ICt9Cj4gKwo+ICsKPiAr Cj4gKy8qIFRoaXMgZnVuY3Rpb24gZmluZHMgb3IgY3JlYXRlcyBjYWNoZWQgY29udGV4dCBpbmZv cm1hdGlvbiBmb3IgdGhlCj4gKyAqIHBhc3NlZCBTUFUgYW5kIHJlY29yZHMgU1BVIGNvbnRleHQg aW5mb3JtYXRpb24gaW50byB0aGUgT1Byb2ZpbGUKPiArICogZXZlbnQgYnVmZmVyLgo+ICsgKi8K PiArc3RhdGljIGludCBwcm9jZXNzX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBzcHUgKiBzcHUsIHVu c2lnbmVkIGludCBvYmplY3RJZCkKPiArewo+ICugoKCgoKCgdW5zaWduZWQgbG9uZyBmbGFncyA9 IDA7Cj4gK6CgoKCgoKBpbnQgcmV0dmFsID0gMDsKPiAroKCgoKCgoHVuc2lnbmVkIGludCBvZmZz ZXQgPSAwOwo+ICugoKCgoKCgdW5zaWduZWQgbG9uZyBzcHVfY29va2llID0gMCwgYXBwX2Rjb29r aWUgPSAwOwo+ICugoKCgoKCgcmV0dmFsID0gcHJlcGFyZV9jYWNoZWRfc3B1X2luZm8oc3B1LCBv YmplY3RJZCk7Cj4gK6CgoKCgoKBpZiAocmV0dmFsID09IC0xKSB7Cj4gK6CgoKCgoKCgoKCgoKCg oGdvdG8gT1VUOwo+ICugoKCgoKCgfQo+ICsgoCCgIKAgoC8qIEdldCBkY29va2llIGZpcnN0IGJl Y2F1c2UgYSBtdXRleF9sb2NrIGlzIHRha2VuIGluIHRoYXQKPiAroKCgoKCgoCAqIGNvZGUgcGF0 aCwgc28gaW50ZXJydXB0cyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4KPiAroKCgoKCgoCAqLwo+ICug oKCgoKCgYXBwX2Rjb29raWUgPSBnZXRfZXhlY19kY29va2llX2FuZF9vZmZzZXQoc3B1LCAmb2Zm c2V0LCAKPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg oCZzcHVfY29va2llLCBvYmplY3RJZCk7Cj4gKwo+ICsgoCCgIKAgoC8qIFJlY29yZCBjb250ZXh0 IGluZm8gaW4gZXZlbnQgYnVmZmVyICovCj4gK6CgoKCgoKBzcGluX2xvY2tfaXJxc2F2ZSgmYnVm ZmVyX2xvY2ssIGZsYWdzKTsKPiAroKCgoKCgoGFkZF9ldmVudF9lbnRyeShFU0NBUEVfQ09ERSk7 Cj4gK6CgoKCgoKBhZGRfZXZlbnRfZW50cnkoU1BVX0NUWF9TV0lUQ0hfQ09ERSk7Cj4gK6CgoKCg oKBhZGRfZXZlbnRfZW50cnkoc3B1LT5udW1iZXIpOwo+ICugoKCgoKCgYWRkX2V2ZW50X2VudHJ5 KHNwdS0+cGlkKTsKPiAroKCgoKCgoGFkZF9ldmVudF9lbnRyeShzcHUtPnRnaWQpOwo+ICugoKCg oKCgYWRkX2V2ZW50X2VudHJ5KGFwcF9kY29va2llKTsKPiArCj4gK6CgoKCgoKBhZGRfZXZlbnRf ZW50cnkoRVNDQVBFX0NPREUpOwo+ICugoKCgoKCgaWYgKG9mZnNldCkgewo+ICugoKCgoKCgIKAv KiBXaGVuIG9mZnNldCBpcyBub24temVybywgoHRoaXMgbWVhbnMgdGhlIFNQVSBFTEYgd2FzIGVt YmVkZGVkOwo+ICugoKCgoKCgIKAgKiBvdGhlcndpc2UsIGl0IHdhcyBsb2FkZWQgZnJvbSBhIHNl cGFyYXRlIGJpbmFyeSBmaWxlLiCgRm9yIHRoZQo+ICugoKCgoKCgIKAgKiBlbWJlZGRlZCBjYXNl LCB3ZSByZWNvcmQgdGhlIG9mZnNldCBvZiB0aGUgU1BVIEVMRiBpbnRvIHRoZSBQUFUKPiAroKCg oKCgoCCgICogZXhlY3V0YWJsZTsgZm9yIHRoZSBub24tZW1iZWRkZWQgY2FzZSwgd2UgcmVjb3Jk IGEgZGNvb2tpZSB0aGF0Cj4gK6CgoKCgoKAgoCAqIHBvaW50cyB0byB0aGUgbG9jYXRpb24gb2Yg dGhlIFNQVSBiaW5hcnkgdGhhdCB3YXMgbG9hZGVkLgo+ICugoKCgoKCgIKAgKi8KPiAroKCgoKCg oKCgoKCgoKCgYWRkX2V2ZW50X2VudHJ5KFNQVV9PRkZTRVRfQ09ERSk7Cj4gK6CgoKCgoKCgoKCg oKCgoGFkZF9ldmVudF9lbnRyeShvZmZzZXQpOwo+ICugoKCgoKCgfSBlbHNlIHsKPiAroKCgoKCg oKCgoKCgoKCgYWRkX2V2ZW50X2VudHJ5KFNQVV9DT09LSUVfQ09ERSk7Cj4gK6CgoKCgoKCgoKCg oKCgoGFkZF9ldmVudF9lbnRyeShzcHVfY29va2llKTsKPiAroKCgoKCgoH0KCkkgZG9uJ3QgZ2V0 IGl0LiBXaGF0IGlzIHRoZSBhcHBfZGNvb2tpZSB1c2VkIGZvcj8gSWYgdGhlIHNwdSBiaW5hcnkg aXMKZW1iZWRkZWQgaW50byBhIGxpYnJhcnksIHlvdSBhcmUgc3RpbGwgbWlzc2luZyB0aGUgZGNv b2tpZSB0byB0aGF0IC5zbyBmaWxlLApiZWNhdXNlIHlvdSByZXR1cm4gb25seSBhbiBvZmZzZXQu Cgo8bml0cGlja2luZz4KCj4gK6CgoKCgoKB1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCm5vIG5l ZWQgdG8gaW5pdGlhbGl6ZQoKPiAroKCgoKCgoHN0cnVjdCBzcHUgKiB0aGVfc3B1ID0gKHN0cnVj dCBzcHUgKikgZGF0YTsKCm5vIG5lZWQgZm9yIHRoZSBjYXN0Cgo+ICugoKCgoKCgcHJfZGVidWco IlNQVSBldmVudCBub3RpZmljYXRpb24gYXJyaXZlZFxuIik7Cj4gK6CgoKCgoKBpZiAodmFsID09 IDApewoKaWYgKCF2YWwpCgo+ICugoKCgoKCgcHJfZGVidWcoInNwdV9zeW5jX3N0YXJ0IC0tIHJ1 bm5pbmcuXG4iKTsKPiArT1VUOgoKb3V0OgoKPiAroKCgoKCgoHJldHVybiByZXQ7oKCgoKAKPiAr fQoKPC9uaXRwaWNraW5nPgoKCgo+IEBAIC00ODAsNyArNDkxLDIyIEBACj4goKCgoKCgoKAgoCCg IKAgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywgaW50IG51bV9jdHJzKQo+IKB7Cj4goKCg oKCgoKBpbnQgaSwgaiwgY3B1Owo+ICugoKCgoKCgc3B1X2N5Y2xlX3Jlc2V0ID0gMDsKPiCgCj4g K6CgoKCgoKAvKiBUaGUgY3B1ZnJlcV9xdWlja19nZXQgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCBj YmVfY3B1ZnJlcSBtb2R1bGUKPiAroKCgoKCgoCAqIGJlIGxvYWRlZC4goFRoaXMgZnVuY3Rpb24g aXMgbm90IGFjdHVhbGx5IHByb3ZpZGVkIGFuZCBleHBvcnRlZAo+ICugoKCgoKCgICogYnkgY2Jl X2NwdWZyZXEsIGJ1dCBpdCByZWxpZXMgb24gY2JlX2NwdWZyZXEgaW5pdGlhbGl6ZSBrZXJuZWwK PiAroKCgoKCgoCAqIGRhdGEgc3RydWN0dXJlcy4goFNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciBk ZXBtb2QgdG8gcmVhbGl6ZQo+ICugoKCgoKCgICogdGhhdCBvdXIgT1Byb2ZpbGUgbW9kdWxlIGRl cGVuZHMgb24gY2JlX2NwdWZyZXEsIHdlIGN1cnJlbnRseQo+ICugoKCgoKCgICogYXJlIGxldHRp bmcgdGhlIHVzZXJzcGFjZSB0b29sLCBvcGNvbnRyb2wsIGVuc3VyZSB0aGF0IHRoZQo+ICugoKCg oKCgICogY2JlX2NwdWZyZXEgbW9kdWxlIGlzIGxvYWRlZC4KPiAroKCgoKCgoCAqLwo+ICugoKCg oKCga2h6ZnJlcSA9IGNwdWZyZXFfcXVpY2tfZ2V0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CgpZb3Ug c2hvdWxkIHByb2JhYmx5IGhhdmUgYSBmYWxsYmFjayBpbiBoZXJlIGluIGNhc2UgdGhlIGNwdWZy ZXEgbW9kdWxlCmlzIG5vdCBsb2FkZWQuIFRoZXJlIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIHBwY19w cm9jX2ZyZXEgKGluIEh6KSB0aGF0CnlvdSBjYW4gYWNjZXNzLgo+IKCgoKCgoKCgOwo+IKB9Cj4g oAo+IC1zdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9zdGFydChzdHJ1Y3Qgb3BfY291bnRlcl9jb25m aWcgKmN0cikKPiArc3RhdGljIGludCBjYWxjdWxhdGVfbGZzcihpbnQgbikKPiArewo+ICsjZGVm aW5lIHNpemUgMjQKPiAroKCgoKCgoGludCBpOwo+ICugoKCgoKCgdW5zaWduZWQgaW50IG5ld2xm c3IwOwo+ICugoKCgoKCgdW5zaWduZWQgaW50IGxmc3IgPSAweEZGRkZGRjsKPiAroKCgoKCgoHVu c2lnbmVkIGludCBob3dtYW55ID0gbGZzciAtIG47Cj4gKwo+ICugoKCgoKCgZm9yIChpID0gMjsg aSA8IGhvd21hbnkgKyAyOyBpKyspIHsKPiAroKCgoKCgoKCgoKCgoKCgbmV3bGZzcjAgPSAoKChs ZnNyID4+IChzaXplIC0gMSAtIDApKSAmIDEpIF4KPiAroKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg oCCgKChsZnNyID4+IChzaXplIC0gMSAtIDEpKSAmIDEpIF4KPiAroKCgoKCgoKCgoKCgoKCgoKCg oKCgoKAgoCCgKCgobGZzciA+PiAoc2l6ZSAtIDEgLSA2KSkgJiAxKSBeCj4gK6CgoKCgoKCgoKCg oKCgoKCgoKCgoKCgIKAgoCAoKGxmc3IgPj4gKHNpemUgLSAxIC0gMjMpKSAmIDEpKSk7Cj4gKwo+ ICugoKCgoKCgoKCgoKCgoKBsZnNyID4+PSAxOwo+ICugoKCgoKCgoKCgoKCgoKBsZnNyID0gbGZz ciB8IChuZXdsZnNyMCA8PCAoc2l6ZSAtIDEpKTsKPiAroKCgoKCgoH0KPiAroKCgoKCgoHJldHVy biBsZnNyOwo+ICsKPiArfQoKSSBkb24ndCBoYXZlIHRoZSBzbGlnaHRlc3QgaWRlYSB3aGF0IHRo aXMgY29kZSBpcyBhYm91dCwgYnV0Cml0IGNlcnRhaW5seSBsb29rcyBpbmVmZmljaWVudCB0byBs b29wIDE2IG1pbGxpb24gdGltZXMgdG8KY29tcHV0ZSBhIGNvbnN0YW50LiBDb3VsZCB5b3UgdXNl IGEgZmFzdGVyIGFsZ29yaXRobSBpbnN0ZWFkLApvciBhdCBsZWFzdCBhZGQgYSBjb21tZW50IGFi b3V0IHdoeSB5b3UgZG8gaXQgdGhpcyB3YXk/Cgo+ICtzdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9z dG9wKHZvaWQpCj4gK3sKPiAroKCgoKCgoGlmIChzcHVfY3ljbGVfcmVzZXQpIHsKPiAroKCgoKCg oKCgoKCgoKCgY2VsbF9nbG9iYWxfc3RvcF9zcHUoKTsKPiAroKCgoKCgoH0gZWxzZSB7Cj4gK6Cg oKCgoKCgoKCgoKCgoGNlbGxfZ2xvYmFsX3N0b3BfcHB1KCk7Cj4gK6CgoKCgoKB9Cj4gKwo+ICt9 CgpUaGlzIGxvb2tzIHdlaXJkIGFzIHdlbGwuIEkgc3VwcG9zZSBpdCdzIGEgbGltaXRhdGlvbiBv ZiB0aGUgaGFyZHdhcmUKdGhhdCB5b3UgY2FuIG9ubHkgZG8gZWl0aGVyIHBwdSBvciBzcHUgcHJv ZmlsaW5nLiBIb3dldmVyLCBtYWtpbmcgdGhhdApkZXBlbmRlbnQgb2Ygd2hldGhlciB0aGUgJ3Nw dV9jeWNsZV9yZXNldCcgdmFyaWFibGUgaXMgc2V0IHNvdW5kcwpyYXRoZXIgYm9ndXMuCgpJIGRv bid0IGtub3cgd2hhdCB0aGUgYmVzdCBpbnRlcmZhY2UgZm9yIGNob29zaW5nIHRoZSB0YXJnZXQg ZnJvbQp1c2VyIHNwYWNlIHdvdWxkIGJlLCBidXQgeW91IHByb2JhYmx5IGFsc28gd2FudCB0byBi ZSBhYmxlIHRvCnN3aXRjaCBiZXR3ZWVuIHRoZW0gYXQgcnVuIHRpbWUuCgoJQXJuZCA8PjwK