All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1432156539.19618.135.camel@intel.com>

diff --git a/a/1.txt b/N1/1.txt
index ff5d956..f3653c5 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,478 +1,546 @@
-T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K
-PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1
-YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50
-ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp
-bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg
-Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz
-dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z
-KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo
-ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv
-c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1
-Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K
-SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu
-IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
-aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg
-ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp
-dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg
-Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp
-ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv
-bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx
-MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+
-ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3
-ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq
-ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+
-ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0
-OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN
-Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg
-IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp
-YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl
-ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl
-dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1
-Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r
-IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
-ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv
-ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0
-XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh
-dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1
-ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K
-PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh
-ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg
-Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg
-ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf
-bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K
-PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g
-KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct
-PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
-aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt
-XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf
-cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p
-byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg
-bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
-dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi
-RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m
-ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg
-ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg
-ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp
-b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K
-PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K
-PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu
-djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh
-cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K
-PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y
-ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv
-ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1
-IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v
-ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp
-b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr
-IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv
-ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg
-ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K
-PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp
-Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg
-IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp
-bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np
-emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw
-MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg
-c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg
-KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg
-KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg
-ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg
-Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg
-cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g
-KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m
-ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc
-biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf
-b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg
-ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg
-ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g
-ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
-aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg
-ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+
-ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN
-Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
-UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj
-bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2
-NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf
-UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9
-IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0
-ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs
-DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1
-IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg
-ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS
-OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT
-TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52
-NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1
-LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
-ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
-b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw
-MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg
-ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg
-ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg
-ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT
-RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo
-YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+
-ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P
-RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo
-bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2
-NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg
-ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs
-bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz
-NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls
-cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu
-dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg
-ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg
-dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg
-PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg
-ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1
-XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
-dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg
-ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm
-ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g
-PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl
-diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW
-U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g
-c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN
-Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K
-PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w
-ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u
-ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg
-ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg
-LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L
-U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg
-PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh
-ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg
-ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g
-KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf
-T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w
-cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K
-PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+
-IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl
-diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp
-Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg
-ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
-b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS
-UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs
-NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi
-X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+
-ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n
-IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg
-IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg
-LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50
-ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu
-ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g
-LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg
-ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC
-QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg
-KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh
-cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf
-YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+
-ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi
-YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m
-ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T
-QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y
-bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg
-ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl
-ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50
-IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg
-ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi
-MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo
-YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy
-ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0
-ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg
-IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g
-ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf
-YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg
-ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg
-ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+
-IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs
-IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy
-MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg
-bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h
-ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
-ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh
-cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h
-ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi
-MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv
-d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg
-ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g
-PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT
-RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g
-KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl
-dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg
-ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg
-ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g
-LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg
-NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw
-X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt
-bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk
-ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg
-ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk
-ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi
-YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg
-ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk
-ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw
-KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg
-MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm
-LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz
-TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
-U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi
-U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
-bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt
-PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0
-ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
-X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
-X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
-ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN
-Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0
-NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
-LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug
-ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g
-PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6
-IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy
-X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht
-bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi
-YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
-ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg
-ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4
-XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy
-LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g
-NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
-cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh
-cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg
-ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN
-Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1
-TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
-ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g
-PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg
-ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp
-dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
-MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
-bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p
-byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg
-bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
-IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K
-PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp
-Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf
-T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB
-UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g
-b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K
-PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp
-dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
-MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+
-YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh
-cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr
-IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg
-ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg
-ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g
-KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7
-DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G
-RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0
-cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G
-RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
-NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs
-IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m
-ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy
-M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO
-Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
-LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp
-ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw
-ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
-X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
-X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
-ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7
-DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS
-NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl
-diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs
-c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
-NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf
-b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t
-aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
-cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
-ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g
-ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs
-bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl
-ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf
-YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf
-YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg
-ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K
-PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY
-TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
-ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K
-PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj
-dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg
-aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+
-ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q
-IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP
-T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo
-IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg
-bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt
-ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg
-c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl
-bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC
-X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf
-SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O
-VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf
-SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+
-ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg
-ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh
-c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf
-REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf
-SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U
-RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf
-UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY
-Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP
-T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9
-DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv
-KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn
-aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp
-cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+
-IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN
-Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg
-ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj
-YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD
-SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD
-RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO
-VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8
-PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN
-Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN
-Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0
-ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy
-ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg
-ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+
-ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU
-MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g
-PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg
-ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz
-ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E
-RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J
-RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF
-TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q
-U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6
-DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr
-ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg
-Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg
-ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g
-KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu
-ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu
-ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs
-IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg
-ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj
-IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg
-ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj
-YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93
-IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+
-ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs
-DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG
-U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U
-X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy
-M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50
-ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug
-ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s
-aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy
-Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg
-LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg
-ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+
-ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy
-Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi
-X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu
-ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50
-ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
-aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh
-cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U
-X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG
-U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg
-ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg
-ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw
-eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4
-DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+
-ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl
-ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg
-U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q
-QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY
-TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P
-RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU
-ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg
-ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg
-IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw
-MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+
-ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj
-ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu
-ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C
-X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS
-NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF
-X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT
-RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg
-ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg
-ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg
-ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu
-YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi
-ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr
-IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz
-dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf
-dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg
-ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf
-c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk
-Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg
-QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg
-I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg
-bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+
-ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk
-YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0
-X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50
-Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y
-dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+
-ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu
-a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso
-Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg
-SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93
-b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv
-cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u
-ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf
-dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0
-NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq
-c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+
-ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu
-Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl
-KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j
-bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf
-d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf
-dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K
-PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+
-IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry
-dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso
-dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z
-cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg
-ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0
-cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz
-dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf
-Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA
-IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh
-bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z
-ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+
-IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl
-dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0
-IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu
-NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t
-IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+
-IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g
-TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t
-aW5mby5odG1sDQo=
+On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:
+> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:
+> > From: Dave Jiang <dave.jiang@intel.com>
+> >
+> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>
+> 
+> Needs a topic in the subject line and a changelog.
+> 
+> It also seems to do a lot more than just checking device ID (I assume
+> that's what "DID" means), so this should probably be split into
+> several patches that each do one thing.  I see at least:
+> 
+>   - cosmetic code restructuring
+>   - work_struct/tasklet_struct changes
+>   - new #defines and bar2_off() changes
+
+I think this patch got mangled with couple other patches. Allen?
+
+> 
+> > ---
+> >  drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
+> >  drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-
+> >  drivers/ntb/ntb_transport.c         |  16 +--
+> >  3 files changed, 133 insertions(+), 103 deletions(-)
+> >
+> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > index d162f22..89fea50 100644
+> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >         size_t buf_size;
+> >         ssize_t ret, off;
+> >         union { u64 v64; u32 v32; u16 v16; } u;
+> > -       unsigned long reg;
+> >
+> >         ndev = filp->private_data;
+> >         mmio = ndev->self_mmio;
+> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >
+> >         if (!ndev->reg->link_is_up(ndev)) {
+> >                 off += scnprintf(buf + off, buf_size - off,
+> > -                                "Link Satus -\t\tDown\n");
+> > +                                "Link Status -\t\tDown\n");
+> >         } else {
+> >                 off += scnprintf(buf + off, buf_size - off,
+> > -                                "Link Satus -\t\tUp\n");
+> > +                                "Link Status -\t\tUp\n");
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "Link Speed -\t\tPCI-E Gen %u\n",
+> >                                  NTB_LNK_STA_SPEED(ndev->lnk_sta));
+> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
+> >
+> > -       reg = ndev->self_reg->db_mask;
+> > -       u.v64 = ndev_db_read(ndev, mmio + reg);
+> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Mask -\t\t%#llx\n", u.v64);
+> >
+> > -       reg = ndev->self_reg->db_bell;
+> > -       u.v64 = ndev_db_read(ndev, mmio + reg);
+> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Bell -\t\t%#llx\n", u.v64);
+> >
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "\nNTB Incoming XLAT:\n");
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "XLAT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "XLAT45 -\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "LMT23 -\t\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "LMT45 -\t\t\t%#018llx\n", u.v64);
+> >
+> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "\nNTB Outgoing B2B XLAT:\n");
+> >
+> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B XLAT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B XLAT45 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B LMT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B LMT45 -\t\t%#018llx\n", u.v64);
+> >
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "\nNTB Secondary BAR:\n");
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR01 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR45 -\t\t%#018llx\n", u.v64);
+> >                 }
+> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "\nSNB NTB Statistics:\n");
+> >
+> > -               reg = SNB_USMEMMISS_OFFSET;
+> > -               u.v16 = ioread16(mmio + reg);
+> > +               u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "Upstream Memory Miss -\t%u\n", u.v16);
+> >
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "\nSNB NTB Hardware Errors:\n");
+> >
+> > -               reg = SNB_DEVSTS_OFFSET;
+> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+> > +               if (!pci_read_config_word(ndev->ntb.pdev,
+> > +                                         SNB_DEVSTS_OFFSET, &u.v16))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "DEVSTS -\t\t%#06x\n", u.v16);
+> >
+> > -               reg = SNB_LINK_STATUS_OFFSET;
+> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+> > +               if (!pci_read_config_word(ndev->ntb.pdev,
+> > +                                         SNB_LINK_STATUS_OFFSET, &u.v16))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "LNKSTS -\t\t%#06x\n", u.v16);
+> >
+> > -               reg = SNB_UNCERRSTS_OFFSET;
+> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+> > +               if (!pci_read_config_dword(ndev->ntb.pdev,
+> > +                                          SNB_UNCERRSTS_OFFSET, &u.v32))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "UNCERRSTS -\t\t%#06x\n", u.v32);
+> >
+> > -               reg = SNB_CORERRSTS_OFFSET;
+> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+> > +               if (!pci_read_config_dword(ndev->ntb.pdev,
+> > +                                          SNB_CORERRSTS_OFFSET, &u.v32))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "CORERRSTS -\t\t%#06x\n", u.v32);
+> >         }
+> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >  {
+> >         struct pci_dev *pdev;
+> >         void __iomem *mmio;
+> > -       unsigned long off;
+> >         resource_size_t bar_size;
+> >         phys_addr_t bar_addr;
+> >         int b2b_bar;
+> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
+> >         }
+> >
+> > -       /* setup incoming bar base addresses */
+> > -       off = SNB_SBAR0BASE_OFFSET;
+> > -
+> >         /* SBAR01 hit by first part of the b2b bar */
+> >         if (b2b_bar == 0) {
+> >                 bar_addr = addr->bar0_addr;
+> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >         }
+> >
+> >         dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
+> > -       iowrite64(bar_addr, mmio + bar0_off(off, 0));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
+> >
+> >         /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
+> >          * The b2b bar is either disabled above, or configured half-size, and
+> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >          */
+> >
+> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
+> > -       iowrite64(bar_addr, mmio + bar0_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar0_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = addr->bar4_addr64 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite64(bar_addr, mmio + bar0_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar0_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = addr->bar4_addr32 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar0_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar0_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = addr->bar5_addr32 +
+> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar0_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar0_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
+> >         }
+> >
+> >         /* setup incoming bar limits == base addrs (zero length windows) */
+> > -       off = SNB_SBAR2LMT_OFFSET;
+> >
+> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
+> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = addr->bar4_addr64 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = addr->bar4_addr32 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = addr->bar5_addr32 +
+> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
+> >         }
+> >
+> >         /* zero incoming translation addrs */
+> > -       off = SNB_SBAR2XLAT_OFFSET;
+> > -
+> > -       iowrite64(0, mmio + bar2_off(off, 2));
+> > +       iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
+> >
+> >         if (!ndev->bar4_split) {
+> > -               iowrite64(0, mmio + bar2_off(off, 4));
+> > +               iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
+> >         } else {
+> > -               iowrite32(0, mmio + bar2_off(off, 4));
+> > -               iowrite32(0, mmio + bar2_off(off, 5));
+> > +               iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
+> > +               iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
+> >         }
+> >
+> >         /* zero outgoing translation limits (whole bar size windows) */
+> > -       off = SNB_PBAR2LMT_OFFSET;
+> > -       iowrite64(0, mmio + bar2_off(off, 2));
+> > +       iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
+> >         if (!ndev->bar4_split) {
+> > -               iowrite64(0, mmio + bar2_off(off, 4));
+> > +               iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
+> >         } else {
+> > -               iowrite32(0, mmio + bar2_off(off, 4));
+> > -               iowrite32(0, mmio + bar2_off(off, 5));
+> > +               iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
+> > +               iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
+> >         }
+> >
+> >         /* set outgoing translation offsets */
+> > -       off = SNB_PBAR2XLAT_OFFSET;
+> > -
+> >         bar_addr = peer_addr->bar2_addr64;
+> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = peer_addr->bar4_addr64;
+> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = peer_addr->bar2_addr64;
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = peer_addr->bar2_addr64;
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
+> >         }
+> >
+> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
+> >         u8 ppd;
+> >         int rc, mem;
+> >
+> > +       pdev = ndev_pdev(ndev);
+> > +
+> > +       switch (pdev->device) {
+> >         /* There is a Xeon hardware errata related to writes to SDOORBELL or
+> >          * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
+> >          * which may hang the system.  To workaround this use the second memory
+> >          * window to access the interrupt and scratch pad registers on the
+> >          * remote system.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+> > +               break;
+> > +       }
+> >
+> > +       switch (pdev->device) {
+> >         /* There is a hardware errata related to accessing any register in
+> >          * SB01BASE in the presence of bidirectional traffic crossing the NTB.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+> > +               break;
+> > +       }
+> >
+> > +       switch (pdev->device) {
+> >         /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be
+> >          * mirrored to the remote system.  Shrink the number of bits by one,
+> >          * since bit 14 is the last bit.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+> > +               break;
+> > +       }
+> >
+> >         ndev->reg = &snb_reg;
+> >
+> > -       pdev = ndev_pdev(ndev);
+> > -
+> >         rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
+> >         if (rc)
+> >                 return -EIO;
+> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
+> >          * window by setting the limit equal to base, nor can it limit the size
+> >          * of the memory window by setting the limit to base + size.
+> >          */
+> > -       .bar2_limit             = SNB_PBAR2LMT_OFFSET,
+> > -       .bar2_xlat              = SNB_PBAR2XLAT_OFFSET,
+> > +       .bar2_limit             = SNB_PBAR23LMT_OFFSET,
+> > +       .bar2_xlat              = SNB_PBAR23XLAT_OFFSET,
+> >  };
+> >
+> >  static const struct intel_ntb_xlat_reg snb_sec_xlat = {
+> >         .bar0_base              = SNB_SBAR0BASE_OFFSET,
+> > -       .bar2_limit             = SNB_SBAR2LMT_OFFSET,
+> > -       .bar2_xlat              = SNB_SBAR2XLAT_OFFSET,
+> > +       .bar2_limit             = SNB_SBAR23LMT_OFFSET,
+> > +       .bar2_xlat              = SNB_SBAR23XLAT_OFFSET,
+> >  };
+> >
+> >  static const struct intel_b2b_addr snb_b2b_usd_addr = {
+> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > index 0224b1a..fec689d 100644
+> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > @@ -70,11 +70,27 @@
+> >
+> >  /* SNB hardware (and JSF, IVT, HSX) */
+> >
+> > -#define SNB_PBAR2LMT_OFFSET            0x0000
+> > -#define SNB_PBAR2XLAT_OFFSET           0x0010
+> > -#define SNB_SBAR2LMT_OFFSET            0x0020
+> > -#define SNB_SBAR2XLAT_OFFSET           0x0030
+> > +#define SNB_PBAR23LMT_OFFSET           0x0000
+> > +#define SNB_PBAR45LMT_OFFSET           0x0008
+> > +#define SNB_PBAR4LMT_OFFSET            0x0008
+> > +#define SNB_PBAR5LMT_OFFSET            0x000c
+> > +#define SNB_PBAR23XLAT_OFFSET          0x0010
+> > +#define SNB_PBAR45XLAT_OFFSET          0x0018
+> > +#define SNB_PBAR4XLAT_OFFSET           0x0018
+> > +#define SNB_PBAR5XLAT_OFFSET           0x001c
+> > +#define SNB_SBAR23LMT_OFFSET           0x0020
+> > +#define SNB_SBAR45LMT_OFFSET           0x0028
+> > +#define SNB_SBAR4LMT_OFFSET            0x0028
+> > +#define SNB_SBAR5LMT_OFFSET            0x002c
+> > +#define SNB_SBAR23XLAT_OFFSET          0x0030
+> > +#define SNB_SBAR45XLAT_OFFSET          0x0038
+> > +#define SNB_SBAR4XLAT_OFFSET           0x0038
+> > +#define SNB_SBAR5XLAT_OFFSET           0x003c
+> >  #define SNB_SBAR0BASE_OFFSET           0x0040
+> > +#define SNB_SBAR23BASE_OFFSET          0x0048
+> > +#define SNB_SBAR45BASE_OFFSET          0x0050
+> > +#define SNB_SBAR4BASE_OFFSET           0x0050
+> > +#define SNB_SBAR5BASE_OFFSET           0x0054
+> >  #define SNB_SBDF_OFFSET                        0x005c
+> >  #define SNB_NTBCNTL_OFFSET             0x0058
+> >  #define SNB_PDOORBELL_OFFSET           0x0060
+> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
+> > index f1ed1b7..bb2eb85 100644
+> > --- a/drivers/ntb/ntb_transport.c
+> > +++ b/drivers/ntb/ntb_transport.c
+> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {
+> >
+> >         bool link_is_up;
+> >         struct delayed_work link_work;
+> > -       struct work_struct db_work;
+> >         struct work_struct link_cleanup;
+> > +       struct tasklet_struct db_work;
+> >  };
+> >
+> >  enum {
+> > @@ -241,7 +241,7 @@ enum {
+> >  #define NTB_QP_DEF_NUM_ENTRIES 100
+> >  #define NTB_LINK_DOWN_TIMEOUT  10
+> >
+> > -static void ntb_transport_doorbell_work(struct work_struct *ws);
+> > +static void ntb_transport_doorbell_work(unsigned long data);
+> >  static const struct ntb_ctx_ops ntb_transport_ops;
+> >  static struct ntb_client ntb_transport_client;
+> >
+> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
+> >         }
+> >
+> >         INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
+> > -       INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
+> >         INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
+> > +       tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
+> > +                    (unsigned long)nt);
+> >
+> >         rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
+> >         if (rc)
+> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
+> >         int i;
+> >
+> >         ntb_transport_link_cleanup(nt);
+> > -       cancel_work_sync(&nt->db_work);
+> > +       tasklet_disable(&nt->db_work);
+> >         cancel_work_sync(&nt->link_cleanup);
+> >         cancel_delayed_work_sync(&nt->link_work);
+> >
+> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
+> >  }
+> >  EXPORT_SYMBOL_GPL(ntb_transport_max_size);
+> >
+> > -static void ntb_transport_doorbell_work(struct work_struct *work)
+> > +static void ntb_transport_doorbell_work(unsigned long data)
+> >  {
+> > -       struct ntb_transport_ctx *nt = container_of(work,
+> > -                       struct ntb_transport_ctx, db_work);
+> > +       struct ntb_transport_ctx *nt = (void *)data;
+> >         struct ntb_transport_qp *qp;
+> >         u64 db_mask, db_bits, db_again;
+> >         unsigned int qp_num;
+> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
+> >
+> >         ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
+> >
+> > -       schedule_work(&nt->db_work);
+> > +       tasklet_schedule(&nt->db_work);
+> >  }
+> >
+> >  static const struct ntb_ctx_ops ntb_transport_ops = {
+> > --
+> > 2.4.0.rc0.43.gcf8a8c6
+> >
+> > --
+> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in
+> > the body of a message to majordomo@vger.kernel.org
+> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff --git a/a/content_digest b/N1/content_digest
index a1b7771..67d787e 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -12,483 +12,551 @@
  " linux-ntb@googlegroups.com <linux-ntb@googlegroups.com>\0"
  "\00:1\0"
  "b\0"
- "T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K\n"
- "PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1\n"
- "YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50\n"
- "ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp\n"
- "bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg\n"
- "Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz\n"
- "dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z\n"
- "KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo\n"
- "ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv\n"
- "c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1\n"
- "Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K\n"
- "SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu\n"
- "IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n"
- "aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg\n"
- "ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp\n"
- "dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg\n"
- "Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp\n"
- "ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv\n"
- "bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx\n"
- "MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+\n"
- "ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3\n"
- "ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq\n"
- "ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+\n"
- "ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0\n"
- "OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN\n"
- "Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg\n"
- "IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp\n"
- "YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl\n"
- "ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl\n"
- "dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1\n"
- "Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r\n"
- "IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n"
- "ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv\n"
- "ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0\n"
- "XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh\n"
- "dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1\n"
- "ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K\n"
- "PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh\n"
- "ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg\n"
- "Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf\n"
- "bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K\n"
- "PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g\n"
- "KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct\n"
- "PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n"
- "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt\n"
- "XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf\n"
- "cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p\n"
- "byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg\n"
- "bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n"
- "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi\n"
- "RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m\n"
- "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg\n"
- "ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg\n"
- "ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp\n"
- "b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K\n"
- "PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K\n"
- "PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu\n"
- "djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh\n"
- "cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K\n"
- "PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y\n"
- "ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv\n"
- "ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1\n"
- "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v\n"
- "ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp\n"
- "b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr\n"
- "IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv\n"
- "ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K\n"
- "PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp\n"
- "Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg\n"
- "IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp\n"
- "bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np\n"
- "emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw\n"
- "MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg\n"
- "c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg\n"
- "KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg\n"
- "KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg\n"
- "ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg\n"
- "Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg\n"
- "cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g\n"
- "KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m\n"
- "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc\n"
- "biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf\n"
- "b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg\n"
- "ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n"
- "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+\n"
- "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n"
- "UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj\n"
- "bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2\n"
- "NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf\n"
- "UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9\n"
- "IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0\n"
- "ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs\n"
- "DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1\n"
- "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS\n"
- "OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT\n"
- "TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52\n"
- "NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1\n"
- "LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n"
- "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw\n"
- "MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg\n"
- "ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg\n"
- "ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT\n"
- "RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo\n"
- "YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+\n"
- "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P\n"
- "RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo\n"
- "bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2\n"
- "NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs\n"
- "bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz\n"
- "NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls\n"
- "cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu\n"
- "dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg\n"
- "ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg\n"
- "dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg\n"
- "PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg\n"
- "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1\n"
- "XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n"
- "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg\n"
- "ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm\n"
- "ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g\n"
- "PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl\n"
- "diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW\n"
- "U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g\n"
- "c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN\n"
- "Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K\n"
- "PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w\n"
- "ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u\n"
- "ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg\n"
- "LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L\n"
- "U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg\n"
- "PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh\n"
- "ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg\n"
- "ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g\n"
- "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf\n"
- "T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w\n"
- "cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K\n"
- "PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl\n"
- "diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp\n"
- "Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n"
- "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS\n"
- "UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs\n"
- "NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi\n"
- "X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+\n"
- "ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n\n"
- "IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg\n"
- "IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg\n"
- "LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50\n"
- "ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu\n"
- "ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g\n"
- "LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg\n"
- "ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC\n"
- "QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg\n"
- "KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh\n"
- "cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf\n"
- "YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+\n"
- "ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi\n"
- "YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m\n"
- "ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T\n"
- "QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y\n"
- "bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg\n"
- "ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl\n"
- "ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50\n"
- "IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg\n"
- "ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi\n"
- "MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo\n"
- "YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy\n"
- "ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0\n"
- "ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg\n"
- "IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf\n"
- "YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg\n"
- "ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs\n"
- "IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy\n"
- "MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg\n"
- "bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h\n"
- "ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n"
- "ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh\n"
- "cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h\n"
- "ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi\n"
- "MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv\n"
- "d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg\n"
- "ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g\n"
- "PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT\n"
- "RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g\n"
- "KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl\n"
- "dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg\n"
- "ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g\n"
- "LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg\n"
- "NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw\n"
- "X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt\n"
- "bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk\n"
- "ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg\n"
- "ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk\n"
- "ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi\n"
- "YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg\n"
- "ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk\n"
- "ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw\n"
- "KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg\n"
- "MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm\n"
- "LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz\n"
- "TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n"
- "U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi\n"
- "U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n"
- "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt\n"
- "PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0\n"
- "ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n"
- "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n"
- "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n"
- "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0\n"
- "NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n"
- "LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug\n"
- "ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g\n"
- "PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6\n"
- "IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy\n"
- "X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht\n"
- "bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi\n"
- "YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg\n"
- "ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4\n"
- "XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy\n"
- "LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g\n"
- "NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n"
- "cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh\n"
- "cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg\n"
- "ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1\n"
- "TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n"
- "ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g\n"
- "PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg\n"
- "ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp\n"
- "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n"
- "MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n"
- "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p\n"
- "byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg\n"
- "bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K\n"
- "PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp\n"
- "Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf\n"
- "T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB\n"
- "UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g\n"
- "b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K\n"
- "PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp\n"
- "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n"
- "MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+\n"
- "YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh\n"
- "cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr\n"
- "IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg\n"
- "ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg\n"
- "ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g\n"
- "KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7\n"
- "DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G\n"
- "RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0\n"
- "cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G\n"
- "RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n"
- "NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs\n"
- "IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m\n"
- "ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy\n"
- "M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO\n"
- "Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n"
- "LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp\n"
- "ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw\n"
- "ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n"
- "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n"
- "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n"
- "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7\n"
- "DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS\n"
- "NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl\n"
- "diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs\n"
- "c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n"
- "NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf\n"
- "b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t\n"
- "aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n"
- "cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs\n"
- "bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl\n"
- "ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf\n"
- "YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf\n"
- "YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg\n"
- "ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K\n"
- "PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY\n"
- "TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n"
- "ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K\n"
- "PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj\n"
- "dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg\n"
- "aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+\n"
- "ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q\n"
- "IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP\n"
- "T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo\n"
- "IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg\n"
- "bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt\n"
- "ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg\n"
- "c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl\n"
- "bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC\n"
- "X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf\n"
- "SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O\n"
- "VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf\n"
- "SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+\n"
- "ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg\n"
- "ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh\n"
- "c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf\n"
- "REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf\n"
- "SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U\n"
- "RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf\n"
- "UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY\n"
- "Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP\n"
- "T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9\n"
- "DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv\n"
- "KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn\n"
- "aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp\n"
- "cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+\n"
- "IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN\n"
- "Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg\n"
- "ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj\n"
- "YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD\n"
- "SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD\n"
- "RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO\n"
- "VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8\n"
- "PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN\n"
- "Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN\n"
- "Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0\n"
- "ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy\n"
- "ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg\n"
- "ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+\n"
- "ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU\n"
- "MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g\n"
- "PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg\n"
- "ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz\n"
- "ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E\n"
- "RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J\n"
- "RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF\n"
- "TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q\n"
- "U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6\n"
- "DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr\n"
- "ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg\n"
- "Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g\n"
- "KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu\n"
- "ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu\n"
- "ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs\n"
- "IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg\n"
- "ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj\n"
- "IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg\n"
- "ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj\n"
- "YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93\n"
- "IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+\n"
- "ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs\n"
- "DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG\n"
- "U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U\n"
- "X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy\n"
- "M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50\n"
- "ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug\n"
- "ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s\n"
- "aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy\n"
- "Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg\n"
- "LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg\n"
- "ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+\n"
- "ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy\n"
- "Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi\n"
- "X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu\n"
- "ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50\n"
- "ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n"
- "aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh\n"
- "cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U\n"
- "X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG\n"
- "U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg\n"
- "ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg\n"
- "ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw\n"
- "eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4\n"
- "DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+\n"
- "ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl\n"
- "ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg\n"
- "U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q\n"
- "QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY\n"
- "TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P\n"
- "RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU\n"
- "ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg\n"
- "ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg\n"
- "IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw\n"
- "MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+\n"
- "ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj\n"
- "ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu\n"
- "ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C\n"
- "X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS\n"
- "NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF\n"
- "X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT\n"
- "RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg\n"
- "ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg\n"
- "ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu\n"
- "YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi\n"
- "ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr\n"
- "IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz\n"
- "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf\n"
- "dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg\n"
- "ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf\n"
- "c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk\n"
- "Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg\n"
- "QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg\n"
- "I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg\n"
- "bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+\n"
- "ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk\n"
- "YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0\n"
- "X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50\n"
- "Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y\n"
- "dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+\n"
- "ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu\n"
- "a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso\n"
- "Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg\n"
- "SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93\n"
- "b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv\n"
- "cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u\n"
- "ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf\n"
- "dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0\n"
- "NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq\n"
- "c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+\n"
- "ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu\n"
- "Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl\n"
- "KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j\n"
- "bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf\n"
- "d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf\n"
- "dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K\n"
- "PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+\n"
- "IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry\n"
- "dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso\n"
- "dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z\n"
- "cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0\n"
- "cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz\n"
- "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf\n"
- "Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA\n"
- "IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh\n"
- "bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z\n"
- "ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+\n"
- "IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl\n"
- "dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0\n"
- "IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu\n"
- "NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t\n"
- "IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+\n"
- "IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g\n"
- "TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t\n"
- aW5mby5odG1sDQo=
+ "On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:\n"
+ "> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:\n"
+ "> > From: Dave Jiang <dave.jiang@intel.com>\n"
+ "> >\n"
+ "> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>\n"
+ "> \n"
+ "> Needs a topic in the subject line and a changelog.\n"
+ "> \n"
+ "> It also seems to do a lot more than just checking device ID (I assume\n"
+ "> that's what \"DID\" means), so this should probably be split into\n"
+ "> several patches that each do one thing.  I see at least:\n"
+ "> \n"
+ ">   - cosmetic code restructuring\n"
+ ">   - work_struct/tasklet_struct changes\n"
+ ">   - new #defines and bar2_off() changes\n"
+ "\n"
+ "I think this patch got mangled with couple other patches. Allen?\n"
+ "\n"
+ "> \n"
+ "> > ---\n"
+ "> >  drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------\n"
+ "> >  drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-\n"
+ "> >  drivers/ntb/ntb_transport.c         |  16 +--\n"
+ "> >  3 files changed, 133 insertions(+), 103 deletions(-)\n"
+ "> >\n"
+ "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > index d162f22..89fea50 100644\n"
+ "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >         size_t buf_size;\n"
+ "> >         ssize_t ret, off;\n"
+ "> >         union { u64 v64; u32 v32; u16 v16; } u;\n"
+ "> > -       unsigned long reg;\n"
+ "> >\n"
+ "> >         ndev = filp->private_data;\n"
+ "> >         mmio = ndev->self_mmio;\n"
+ "> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >\n"
+ "> >         if (!ndev->reg->link_is_up(ndev)) {\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> > -                                \"Link Satus -\\t\\tDown\\n\");\n"
+ "> > +                                \"Link Status -\\t\\tDown\\n\");\n"
+ "> >         } else {\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> > -                                \"Link Satus -\\t\\tUp\\n\");\n"
+ "> > +                                \"Link Status -\\t\\tUp\\n\");\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"Link Speed -\\t\\tPCI-E Gen %u\\n\",\n"
+ "> >                                  NTB_LNK_STA_SPEED(ndev->lnk_sta));\n"
+ "> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Mask Cached -\\t%#llx\\n\", ndev->db_mask);\n"
+ "> >\n"
+ "> > -       reg = ndev->self_reg->db_mask;\n"
+ "> > -       u.v64 = ndev_db_read(ndev, mmio + reg);\n"
+ "> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Mask -\\t\\t%#llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = ndev->self_reg->db_bell;\n"
+ "> > -       u.v64 = ndev_db_read(ndev, mmio + reg);\n"
+ "> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Bell -\\t\\t%#llx\\n\", u.v64);\n"
+ "> >\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"\\nNTB Incoming XLAT:\\n\");\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"LMT23 -\\t\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"LMT45 -\\t\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"\\nNTB Outgoing B2B XLAT:\\n\");\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B LMT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B LMT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"\\nNTB Secondary BAR:\\n\");\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR01 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >                 }\n"
+ "> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"\\nSNB NTB Statistics:\\n\");\n"
+ "> >\n"
+ "> > -               reg = SNB_USMEMMISS_OFFSET;\n"
+ "> > -               u.v16 = ioread16(mmio + reg);\n"
+ "> > +               u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"Upstream Memory Miss -\\t%u\\n\", u.v16);\n"
+ "> >\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"\\nSNB NTB Hardware Errors:\\n\");\n"
+ "> >\n"
+ "> > -               reg = SNB_DEVSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n"
+ "> > +               if (!pci_read_config_word(ndev->ntb.pdev,\n"
+ "> > +                                         SNB_DEVSTS_OFFSET, &u.v16))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"DEVSTS -\\t\\t%#06x\\n\", u.v16);\n"
+ "> >\n"
+ "> > -               reg = SNB_LINK_STATUS_OFFSET;\n"
+ "> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n"
+ "> > +               if (!pci_read_config_word(ndev->ntb.pdev,\n"
+ "> > +                                         SNB_LINK_STATUS_OFFSET, &u.v16))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"LNKSTS -\\t\\t%#06x\\n\", u.v16);\n"
+ "> >\n"
+ "> > -               reg = SNB_UNCERRSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n"
+ "> > +               if (!pci_read_config_dword(ndev->ntb.pdev,\n"
+ "> > +                                          SNB_UNCERRSTS_OFFSET, &u.v32))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"UNCERRSTS -\\t\\t%#06x\\n\", u.v32);\n"
+ "> >\n"
+ "> > -               reg = SNB_CORERRSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n"
+ "> > +               if (!pci_read_config_dword(ndev->ntb.pdev,\n"
+ "> > +                                          SNB_CORERRSTS_OFFSET, &u.v32))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"CORERRSTS -\\t\\t%#06x\\n\", u.v32);\n"
+ "> >         }\n"
+ "> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >  {\n"
+ "> >         struct pci_dev *pdev;\n"
+ "> >         void __iomem *mmio;\n"
+ "> > -       unsigned long off;\n"
+ "> >         resource_size_t bar_size;\n"
+ "> >         phys_addr_t bar_addr;\n"
+ "> >         int b2b_bar;\n"
+ "> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5SZ %#x\\n\", bar_sz);\n"
+ "> >         }\n"
+ "> >\n"
+ "> > -       /* setup incoming bar base addresses */\n"
+ "> > -       off = SNB_SBAR0BASE_OFFSET;\n"
+ "> > -\n"
+ "> >         /* SBAR01 hit by first part of the b2b bar */\n"
+ "> >         if (b2b_bar == 0) {\n"
+ "> >                 bar_addr = addr->bar0_addr;\n"
+ "> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR01 %#018llx\\n\", bar_addr);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar0_off(off, 0));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);\n"
+ "> >\n"
+ "> >         /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.\n"
+ "> >          * The b2b bar is either disabled above, or configured half-size, and\n"
+ "> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >          */\n"
+ "> >\n"
+ "> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar0_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar0_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR23 %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = addr->bar4_addr64 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite64(bar_addr, mmio + bar0_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar0_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR45 %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = addr->bar4_addr32 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar0_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar0_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR4 %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = addr->bar5_addr32 +\n"
+ "> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar0_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar0_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5 %#010llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* setup incoming bar limits == base addrs (zero length windows) */\n"
+ "> > -       off = SNB_SBAR2LMT_OFFSET;\n"
+ "> >\n"
+ "> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR23LMT %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = addr->bar4_addr64 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR45LMT %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = addr->bar4_addr32 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR4LMT %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = addr->bar5_addr32 +\n"
+ "> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5LMT %#05llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* zero incoming translation addrs */\n"
+ "> > -       off = SNB_SBAR2XLAT_OFFSET;\n"
+ "> > -\n"
+ "> > -       iowrite64(0, mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> > -               iowrite64(0, mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);\n"
+ "> >         } else {\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 4));\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);\n"
+ "> > +               iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* zero outgoing translation limits (whole bar size windows) */\n"
+ "> > -       off = SNB_PBAR2LMT_OFFSET;\n"
+ "> > -       iowrite64(0, mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> > -               iowrite64(0, mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);\n"
+ "> >         } else {\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 4));\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);\n"
+ "> > +               iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* set outgoing translation offsets */\n"
+ "> > -       off = SNB_PBAR2XLAT_OFFSET;\n"
+ "> > -\n"
+ "> >         bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"PBAR23XLAT %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = peer_addr->bar4_addr64;\n"
+ "> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR45XLAT %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR4XLAT %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR5XLAT %#010llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)\n"
+ "> >         u8 ppd;\n"
+ "> >         int rc, mem;\n"
+ "> >\n"
+ "> > +       pdev = ndev_pdev(ndev);\n"
+ "> > +\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* There is a Xeon hardware errata related to writes to SDOORBELL or\n"
+ "> >          * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,\n"
+ "> >          * which may hang the system.  To workaround this use the second memory\n"
+ "> >          * window to access the interrupt and scratch pad registers on the\n"
+ "> >          * remote system.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* There is a hardware errata related to accessing any register in\n"
+ "> >          * SB01BASE in the presence of bidirectional traffic crossing the NTB.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be\n"
+ "> >          * mirrored to the remote system.  Shrink the number of bits by one,\n"
+ "> >          * since bit 14 is the last bit.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> >         ndev->reg = &snb_reg;\n"
+ "> >\n"
+ "> > -       pdev = ndev_pdev(ndev);\n"
+ "> > -\n"
+ "> >         rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);\n"
+ "> >         if (rc)\n"
+ "> >                 return -EIO;\n"
+ "> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {\n"
+ "> >          * window by setting the limit equal to base, nor can it limit the size\n"
+ "> >          * of the memory window by setting the limit to base + size.\n"
+ "> >          */\n"
+ "> > -       .bar2_limit             = SNB_PBAR2LMT_OFFSET,\n"
+ "> > -       .bar2_xlat              = SNB_PBAR2XLAT_OFFSET,\n"
+ "> > +       .bar2_limit             = SNB_PBAR23LMT_OFFSET,\n"
+ "> > +       .bar2_xlat              = SNB_PBAR23XLAT_OFFSET,\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  static const struct intel_ntb_xlat_reg snb_sec_xlat = {\n"
+ "> >         .bar0_base              = SNB_SBAR0BASE_OFFSET,\n"
+ "> > -       .bar2_limit             = SNB_SBAR2LMT_OFFSET,\n"
+ "> > -       .bar2_xlat              = SNB_SBAR2XLAT_OFFSET,\n"
+ "> > +       .bar2_limit             = SNB_SBAR23LMT_OFFSET,\n"
+ "> > +       .bar2_xlat              = SNB_SBAR23XLAT_OFFSET,\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  static const struct intel_b2b_addr snb_b2b_usd_addr = {\n"
+ "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > index 0224b1a..fec689d 100644\n"
+ "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > @@ -70,11 +70,27 @@\n"
+ "> >\n"
+ "> >  /* SNB hardware (and JSF, IVT, HSX) */\n"
+ "> >\n"
+ "> > -#define SNB_PBAR2LMT_OFFSET            0x0000\n"
+ "> > -#define SNB_PBAR2XLAT_OFFSET           0x0010\n"
+ "> > -#define SNB_SBAR2LMT_OFFSET            0x0020\n"
+ "> > -#define SNB_SBAR2XLAT_OFFSET           0x0030\n"
+ "> > +#define SNB_PBAR23LMT_OFFSET           0x0000\n"
+ "> > +#define SNB_PBAR45LMT_OFFSET           0x0008\n"
+ "> > +#define SNB_PBAR4LMT_OFFSET            0x0008\n"
+ "> > +#define SNB_PBAR5LMT_OFFSET            0x000c\n"
+ "> > +#define SNB_PBAR23XLAT_OFFSET          0x0010\n"
+ "> > +#define SNB_PBAR45XLAT_OFFSET          0x0018\n"
+ "> > +#define SNB_PBAR4XLAT_OFFSET           0x0018\n"
+ "> > +#define SNB_PBAR5XLAT_OFFSET           0x001c\n"
+ "> > +#define SNB_SBAR23LMT_OFFSET           0x0020\n"
+ "> > +#define SNB_SBAR45LMT_OFFSET           0x0028\n"
+ "> > +#define SNB_SBAR4LMT_OFFSET            0x0028\n"
+ "> > +#define SNB_SBAR5LMT_OFFSET            0x002c\n"
+ "> > +#define SNB_SBAR23XLAT_OFFSET          0x0030\n"
+ "> > +#define SNB_SBAR45XLAT_OFFSET          0x0038\n"
+ "> > +#define SNB_SBAR4XLAT_OFFSET           0x0038\n"
+ "> > +#define SNB_SBAR5XLAT_OFFSET           0x003c\n"
+ "> >  #define SNB_SBAR0BASE_OFFSET           0x0040\n"
+ "> > +#define SNB_SBAR23BASE_OFFSET          0x0048\n"
+ "> > +#define SNB_SBAR45BASE_OFFSET          0x0050\n"
+ "> > +#define SNB_SBAR4BASE_OFFSET           0x0050\n"
+ "> > +#define SNB_SBAR5BASE_OFFSET           0x0054\n"
+ "> >  #define SNB_SBDF_OFFSET                        0x005c\n"
+ "> >  #define SNB_NTBCNTL_OFFSET             0x0058\n"
+ "> >  #define SNB_PDOORBELL_OFFSET           0x0060\n"
+ "> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c\n"
+ "> > index f1ed1b7..bb2eb85 100644\n"
+ "> > --- a/drivers/ntb/ntb_transport.c\n"
+ "> > +++ b/drivers/ntb/ntb_transport.c\n"
+ "> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {\n"
+ "> >\n"
+ "> >         bool link_is_up;\n"
+ "> >         struct delayed_work link_work;\n"
+ "> > -       struct work_struct db_work;\n"
+ "> >         struct work_struct link_cleanup;\n"
+ "> > +       struct tasklet_struct db_work;\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  enum {\n"
+ "> > @@ -241,7 +241,7 @@ enum {\n"
+ "> >  #define NTB_QP_DEF_NUM_ENTRIES 100\n"
+ "> >  #define NTB_LINK_DOWN_TIMEOUT  10\n"
+ "> >\n"
+ "> > -static void ntb_transport_doorbell_work(struct work_struct *ws);\n"
+ "> > +static void ntb_transport_doorbell_work(unsigned long data);\n"
+ "> >  static const struct ntb_ctx_ops ntb_transport_ops;\n"
+ "> >  static struct ntb_client ntb_transport_client;\n"
+ "> >\n"
+ "> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);\n"
+ "> > -       INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);\n"
+ "> >         INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);\n"
+ "> > +       tasklet_init(&nt->db_work, ntb_transport_doorbell_work,\n"
+ "> > +                    (unsigned long)nt);\n"
+ "> >\n"
+ "> >         rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);\n"
+ "> >         if (rc)\n"
+ "> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)\n"
+ "> >         int i;\n"
+ "> >\n"
+ "> >         ntb_transport_link_cleanup(nt);\n"
+ "> > -       cancel_work_sync(&nt->db_work);\n"
+ "> > +       tasklet_disable(&nt->db_work);\n"
+ "> >         cancel_work_sync(&nt->link_cleanup);\n"
+ "> >         cancel_delayed_work_sync(&nt->link_work);\n"
+ "> >\n"
+ "> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)\n"
+ "> >  }\n"
+ "> >  EXPORT_SYMBOL_GPL(ntb_transport_max_size);\n"
+ "> >\n"
+ "> > -static void ntb_transport_doorbell_work(struct work_struct *work)\n"
+ "> > +static void ntb_transport_doorbell_work(unsigned long data)\n"
+ "> >  {\n"
+ "> > -       struct ntb_transport_ctx *nt = container_of(work,\n"
+ "> > -                       struct ntb_transport_ctx, db_work);\n"
+ "> > +       struct ntb_transport_ctx *nt = (void *)data;\n"
+ "> >         struct ntb_transport_qp *qp;\n"
+ "> >         u64 db_mask, db_bits, db_again;\n"
+ "> >         unsigned int qp_num;\n"
+ "> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)\n"
+ "> >\n"
+ "> >         ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));\n"
+ "> >\n"
+ "> > -       schedule_work(&nt->db_work);\n"
+ "> > +       tasklet_schedule(&nt->db_work);\n"
+ "> >  }\n"
+ "> >\n"
+ "> >  static const struct ntb_ctx_ops ntb_transport_ops = {\n"
+ "> > --\n"
+ "> > 2.4.0.rc0.43.gcf8a8c6\n"
+ "> >\n"
+ "> > --\n"
+ "> > To unsubscribe from this list: send the line \"unsubscribe linux-pci\" in\n"
+ "> > the body of a message to majordomo@vger.kernel.org\n"
+ > > More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
-2e582ad3e389f67386b7c982514fa3ccb20f0b7cbee3b1a559d58cced5bfbb25
+428118fc61f8d3266913a91d889cfc99ccab368f9f8d657847f6d26ed7d10ca0

diff --git a/a/1.txt b/N2/1.txt
index ff5d956..3452aac 100644
--- a/a/1.txt
+++ b/N2/1.txt
@@ -1,478 +1,547 @@
-T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K
-PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1
-YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50
-ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp
-bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg
-Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz
-dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z
-KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo
-ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv
-c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1
-Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K
-SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu
-IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
-aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg
-ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp
-dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg
-Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp
-ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv
-bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx
-MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+
-ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3
-ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq
-ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+
-ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0
-OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN
-Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg
-IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp
-YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl
-ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl
-dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1
-Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r
-IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
-ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv
-ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0
-XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh
-dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1
-ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K
-PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh
-ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg
-Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg
-ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf
-bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K
-PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g
-KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct
-PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
-aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt
-XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf
-cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p
-byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg
-bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
-dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi
-RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m
-ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg
-ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg
-ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp
-b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K
-PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K
-PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu
-djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh
-cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K
-PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y
-ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv
-ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1
-IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v
-ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp
-b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr
-IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv
-ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg
-ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K
-PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp
-Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg
-IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp
-bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np
-emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw
-MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg
-c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg
-KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg
-KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg
-ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg
-Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg
-cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g
-KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m
-ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc
-biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf
-b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg
-ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg
-ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g
-ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
-aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg
-ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+
-ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN
-Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
-UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj
-bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2
-NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf
-UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9
-IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0
-ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg
-ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs
-DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1
-IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg
-ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS
-OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT
-TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52
-NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1
-LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
-ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
-b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw
-MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg
-ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg
-ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg
-ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT
-RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo
-YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+
-ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P
-RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo
-bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2
-NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg
-ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs
-bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz
-NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls
-cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu
-dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg
-ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg
-dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg
-PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg
-ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1
-XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
-dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg
-ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm
-ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g
-PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl
-diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW
-U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g
-c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN
-Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K
-PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w
-ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u
-ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg
-ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg
-LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L
-U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg
-PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh
-ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg
-ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g
-KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf
-T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w
-cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K
-PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+
-IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl
-diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp
-Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg
-ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
-b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS
-UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs
-NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi
-X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+
-ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n
-IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg
-IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg
-LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50
-ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu
-ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g
-LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg
-ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC
-QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg
-KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh
-cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf
-YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+
-ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi
-YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m
-ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T
-QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y
-bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg
-ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl
-ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50
-IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg
-ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi
-MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo
-YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy
-ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0
-ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg
-IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g
-ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf
-YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg
-ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg
-ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+
-IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs
-IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy
-MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg
-bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h
-ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
-ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh
-cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h
-ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi
-MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv
-d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg
-ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g
-PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT
-RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g
-KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl
-dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg
-ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg
-ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g
-LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg
-NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw
-X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt
-bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk
-ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg
-ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk
-ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi
-YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg
-ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk
-ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw
-KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg
-MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm
-LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz
-TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
-U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi
-U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
-bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt
-PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0
-ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
-X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
-X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
-ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN
-Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0
-NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
-LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug
-ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g
-PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6
-IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy
-X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht
-bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi
-YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
-ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg
-ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4
-XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy
-LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g
-NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
-cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh
-cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg
-ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN
-Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1
-TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
-ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g
-PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg
-ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp
-dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
-MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
-bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p
-byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg
-bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
-IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K
-PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp
-Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf
-T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB
-UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g
-b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K
-PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp
-dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
-MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+
-YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh
-cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr
-IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg
-ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg
-ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g
-KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7
-DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G
-RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0
-cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G
-RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
-NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs
-IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m
-ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy
-M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO
-Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
-LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp
-ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw
-ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
-X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
-X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
-ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7
-DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS
-NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl
-diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs
-c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
-NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf
-b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t
-aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
-cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
-ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g
-ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs
-bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl
-ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf
-YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf
-YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg
-ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K
-PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY
-TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
-ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K
-PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj
-dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg
-aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+
-ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q
-IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP
-T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo
-IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg
-bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt
-ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg
-c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl
-bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC
-X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf
-SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O
-VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf
-SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+
-ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg
-ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh
-c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf
-REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf
-SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U
-RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf
-UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY
-Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP
-T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9
-DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv
-KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn
-aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp
-cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+
-IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN
-Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg
-ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj
-YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD
-SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD
-RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO
-VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8
-PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN
-Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN
-Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0
-ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy
-ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg
-ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+
-ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU
-MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g
-PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg
-ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz
-ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E
-RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J
-RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF
-TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q
-U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6
-DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr
-ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg
-Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg
-ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g
-KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu
-ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu
-ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs
-IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg
-ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj
-IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg
-ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj
-YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93
-IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+
-ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs
-DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG
-U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U
-X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy
-M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50
-ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug
-ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s
-aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy
-Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg
-LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg
-ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+
-ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy
-Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi
-X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu
-ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50
-ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
-aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh
-cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U
-X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG
-U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg
-ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg
-ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw
-eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4
-DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+
-ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl
-ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg
-U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q
-QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY
-TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P
-RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU
-ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg
-ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg
-IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw
-MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+
-ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj
-ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu
-ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C
-X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS
-NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF
-X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT
-RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg
-ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg
-ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg
-ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu
-YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi
-ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr
-IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz
-dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf
-dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg
-ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf
-c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk
-Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg
-QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg
-I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg
-bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+
-ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk
-YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0
-X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50
-Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y
-dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+
-ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu
-a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso
-Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg
-SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93
-b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv
-cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u
-ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf
-dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0
-NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq
-c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+
-ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu
-Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl
-KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j
-bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf
-d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf
-dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K
-PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+
-IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry
-dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso
-dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z
-cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg
-ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0
-cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz
-dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf
-Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA
-IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh
-bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z
-ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+
-IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl
-dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0
-IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu
-NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t
-IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+
-IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g
-TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t
-aW5mby5odG1sDQo=
+On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:
+> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:
+> > From: Dave Jiang <dave.jiang@intel.com>
+> >
+> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>
+> 
+> Needs a topic in the subject line and a changelog.
+> 
+> It also seems to do a lot more than just checking device ID (I assume
+> that's what "DID" means), so this should probably be split into
+> several patches that each do one thing.  I see at least:
+> 
+>   - cosmetic code restructuring
+>   - work_struct/tasklet_struct changes
+>   - new #defines and bar2_off() changes
+
+I think this patch got mangled with couple other patches. Allen?
+
+> 
+> > ---
+> >  drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
+> >  drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-
+> >  drivers/ntb/ntb_transport.c         |  16 +--
+> >  3 files changed, 133 insertions(+), 103 deletions(-)
+> >
+> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > index d162f22..89fea50 100644
+> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c
+> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >         size_t buf_size;
+> >         ssize_t ret, off;
+> >         union { u64 v64; u32 v32; u16 v16; } u;
+> > -       unsigned long reg;
+> >
+> >         ndev = filp->private_data;
+> >         mmio = ndev->self_mmio;
+> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >
+> >         if (!ndev->reg->link_is_up(ndev)) {
+> >                 off += scnprintf(buf + off, buf_size - off,
+> > -                                "Link Satus -\t\tDown\n");
+> > +                                "Link Status -\t\tDown\n");
+> >         } else {
+> >                 off += scnprintf(buf + off, buf_size - off,
+> > -                                "Link Satus -\t\tUp\n");
+> > +                                "Link Status -\t\tUp\n");
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "Link Speed -\t\tPCI-E Gen %u\n",
+> >                                  NTB_LNK_STA_SPEED(ndev->lnk_sta));
+> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
+> >
+> > -       reg = ndev->self_reg->db_mask;
+> > -       u.v64 = ndev_db_read(ndev, mmio + reg);
+> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Mask -\t\t%#llx\n", u.v64);
+> >
+> > -       reg = ndev->self_reg->db_bell;
+> > -       u.v64 = ndev_db_read(ndev, mmio + reg);
+> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "Doorbell Bell -\t\t%#llx\n", u.v64);
+> >
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "\nNTB Incoming XLAT:\n");
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "XLAT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "XLAT45 -\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "LMT23 -\t\t\t%#018llx\n", u.v64);
+> >
+> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
+> > -       u.v64 = ioread64(mmio + reg);
+> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
+> >         off += scnprintf(buf + off, buf_size - off,
+> >                          "LMT45 -\t\t\t%#018llx\n", u.v64);
+> >
+> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "\nNTB Outgoing B2B XLAT:\n");
+> >
+> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B XLAT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B XLAT45 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B LMT23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "B2B LMT45 -\t\t%#018llx\n", u.v64);
+> >
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "\nNTB Secondary BAR:\n");
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR01 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR23 -\t\t%#018llx\n", u.v64);
+> >
+> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
+> > -                       u.v64 = ioread64(mmio + reg);
+> > +                       u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "SBAR45 -\t\t%#018llx\n", u.v64);
+> >                 }
+> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "\nSNB NTB Statistics:\n");
+> >
+> > -               reg = SNB_USMEMMISS_OFFSET;
+> > -               u.v16 = ioread16(mmio + reg);
+> > +               u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "Upstream Memory Miss -\t%u\n", u.v16);
+> >
+> >                 off += scnprintf(buf + off, buf_size - off,
+> >                                  "\nSNB NTB Hardware Errors:\n");
+> >
+> > -               reg = SNB_DEVSTS_OFFSET;
+> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+> > +               if (!pci_read_config_word(ndev->ntb.pdev,
+> > +                                         SNB_DEVSTS_OFFSET, &u.v16))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "DEVSTS -\t\t%#06x\n", u.v16);
+> >
+> > -               reg = SNB_LINK_STATUS_OFFSET;
+> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+> > +               if (!pci_read_config_word(ndev->ntb.pdev,
+> > +                                         SNB_LINK_STATUS_OFFSET, &u.v16))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "LNKSTS -\t\t%#06x\n", u.v16);
+> >
+> > -               reg = SNB_UNCERRSTS_OFFSET;
+> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+> > +               if (!pci_read_config_dword(ndev->ntb.pdev,
+> > +                                          SNB_UNCERRSTS_OFFSET, &u.v32))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "UNCERRSTS -\t\t%#06x\n", u.v32);
+> >
+> > -               reg = SNB_CORERRSTS_OFFSET;
+> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+> > +               if (!pci_read_config_dword(ndev->ntb.pdev,
+> > +                                          SNB_CORERRSTS_OFFSET, &u.v32))
+> >                         off += scnprintf(buf + off, buf_size - off,
+> >                                          "CORERRSTS -\t\t%#06x\n", u.v32);
+> >         }
+> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >  {
+> >         struct pci_dev *pdev;
+> >         void __iomem *mmio;
+> > -       unsigned long off;
+> >         resource_size_t bar_size;
+> >         phys_addr_t bar_addr;
+> >         int b2b_bar;
+> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
+> >         }
+> >
+> > -       /* setup incoming bar base addresses */
+> > -       off = SNB_SBAR0BASE_OFFSET;
+> > -
+> >         /* SBAR01 hit by first part of the b2b bar */
+> >         if (b2b_bar == 0) {
+> >                 bar_addr = addr->bar0_addr;
+> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >         }
+> >
+> >         dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
+> > -       iowrite64(bar_addr, mmio + bar0_off(off, 0));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
+> >
+> >         /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
+> >          * The b2b bar is either disabled above, or configured half-size, and
+> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
+> >          */
+> >
+> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
+> > -       iowrite64(bar_addr, mmio + bar0_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar0_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = addr->bar4_addr64 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite64(bar_addr, mmio + bar0_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar0_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = addr->bar4_addr32 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar0_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar0_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = addr->bar5_addr32 +
+> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar0_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar0_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
+> >         }
+> >
+> >         /* setup incoming bar limits == base addrs (zero length windows) */
+> > -       off = SNB_SBAR2LMT_OFFSET;
+> >
+> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
+> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = addr->bar4_addr64 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = addr->bar4_addr32 +
+> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = addr->bar5_addr32 +
+> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
+> >         }
+> >
+> >         /* zero incoming translation addrs */
+> > -       off = SNB_SBAR2XLAT_OFFSET;
+> > -
+> > -       iowrite64(0, mmio + bar2_off(off, 2));
+> > +       iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
+> >
+> >         if (!ndev->bar4_split) {
+> > -               iowrite64(0, mmio + bar2_off(off, 4));
+> > +               iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
+> >         } else {
+> > -               iowrite32(0, mmio + bar2_off(off, 4));
+> > -               iowrite32(0, mmio + bar2_off(off, 5));
+> > +               iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
+> > +               iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
+> >         }
+> >
+> >         /* zero outgoing translation limits (whole bar size windows) */
+> > -       off = SNB_PBAR2LMT_OFFSET;
+> > -       iowrite64(0, mmio + bar2_off(off, 2));
+> > +       iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
+> >         if (!ndev->bar4_split) {
+> > -               iowrite64(0, mmio + bar2_off(off, 4));
+> > +               iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
+> >         } else {
+> > -               iowrite32(0, mmio + bar2_off(off, 4));
+> > -               iowrite32(0, mmio + bar2_off(off, 5));
+> > +               iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
+> > +               iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
+> >         }
+> >
+> >         /* set outgoing translation offsets */
+> > -       off = SNB_PBAR2XLAT_OFFSET;
+> > -
+> >         bar_addr = peer_addr->bar2_addr64;
+> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));
+> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));
+> > +       iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
+> > +       bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
+> >         dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
+> >
+> >         if (!ndev->bar4_split) {
+> >                 bar_addr = peer_addr->bar4_addr64;
+> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));
+> > +               iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
+> > +               bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
+> >         } else {
+> >                 bar_addr = peer_addr->bar2_addr64;
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));
+> > +               iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
+> >
+> >                 bar_addr = peer_addr->bar2_addr64;
+> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));
+> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));
+> > +               iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
+> > +               bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
+> >                 dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
+> >         }
+> >
+> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
+> >         u8 ppd;
+> >         int rc, mem;
+> >
+> > +       pdev = ndev_pdev(ndev);
+> > +
+> > +       switch (pdev->device) {
+> >         /* There is a Xeon hardware errata related to writes to SDOORBELL or
+> >          * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
+> >          * which may hang the system.  To workaround this use the second memory
+> >          * window to access the interrupt and scratch pad registers on the
+> >          * remote system.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+> > +               break;
+> > +       }
+> >
+> > +       switch (pdev->device) {
+> >         /* There is a hardware errata related to accessing any register in
+> >          * SB01BASE in the presence of bidirectional traffic crossing the NTB.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+> > +               break;
+> > +       }
+> >
+> > +       switch (pdev->device) {
+> >         /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be
+> >          * mirrored to the remote system.  Shrink the number of bits by one,
+> >          * since bit 14 is the last bit.
+> >          */
+> > -       ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+> > +               ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+> > +               break;
+> > +       }
+> >
+> >         ndev->reg = &snb_reg;
+> >
+> > -       pdev = ndev_pdev(ndev);
+> > -
+> >         rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
+> >         if (rc)
+> >                 return -EIO;
+> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
+> >          * window by setting the limit equal to base, nor can it limit the size
+> >          * of the memory window by setting the limit to base + size.
+> >          */
+> > -       .bar2_limit             = SNB_PBAR2LMT_OFFSET,
+> > -       .bar2_xlat              = SNB_PBAR2XLAT_OFFSET,
+> > +       .bar2_limit             = SNB_PBAR23LMT_OFFSET,
+> > +       .bar2_xlat              = SNB_PBAR23XLAT_OFFSET,
+> >  };
+> >
+> >  static const struct intel_ntb_xlat_reg snb_sec_xlat = {
+> >         .bar0_base              = SNB_SBAR0BASE_OFFSET,
+> > -       .bar2_limit             = SNB_SBAR2LMT_OFFSET,
+> > -       .bar2_xlat              = SNB_SBAR2XLAT_OFFSET,
+> > +       .bar2_limit             = SNB_SBAR23LMT_OFFSET,
+> > +       .bar2_xlat              = SNB_SBAR23XLAT_OFFSET,
+> >  };
+> >
+> >  static const struct intel_b2b_addr snb_b2b_usd_addr = {
+> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > index 0224b1a..fec689d 100644
+> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h
+> > @@ -70,11 +70,27 @@
+> >
+> >  /* SNB hardware (and JSF, IVT, HSX) */
+> >
+> > -#define SNB_PBAR2LMT_OFFSET            0x0000
+> > -#define SNB_PBAR2XLAT_OFFSET           0x0010
+> > -#define SNB_SBAR2LMT_OFFSET            0x0020
+> > -#define SNB_SBAR2XLAT_OFFSET           0x0030
+> > +#define SNB_PBAR23LMT_OFFSET           0x0000
+> > +#define SNB_PBAR45LMT_OFFSET           0x0008
+> > +#define SNB_PBAR4LMT_OFFSET            0x0008
+> > +#define SNB_PBAR5LMT_OFFSET            0x000c
+> > +#define SNB_PBAR23XLAT_OFFSET          0x0010
+> > +#define SNB_PBAR45XLAT_OFFSET          0x0018
+> > +#define SNB_PBAR4XLAT_OFFSET           0x0018
+> > +#define SNB_PBAR5XLAT_OFFSET           0x001c
+> > +#define SNB_SBAR23LMT_OFFSET           0x0020
+> > +#define SNB_SBAR45LMT_OFFSET           0x0028
+> > +#define SNB_SBAR4LMT_OFFSET            0x0028
+> > +#define SNB_SBAR5LMT_OFFSET            0x002c
+> > +#define SNB_SBAR23XLAT_OFFSET          0x0030
+> > +#define SNB_SBAR45XLAT_OFFSET          0x0038
+> > +#define SNB_SBAR4XLAT_OFFSET           0x0038
+> > +#define SNB_SBAR5XLAT_OFFSET           0x003c
+> >  #define SNB_SBAR0BASE_OFFSET           0x0040
+> > +#define SNB_SBAR23BASE_OFFSET          0x0048
+> > +#define SNB_SBAR45BASE_OFFSET          0x0050
+> > +#define SNB_SBAR4BASE_OFFSET           0x0050
+> > +#define SNB_SBAR5BASE_OFFSET           0x0054
+> >  #define SNB_SBDF_OFFSET                        0x005c
+> >  #define SNB_NTBCNTL_OFFSET             0x0058
+> >  #define SNB_PDOORBELL_OFFSET           0x0060
+> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
+> > index f1ed1b7..bb2eb85 100644
+> > --- a/drivers/ntb/ntb_transport.c
+> > +++ b/drivers/ntb/ntb_transport.c
+> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {
+> >
+> >         bool link_is_up;
+> >         struct delayed_work link_work;
+> > -       struct work_struct db_work;
+> >         struct work_struct link_cleanup;
+> > +       struct tasklet_struct db_work;
+> >  };
+> >
+> >  enum {
+> > @@ -241,7 +241,7 @@ enum {
+> >  #define NTB_QP_DEF_NUM_ENTRIES 100
+> >  #define NTB_LINK_DOWN_TIMEOUT  10
+> >
+> > -static void ntb_transport_doorbell_work(struct work_struct *ws);
+> > +static void ntb_transport_doorbell_work(unsigned long data);
+> >  static const struct ntb_ctx_ops ntb_transport_ops;
+> >  static struct ntb_client ntb_transport_client;
+> >
+> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
+> >         }
+> >
+> >         INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
+> > -       INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
+> >         INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
+> > +       tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
+> > +                    (unsigned long)nt);
+> >
+> >         rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
+> >         if (rc)
+> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
+> >         int i;
+> >
+> >         ntb_transport_link_cleanup(nt);
+> > -       cancel_work_sync(&nt->db_work);
+> > +       tasklet_disable(&nt->db_work);
+> >         cancel_work_sync(&nt->link_cleanup);
+> >         cancel_delayed_work_sync(&nt->link_work);
+> >
+> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
+> >  }
+> >  EXPORT_SYMBOL_GPL(ntb_transport_max_size);
+> >
+> > -static void ntb_transport_doorbell_work(struct work_struct *work)
+> > +static void ntb_transport_doorbell_work(unsigned long data)
+> >  {
+> > -       struct ntb_transport_ctx *nt = container_of(work,
+> > -                       struct ntb_transport_ctx, db_work);
+> > +       struct ntb_transport_ctx *nt = (void *)data;
+> >         struct ntb_transport_qp *qp;
+> >         u64 db_mask, db_bits, db_again;
+> >         unsigned int qp_num;
+> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
+> >
+> >         ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
+> >
+> > -       schedule_work(&nt->db_work);
+> > +       tasklet_schedule(&nt->db_work);
+> >  }
+> >
+> >  static const struct ntb_ctx_ops ntb_transport_ops = {
+> > --
+> > 2.4.0.rc0.43.gcf8a8c6
+> >
+> > --
+> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in
+> > the body of a message to majordomo@vger.kernel.org
+> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
+ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥
diff --git a/a/content_digest b/N2/content_digest
index a1b7771..99a128b 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -12,483 +12,552 @@
  " linux-ntb@googlegroups.com <linux-ntb@googlegroups.com>\0"
  "\00:1\0"
  "b\0"
- "T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K\n"
- "PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1\n"
- "YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50\n"
- "ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp\n"
- "bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg\n"
- "Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz\n"
- "dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z\n"
- "KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo\n"
- "ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv\n"
- "c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1\n"
- "Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K\n"
- "SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu\n"
- "IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n"
- "aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg\n"
- "ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp\n"
- "dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg\n"
- "Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp\n"
- "ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv\n"
- "bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx\n"
- "MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+\n"
- "ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3\n"
- "ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq\n"
- "ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+\n"
- "ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0\n"
- "OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN\n"
- "Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg\n"
- "IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp\n"
- "YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl\n"
- "ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl\n"
- "dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1\n"
- "Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r\n"
- "IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n"
- "ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv\n"
- "ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0\n"
- "XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh\n"
- "dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1\n"
- "ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K\n"
- "PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh\n"
- "ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg\n"
- "Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf\n"
- "bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K\n"
- "PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g\n"
- "KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct\n"
- "PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n"
- "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt\n"
- "XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf\n"
- "cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p\n"
- "byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg\n"
- "bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n"
- "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi\n"
- "RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m\n"
- "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg\n"
- "ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg\n"
- "ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp\n"
- "b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K\n"
- "PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K\n"
- "PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu\n"
- "djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh\n"
- "cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K\n"
- "PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y\n"
- "ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv\n"
- "ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1\n"
- "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v\n"
- "ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp\n"
- "b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr\n"
- "IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv\n"
- "ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K\n"
- "PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp\n"
- "Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg\n"
- "IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp\n"
- "bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np\n"
- "emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw\n"
- "MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg\n"
- "c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg\n"
- "KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg\n"
- "KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg\n"
- "ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg\n"
- "Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg\n"
- "cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g\n"
- "KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m\n"
- "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc\n"
- "biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf\n"
- "b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg\n"
- "ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n"
- "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+\n"
- "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n"
- "UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj\n"
- "bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2\n"
- "NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf\n"
- "UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9\n"
- "IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0\n"
- "ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs\n"
- "DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1\n"
- "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS\n"
- "OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT\n"
- "TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52\n"
- "NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1\n"
- "LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n"
- "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw\n"
- "MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg\n"
- "ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg\n"
- "ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT\n"
- "RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo\n"
- "YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+\n"
- "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P\n"
- "RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo\n"
- "bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2\n"
- "NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs\n"
- "bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz\n"
- "NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls\n"
- "cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu\n"
- "dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg\n"
- "ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg\n"
- "dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg\n"
- "PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg\n"
- "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1\n"
- "XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n"
- "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg\n"
- "ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm\n"
- "ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g\n"
- "PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl\n"
- "diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW\n"
- "U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g\n"
- "c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN\n"
- "Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K\n"
- "PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w\n"
- "ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u\n"
- "ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg\n"
- "LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L\n"
- "U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg\n"
- "PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh\n"
- "ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg\n"
- "ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g\n"
- "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf\n"
- "T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w\n"
- "cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K\n"
- "PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl\n"
- "diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp\n"
- "Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n"
- "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS\n"
- "UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs\n"
- "NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi\n"
- "X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+\n"
- "ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n\n"
- "IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg\n"
- "IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg\n"
- "LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50\n"
- "ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu\n"
- "ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g\n"
- "LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg\n"
- "ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC\n"
- "QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg\n"
- "KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh\n"
- "cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf\n"
- "YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+\n"
- "ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi\n"
- "YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m\n"
- "ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T\n"
- "QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y\n"
- "bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg\n"
- "ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl\n"
- "ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50\n"
- "IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg\n"
- "ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi\n"
- "MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo\n"
- "YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy\n"
- "ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0\n"
- "ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg\n"
- "IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf\n"
- "YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg\n"
- "ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs\n"
- "IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy\n"
- "MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg\n"
- "bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h\n"
- "ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n"
- "ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh\n"
- "cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h\n"
- "ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi\n"
- "MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv\n"
- "d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg\n"
- "ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g\n"
- "PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT\n"
- "RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g\n"
- "KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl\n"
- "dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg\n"
- "ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g\n"
- "LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg\n"
- "NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw\n"
- "X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt\n"
- "bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk\n"
- "ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg\n"
- "ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk\n"
- "ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi\n"
- "YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg\n"
- "ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk\n"
- "ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw\n"
- "KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg\n"
- "MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm\n"
- "LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz\n"
- "TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n"
- "U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi\n"
- "U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n"
- "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt\n"
- "PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0\n"
- "ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n"
- "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n"
- "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n"
- "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0\n"
- "NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n"
- "LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug\n"
- "ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g\n"
- "PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6\n"
- "IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy\n"
- "X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht\n"
- "bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi\n"
- "YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg\n"
- "ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4\n"
- "XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy\n"
- "LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g\n"
- "NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n"
- "cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh\n"
- "cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg\n"
- "ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN\n"
- "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1\n"
- "TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n"
- "ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g\n"
- "PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg\n"
- "ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp\n"
- "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n"
- "MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n"
- "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p\n"
- "byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg\n"
- "bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n"
- "IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K\n"
- "PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp\n"
- "Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf\n"
- "T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB\n"
- "UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g\n"
- "b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K\n"
- "PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp\n"
- "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n"
- "MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+\n"
- "YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh\n"
- "cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr\n"
- "IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg\n"
- "ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg\n"
- "ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g\n"
- "KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7\n"
- "DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G\n"
- "RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0\n"
- "cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G\n"
- "RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n"
- "NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs\n"
- "IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m\n"
- "ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy\n"
- "M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO\n"
- "Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n"
- "LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp\n"
- "ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw\n"
- "ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n"
- "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n"
- "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n"
- "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7\n"
- "DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS\n"
- "NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl\n"
- "diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs\n"
- "c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n"
- "NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf\n"
- "b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t\n"
- "aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n"
- "cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g\n"
- "ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs\n"
- "bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl\n"
- "ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf\n"
- "YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf\n"
- "YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg\n"
- "ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K\n"
- "PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY\n"
- "TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n"
- "ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K\n"
- "PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj\n"
- "dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg\n"
- "aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+\n"
- "ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q\n"
- "IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP\n"
- "T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo\n"
- "IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg\n"
- "bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt\n"
- "ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg\n"
- "c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl\n"
- "bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC\n"
- "X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf\n"
- "SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O\n"
- "VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf\n"
- "SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+\n"
- "ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg\n"
- "ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh\n"
- "c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf\n"
- "REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf\n"
- "SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U\n"
- "RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf\n"
- "UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY\n"
- "Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP\n"
- "T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9\n"
- "DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv\n"
- "KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn\n"
- "aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp\n"
- "cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+\n"
- "IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN\n"
- "Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg\n"
- "ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj\n"
- "YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD\n"
- "SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD\n"
- "RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO\n"
- "VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8\n"
- "PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN\n"
- "Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN\n"
- "Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0\n"
- "ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy\n"
- "ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg\n"
- "ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+\n"
- "ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU\n"
- "MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g\n"
- "PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg\n"
- "ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz\n"
- "ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E\n"
- "RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J\n"
- "RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF\n"
- "TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q\n"
- "U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6\n"
- "DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr\n"
- "ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg\n"
- "Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg\n"
- "ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g\n"
- "KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu\n"
- "ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu\n"
- "ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs\n"
- "IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg\n"
- "ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj\n"
- "IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg\n"
- "ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj\n"
- "YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93\n"
- "IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+\n"
- "ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs\n"
- "DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG\n"
- "U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U\n"
- "X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy\n"
- "M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50\n"
- "ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug\n"
- "ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s\n"
- "aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy\n"
- "Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg\n"
- "LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg\n"
- "ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+\n"
- "ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy\n"
- "Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi\n"
- "X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu\n"
- "ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50\n"
- "ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n"
- "aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh\n"
- "cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U\n"
- "X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG\n"
- "U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg\n"
- "ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg\n"
- "ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw\n"
- "eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4\n"
- "DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+\n"
- "ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl\n"
- "ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg\n"
- "U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q\n"
- "QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY\n"
- "TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P\n"
- "RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU\n"
- "ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg\n"
- "ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg\n"
- "IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw\n"
- "MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+\n"
- "ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj\n"
- "ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu\n"
- "ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C\n"
- "X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS\n"
- "NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF\n"
- "X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT\n"
- "RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg\n"
- "ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg\n"
- "ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu\n"
- "YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi\n"
- "ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr\n"
- "IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz\n"
- "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf\n"
- "dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg\n"
- "ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf\n"
- "c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk\n"
- "Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg\n"
- "QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg\n"
- "I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg\n"
- "bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+\n"
- "ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk\n"
- "YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0\n"
- "X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50\n"
- "Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y\n"
- "dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+\n"
- "ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu\n"
- "a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso\n"
- "Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg\n"
- "SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93\n"
- "b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv\n"
- "cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u\n"
- "ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf\n"
- "dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0\n"
- "NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq\n"
- "c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+\n"
- "ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu\n"
- "Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl\n"
- "KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j\n"
- "bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf\n"
- "d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf\n"
- "dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K\n"
- "PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+\n"
- "IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry\n"
- "dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso\n"
- "dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z\n"
- "cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0\n"
- "cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz\n"
- "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf\n"
- "Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA\n"
- "IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh\n"
- "bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z\n"
- "ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+\n"
- "IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl\n"
- "dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0\n"
- "IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu\n"
- "NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t\n"
- "IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+\n"
- "IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g\n"
- "TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t\n"
- aW5mby5odG1sDQo=
+ "On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:\n"
+ "> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:\n"
+ "> > From: Dave Jiang <dave.jiang@intel.com>\n"
+ "> >\n"
+ "> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>\n"
+ "> \n"
+ "> Needs a topic in the subject line and a changelog.\n"
+ "> \n"
+ "> It also seems to do a lot more than just checking device ID (I assume\n"
+ "> that's what \"DID\" means), so this should probably be split into\n"
+ "> several patches that each do one thing.  I see at least:\n"
+ "> \n"
+ ">   - cosmetic code restructuring\n"
+ ">   - work_struct/tasklet_struct changes\n"
+ ">   - new #defines and bar2_off() changes\n"
+ "\n"
+ "I think this patch got mangled with couple other patches. Allen?\n"
+ "\n"
+ "> \n"
+ "> > ---\n"
+ "> >  drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------\n"
+ "> >  drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-\n"
+ "> >  drivers/ntb/ntb_transport.c         |  16 +--\n"
+ "> >  3 files changed, 133 insertions(+), 103 deletions(-)\n"
+ "> >\n"
+ "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > index d162f22..89fea50 100644\n"
+ "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c\n"
+ "> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >         size_t buf_size;\n"
+ "> >         ssize_t ret, off;\n"
+ "> >         union { u64 v64; u32 v32; u16 v16; } u;\n"
+ "> > -       unsigned long reg;\n"
+ "> >\n"
+ "> >         ndev = filp->private_data;\n"
+ "> >         mmio = ndev->self_mmio;\n"
+ "> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >\n"
+ "> >         if (!ndev->reg->link_is_up(ndev)) {\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> > -                                \"Link Satus -\\t\\tDown\\n\");\n"
+ "> > +                                \"Link Status -\\t\\tDown\\n\");\n"
+ "> >         } else {\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> > -                                \"Link Satus -\\t\\tUp\\n\");\n"
+ "> > +                                \"Link Status -\\t\\tUp\\n\");\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"Link Speed -\\t\\tPCI-E Gen %u\\n\",\n"
+ "> >                                  NTB_LNK_STA_SPEED(ndev->lnk_sta));\n"
+ "> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Mask Cached -\\t%#llx\\n\", ndev->db_mask);\n"
+ "> >\n"
+ "> > -       reg = ndev->self_reg->db_mask;\n"
+ "> > -       u.v64 = ndev_db_read(ndev, mmio + reg);\n"
+ "> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Mask -\\t\\t%#llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = ndev->self_reg->db_bell;\n"
+ "> > -       u.v64 = ndev_db_read(ndev, mmio + reg);\n"
+ "> > +       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"Doorbell Bell -\\t\\t%#llx\\n\", u.v64);\n"
+ "> >\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"\\nNTB Incoming XLAT:\\n\");\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"LMT23 -\\t\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -       reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);\n"
+ "> > -       u.v64 = ioread64(mmio + reg);\n"
+ "> > +       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));\n"
+ "> >         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                          \"LMT45 -\\t\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"\\nNTB Outgoing B2B XLAT:\\n\");\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B LMT23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"B2B LMT45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"\\nNTB Secondary BAR:\\n\");\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR01 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR23 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >\n"
+ "> > -                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);\n"
+ "> > -                       u.v64 = ioread64(mmio + reg);\n"
+ "> > +                       u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"SBAR45 -\\t\\t%#018llx\\n\", u.v64);\n"
+ "> >                 }\n"
+ "> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"\\nSNB NTB Statistics:\\n\");\n"
+ "> >\n"
+ "> > -               reg = SNB_USMEMMISS_OFFSET;\n"
+ "> > -               u.v16 = ioread16(mmio + reg);\n"
+ "> > +               u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"Upstream Memory Miss -\\t%u\\n\", u.v16);\n"
+ "> >\n"
+ "> >                 off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                  \"\\nSNB NTB Hardware Errors:\\n\");\n"
+ "> >\n"
+ "> > -               reg = SNB_DEVSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n"
+ "> > +               if (!pci_read_config_word(ndev->ntb.pdev,\n"
+ "> > +                                         SNB_DEVSTS_OFFSET, &u.v16))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"DEVSTS -\\t\\t%#06x\\n\", u.v16);\n"
+ "> >\n"
+ "> > -               reg = SNB_LINK_STATUS_OFFSET;\n"
+ "> > -               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n"
+ "> > +               if (!pci_read_config_word(ndev->ntb.pdev,\n"
+ "> > +                                         SNB_LINK_STATUS_OFFSET, &u.v16))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"LNKSTS -\\t\\t%#06x\\n\", u.v16);\n"
+ "> >\n"
+ "> > -               reg = SNB_UNCERRSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n"
+ "> > +               if (!pci_read_config_dword(ndev->ntb.pdev,\n"
+ "> > +                                          SNB_UNCERRSTS_OFFSET, &u.v32))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"UNCERRSTS -\\t\\t%#06x\\n\", u.v32);\n"
+ "> >\n"
+ "> > -               reg = SNB_CORERRSTS_OFFSET;\n"
+ "> > -               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n"
+ "> > +               if (!pci_read_config_dword(ndev->ntb.pdev,\n"
+ "> > +                                          SNB_CORERRSTS_OFFSET, &u.v32))\n"
+ "> >                         off += scnprintf(buf + off, buf_size - off,\n"
+ "> >                                          \"CORERRSTS -\\t\\t%#06x\\n\", u.v32);\n"
+ "> >         }\n"
+ "> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >  {\n"
+ "> >         struct pci_dev *pdev;\n"
+ "> >         void __iomem *mmio;\n"
+ "> > -       unsigned long off;\n"
+ "> >         resource_size_t bar_size;\n"
+ "> >         phys_addr_t bar_addr;\n"
+ "> >         int b2b_bar;\n"
+ "> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5SZ %#x\\n\", bar_sz);\n"
+ "> >         }\n"
+ "> >\n"
+ "> > -       /* setup incoming bar base addresses */\n"
+ "> > -       off = SNB_SBAR0BASE_OFFSET;\n"
+ "> > -\n"
+ "> >         /* SBAR01 hit by first part of the b2b bar */\n"
+ "> >         if (b2b_bar == 0) {\n"
+ "> >                 bar_addr = addr->bar0_addr;\n"
+ "> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR01 %#018llx\\n\", bar_addr);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar0_off(off, 0));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);\n"
+ "> >\n"
+ "> >         /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.\n"
+ "> >          * The b2b bar is either disabled above, or configured half-size, and\n"
+ "> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n"
+ "> >          */\n"
+ "> >\n"
+ "> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar0_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar0_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR23 %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = addr->bar4_addr64 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite64(bar_addr, mmio + bar0_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar0_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR45 %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = addr->bar4_addr32 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar0_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar0_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR4 %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = addr->bar5_addr32 +\n"
+ "> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar0_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar0_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5 %#010llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* setup incoming bar limits == base addrs (zero length windows) */\n"
+ "> > -       off = SNB_SBAR2LMT_OFFSET;\n"
+ "> >\n"
+ "> >         bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n"
+ "> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"SBAR23LMT %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = addr->bar4_addr64 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR45LMT %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = addr->bar4_addr32 +\n"
+ "> >                         (b2b_bar == 4 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR4LMT %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = addr->bar5_addr32 +\n"
+ "> >                         (b2b_bar == 5 ? ndev->b2b_off : 0);\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"SBAR5LMT %#05llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* zero incoming translation addrs */\n"
+ "> > -       off = SNB_SBAR2XLAT_OFFSET;\n"
+ "> > -\n"
+ "> > -       iowrite64(0, mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> > -               iowrite64(0, mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);\n"
+ "> >         } else {\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 4));\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);\n"
+ "> > +               iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* zero outgoing translation limits (whole bar size windows) */\n"
+ "> > -       off = SNB_PBAR2LMT_OFFSET;\n"
+ "> > -       iowrite64(0, mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> > -               iowrite64(0, mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);\n"
+ "> >         } else {\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 4));\n"
+ "> > -               iowrite32(0, mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);\n"
+ "> > +               iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         /* set outgoing translation offsets */\n"
+ "> > -       off = SNB_PBAR2XLAT_OFFSET;\n"
+ "> > -\n"
+ "> >         bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -       iowrite64(bar_addr, mmio + bar2_off(off, 2));\n"
+ "> > -       bar_addr = ioread64(mmio + bar2_off(off, 2));\n"
+ "> > +       iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> > +       bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n"
+ "> >         dev_dbg(ndev_dev(ndev), \"PBAR23XLAT %#018llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >         if (!ndev->bar4_split) {\n"
+ "> >                 bar_addr = peer_addr->bar4_addr64;\n"
+ "> > -               iowrite64(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread64(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR45XLAT %#018llx\\n\", bar_addr);\n"
+ "> >         } else {\n"
+ "> >                 bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 4));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 4));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR4XLAT %#010llx\\n\", bar_addr);\n"
+ "> >\n"
+ "> >                 bar_addr = peer_addr->bar2_addr64;\n"
+ "> > -               iowrite32(bar_addr, mmio + bar2_off(off, 5));\n"
+ "> > -               bar_addr = ioread32(mmio + bar2_off(off, 5));\n"
+ "> > +               iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);\n"
+ "> > +               bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);\n"
+ "> >                 dev_dbg(ndev_dev(ndev), \"PBAR5XLAT %#010llx\\n\", bar_addr);\n"
+ "> >         }\n"
+ "> >\n"
+ "> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)\n"
+ "> >         u8 ppd;\n"
+ "> >         int rc, mem;\n"
+ "> >\n"
+ "> > +       pdev = ndev_pdev(ndev);\n"
+ "> > +\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* There is a Xeon hardware errata related to writes to SDOORBELL or\n"
+ "> >          * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,\n"
+ "> >          * which may hang the system.  To workaround this use the second memory\n"
+ "> >          * window to access the interrupt and scratch pad registers on the\n"
+ "> >          * remote system.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* There is a hardware errata related to accessing any register in\n"
+ "> >          * SB01BASE in the presence of bidirectional traffic crossing the NTB.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> > +       switch (pdev->device) {\n"
+ "> >         /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be\n"
+ "> >          * mirrored to the remote system.  Shrink the number of bits by one,\n"
+ "> >          * since bit 14 is the last bit.\n"
+ "> >          */\n"
+ "> > -       ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n"
+ "> > +       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n"
+ "> > +               ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n"
+ "> > +               break;\n"
+ "> > +       }\n"
+ "> >\n"
+ "> >         ndev->reg = &snb_reg;\n"
+ "> >\n"
+ "> > -       pdev = ndev_pdev(ndev);\n"
+ "> > -\n"
+ "> >         rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);\n"
+ "> >         if (rc)\n"
+ "> >                 return -EIO;\n"
+ "> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {\n"
+ "> >          * window by setting the limit equal to base, nor can it limit the size\n"
+ "> >          * of the memory window by setting the limit to base + size.\n"
+ "> >          */\n"
+ "> > -       .bar2_limit             = SNB_PBAR2LMT_OFFSET,\n"
+ "> > -       .bar2_xlat              = SNB_PBAR2XLAT_OFFSET,\n"
+ "> > +       .bar2_limit             = SNB_PBAR23LMT_OFFSET,\n"
+ "> > +       .bar2_xlat              = SNB_PBAR23XLAT_OFFSET,\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  static const struct intel_ntb_xlat_reg snb_sec_xlat = {\n"
+ "> >         .bar0_base              = SNB_SBAR0BASE_OFFSET,\n"
+ "> > -       .bar2_limit             = SNB_SBAR2LMT_OFFSET,\n"
+ "> > -       .bar2_xlat              = SNB_SBAR2XLAT_OFFSET,\n"
+ "> > +       .bar2_limit             = SNB_SBAR23LMT_OFFSET,\n"
+ "> > +       .bar2_xlat              = SNB_SBAR23XLAT_OFFSET,\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  static const struct intel_b2b_addr snb_b2b_usd_addr = {\n"
+ "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > index 0224b1a..fec689d 100644\n"
+ "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h\n"
+ "> > @@ -70,11 +70,27 @@\n"
+ "> >\n"
+ "> >  /* SNB hardware (and JSF, IVT, HSX) */\n"
+ "> >\n"
+ "> > -#define SNB_PBAR2LMT_OFFSET            0x0000\n"
+ "> > -#define SNB_PBAR2XLAT_OFFSET           0x0010\n"
+ "> > -#define SNB_SBAR2LMT_OFFSET            0x0020\n"
+ "> > -#define SNB_SBAR2XLAT_OFFSET           0x0030\n"
+ "> > +#define SNB_PBAR23LMT_OFFSET           0x0000\n"
+ "> > +#define SNB_PBAR45LMT_OFFSET           0x0008\n"
+ "> > +#define SNB_PBAR4LMT_OFFSET            0x0008\n"
+ "> > +#define SNB_PBAR5LMT_OFFSET            0x000c\n"
+ "> > +#define SNB_PBAR23XLAT_OFFSET          0x0010\n"
+ "> > +#define SNB_PBAR45XLAT_OFFSET          0x0018\n"
+ "> > +#define SNB_PBAR4XLAT_OFFSET           0x0018\n"
+ "> > +#define SNB_PBAR5XLAT_OFFSET           0x001c\n"
+ "> > +#define SNB_SBAR23LMT_OFFSET           0x0020\n"
+ "> > +#define SNB_SBAR45LMT_OFFSET           0x0028\n"
+ "> > +#define SNB_SBAR4LMT_OFFSET            0x0028\n"
+ "> > +#define SNB_SBAR5LMT_OFFSET            0x002c\n"
+ "> > +#define SNB_SBAR23XLAT_OFFSET          0x0030\n"
+ "> > +#define SNB_SBAR45XLAT_OFFSET          0x0038\n"
+ "> > +#define SNB_SBAR4XLAT_OFFSET           0x0038\n"
+ "> > +#define SNB_SBAR5XLAT_OFFSET           0x003c\n"
+ "> >  #define SNB_SBAR0BASE_OFFSET           0x0040\n"
+ "> > +#define SNB_SBAR23BASE_OFFSET          0x0048\n"
+ "> > +#define SNB_SBAR45BASE_OFFSET          0x0050\n"
+ "> > +#define SNB_SBAR4BASE_OFFSET           0x0050\n"
+ "> > +#define SNB_SBAR5BASE_OFFSET           0x0054\n"
+ "> >  #define SNB_SBDF_OFFSET                        0x005c\n"
+ "> >  #define SNB_NTBCNTL_OFFSET             0x0058\n"
+ "> >  #define SNB_PDOORBELL_OFFSET           0x0060\n"
+ "> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c\n"
+ "> > index f1ed1b7..bb2eb85 100644\n"
+ "> > --- a/drivers/ntb/ntb_transport.c\n"
+ "> > +++ b/drivers/ntb/ntb_transport.c\n"
+ "> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {\n"
+ "> >\n"
+ "> >         bool link_is_up;\n"
+ "> >         struct delayed_work link_work;\n"
+ "> > -       struct work_struct db_work;\n"
+ "> >         struct work_struct link_cleanup;\n"
+ "> > +       struct tasklet_struct db_work;\n"
+ "> >  };\n"
+ "> >\n"
+ "> >  enum {\n"
+ "> > @@ -241,7 +241,7 @@ enum {\n"
+ "> >  #define NTB_QP_DEF_NUM_ENTRIES 100\n"
+ "> >  #define NTB_LINK_DOWN_TIMEOUT  10\n"
+ "> >\n"
+ "> > -static void ntb_transport_doorbell_work(struct work_struct *ws);\n"
+ "> > +static void ntb_transport_doorbell_work(unsigned long data);\n"
+ "> >  static const struct ntb_ctx_ops ntb_transport_ops;\n"
+ "> >  static struct ntb_client ntb_transport_client;\n"
+ "> >\n"
+ "> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n"
+ "> >         }\n"
+ "> >\n"
+ "> >         INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);\n"
+ "> > -       INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);\n"
+ "> >         INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);\n"
+ "> > +       tasklet_init(&nt->db_work, ntb_transport_doorbell_work,\n"
+ "> > +                    (unsigned long)nt);\n"
+ "> >\n"
+ "> >         rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);\n"
+ "> >         if (rc)\n"
+ "> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)\n"
+ "> >         int i;\n"
+ "> >\n"
+ "> >         ntb_transport_link_cleanup(nt);\n"
+ "> > -       cancel_work_sync(&nt->db_work);\n"
+ "> > +       tasklet_disable(&nt->db_work);\n"
+ "> >         cancel_work_sync(&nt->link_cleanup);\n"
+ "> >         cancel_delayed_work_sync(&nt->link_work);\n"
+ "> >\n"
+ "> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)\n"
+ "> >  }\n"
+ "> >  EXPORT_SYMBOL_GPL(ntb_transport_max_size);\n"
+ "> >\n"
+ "> > -static void ntb_transport_doorbell_work(struct work_struct *work)\n"
+ "> > +static void ntb_transport_doorbell_work(unsigned long data)\n"
+ "> >  {\n"
+ "> > -       struct ntb_transport_ctx *nt = container_of(work,\n"
+ "> > -                       struct ntb_transport_ctx, db_work);\n"
+ "> > +       struct ntb_transport_ctx *nt = (void *)data;\n"
+ "> >         struct ntb_transport_qp *qp;\n"
+ "> >         u64 db_mask, db_bits, db_again;\n"
+ "> >         unsigned int qp_num;\n"
+ "> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)\n"
+ "> >\n"
+ "> >         ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));\n"
+ "> >\n"
+ "> > -       schedule_work(&nt->db_work);\n"
+ "> > +       tasklet_schedule(&nt->db_work);\n"
+ "> >  }\n"
+ "> >\n"
+ "> >  static const struct ntb_ctx_ops ntb_transport_ops = {\n"
+ "> > --\n"
+ "> > 2.4.0.rc0.43.gcf8a8c6\n"
+ "> >\n"
+ "> > --\n"
+ "> > To unsubscribe from this list: send the line \"unsubscribe linux-pci\" in\n"
+ "> > the body of a message to majordomo@vger.kernel.org\n"
+ "> > More majordomo info at  http://vger.kernel.org/majordomo-info.html\n"
+ "\303\277\303\264\303\250\302\272{.n\303\207+\302\211\302\267\302\237\302\256\302\211\302\255\302\206+%\302\212\303\213\303\277\302\261\303\251\303\235\302\266\027\302\245\302\212w\303\277\302\272{.n\303\207+\302\211\302\267\302\245\302\212{\302\261\303\276G\302\253\302\235\303\251\303\277\302\212{ay\302\272\035\303\212\302\207\303\232\302\231\303\253,j\a\302\255\302\242f\302\243\302\242\302\267h\302\232\302\217\303\257\302\201\303\252\303\277\302\221\303\252\303\247z_\303\250\302\256\003(\302\255\303\251\302\232\302\216\302\212\303\235\302\242j\"\302\235\303\272\032\302\266\033m\302\247\303\277\303\277\302\276\a\302\253\303\276G\302\253\302\235\303\251\303\277\302\242\302\270?\302\231\302\250\303\250\302\255\303\232&\302\243\303\270\302\247~\302\217\303\241\302\266iO\302\225\303\246\302\254z\302\267\302\232v\303\230^\024\004\032\302\266\033m\302\247\303\277\303\277\303\203\f\303\277\302\266\303\254\303\277\302\242\302\270?\302\226I\302\245"
 
-2e582ad3e389f67386b7c982514fa3ccb20f0b7cbee3b1a559d58cced5bfbb25
+79ff4b3d03b77e20b9b1e6c828dffb945ccc7e41ead529d0523e8dc080fdb6c6

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.