From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mohit Gambhir Subject: Re: [PATCH v3 2/2][XTF] xtf/vpmu: MSR read/write tests for VPMU Date: Tue, 25 Apr 2017 17:45:06 -0400 Message-ID: References: <20170424175430.395-1-mohit.gambhir@oracle.com> <20170424175430.395-3-mohit.gambhir@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Andrew Cooper , xen-devel@lists.xen.org Cc: boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org CgpPbiAwNC8yNS8yMDE3IDAyOjIwIFBNLCBBbmRyZXcgQ29vcGVyIHdyb3RlOgo+IE9uIDI0LzA0 LzE3IDE4OjU0LCBNb2hpdCBHYW1iaGlyIHdyb3RlOgo+PiBUaGlzIHBhdGNoIHRlc3RzIFZQTVUg ZnVuY3Rpb25hbGl0eSBpbiB0aGUgaHlwZXJ2aXNvciBvbiBJbnRlbCBtYWNoaW5lcy4KPj4gVGhl IHRlc3RzIHdyaXRlIHRvIGFsbCB2YWxpZCBiaXRzIGluIHRoZSBNU1JzIHRoYXQgZ2V0IGV4cG9z ZWQgdG8gdGhlIGd1ZXN0cwo+PiB3aGVuIFZQTVUgaXMgZW5hYmxlZC4gVGhlIHRlc3RzIGFsc28g d3JpdGUgaW52YWxpZCB2YWx1ZXMgdG8gdGhlIGJpdHMKPj4gdGhhdCBzaG91bGQgYmUgbWFza2Vk IGFuZCBleHBlY3QgdGhlIHdybXNyIGNhbGwgdG8gZmF1bHQuCj4+Cj4+IFRoZSB0ZXN0cyBhcmUg Y3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciBBTUQgbWFjaGluZXMgYW5kIFBWIGd1ZXN0cy4KPj4K Pj4gU2lnbmVkLW9mZi1ieTogTW9oaXQgR2FtYmhpciA8bW9oaXQuZ2FtYmhpckBvcmFjbGUuY29t Pgo+PiAtLS0KPj4gICB0ZXN0cy92cG11L01ha2VmaWxlIHwgICA5ICsKPj4gICB0ZXN0cy92cG11 L21haW4uYyAgIHwgNTA0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPj4gICAyIGZpbGVzIGNoYW5nZWQsIDUxMyBpbnNlcnRpb25zKCspCj4+ICAg Y3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL3ZwbXUvTWFrZWZpbGUKPj4gICBjcmVhdGUgbW9kZSAx MDA2NDQgdGVzdHMvdnBtdS9tYWluLmMKPj4KPj4gZGlmZiAtLWdpdCBhL3Rlc3RzL3ZwbXUvTWFr ZWZpbGUgYi90ZXN0cy92cG11L01ha2VmaWxlCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGlu ZGV4IDAwMDAwMDAuLjFlYWY0MzYKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi90ZXN0cy92cG11 L01ha2VmaWxlCj4+IEBAIC0wLDAgKzEsOSBAQAo+PiAraW5jbHVkZSAkKFJPT1QpL2J1aWxkL2Nv bW1vbi5tawo+PiArCj4+ICtOQU1FICAgICAgOj0gdnBtdQo+PiArQ0FURUdPUlkgIDo9IHV0aWxp dHkKPiB1dGlsaXRpZXMgZG9uJ3QgZ2V0IHJ1biBhdXRvbWF0aWNhbGx5LiAgSXMgdGhpcyBpbnRl bnRpb25hbD8gIElmIGl0Cj4gaXNuJ3QsIHdoYXQgaXMgdGhlIHBsYW4gZm9yIG1ha2luZyBpdCBh dXRvbWF0aWNhbGx5IHJ1bj8gIHZwbXUgaXMgc3RpbGwKPiBkaXNhYmxlZCBieSBkZWZhdWx0IGlu IGFsbCBicmFuY2hlcyBkdWUgdG8gdGhlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcywKPiBzbyBl dmVuIGlmIHRoaXMgdnBtdSB0ZXN0IHdhcyBhdXRvbWF0aWNhbGx5IHJ1biwgaXQgd291bGQgc2tp cCBkdWUgdG8KPiB2cG11IG5vdCBiZWluZyB2aXNpYmxlLgpUaGUgcmVhc29uIEkgd2FudGVkIGl0 IHRvIG5vdCBydW4gYXV0b21hdGljYWxseSB3YXMgYmVjYXVzZSBJIHRob3VnaHQgaXQgCndpbGwg ZmFpbCB3aGVuIHZwbXUKaXMgbm90IGVuYWJsZWQgLSB3aGljaCBpcyB0aGUgZGVmYXVsdCBjYXNl LiBCdXQgaWYgWFRGIHdpbGwgc2tpcCB2cG11IAp0ZXN0cyB3aGVuIGl0IGlzIGRpc2FibGVkCnRo ZW4gd2UgY2FuIHJ1biB0aGUgdGVzdHMgYXV0b21hdGljYWxseS4gU2hvdWxkIHRoZSBDQVRFR09S WSBiZSAKZnVuY3Rpb25hbCBpbiB0aGF0IGNhc2U/Cj4gQXMgYSB0YW5nZW50LCBJIHdvbmRlciBp ZiBpdCB3b3VsZCBiZSBhIHVzZWZ1bCB0byBoYXZlIGEgc2VwYXJhdGUKPiBjYXRlZ29yeSBmb3Ig aW5jb21wbGV0ZSB0ZXN0cywgYnV0IHdoaWNoIGFyZSBzdGlsbCB1c2VmdWwgdG8gaGF2ZSBmb3IK PiBtYW51YWwgcnVubmluZy4KUG9zc2libHkuIFV0aWxpdHkgY2F0ZWdvcnkgc2VlbXMgdG8gZG8g anVzdCB0aGF0IGJ1dCBJIGNhbiBzZWUgdGhhdCBpdCAKaXMgcmVhbGx5IG5vdCBtZWFudCBmb3IK ZnVuY3Rpb25hbCB0ZXN0cy4gVGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgd3JpdGluZyB0ZXN0 cyBiZWZvcmUgb3IgCndoaWxlIGltcGxlbWVudGluZyBhCmZlYXR1cmUgaXMgdXNlZnVsICBhbmQg aW4gdGhhdCBjYXNlIHRoaXMgbmV3IGNhdGVnb3J5IGNhbiBiZSBiZW5lZmljaWFsLiAKSXQgd291 bGQgYWxzbyBiZW5lZml0CnRvIGhhdmUgc29tZSBraW5kIG9mICJleHBlY3RlZCBmYWlsdXJlIiBy ZXR1cm4gdHlwZS4KPj4gK1RFU1QtRU5WUyA6PSAkKEFMTF9FTlZJUk9OTUVOVFMpCj4gWW91IGJ1 aWxkIGZvciBhbGwgZW52aXJvbm1lbnRzLCBidXQgdGhlbiBoYXZlIFBWIHVuaWxhdGVyYWxseSBz a2lwLgo+IEFnYWluLCBpcyB0aGlzIGludGVudGlvbmFsPwpZZXMsIEkgdGhvdWdodCBJIHdvdWxk IGdvIGJhY2sgYW5kIGFkZCBQVi9BTUQgdGVzdHMgaW4gVjIgYnV0IEkgY2FuIApsZWF2ZSB0aG9z ZSBURVNULUVOVlMKb3V0IGZvciBub3cgYW5kICJza2lwIHRoZSBza2lwIiA6KSBpZiB0aGF0J3Mg cHJlZmVyYWJsZS4KPiBGb3IgSFZNLCB3aHkgYWxsIGVudmlyb25tZW50cz8gIGRvZXMgUE1VIGhh dmUgYW55IGludGVyYWN0aW9uIHdpdGggdGhlCj4gb3BlcmF0aW5nIG9yIHBhZ2luZyBtb2RlIGlu IHVzZSBhdCB0aGUgdGltZSBvZiB0aGUgc2FtcGxlcz8KTm90IHRoYXQgSSBrbm93IG9mLiBTbyBz aG91bGQgaXQganVzdCBiZSBodm02ND8KPj4gKwo+PiArb2JqLXBlcmVudiArPSBtYWluLm8KPj4g Kwo+PiAraW5jbHVkZSAkKFJPT1QpL2J1aWxkL2dlbi5tawo+PiBkaWZmIC0tZ2l0IGEvdGVzdHMv dnBtdS9tYWluLmMgYi90ZXN0cy92cG11L21haW4uYwo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ PiBpbmRleCAwMDAwMDAwLi5lZDAwOTUzCj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvdGVzdHMv dnBtdS9tYWluLmMKPj4gQEAgLTAsMCArMSw1MDQgQEAKPj4gKy8qKgo+PiArICogQGZpbGUgdGVz dHMvdnBtdS9tYWluLmMKPj4gKyAqIEByZWYgdGVzdC12cG11Cj4+ICsgKgo+PiArICogQHBhZ2Ug dGVzdC12cG11IHZwbXUKPj4gKyAqCj4+ICsgKiBUZXN0IE1TUnMgZXhwb3NlZCBieSBWUE1VIGZv ciB2YXJpb3VzIHZlcnNpb25zIG9mIEFyY2hpdGVjdHVyYWwgUGVyZm9ybWFuY2UKPj4gKyAqIE1v bml0b3JpbmcgVW5pdAo+IFRoaXMgbmVlZHMgcmF0aGVyIG1vcmUgaW5mb3JtYXRpb24uICBXaGF0 IHRlc3RzIGFyZSBwZXJmb3JtZWQ/ICBUYWtlIGEKPiBsb29rIGF0IGh0dHA6Ly94ZW5iaXRzLnhl bi5vcmcvZG9jcy94dGYvdGVzdC1pbmRleC5odG1sLCBwYXJ0aWN1bGFybHkKPiB0aGUgZnVuY3Rp b25hbCB0ZXN0cy4KT0ssIHdpbGwgZml4IGl0IGluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHBh dGNoLgo+PiArICoKPj4gKyAqIEBzZWUgdGVzdHMvdnBtdS9tYWluLmMKPj4gKyAqLwo+PiArCj4+ ICsjaW5jbHVkZSA8eHRmLmg+Cj4+ICsjaW5jbHVkZSA8YXJjaC9tc3ItaW5kZXguaD4KPj4gKyNp bmNsdWRlIDxhcmNoL21tLmg+Cj4+ICsKPj4gKyNkZWZpbmUgRVZFTlRfVU9QU19SRVRJUkVEICAg ICAgICAgICAgICAgICAgIDB4MDA0MTAxYzIKPj4gKyNkZWZpbmUgRVZFTlRfVU9QU19SRVRJUkVE X0FOWVRIUkVBRCAgICAgICAgIDB4MDA2MTAxYzIKPj4gKyNkZWZpbmUgRklYRURfQ1RSX0NUTF9C SVRTICAgICAgICAgICAgICAgICAgIDQKPj4gKyNkZWZpbmUgRklYRURfQ1RSX0VOQUJMRSAgICAg ICAgICAgICAgICAgICAgIDB4MDAwMDAwMEEKPj4gKyNkZWZpbmUgRklYRURfQ1RSX0VOQUJMRV9B TllUSFJFQUQgICAgICAgICAgIDB4MDAwMDAwMEUKPj4gKyNkZWZpbmUgSUEzMl9QRVJGRVZFTlRT RUx4X0VOQUJMRV9BTllUSFJFQUQgICgxdWxsIDw8IDIxKQo+PiArI2RlZmluZSBJQTMyX1BFUkZF VkVOVFNFTHhfRU5BQkxFX1BDQiAgICAgICAgKDF1bGwgPDwgMTkpCj4+ICsjZGVmaW5lIElBMzJf REVCVUdDVExfRnJlZXplX0xCUl9PTl9QTUkgICAgICAoMXVsbCA8PCAxMSkKPj4gKyNkZWZpbmUg SUEzMl9ERUJVR0NUTF9GcmVlemVfUGVyZk1vbl9Pbl9QTUkgICgxdWxsIDw8IDEyKQo+PiArCj4+ ICtjb25zdCBjaGFyIHRlc3RfdGl0bGVbXSA9ICJUZXN0IHZwbXUiOwo+PiArCj4+ICtzdGF0aWMg dm9pZCBnZXRfaW50ZWxfcG11X3ZlcnNpb24odWludDhfdCAqdiwgdWludDhfdCAqbmcsIHVpbnQ4 X3QgKm5mLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm5n YikKPj4gK3sKPiBJTU8sIEl0IGxvb2tzIGxpa2UgdGhlIGxvZ2ljIHdvdWxkIGJlIGVhc2llciB0 byBmb2xsb3cgaWYgdGhpcyB3YXNuJ3QKPiBicm9rZW4gb3V0IG9mIHRlc3RfbWFpbigpLgo+Ck9L LCB3aWxsIGZpeCBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBwYXRjaC4KPj4gKyAgICAv KiBJbnRlciBTb2Z0d2FyZSBEZXZlbG9wbWVudCBNYW51YWwgVm9sIDJBCj4+ICsgICAgICogVGFi bGUgMy04ICBJbmZvcm1hdGlvbiBSZXR1cm5lZCBieSBDUFVJRCBJbnN0cnVjdGlvbiAqLwo+IFBs ZWFzZSBmb2xsb3cgWGVuIEh5cGVydmlzb3IgY29kaW5nIHN0eWxlLiAgVGhlcmVmb3JlLAo+Cj4g LyogU2luZ2xlIGxpbmUgY29tbWVudHMgbGlrZSB0aGlzIHBsZWFzZS4gKi8KPgo+IGFuZAo+Cj4g LyoKPiAgICogTXVsdGktbGluZSBjb21tZW50cwo+ICAgKiBsaWtlIHRoaXMgcGxlYXNlLgo+ICAg Ki8KPgpPSywgd2lsbCBmaXggaXQgaW4gdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgcGF0Y2guCj4+ ICsKPj4gKyAgICB1aW50MzJfdCBsZWFmID0gMHgwYSwgc3VibGVhZiA9IDA7Cj4+ICsKPj4gKyAg ICB1aW50MzJfdCBlYXgsIGVieCwgZWN4LCBlZHg7Cj4+ICsKPj4gKyAgICBjcHVpZF9jb3VudChs ZWFmLCBzdWJsZWFmLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKPiBZb3UgbmVlZCB0byBjaGVj ayBtYXhfbGVhZiA+PSAweDBhIGJlZm9yZSB0aGlzIGlzIHZhbGlkIHRvIGRvLiAgSSBoYXZlCj4g anVzdCBwdXNoZWQgYSBjaGFuZ2Ugd2hpY2ggZXhwb3NlcyBtYXhfbGVhZiBhbmQgbWF4X2V4dGRf bGVhZiBmcm9tIHRoZQo+IGJvb3QtdGltZSBjcHVpZCBjb2xsZWN0aW9uIGxvZ2ljLCB3aGljaCB5 b3UgY2FuIHVzZS4KT0ssIHdpbGwgZml4IGl0IGluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHBh dGNoLgo+PiArCj4+ICsgICAgLyogRXh0cmFjdCB0aGUgdmVyc2lvbiBJRCAtIEVBWCA3OjAgKi8K Pj4gKyAgICAqdiA9ICAoZWF4ICYgMHhmZik7Cj4+ICsKPj4gKyAgICAvKiBFeHRyYWN0IG51bWJl ciBvZiBnZW5lcmFsIHB1cnBvc2UgY291bnRlciByZWdzIC0gRUFYIDE1OjggKi8KPj4gKyAgICAq bmcgPSAoZWF4ID4+IDgpICYgMHhmZjsKPj4gKwo+PiArICAgIC8qIEV4dHJhY3QgbnVtYmVyIG9m IGZpeGVkIGZ1bmN0aW9uIGNvdW50ZXIgcmVncyAtIEVEWCA0OjAgKi8KPj4gKyAgICAqbmYgPSBl ZHggJiAweDFmOwo+PiArCj4+ICsgICAgLyogRXh0cmFjdCBudW1iZXIgb2YgYml0cyBpbiBnZW5l cmFsIHB1cnBvc2UgY291bnRlciByZWdpc3RlcnMgYml0cyAqLwo+PiArICAgICpuZ2IgPSAoZWF4 ID4+IDE2KSAgJiAweGZmOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCB0ZXN0X3ZhbGlkX21z cl93cml0ZSh1aW50MzJfdCBpZHgsIHVpbnQ2NF90IHd2YWwpCj4+ICt7Cj4+ICsgICAgY29uc3Qg Y2hhciAqcGZ4ID0gIkVycm9yOiB0ZXN0X3ZhbGlkX21zcl93cml0ZToiOwo+PiArCj4+ICsgICAg dWludDY0X3QgcnZhbCA9IDA7Cj4gSSBkb24ndCBzZWUgbXVjaCB2YWx1ZSB3aXRoIHNwYWNpbmcg dGhlc2UgZGVjbGFyYXRpb25zIG91dC4KPgogICBPSywgd2lsbCBmaXggaXQgaW4gdGhlIG5leHQg dmVyc2lvbiBvZiB0aGUgcGF0Y2guCj4+ICsKPj4gKyAgICBwcmludGsoIldyaXRpbmcgMHglIiBQ Ukl4NjQgIiB0byBNU1IgMHgleFxuIiwgd3ZhbCwgaWR4KTsKPiAlI3ggaXMgc2hvcnRlciB0aGFu IDB4JXggd2hlbiB5b3UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgd2lkdGggb2YgdGhlCj4gbnVtYmVy IHByaW50ZWQuCj4KPiBIb3dldmVyLCBpdCBpcyBnZW5lcmFsbHkgZWFzaWVyIHRvIHJlYWQgdGhl IGxvZ3Mgd2hlbiBudW1iZXJzIGxpa2UgdGhpcwo+IGFyZSBwcmludGVkIGF0IGZ1bGwgd2lkdGgs Cj4KICAgT0ssIHdpbGwgZml4IGl0IGluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHBhdGNoLgo+ PiArCj4+ICsgICAgaWYoIHdybXNyX3NhZmUoaWR4LCB3dmFsKSApCj4+ICsgICAgewo+PiArICAg ICAgICB4dGZfZXJyb3IoIiVzIHdybXNyIGZvciBNU1IgMHgleCByZXN1bHRlZCBpbiBhIGZhdWx0 IVxuIiwgcGZ4LCBpZHgpOwo+IElmIHlvdSBhcmUgZXhwZWN0aW5nIHRoZSB3cml0ZSB0byBzdWNj ZWVkIGFuZCBpdCBkb2Vzbid0LCB0aGF0IGlzIGEgdGVzdAo+IGZhaWx1cmUsIHJhdGhlciB0aGFu IGFuIGVycm9yICh3aGljaCBpcyB1c2VkIHRvIHNpZ25pZnkgc29tZXRoaW5nCj4gZXhwZWN0ZWQg Z29pbmcgd3JvbmcpLgo+Cj4gVGhlIHRyYWlsaW5nICEgaXMgdW5uZWNlc3NhcnkgaW4gdGhlIGxv ZywgYW5kIGlzIGl0IHBvc3NpYmxlIHRvIHJlZHVjZQo+IHRoZSB2ZXJib3NpdHkgb2YgdGhlIGxv Z2dpbmc/ICBUaGlzIGNvdWxkIGVhc2lseSBiZSB4dGZfZmFpbHVyZSgiRmFpbDoKPiB3cm1zcigl MDh4LCAlMDE2IlBSSXg2NCIpIGdvdCB1bmV4cGVjdGVkIGZhdWx0XG4iKSA/Cj4KPiBJIGhhdmUg YWxzbyBmb3VuZCBpdCBnZW5lcmFsbHkgaGVscGZ1bCB0byBub3QgcHJpbnQgdGhlIHN1Y2Nlc3Mg Y2FzZXMsCj4gYXMgdGhleSBxdWlja2x5IGdyb3cgb3V0IG9mIGNvbnRyb2wuICBMb2dnaW5nIGp1 c3QgdGhlIHRvcCBsZXZlbCBhcmVhcwo+IG9mIHRlc3QgKGUuZy4geW91ciB2UE1VIHZlcnNpb24g ZnVuY3Rpb24pLCBhbmQgdGhlIGZhaWx1cmVzIG1ha2VzIGlzIGZhcgo+IGVhc2llciBpbiB0aGUg Y2FzZSB0aGF0IHNvbWV0aGluZyBkb2VzIGdvIHdyb25nLgogICBPSywgd2lsbCBmaXggaXQgaW4g dGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgcGF0Y2guCj4+ICsgICAgICAgIHJldHVybiBmYWxzZTsK Pj4gKyAgICB9Cj4+ICsKPj4gKyAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlcyB3ZXJl IHdyaXR0ZW4gY29ycmVjdGx5ICovCj4+ICsgICAgaWYgKCByZG1zcl9zYWZlKGlkeCwgJnJ2YWwp ICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIHh0Zl9lcnJvcigiJXMgcmRtc3IgZm9yIE1TUiAweCV4 IHJlc3VsdGVkIGluIGEgZmF1bHQhXG4iLCBwZngsIGlkeCk7Cj4+ICsgICAgICAgIHJldHVybiBm YWxzZTsKPj4gKyAgICB9Cj4+ICsgICAgaWYgKCBydmFsICE9IHd2YWwgKQo+PiArICAgIHsKPj4g KyAgICAgICAgeHRmX2Vycm9yKCIlcyByZG1zciB2YWx1ZSBtaXNtYXRjaCBmb3IgTVNSIDB4JXgg RXhwZWN0ZWQ6ICUiUFJJeDY0Cj4+ICsgICAgICAgICAgICAgICAgIiwgRm91bmQgJSJQUkl4NjQi XG4iLCBwZngsIGlkeCwgd3ZhbCwgcnZhbCk7Cj4+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPj4g KyAgICB9Cj4+ICsKPj4gKyAgICByZXR1cm4gdHJ1ZTsKPiBBcyBhIGdlbmVyYWwgbm90ZSwgaGF2 aW5nIHRydWUgYW5kIGZhbHNlIHJldHVybmVkIGxpa2UgdGhpcyBhcmUKPiBjb3VudGVycHJvZHVj dGl2ZSBpbiBjb21wcmVoZW5zaXZlIHRlc3RzIGxpa2UgdGhpcy4gIEl0IGNhdXNlcyB5b3UgdG8K PiBiYWlsIG91dCBhdCB0aGUgZmlyc3QgZmFpbHVyZSwgcmF0aGVyIHRoYW4gdHJ5IGV2ZXJ5dGhp bmcgYW5kIGxvZyBhbGwKPiBlcnJvcnMuICBBIHNpbmdsZSBjYWxsIHRvIHh0Zl97ZXJyb3IsZmFp bHVyZX0oKSB3aWxsIGNhdXNlIHRoZSBvdmVyYWxsCj4gcmVzdWx0IHRvIGJlIHRoZSBtb3N0IHNl dmVyZSwgc28geW91IGRvbid0IG5lZWQgdG8gcGFzcyBiYWNrIGFuIGV4dHJhCj4gc3RhdHVzIGxp a2UgdGhpcyAodW5sZXNzIGEgZmFpbHVyZSBhdCB0aGlzIHBvaW50IGFjdGl2ZWx5IHByb2hpYml0 cyBhCj4gbGF0ZXIgYml0IG9mIHRlc3RpbmcsIHdoaWNoIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHRo ZSBjYXNlKS4KVHJ1ZS4gV2lsbCBjaGFuZ2UgdGhpcy4KPj4gK30KPj4gKwo+PiArc3RhdGljIGJv b2wgdGVzdF9pbnZhbGlkX21zcl93cml0ZSh1aW50MzJfdCBpZHgsIHVpbnQ2NF90IHd2YWwpCj4+ ICt7Cj4+ICsgICAgcHJpbnRrKCJXcml0ZSBpbnZhbGlkIHZhbHVlICUiUFJJeDY0IiB0byBNU1Ig MHgleFxuIiwgd3ZhbCwgaWR4KTsKPj4gKwo+PiArICAgIC8qIHdybXNyX3NhZmUgbXVzdCByZXR1 cm4gZmFsc2UgYWZ0ZXIgZmF1bHRpbmcgKi8KPj4gKyAgICBpZiggIXdybXNyX3NhZmUoaWR4LCB3 dmFsKSApCj4+ICsgICAgewo+PiArICAgICAgICB4dGZfZXJyb3IoIkVycm9yOiB0ZXN0X2ludmFs aWRfbXNyX3dyaXRlIHdybXNyIGZvciBNU1IgMHgleCBkaWQgbm90ICIKPj4gKyAgICAgICAgICAg ICAgICAgICJmYXVsdCFcbiIsIGlkeCk7Cj4+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKyAg ICB9Cj4+ICsKPj4gKyAgICBwcmludGsoIndybXNyIHRvIE1TUiAweCV4IGZhdWx0ZWQgYXMgZXhw ZWN0ZWQuXG4iLCBpZHgpOwo+PiArCj4+ICsgICAgcmV0dXJuIHRydWU7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyBib29sIHRlc3RfdHJhbnNwYXJlbnRfbXNyX3dyaXRlKHVpbnQzMl90IGlkeCwgdWlu dDY0X3Qgd3ZhbCkKPj4gK3sKPj4gKyAgICBjb25zdCBjaGFyICpwZnggPSAiRXJyb3I6IHRlc3Rf dHJhbnNwYXJlbnRfbXNyX3dyaXRlOiI7Cj4+ICsKPj4gKyAgICB1aW50NjRfdCBydmFsMSA9IDA7 Cj4+ICsKPj4gKyAgICB1aW50NjRfdCBydmFsMiA9IDA7Cj4gQWdhaW4sIG5vIG5lZWQgZm9yIHRo ZXNlIHRvIGJlIHNvIHNwYWNlZCBvdXQuCk9LLgo+PiArCj4+ICsgICAgcHJpbnRrKCJBdHRlbXB0 aW5nIHRvIHdyaXRlIGEgdmFsdWUgd2l0aCBubyBlZmZlY3QgdG8gTVNSIDB4JXhcbiIsIGlkeCk7 Cj4+ICsKPj4gKyAgICAvKiByZWFkIGN1cnJlbnQgdmFsdWUgKi8KPj4gKyAgICBpZiAoIHJkbXNy X3NhZmUoaWR4LCAmcnZhbDEpICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIHh0Zl9lcnJvcigiJXMg cmRtc3IgZm9yIE1TUiAweCV4IHJlc3VsdGVkIGluIGEgZmF1bHRcbiIsIHBmeCwgaWR4KTsKPj4g KyAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiArICAgIH0KPj4gKwo+PiArICAgIC8qIHdybXNyIHNo b3VsZCBub3QgZmF1bHQgYnV0IHNob3VsZCBub3Qgd3JpdGUgYW55dGhpbmcgZWl0aGVyICovCj4+ ICsgICAgaWYgICggd3Jtc3Jfc2FmZShpZHgsIHd2YWwpICkKPj4gKyAgICB7Cj4+ICsgICAgICAg IHh0Zl9lcnJvcigiJXMgd3Jtc3IgZm9yIE1TUiAweCV4IHJlc3VsdGVkIGluIGEgZmF1bHRcbiIs IHBmeCwgaWR4KTsKPj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiArICAgIH0KPj4gKwo+PiAr ICAgIC8qIHJlYWQgbmV3IHZhbHVlICovCj4+ICsgICAgaWYgKCByZG1zcl9zYWZlKGlkeCwgJnJ2 YWwyKSApCj4+ICsgICAgewo+PiArICAgICAgICB4dGZfZXJyb3IoIiVzIHJkbXNyIGZvciBNU1Ig MHgleCByZXN1bHRlZCBpbiBhIGZhdWx0XG4iLCBwZngsIGlkeCk7Cj4+ICsgICAgICAgIHJldHVy biBmYWxzZTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgICAvKiBDaGVjayBpZiB0aGUgbmV3IHZhbHVl IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgYmVmb3JlIHdybXNyICovCj4+ICsKPj4gKyAgICBpZiAo IHJ2YWwxICE9IHJ2YWwyICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIHh0Zl9lcnJvcigiJXMgcmRt c3IgdmFsdWUgbWlzbWF0Y2ggZm9yIE1TUiAweCV4IEV4cGVjdGVkICUiUFJJeDY0Cj4+ICsgICAg ICAgICAgICAgICAgIi4gRm91bmQgJSJQUkl4NjQiXG4iLCBwZngsIGlkeCwgcnZhbDEsIHJ2YWwy KTsKPj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiArICAgIH0KPj4gKwo+PiArICAgIHJldHVy biB0cnVlOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCB0ZXN0X2ludGVsX3BtdV92ZXIxKHVp bnQ4X3QgbmcpCj4+ICt7Cj4+ICsgICAgLyogSW50ZWwgU29md3RhcmUgRGV2ZWxvcG1lbnQgTWFu dWFsIFZvbC4gM0IsCj4+ICsgICAgICogU2VjdGlvbiAxOC4yLjEgLSBBcmNoaXRlY3R1cmFsIFBl cmZvcm1hbmNlIE1vbml0b3JpbmcgVmVyc2lvbiAxCj4+ICsgICAgICoKPj4gKyAgICAgKiBNU1Jz IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBWUE1VIC0KPj4gKyAgICAgKgo+PiArICAgICAqIElBMzJf UE1DeCAoc3RhcnQgYXQgYWRkcmVzcyAweGMxKQo+PiArICAgICAqIElBMzJfUEVSRkVWRU5UU0VM eCAoc3RhcnQgYXQgYWRkcmVzcyAweDE4NikKPj4gKyAgICAgKi8KPiBWZXJ5IGhlbHBmdWwgY29t bWVudCEgSSB0aG9yb3VnaGx5IGFwcHJvdmUuCkF3ZXNvbWUhCj4+ICsKPj4gKyAgICB1aW50MzJf dCBpZHg7Cj4+ICsKPj4gKyAgICB1aW50NjRfdCB3dmFsID0gMDsKPj4gKwo+PiArICAgIHVpbnQ4 X3QgaTsKPiBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSBhIHVpbnQ4X3QuICBBIHBsYWluIHVuc2ln bmVkIGludCB3aWxsIGJlIGZpbmUuCj4KT0suCj4+ICsKPj4gKyAgICBwcmludGsoIi0tLS0tLS0t LS0tLS0tLS0tXG4iKTsKPj4gKyAgICBwcmludGsoIlRlc3RpbmcgdmVyc2lvbiAxXG4iKTsKPj4g KyAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKPj4gKwo+PiArICAgIC8qIGZvciBh bGwgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXJzICovCj4+ICsgICAgZm9yICggaSA9IDA7IGkgPCBu ZzsgaSsrICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIC8qIHRlc3Qgd3JpdGluZyB0byBJQTMyX1BN Q3ggKi8KPj4gKyAgICAgICAgaWR4ID0gTVNSX0lBMzJfUE1DKGkpOwo+PiArCj4+ICsgICAgICAg IC8qIHRlc3Qgd2UgY2FuIHdyaXRlIHRvIGFsbCB2YWxpZCBiaXRzIGluIHRoZSBjb3VudGVycyAq Lwo+PiArICAgICAgICAvKiBkb24ndCBzZXQgYml0IDMxIHNpbmNlIHRoYXQgZ2V0cyBzaWduLWV4 dGVuZGVkICovCj4gV2hhdCBpcyB3cm9uZyB3aXRoIGJpdCAzMSBiZWluZyBzaWduIGV4dGVuZGVk PwpUaGUgcHJvYmxlbSB0aGVyZSBpcyB0aGF0IHNldHRpbmcgUE1DeCB0byAweGZmZmZmZmZmIHNp Z24gZXh0ZW5kcyAzMXN0IApiaXQgdG8KdGhlIHJlbWFpbmluZyBiaXRzLiBTbyBQTUN4IGJlY29t ZXMgMHhmZmZmZmZmZmZmZmYgKHdoZW4gYml0IHdpZHRoIGlzIAo0OCkuIHJkbXNyIHRoZW4KcmVh ZHMgYWxsIDQ4IGJpdHMgYW5kIHRoZSB2YWx1ZSBtaXNtYXRjaGVzIHRoZSBvbmUgdGhhdCB3YXMg d3JpdHRlbi4KCkEgc21hcnRlciB0ZXN0IHdvdWxkIHByb3ZpZGUgYm90aCAtIHdyaXRlIHZhbHVl IHRvIHdyaXRlIGFuZCByZWFkIHZhbHVlIAp0byBjaGVjayBhZ2FpbnN0LgpCdXQgdGVzdF92YWxp ZF9tc3Jfd3JpdGUoKSBvbmx5IHRha2VzIHd2YWwgYW5kIGNoZWNrcyB0byBzZWUgaWYgd2UgcmVh ZCAKdGhlIHNhbWUgdmFsdWUKdGhhdCB3ZSB3cm90ZS4KCj4KPj4gKyAgICAgICAgd3ZhbCA9ICgo MXVsbCA8PCAzMSkgLSAxKSA7Cj4+ICsKPj4gKyAgICAgICAgaWYgKCAhdGVzdF92YWxpZF9tc3Jf d3JpdGUoaWR4LCB3dmFsKSApCj4+ICsgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4g KyAgICAgICAgLyogc2V0IGFsbCB2YWxpZCBiaXRzIGluIE1TUl9JQTMyX0VWRU5UU0VMeCAqLwo+ PiArICAgICAgICBpZHggPSBNU1JfSUEzMl9QRVJGRVZUU0VMKGkpOwo+PiArICAgICAgICB3dmFs ID0gKCgxdWxsIDw8IDMyKSAtIDEpIF4gKElBMzJfUEVSRkVWRU5UU0VMeF9FTkFCTEVfQU5ZVEhS RUFEIHwKPj4gKyAgICAgICAgICAgICAgICBJQTMyX1BFUkZFVkVOVFNFTHhfRU5BQkxFX1BDQik7 Cj4gV2hhdCBpcyB3cm9uZyB3aXRoIFBpbiBDb250cm9sIGluIHRoaXMgcmVnaXN0ZXI/ICBBcmNo aXRlY3R1cmFsbHksIGl0IGlzCj4gYSBzb2Z0d2FyZSBjb25maWd1cmFibGUgYml0LgpMb29rIGF0 IHRoaXMgcGF0Y2ggb24geGVuLWRldmVsCgpbUEFUQ0hdIEZpeCBoeXBlcnZpc29yIGNyYXNoIHdo ZW4gd3JpdGluZyB0byBWUE1VIE1TUgoKSSBmb3VuZCB0aGF0IG91dCB3aGlsZSB3cml0aW5nIHRo aXMgdGVzdC4KCj4+ICsKPj4gKyAgICAgICAgaWYgKCAhdGVzdF92YWxpZF9tc3Jfd3JpdGUoaWR4 LCB3dmFsKSApCj4+ICsgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKyAgICAgICAg LyogdGVzdCB3cml0aW5nIGFuIGludmFsaWQgdmFsdWUgYW5kIGFzc2VydCB0aGF0IGl0IGZhdWx0 cyAqLwo+PiArICAgICAgICB3dmFsID0gfigoMXVsbCA8PCAzMikgLSAxKTsKPj4gKwo+PiArICAg ICAgICBpZiAoICF0ZXN0X2ludmFsaWRfbXNyX3dyaXRlKGlkeCwgd3ZhbCkgKQo+PiArICAgICAg ICAgICAgcmV0dXJuIGZhbHNlOwo+PiArICAgIH0KPj4gKwo+PiArICAgIHJldHVybiB0cnVlOwo+ PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCB0ZXN0X2ludGVsX3BtdV92ZXIyKHVpbnQ4X3Qgbmcs IHVpbnQ4X3QgbmYpCj4+ICt7Cj4+ICsgICAgLyogSW50ZWwgU29md3RhcmUgRGV2ZWxvcG1lbnQg TWFudWFsIFZvbC4gM0IsCj4+ICsgICAgICogU2VjdGlvbiAxOC4yLjIgLSBBcmNoaXRlY3R1cmFs IFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgVmVyc2lvbiAyCj4+ICsgICAgICoKPj4gKyAgICAgKiBN U1JzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBWUE1VIC0KPj4gKyAgICAgKgo+PiArICAgICAqIElB MzJfRklYRURfQ1RSeCAoc3RhcnQgYXQgYWRkcmVzcyAweDMwOSkKPj4gKyAgICAgKiBJQTMyX0ZJ WEVEX0NUUl9DVFJMCj4+ICsgICAgICogSUEzMl9QRVJGX0dMT0JBTF9DVFJMCj4+ICsgICAgICog SUEzMl9QRVJGX0dMT0JBTF9TVEFUVVMgKHJlYWQtb25seSkKPj4gKyAgICAgKiBJQTMyX1BFUkZf R0xPQkFMX09WRl9DVFJMCj4+ICsgICAgICogSUEzMl9ERUJVR0NUTF9GcmVlemVfTEJSX09OX1BN SQo+PiArICAgICAqIElBMzJfREVCVUdDVExfRnJlZXplX1BlcmZNb25fT25fUE1JCj4+ICsgICAg ICovCj4+ICsKPj4gKyAgICB1aW50MzJfdCBpZHg7Cj4+ICsKPj4gKyAgICB1aW50NjRfdCB3dmFs LCBydmFsOwo+PiArCj4+ICsgICAgdWludDhfdCBpOwo+PiArCj4+ICsgICAgcHJpbnRrKCItLS0t LS0tLS0tLS0tLS0tLVxuIik7Cj4+ICsgICAgcHJpbnRrKCJUZXN0aW5nIHZlcnNpb24gMlxuIik7 Cj4+ICsgICAgcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLVxuIik7Cj4+ICsKPj4gKyAgICBmb3Ig KCBpID0gMDsgaSA8IG5mOyBpKysgKQo+PiArICAgIHsKPj4gKyAgICAgICAgLyogdGVzdCB3cml0 aW5nIHRvIElBMzJfRklYRURfQ1RSeCAqLwo+PiArICAgICAgICBpZHggPSBNU1JfSUEzMl9GSVhF RF9DVFIoaSk7Cj4+ICsKPj4gKyAgICAgICAgd3ZhbCA9ICgxdWxsIDw8IDMyKSAtIDE7Cj4+ICsK Pj4gKyAgICAgICAgaWYgKCAhdGVzdF92YWxpZF9tc3Jfd3JpdGUoaWR4LCB3dmFsKSApCj4+ICsg ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiArCj4+ICsgICAgICAgIC8qIHRlc3QgaW52YWxp ZCB3cml0ZSB0byBJQTMyX0ZJWEVEX0NUUnggKi8KPj4gKyAgICAgICAgd3ZhbCA9IH53dmFsOwo+ PiArCj4+ICsgICAgICAgIGlmICggIXRlc3RfaW52YWxpZF9tc3Jfd3JpdGUoaWR4LCB3dmFsKSAp Cj4+ICsgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiArICAgIH0KPj4gKwo+PiArICAgIC8q IHRlc3QgSUEzMl9GSVhFRF9DVFJfQ1RSTCAqLwo+PiArICAgIGlkeCA9IE1TUl9JQTMyX0ZJWEVE X0NUUl9DVFJMOwo+PiArCj4+ICsgICAgLyogZW5hYmxlIGFsbCBmaXhlZCBjb3VudGVycyAqLwo+ PiArICAgIHd2YWwgPSAwOwo+PiArCj4+ICsgICAgZm9yICggaSA9IDA7IGkgPCBuZjsgaSsrICkK Pj4gKyAgICAgICAgd3ZhbCB8PSAoRklYRURfQ1RSX0VOQUJMRSA8PCAoRklYRURfQ1RSX0NUTF9C SVRTICogaSkpOwo+PiArCj4+ICsgICAgaWYgKCAhdGVzdF92YWxpZF9tc3Jfd3JpdGUoaWR4LCB3 dmFsKSApCj4+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArICAgIC8qIGludmVydCB3 dmFsIHRvIHRlc3Qgd3JpdGluZyBhbiBpbnZhbGlkIHZhbHVlICovCj4+ICsgICAgd3ZhbCA9IH53 dmFsOwo+PiArCj4+ICsgICAgaWYgKCAhdGVzdF9pbnZhbGlkX21zcl93cml0ZShpZHgsIHd2YWwp ICkKPj4gKyAgICAgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArICAgIC8qIHRlc3QgSUEzMl9QRVJG X0dMT0JBTF9DVFJMICovCj4+ICsgICAgaWR4ID0gTVNSX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTDsK Pj4gKwo+PiArICAgIHd2YWwgPSAwOwo+PiArCj4+ICsgICAgLyogc2V0IGFsbCBmaXhlZCBmdW5j dGlvbiBjb3VudGVycyBlbmFibGUgYml0cyAqLwo+PiArICAgIGZvciAoIGk9MDsgaSA8IG5mOyBp ICsrICkKPj4gKyAgICAgICAgd3ZhbCB8PSAoKHVpbnQ2NF90KTEgPDwgKDMyICsgaSkpOwo+PiAr Cj4+ICsgICAgLyogc2V0IGFsbCBnZW5lcmFsIHB1cnBvc2UgY291bnRlcnMgZW5hYmxlIGJpdHMq Lwo+PiArICAgIGZvciAoIGkgPSAwOyBpIDwgbmc7IGkrKyApCj4+ICsgICAgICAgIHd2YWwgfD0g KDEgPDwgaSk7Cj4+ICsKPj4gKyAgICBpZiAoICF0ZXN0X3ZhbGlkX21zcl93cml0ZShpZHgsIHd2 YWwpICkKPj4gKyAgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArICAgIC8qIGludmVydCB3 dmFsIHRvIHRlc3QgaW52YWxpZCB3cml0ZSB0byBNU1JfSUEzMl9QRVJGX0dMT0JBTF9DVFJMKi8K Pj4gKyAgICB3dmFsID0gfnd2YWw7Cj4+ICsKPj4gKyAgICBpZiAoICF0ZXN0X2ludmFsaWRfbXNy X3dyaXRlKGlkeCwgd3ZhbCkgKQo+PiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKyAg ICAvKiB0ZXN0IElBMzJfUEVSRl9HTE9CQUxfT1ZGX0NUUkwgKi8KPj4gKyAgICBpZHggPSBNU1Jf SUEzMl9QRVJGX0dMT0JBTF9PVkZfQ1RSTDsKPj4gKwo+PiArICAgIC8qIHNldCBhbGwgdmFsaWQg Yml0cyBpbiBNU1JfSUEzMl9QRVJGX0dMT0JBTF9PVkZfQ1RSTCAqLwo+PiArICAgIHd2YWwgPSAw eEMwMDAwMDAwMDAwMDAwMDAgfCAoKCgxVUxMIDw8IG5mKSAtIDEpIDw8IDMyKSB8ICgoMVVMTCA8 PCBuZykgLSAxKTsKPj4gKwo+PiArICAgIC8qIFdyaXRpbmcgdG8gTVNSX0lBMzJfUEVSRl9HTE9C QUxfT1ZGX0NUUkwgY2xlYXJzCj4+ICsgICAgICogTVNSX0lBMzJfUEVSRl9HTE9CQUxfU1RBVFVT IGJ1dCBidXQgYWx3YXlzIHJldHVybnMgMCB3aGVuIHJlYWQgc28KPj4gKyAgICAgKiBpdCBpcyB0 ZXN0ZWQgYXMgYSB0cmFuc3BhcmVudCB3cml0ZSAqLwo+PiArCj4+ICsgICAgaWYgKCAhdGVzdF90 cmFuc3BhcmVudF9tc3Jfd3JpdGUoaWR4LCB3dmFsKSApCj4+ICsgICAgICAgIHJldHVybiBmYWxz ZTsKPj4gKwo+PiArICAgIC8qIGludmVydCB3dmFsIHRvIHRlc3QgaW52YWxpZCB3cml0ZSB0byBN U1JfSUEzMl9QRVJGX0dMT0JBTF9PVkZfQ1RSTCovCj4+ICsgICAgd3ZhbCA9IH53dmFsOwo+PiAr Cj4+ICsgICAgaWYgKCAhdGVzdF9pbnZhbGlkX21zcl93cml0ZShpZHgsIHd2YWwpICkKPj4gKyAg ICAgICAgcmV0dXJuIGZhbHNlOwo+PiArCj4+ICsgICAgLyogdGVzdCBJQTMyX1BFUkZfR0xPQkFM X1NUQVRVUyAocmVhZC1vbmx5KSAqLwo+PiArICAgIGlkeCA9IE1TUl9JQTMyX1BFUkZfR0xPQkFM X1NUQVRVUzsKPj4gKwo+PiArICAgIGlmICggcmRtc3Jfc2FmZShpZHgsICZydmFsKSApCj4+ICsg ICAgewo+PiArICAgICAgICB4dGZfZXJyb3IoIkVycm9yOiB0ZXN0X2ludGVsX3BtdV92ZXIyOiAi Cj4+ICsgICAgICAgICAgICAgICAgICAicmRtc3Jfc2FmZSBmb3IgTVNSIDB4JXggcmVzdWx0ZWQg aW4gYSBmYXVsdCFcbiIsIGlkeCk7Cj4+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKyAgICB9 Cj4+ICsKPj4gKyAgICAvKiB0cnkgdG8gd3JpdGUgdGhlIElBMzJfUEVSRl9HTE9CQUxfU1RBVFVT IHJlZ2lzdGVyIGFuZCBleHBlY3QgaXQgdG8gZmFpbCovCj4+ICsgICAgaWYgKCAhdGVzdF9pbnZh bGlkX21zcl93cml0ZShpZHgsIHJ2YWwpICkKPj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+PiAr Cj4+ICsKPj4gKyAgICAvKiB0ZXN0IElBMzJfREVCVUdDVEwgKi8KPj4gKyAgICBpZHggPSBNU1Jf SUEzMl9ERUJVR0NUTDsKPj4gKwo+PiArICAgIC8qIFRlc3QgSUEzMl9ERUJVR0NUTCBmYWNpbGl0 aWVzIGVuYWJsZWQgYnkgdjIgKi8KPj4gKyAgICB3dmFsID0gSUEzMl9ERUJVR0NUTF9GcmVlemVf TEJSX09OX1BNSSB8IElBMzJfREVCVUdDVExfRnJlZXplX1BlcmZNb25fT25fUE1JOwo+PiArCj4+ ICsgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHZhbGlkIHdyaXRlIGJ1dCBp dCBpc250IHN1cHBvcnRlZCBieSB0aGUKPj4gKyAgICAgKiBWUE1VIHlldCAqLwo+IEluIHdoaWNo IGNhc2UgdGhlIHRlc3Qgc2hvdWxkIGJlIGNvcnJlY3QgaGVyZSwgYW5kIGhpZ2hsaWdodCB0aGF0 IHRoZXJlCj4gaXMgYSBidWcgaW4gWGVuLgpCdXQgdGhlbiwgc2hvdWxkIHRoZSBtYWluIHRlc3Qg cmV0dXJuIHh0Zl9zdWNjZXNzLCB4dGZfc2tpcCBvciB4dGZfZmFpbHVyZT8KPj4gKyAgICBpZiAo ICF0ZXN0X3RyYW5zcGFyZW50X21zcl93cml0ZShpZHgsIHd2YWwpICkKPj4gKyAgICAgICAgcmV0 dXJuIGZhbHNlOwo+PiArCj4+ICsgICAgcmV0dXJuIHRydWU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBib29sIHRlc3RfaW50ZWxfcG11X3ZlcjModWludDhfdCBuZywgdWludDhfdCBuZikKPj4gK3sK Pj4gKyAgICAvKiBJbnRlbCBTb2Z3dGFyZSBEZXZlbG9wbWVudCBNYW51YWwgVm9sLiAzQgo+PiAr ICAgICAqIFNlY3Rpb24gMTguMi4zIEFyY2hpdGVjdHVyYWwgUGVyZm9ybWFuY2UgTW9uaXRvcmlu ZyBWZXJzaW9uIDMKPj4gKyAgICAgKgo+PiArICAgICAqIE1TUnMgbWFkZSBhdmFpbGFibGUgYnkg dGhlIFZQTVUKPj4gKyAgICAgKgo+PiArICAgICAqIElBMzJfUEVSRkVWRU5UU0VMeC5BTllUSFJF QUQgKEJpdCAyMSkKPj4gKyAgICAgKiBJQTMyX0ZJWEVEX0NUUl9DVFJMLkFOWVRIUkVBRHggKEJp dCAyLCA2LCAxMSkKPj4gKyAgICAgKgo+PiArICAgICAqIFZlcnNpb24gMyBpbnRyb2R1Y2VzIEFO WVRIUkVBRCBiaXQgYnV0IFZQTVUgZG9lcyBub3Qgc3VwcG9ydCBpdCB0bwo+PiArICAgICAqIGVu c3VyZSB0aGF0IGEgVkNQVSBpc24ndCBhYmxlIHRvIHJlYWQgdmFsdWVzIGZyb20gcGh5c2ljYWwg cmVzb3VyY2VzIHRoYXQKPj4gKyAgICAgKiBhcmUgbm90IGFsbG9jYXRlZCB0byBpdC4gVGhpcyB0 ZXN0IGNhc2UgdmFsaWRhdGVzIHRoYXQgd2UgYXJlIHVuYWJsZSB0bwo+PiArICAgICAqIHdyaXRl IHRvIC5BTllUSFJFQUQgYml0IGluIElBMzJfUEVSRkVWRU5UU0VMeCBhbmQgSUEzMl9GSVhFRF9D VFJfQ1RSTAo+PiArICAgICAqLwo+PiArCj4+ICsgICAgdWludDY0X3Qgd3ZhbDsKPj4gKwo+PiAr ICAgIHVpbnQzMl90IGlkeDsKPj4gKwo+PiArICAgIHVpbnQ4X3QgaTsKPj4gKwo+PiArICAgIHBy aW50aygiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwo+PiArICAgIHByaW50aygiVGVzdGluZyB2ZXJz aW9uIDNcbiIpOwo+PiArICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwo+PiArCj4+ ICsgICAgLyogdGVzdCBJQTMyX1BFUkZFVkVOVFNFTHguQU5ZVEhSRUFEIGlzIGRpc2FibGVkICov Cj4+ICsgICAgZm9yICggaSA9IDA7IGkgPCBuZzsgaSsrICkKPj4gKyAgICB7Cj4+ICsgICAgICAg IGlkeCA9IE1TUl9JQTMyX1BFUkZFVlRTRUwoaSk7Cj4+ICsKPj4gKyAgICAgICAgd3ZhbCA9IEVW RU5UX1VPUFNfUkVUSVJFRF9BTllUSFJFQUQ7Cj4+ICsKPj4gKyAgICAgICAgaWYgKCAhdGVzdF9p bnZhbGlkX21zcl93cml0ZShpZHgsIHd2YWwpICkKPj4gKyAgICAgICAgICAgIHJldHVybiBmYWxz ZTsKPj4gKyAgICB9Cj4+ICsKPj4gKwo+PiArICAgIC8qIHRlc3QgSUEzMl9GSVhFRF9DVFJfQ1RM LkFOWVRIUkVBRCBpcyBkaXNhYmxlZCAqLwo+PiArICAgIGlkeCA9IE1TUl9JQTMyX0ZJWEVEX0NU Ul9DVFJMOwo+PiArCj4+ICsgICAgd3ZhbCA9IDA7Cj4+ICsKPj4gKyAgICBmb3IgKCBpID0gMDsg aSA8IG5mOyBpKysgKQo+PiArICAgICAgICB3dmFsIHw9IChGSVhFRF9DVFJfRU5BQkxFX0FOWVRI UkVBRCA8PCAoNCAqIGkpKSA7Cj4+ICsKPj4gKyAgICBpZiAoICF0ZXN0X2ludmFsaWRfbXNyX3dy aXRlKGlkeCwgd3ZhbCkgKQo+PiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKyAgICBy ZXR1cm4gdHJ1ZTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGJvb2wgdGVzdF9mdWxsX3dpZHRoX2Nu dHModWludDhfdCBuZywgdWludDhfdCBuZ2IpCj4+ICt7Cj4+ICsgICAgdWludDY0X3QgY2FwczsK Pj4gKwo+PiArICAgIHVpbnQzMl90IGlkeDsKPj4gKwo+PiArICAgIHVpbnQ2NF90IHd2YWw7Cj4+ ICsKPj4gKyAgICB1aW50OF90IGk7Cj4+ICsKPj4gKyAgICAvKiBHZXQgcGVyZiBjYXBhYmlsdGll cyAqLwo+PiArICAgIGlmICggcmRtc3Jfc2FmZShNU1JfSUEzMl9QRVJGX0NBUEFCSUxJVElFUywg JmNhcHMpICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIHByaW50aygiRmF1bHQgd2hpbGUgcmVhZGlu ZyBNU1JfSUEzMl9QRVJGX0NBUEFCSUxJVElFU1xuIik7Cj4gVGhlIFBFUkZfQ0FQQUJJTElUSUVT IE1TUiBpcyBvbmx5IHZhbGlkIHRvIHJlYWQgaWYgUERDTSBpcyBhZHZlcnRpc2VkIGluCj4gQ1BV SUQuCj4KPiBXZSBjdXJyZW50bHkgbmV2ZXIgYWR2ZXJ0aXNlIFBDRE0sIGFuZCBpcyBhIGJ1ZyB0 aGF0Cj4gTVNSX1BFUkZfQ0FQQUJJTElUSUVTIGlzIGFjY2Vzc2FibGUgYXQgYWxsIGluIGd1ZXN0 IGNvbnRleHQuCj4gKHNwZWNpZmljYWxseSwgaXQgaXMgYmVjYXVzZSBYZW4gbGVha3MgYWxtb3N0 IGFsbCBob3N0IE1TUiBzdGF0ZSBpbnRvCj4gZ3Vlc3RzKS4KU28gSSBzdXBwb3NlIEkgY2FuJ3Qg dGVzdCBmdWxsLWJpdCB3aWR0aCB3cml0ZXMgdGhlbj8KPj4gKyAgICAgICAgcmV0dXJuIGZhbHNl Owo+PiArICAgIH0KPj4gKwo+PiArICAgIGlmICggIShjYXBzID4+IDEzKSAmIDEgKQo+IFRoaXMg bGFja3Mgc3VmZmljaWVudCBicmFja2V0cyBmb3Igd2hhdCB5b3UgYXJlIGludGVuZGluZyB0byBk by4gIEFsc28sCj4gaXQgbG9va3MgbGlrZSB5b3UgcHJvYmFibHkgd2FudCBhICNkZWZpbmUgYXQg dGhlIHRvcCBvZiB0aGUgZmlsZSBmb3IKPiB0aGlzIGNvbnN0YW50LgohIGFuZCAmIGhhdmUgdGhl IHNhbWUgcHJlY2VkZW5jZSBhbmQgcmlnaHQgdG8gbGVmdCBhc3NvY2lhdGl2aXR5LiBTbyAKdGVj aG5pY2FsbHkgaXQgc2hvdWxkCmRvIHdoYXQgaXQgaXMgaW50ZW5kZWQgdG8gZG8uIEJ1dCBJIHdp bGwgbWFrZSBpdCBsb29rIGJldHRlci4KPgo+PiArICAgIHsKPj4gKyAgICAgICAgcHJpbnRrKCJG dWxsIHdpZHRoIGNvdW50ZXJzIG5vdCBzdXBwb3J0ZWRcbiIpOwo+PiArICAgICAgICByZXR1cm4g dHJ1ZTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgICAvKiB0ZXN0IHdyaXRlcyB0byBmdWxsIHdpZHRo IGNvdW50ZXJzICovCj4+ICsgICAgZm9yICggaSA9IDA7IGkgPCBuZzsgaSsrKQo+PiArICAgIHsK Pj4gKyAgICAgICAgaWR4ID0gTVNSX0lBMzJfQV9QTUMoaSk7Cj4+ICsKPj4gKyAgICAgICAgd3Zh bCA9ICgoMXVsbCA8PCBuZ2IpIC0gMSkgOwo+PiArCj4+ICsgICAgICAgIGlmICggIXRlc3RfdmFs aWRfbXNyX3dyaXRlKGlkeCwgd3ZhbCkgKQo+PiArICAgICAgICAgICAgICAgIHJldHVybiBmYWxz ZTsKPj4gKwo+PiArICAgICAgICAvKiBpbnZlcnQgd3ZhbCB0byB0ZXN0IGludmFsaWQgd3JpdGUg dG8gTVNSX0lBMzJfUEVSRl9HTE9CQUxfT1ZGX0NUUkwqLwo+PiArICAgICAgICB3dmFsID0gfnd2 YWw7Cj4+ICsKPj4gKyAgICAgICAgaWYgKCAhdGVzdF9pbnZhbGlkX21zcl93cml0ZShpZHgsIHd2 YWwpICkKPj4gKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAg ICByZXR1cm4gdHJ1ZTsKPj4gKwo+PiArfQo+PiArCj4+ICt2b2lkIHRlc3RfbWFpbih2b2lkKQo+ PiArewo+PiArICAgIC8qIEFyY2hpdGVjdHVyYWwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBWZXJz aW9uICovCj4+ICsgICAgdWludDhfdCB2ZXI7Cj4+ICsKPj4gKyAgICAvKiBOdW1iZXIgb2YgZ2Vu ZXJhbCBwdXJwb3NlIGNvdW50ZXIgcmVnaXN0ZXJzICovCj4+ICsgICAgdWludDhfdCBuZ3JlZ3M7 Cj4+ICsKPj4gKyAgICAvKiBOdW1iZXIgb2YgZml4ZWQgZnVuY3Rpb24gY291bnRlciByZWdpc3Rl cnMgKi8KPj4gKyAgICB1aW50OF90IG5mcmVnczsKPj4gKwo+PiArICAgIC8qIEJpdCB3aWR0aCBv ZiBnZW5lcmFsLXB1cnBvc2UsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgY291bnRlciAqLwo+PiAr ICAgIHVpbnQ4X3QgbmdiaXRzOwo+PiArCj4+ICsgICAgaWYgKCBJU19ERUZJTkVEKENPTkZJR19Q VikgKQo+PiArICAgIHsKPj4gKyAgICAgICAgcHJpbnRrKCJWUE1VIHRlc3RpbmcgZm9yIFBWIGd1 ZXN0cyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOwo+PiArICAgICAgICBnb3RvIHNraXA7Cj4g IEZyb20gdGVzdF9tYWluKCksIHVzZSByZXR1cm4geHRmX3NraXAoIi4uLlxuIikuICBZb3UgZG9u J3QgbmVlZCBhbnkgZ290bwo+IHNraXAgYXQgYWxsLgpPay4KPj4gKyAgICB9Cj4+ICsKPj4gKyAg ICBpZiAoIHZlbmRvcl9pc19hbWQgKQo+PiArICAgIHsKPj4gKyAgICAgICAgcHJpbnRrKCJWUE1V IHRlc3RpbmcgZm9yIEFNRCBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOwo+PiArICAgICAgICBn b3RvIHNraXA7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgZ2V0X2ludGVsX3BtdV92ZXJzaW9uKCZ2 ZXIsICZuZ3JlZ3MsICZuZnJlZ3MsICZuZ2JpdHMpOwo+PiArCj4+ICsgICAgcHJpbnRrKCJWZXI9 JXU6IEdQUj0ldTogRkZSPSV4IEdQQj0ldVxuIiwgdmVyLCBuZ3JlZ3MsIG5mcmVncywgbmdiaXRz KTsKPiBQbGVhc2UgZG9uJ3QgYWJicmV2aWF0ZSBnZW5lcmFsIHB1cnBvc2UgaW5mb3JtYXRpb24g bGlrZSB0aGlzLiAgQWxzbywKPiB3aGVyZSBwb3NzaWJsZSwgcGxlYXNlIHVzZSAiRk9PICR2YWws IEJBUiAkdmFsMiwgLi4uIiBpbnN0ZWFkIGlmIG1peGluZwo+IHB1bmN0dWF0aW9uIGxpa2UgdGhh dC4KPgo+IEZpbmFsbHksIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3QgbWl4IGRlY2lt YWwgYW5kIGhleCB3aXRob3V0IGEKPiBsZWFkaW5nIHByZWZpeCBpbiB0aGUgc2FtZSBwcmludCBt ZXNzYWdlLiAgSXQgaXMgdmVyeSBjb25mdXNpbmcgdG8gcmVhZC4KT0ssIHdpbGwgZml4IHRoaXMu Cj4+ICsKPj4gKyAgICBzd2l0Y2ggKHZlcikKPj4gKyAgICB7Cj4+ICsKPj4gKyAgICAgICAgY2Fz ZSA0Ogo+PiArICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gNCBmYWNpbGl0aWVzIGFyZSBub3Qg c3VwcG9ydGVkCj4+ICsgICAgICAgICAgICAgICAgICogVlBNVSAgZW11bGF0ZXMgdmVyc2lvbiAz ICovCj4+ICsgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCj4gVGhlIGRlZmF1bHQg Y2FzZSBzaG91bGQgYmUgaGVyZSwgd2l0aCBhbiB4dGZfd2FybmluZygiVGVzdCBkb2Vzbid0Cj4g c3VwcG9ydCB2ZXJzaW9uICV1XG4iLCB2ZXIpLCBmYWxsaW5nIHRocm91Z2ggaW50byBjYXNlIDMu Ck9LCj4+ICsKPj4gKyAgICAgICAgY2FzZSAzOgo+PiArICAgICAgICAgICAgICAgIC8qIHRlc3Qg dmVyc2lvbiAzIGZhY2lsaXRpZXMgKi8KPj4gKyAgICAgICAgICAgICAgICBpZiAoICF0ZXN0X2lu dGVsX3BtdV92ZXIzKCBuZ3JlZ3MsIG5mcmVncykgKQo+PiArICAgICAgICAgICAgICAgICAgICBy ZXR1cm4geHRmX2ZhaWx1cmUoIkZhaWw6IEZhaWxlZCBWUE1VIHZlcnNpb24gM1xuIik7Cj4+ICsg ICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCj4+ICsKPj4gKyAgICAgICAgY2FzZSAy Ogo+PiArICAgICAgICAgICAgICAgIC8qIHRlc3QgdmVyc2lvbiAyIGZhY2lsaXRpZXMgKi8KPj4g KyAgICAgICAgICAgICAgICBpZiAoICF0ZXN0X2ludGVsX3BtdV92ZXIyKG5ncmVncywgbmZyZWdz KSApCj4+ICsgICAgICAgICAgICAgICAgICAgIHJldHVybiB4dGZfZmFpbHVyZSgiRmFpbDogRmFp bGVkIFZQTVUgdmVyc2lvbiAyXG4iKTsKPj4gKwo+PiArICAgICAgICAgICAgICAgIC8qIHRlc3Qg dmVyc2lvbiAxIGZhY2lsaXRpZXMgKi8KPj4gKyAgICAgICAgICAgICAgICBpZiAoICF0ZXN0X2lu dGVsX3BtdV92ZXIxKG5ncmVncykgKQo+PiArICAgICAgICAgICAgICAgICAgICByZXR1cm4geHRm X2ZhaWx1cmUoIkZhaWw6IEZhaWxlZCBWUE1VIHZlcnNpb24gMVxuIik7Cj4+ICsKPj4gKyAgICAg ICAgICAgICAgICAvKiB0ZXN0IGZ1bGwgd2lkdGggY291bnRlcnMgKi8KPj4gKyAgICAgICAgICAg ICAgICBpZiAoICF0ZXN0X2Z1bGxfd2lkdGhfY250cyhuZ3JlZ3MsIG5nYml0cykgKQo+PiArICAg ICAgICAgICAgICAgICAgICByZXR1cm4geHRmX2ZhaWx1cmUoIkZhaWw6IEZhaWxlZCBmdWxsIHdp ZHRoIHRlc3RcbiIpOwo+PiArCj4+ICsgICAgICAgICAgICAgICAgYnJlYWs7Cj4+ICsKPj4gKyAg ICAgICAgY2FzZSAxOgo+PiArICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gMSB1bnN1cHBvcnRl ZCAqLwo+IFlvdSBoYXZlIGEgdjEgdGVzdCBmdW5jdGlvbiwgeWV0IGl0IGlzIHVuc3VwcG9ydGVk PwpZZXMsIGZyb20gVlBNVXMgcGVyc3BlY3RpdmUsIHYxIGluIGl0c2VsZiBpcyB1bnN1cHBvcnRl ZCBiZWNhdXNlIHRoYXQgd291bGQKaGF2ZSByZXF1aXJlZCBkaXNhYmxpbmcgYWNjZXNzIHRvIFBF UkZfR0xPQkFMX1NUQVRVUyBhbmQgClBFUkZfR0xPQkFMX0NUUkwgTVNScy4KSG93ZXZlciwgZWFj aCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBmYWNpbGl0aWVzIGludHJvZHVjZWQgaW4gdGhlIHByZXZp b3VzIAp2ZXJzaW9uLgpUaHVzLCB0ZXN0X2ludGVsX3BtdV92ZXIxKCkgaXMgaW50ZW5kZWQgZm9y IHYyIHRlc3RpbmcgYW5kIGhlbHBzIApicmVha2luZyB0aGUKdGVzdF9pbnRlbF9wbXVfdmVyMigp ICBmdW5jdGlvbiBpbnRvIGZhY2lsaXRpZXMgaW50cm9kdWNlZCBieSB0aGUgCmFyY2hpdGVjdHVy ZSBpbgp0d28gc2VwYXJhdGUgdmVyc2lvbnMgLSB2MSBhbmQgdjIKPj4gKwo+PiArICAgICAgICBk ZWZhdWx0Ogo+IFRoaXMgc2hvdWxkIGJlIGEgY2FzZSAwIHNwZWNpZmljYWxseSBmb3IgdnBtdSB1 bmF2YWlsYWJsZS4KT0sKPiB+QW5kcmV3Cj4KPj4gKyAgICAgICAgICAgICAgICBwcmludGsoIlZN UFUgbm90IHN1cHBvcnRlZCFcbiIpOwo+PiArICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKPj4g KyAgICB9Cj4+ICsKPj4gKyAgICByZXR1cm4geHRmX3N1Y2Nlc3MoTlVMTCk7Cj4+ICsKPj4gK3Nr aXA6Cj4+ICsgICAgcmV0dXJuIHh0Zl9za2lwKE5VTEwpOwo+PiArfQo+PiArCj4+ICsvKgo+PiAr ICogTG9jYWwgdmFyaWFibGVzOgo+PiArICogbW9kZTogQwo+PiArICogYy1maWxlLXN0eWxlOiAi QlNEIgo+PiArICogYy1iYXNpYy1vZmZzZXQ6IDQKPj4gKyAqIHRhYi13aWR0aDogNAo+PiArICog aW5kZW50LXRhYnMtbW9kZTogbmlsCj4+ICsgKiBFbmQ6Cj4+ICsgKi8KCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0 Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK