From mboxrd@z Thu Jan 1 00:00:00 1970 From: jack_wang Subject: Re: [RFC PATCH v5 7/7] libsas: let libata recover links that fail to transmit initial sig-fis Date: Sun, 15 Jan 2012 10:41:00 +0800 Message-ID: <201201151040578908900@usish.com> References: <20120114180904.25887.75601.stgit@localhost6.localdomain6>, <20120114181048.25887.56612.stgit@localhost6.localdomain6> Reply-To: jack_wang Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 Return-path: Received: from sr-smtp.usish.com ([210.5.144.203]:35489 "EHLO sr-smtp.usish.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753488Ab2AOClD (ORCPT ); Sat, 14 Jan 2012 21:41:03 -0500 Sender: linux-ide-owner@vger.kernel.org List-Id: linux-ide@vger.kernel.org To: Dan Williams , linux-scsi Cc: Xiangliang Yu , linux-ide , Luben Tuikov VGhhbmtzIHlvdXIgd29yayB0byBtYWtlIGxpZmUgZWFzaWVyLiBMb29rcyBnb29kIHRvIG1lLg0K DQoNCi0tLS0tLS0tLS0tLS0tDQpqYWNrX3dhbmcNCj5saWJzYXMgZmFpbHMgdG8gZGlzY292ZXIg YWxsIHNhdGEgZGV2aWNlcyBpbiB0aGUgZG9tYWluLiAgSWYgYSBkZXZpY2UgZmFpbHMNCj5uZWdv dGlhdGlvbiBhbmQgZG9lcyBub3QgdHJhbnNtaXQgYSBzaWduYXR1cmUgZmlzIHRoZSBsaW5rIG5l ZWRzIHJlY292ZXJ5Lg0KPmxpYmF0YSBhbHJlYWR5IHVuZGVyc3RhbmRzIGhvdyB0byBtYW5hZ2Ug c2xvdyB0byBjb21lIHVwIGxpbmtzLCBzbyB0cmVhdCB0aGVzZQ0KPmNvbmRpdGlvbnMgYXMgYXRh IGRldmljZSBhdHRhY2ggZXZlbnRzIGZvciB0aGUgcHVycG9zZXMgb2YgY3JlYXRpbmcgYW4NCj5h dGFfcG9ydC4gIFRoaXMgYWxsb3dzIGxpYmF0YSB0byBtYW5hZ2UgcmV0cnlpbmcgbGluayBicmlu ZyB1cC4NCj4NCj5DYzogSmFjayBXYW5nIDxqYWNrX3dhbmdAdXNpc2guY29tPg0KPkNjOiBYaWFu Z2xpYW5nIFl1IDx5dXhpYW5nbEBtYXJ2ZWxsLmNvbT4NCj5DYzogTHViZW4gVHVpa292IDxsdHVp a292QHlhaG9vLmNvbT4NCj5TaWduZWQtb2ZmLWJ5OiBEYW4gV2lsbGlhbXMgPGRhbi5qLndpbGxp YW1zQGludGVsLmNvbT4NCj4tLS0NCj4gZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMgICAg ICB8ICAgNzEgKysrKysrKysrKysrKysrKysrKy0NCj4gZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNf ZGlzY292ZXIuYyB8ICAgIDEgDQo+IGRyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMg fCAgMTI1ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBkcml2ZXJzL3Nj c2kvbGlic2FzL3Nhc19pbnRlcm5hbC5oIHwgICAgNiArLQ0KPiBpbmNsdWRlL3Njc2kvc2FzLmgg ICAgICAgICAgICAgICAgIHwgICAgNCArDQo+IGluY2x1ZGUvc2NzaS9zYXNfYXRhLmggICAgICAg ICAgICAgfCAgICA4ICsrDQo+IDYgZmlsZXMgY2hhbmdlZCwgMTM2IGluc2VydGlvbnMoKyksIDc5 IGRlbGV0aW9ucygtKQ0KPg0KPmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19h dGEuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jDQo+aW5kZXggMGVlNjgzMS4uZDE0 YWYyMiAxMDA2NDQNCj4tLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYw0KPisrKyBi L2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jDQo+QEAgLTI3OCwyNiArMjc4LDg0IEBAIHN0 YXRpYyBzdHJ1Y3Qgc2FzX2ludGVybmFsICpkZXZfdG9fc2FzX2ludGVybmFsKHN0cnVjdCBkb21h aW5fZGV2aWNlICpkZXYpDQo+IAlyZXR1cm4gdG9fc2FzX2ludGVybmFsKGRldi0+cG9ydC0+aGEt PmNvcmUuc2hvc3QtPnRyYW5zcG9ydHQpOw0KPiB9DQo+IA0KPitzdGF0aWMgdm9pZCBzYXNfZ2V0 X2F0YV9jb21tYW5kX3NldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KTsNCj4rDQo+K2ludCBz YXNfZ2V0X2F0YV9pbmZvKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIHN0cnVjdCBleF9waHkg KnBoeSkNCj4rew0KPisJaWYgKHBoeS0+YXR0YWNoZWRfdHByb3RvICYgU0FTX1BST1RPQ09MX1NU UCkNCj4rCQlkZXYtPnRwcm90byA9IHBoeS0+YXR0YWNoZWRfdHByb3RvOw0KPisJaWYgKHBoeS0+ YXR0YWNoZWRfc2F0YV9kZXYpDQo+KwkJZGV2LT50cHJvdG8gfD0gU0FUQV9ERVY7DQo+Kw0KPisJ aWYgKHBoeS0+YXR0YWNoZWRfZGV2X3R5cGUgPT0gU0FUQV9QRU5ESU5HKQ0KPisJCWRldi0+ZGV2 X3R5cGUgPSBTQVRBX1BFTkRJTkc7DQo+KwllbHNlIHsNCj4rCQlpbnQgcmVzOw0KPisNCj4rCQlk ZXYtPmRldl90eXBlID0gU0FUQV9ERVY7DQo+KwkJcmVzID0gc2FzX2dldF9yZXBvcnRfcGh5X3Nh dGEoZGV2LT5wYXJlbnQsIHBoeS0+cGh5X2lkLA0KPisJCQkJCSAgICAgICZkZXYtPnNhdGFfZGV2 LnJwc19yZXNwKTsNCj4rCQlpZiAocmVzKSB7DQo+KwkJCVNBU19EUFJJTlRLKCJyZXBvcnQgcGh5 IHNhdGEgdG8gJTAxNmxseDoweCV4IHJldHVybmVkICINCj4rCQkJCSAgICAiMHgleFxuIiwgU0FT X0FERFIoZGV2LT5wYXJlbnQtPnNhc19hZGRyKSwNCj4rCQkJCSAgICBwaHktPnBoeV9pZCwgcmVz KTsNCj4rCQkJcmV0dXJuIHJlczsNCj4rCQl9DQo+KwkJbWVtY3B5KGRldi0+ZnJhbWVfcmN2ZCwg JmRldi0+c2F0YV9kZXYucnBzX3Jlc3AucnBzLmZpcywNCj4rCQkgICAgICAgc2l6ZW9mKHN0cnVj dCBkZXZfdG9faG9zdF9maXMpKTsNCj4rCQkvKiBUT0RPIHN3aXRjaCB0byBhdGFfZGV2X2NsYXNz aWZ5KCkgKi8NCj4rCQlzYXNfZ2V0X2F0YV9jb21tYW5kX3NldChkZXYpOw0KPisJfQ0KPisJcmV0 dXJuIDA7DQo+K30NCj4rDQo+K3N0YXRpYyBpbnQgc2FzX2F0YV9jbGVhcl9wZW5kaW5nKHN0cnVj dCBkb21haW5fZGV2aWNlICpkZXYsIHN0cnVjdCBleF9waHkgKnBoeSkNCj4rew0KPisJaW50IHJl czsNCj4rDQo+KwkvKiB3ZSB3ZXJlbid0IHBlbmRpbmcsIHNvIHN1Y2Nlc3NmdWxseSBlbmQgdGhl IHJlc2V0IHNlcXVlbmNlIG5vdyAqLw0KPisJaWYgKGRldi0+ZGV2X3R5cGUgIT0gU0FUQV9QRU5E SU5HKQ0KPisJCXJldHVybiAxOw0KPisNCj4rCS8qIGhtbW0sIGlmIHRoaXMgc3VjY2VlZHMgZG8g d2UgbmVlZCB0byByZXBvc3QgdGhlIGRvbWFpbl9kZXZpY2UgdG8gdGhlDQo+KwkgKiBsbGRkIHNv IGl0IGNhbiBwaWNrIHVwIG5ldyBwYXJhbWV0ZXJzPw0KPisJICovDQo+KwlyZXMgPSBzYXNfZ2V0 X2F0YV9pbmZvKGRldiwgcGh5KTsNCj4rCWlmIChyZXMpDQo+KwkJcmV0dXJuIDA7IC8qIHJldHJ5 ICovDQo+KwllbHNlDQo+KwkJcmV0dXJuIDE7DQo+K30NCj4rDQo+IHN0YXRpYyBpbnQgc21wX2F0 YV9jaGVja19yZWFkeShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmspDQo+IHsNCj4gCWludCByZXM7DQo+ LQl1OCBhZGRyWzhdOw0KPiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOw0KPiAJc3Ry dWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGFwLT5wcml2YXRlX2RhdGE7DQo+IAlzdHJ1Y3QgZG9t YWluX2RldmljZSAqZXhfZGV2ID0gZGV2LT5wYXJlbnQ7DQo+IAlzdHJ1Y3Qgc2FzX3BoeSAqcGh5 ID0gc2FzX2dldF9sb2NhbF9waHkoZGV2KTsNCj4rCXN0cnVjdCBleF9waHkgKmV4X3BoeSA9ICZl eF9kZXYtPmV4X2Rldi5leF9waHlbcGh5LT5udW1iZXJdOw0KPiANCj4tCXJlcyA9IHNhc19nZXRf cGh5X2F0dGFjaGVkX3Nhc19hZGRyKGV4X2RldiwgcGh5LT5udW1iZXIsIGFkZHIpOw0KPisJcmVz ID0gc2FzX2V4X3BoeV9kaXNjb3ZlcihleF9kZXYsIHBoeS0+bnVtYmVyKTsNCj4gCXNhc19wdXRf bG9jYWxfcGh5KHBoeSk7DQo+Kw0KPiAJLyogYnJlYWsgdGhlIHdhaXQgZWFybHkgaWYgdGhlIGV4 cGFuZGVyIGlzIHVucmVhY2hhYmxlLA0KPiAJICogb3RoZXJ3aXNlIGtlZXAgcG9sbGluZw0KPiAJ ICovDQo+IAlpZiAocmVzID09IC1FQ09NTSkNCj4gCQlyZXR1cm4gcmVzOw0KPi0JaWYgKHJlcyAh PSBTTVBfUkVTUF9GVU5DX0FDQyB8fCBTQVNfQUREUihhZGRyKSA9PSAwKQ0KPisJaWYgKHJlcyAh PSBTTVBfUkVTUF9GVU5DX0FDQykNCj4gCQlyZXR1cm4gMDsNCj4tCWVsc2UNCj4tCQlyZXR1cm4g MTsNCj4rDQo+Kwlzd2l0Y2ggKGV4X3BoeS0+YXR0YWNoZWRfZGV2X3R5cGUpIHsNCj4rCWNhc2Ug U0FUQV9QRU5ESU5HOg0KPisJCXJldHVybiAwOw0KPisJY2FzZSBTQVNfRU5EX0RFVjoNCj4rCQlp ZiAoZXhfcGh5LT5hdHRhY2hlZF9zYXRhX2RldikNCj4rCQkJcmV0dXJuIHNhc19hdGFfY2xlYXJf cGVuZGluZyhkZXYsIGV4X3BoeSk7DQo+KwlkZWZhdWx0Og0KPisJCXJldHVybiAtRU5PREVWOw0K PisJfQ0KPiB9DQo+IA0KPiBzdGF0aWMgaW50IGxvY2FsX2F0YV9jaGVja19yZWFkeShzdHJ1Y3Qg YXRhX2xpbmsgKmxpbmspDQo+QEAgLTU2Miw2ICs2MjAsOSBAQCBzdGF0aWMgdm9pZCBzYXNfZ2V0 X2F0YV9jb21tYW5kX3NldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQ0KPiAJc3RydWN0IGRl dl90b19ob3N0X2ZpcyAqZmlzID0NCj4gCQkoc3RydWN0IGRldl90b19ob3N0X2ZpcyAqKSBkZXYt PmZyYW1lX3JjdmQ7DQo+IA0KPisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9QRU5ESU5HKQ0K PisJCXJldHVybjsNCj4rDQo+IAlpZiAoKGZpcy0+c2VjdG9yX2NvdW50ID09IDEgJiYgLyogQVRB ICovDQo+IAkgICAgIGZpcy0+bGJhbCAgICAgICAgID09IDEgJiYNCj4gCSAgICAgZmlzLT5sYmFt ICAgICAgICAgPT0gMCAmJg0KPmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19k aXNjb3Zlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYw0KPmluZGV4IGM2 NjgxYjQuLmRjOGJhZWYgMTAwNjQ0DQo+LS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlz Y292ZXIuYw0KPisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMNCj5AQCAt NDgsNiArNDgsNyBAQCB2b2lkIHNhc19pbml0X2RldihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2 KQ0KPiAgICAgICAgIGNhc2UgU0FUQV9ERVY6DQo+ICAgICAgICAgY2FzZSBTQVRBX1BNOg0KPiAg ICAgICAgIGNhc2UgU0FUQV9QTV9QT1JUOg0KPisJY2FzZSBTQVRBX1BFTkRJTkc6DQo+ICAgICAg ICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmZGV2LT5zYXRhX2Rldi5jaGlsZHJlbik7DQo+ICAg ICAgICAgICAgICAgICBicmVhazsNCj4gICAgICAgICBkZWZhdWx0Og0KPmRpZmYgLS1naXQgYS9k cml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9z YXNfZXhwYW5kZXIuYw0KPmluZGV4IDY4YTgwYTAuLjE4YWVmMzAgMTAwNjQ0DQo+LS0tIGEvZHJp dmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYw0KPisrKyBiL2RyaXZlcnMvc2NzaS9saWJz YXMvc2FzX2V4cGFuZGVyLmMNCj5AQCAtMTY2LDE3ICsxNjYsMTUgQEAgc3RhdGljIGlubGluZSB2 b2lkICphbGxvY19zbXBfcmVzcChpbnQgc2l6ZSkNCj4gCXJldHVybiBremFsbG9jKHNpemUsIEdG UF9LRVJORUwpOw0KPiB9DQo+IA0KPi0vKiAtLS0tLS0tLS0tIEV4cGFuZGVyIGNvbmZpZ3VyYXRp b24gLS0tLS0tLS0tLSAqLw0KPi0NCj4tc3RhdGljIHZvaWQgc2FzX3NldF9leF9waHkoc3RydWN0 IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwNCj4tCQkJICAgdm9pZCAqZGlzY19yZXNw KQ0KPitzdGF0aWMgdm9pZCBzYXNfc2V0X2V4X3BoeShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2 LCBpbnQgcGh5X2lkLCB2b2lkICpyc3ApDQo+IHsNCj4rCXN0cnVjdCBzbXBfcmVzcCAqcmVzcCA9 IHJzcDsNCj4rCXN0cnVjdCBkaXNjb3Zlcl9yZXNwICpkciA9ICZyZXNwLT5kaXNjOw0KPiAJc3Ry dWN0IGV4cGFuZGVyX2RldmljZSAqZXggPSAmZGV2LT5leF9kZXY7DQo+IAlzdHJ1Y3QgZXhfcGh5 ICpwaHkgPSAmZXgtPmV4X3BoeVtwaHlfaWRdOw0KPi0Jc3RydWN0IHNtcF9yZXNwICpyZXNwID0g ZGlzY19yZXNwOw0KPi0Jc3RydWN0IGRpc2NvdmVyX3Jlc3AgKmRyID0gJnJlc3AtPmRpc2M7DQo+ IAlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXYtPnJwaHk7DQo+LQlpbnQgcmVkaXNjb3ZlciA9 IChwaHktPnBoeSAhPSBOVUxMKTsNCj4rCWludCByZWRpc2NvdmVyID0gISFwaHktPnBoeTsNCj4r CWNoYXIgKnR5cGU7DQo+IA0KPiAJaWYgKCFyZWRpc2NvdmVyKSB7DQo+IAkJcGh5LT5waHkgPSBz YXNfcGh5X2FsbG9jKCZycGh5LT5kZXYsIHBoeV9pZCk7DQo+QEAgLTE5Nyw4ICsxOTUsMTQgQEAg c3RhdGljIHZvaWQgc2FzX3NldF9leF9waHkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50 IHBoeV9pZCwNCj4gCQlicmVhazsNCj4gCX0NCj4gDQo+KwkvKiBUaGlzIGlzIGRldGVjdGluZyBh IGZhaWx1cmUgdG8gdHJhbnNtaXQgaW5pdGlhbCBkZXYgdG8gaG9zdA0KPisJICogRklTIGFzIGRl c2NyaWJlZCBpbiBzZWN0aW9uIEouNSBvZiBzYXMtMiByMTYNCj4rCSAqLw0KPisJaWYgKGRyLT5h dHRhY2hlZF9kZXZfdHlwZSA9PSBOT19ERVZJQ0UgJiYgZHItPmF0dGFjaGVkX3NhdGFfZGV2KQ0K PisJCXBoeS0+YXR0YWNoZWRfZGV2X3R5cGUgPSBTQVRBX1BFTkRJTkc7DQo+KwllbHNlDQo+KwkJ cGh5LT5hdHRhY2hlZF9kZXZfdHlwZSA9IGRyLT5hdHRhY2hlZF9kZXZfdHlwZTsNCj4gCXBoeS0+ cGh5X2lkID0gcGh5X2lkOw0KPi0JcGh5LT5hdHRhY2hlZF9kZXZfdHlwZSA9IGRyLT5hdHRhY2hl ZF9kZXZfdHlwZTsNCj4gCXBoeS0+bGlua3JhdGUgPSBkci0+bGlua3JhdGU7DQo+IAlwaHktPmF0 dGFjaGVkX3NhdGFfaG9zdCA9IGRyLT5hdHRhY2hlZF9zYXRhX2hvc3Q7DQo+IAlwaHktPmF0dGFj aGVkX3NhdGFfZGV2ICA9IGRyLT5hdHRhY2hlZF9zYXRhX2RldjsNCj5AQCAtMjEzLDcgKzIxNyw3 IEBAIHN0YXRpYyB2b2lkIHNhc19zZXRfZXhfcGh5KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYs IGludCBwaHlfaWQsDQo+IAlwaHktPmxhc3RfZGFfaW5kZXggPSAtMTsNCj4gDQo+IAlwaHktPnBo eS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MgPSBTQVNfQUREUihwaHktPmF0dGFjaGVkX3Nhc19hZGRy KTsNCj4tCXBoeS0+cGh5LT5pZGVudGlmeS5kZXZpY2VfdHlwZSA9IHBoeS0+YXR0YWNoZWRfZGV2 X3R5cGU7DQo+KwlwaHktPnBoeS0+aWRlbnRpZnkuZGV2aWNlX3R5cGUgPSBkci0+YXR0YWNoZWRf ZGV2X3R5cGU7DQo+IAlwaHktPnBoeS0+aWRlbnRpZnkuaW5pdGlhdG9yX3BvcnRfcHJvdG9jb2xz ID0gcGh5LT5hdHRhY2hlZF9pcHJvdG87DQo+IAlwaHktPnBoeS0+aWRlbnRpZnkudGFyZ2V0X3Bv cnRfcHJvdG9jb2xzID0gcGh5LT5hdHRhY2hlZF90cHJvdG87DQo+IAlwaHktPnBoeS0+aWRlbnRp ZnkucGh5X2lkZW50aWZpZXIgPSBwaHlfaWQ7DQo+QEAgLTIyOSwxNCArMjMzLDMzIEBAIHN0YXRp YyB2b2lkIHNhc19zZXRfZXhfcGh5KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIGludCBwaHlf aWQsDQo+IAkJCXJldHVybjsNCj4gCQl9DQo+IA0KPi0JU0FTX0RQUklOVEsoImV4ICUwMTZsbHgg cGh5JTAyZDolYyBhdHRhY2hlZDogJTAxNmxseFxuIiwNCj4rCXN3aXRjaCAocGh5LT5hdHRhY2hl ZF9kZXZfdHlwZSkgew0KPisJY2FzZSBTQVRBX1BFTkRJTkc6DQo+KwkJdHlwZSA9ICJzdHAgcGVu ZGluZyI7DQo+KwkJYnJlYWs7DQo+KwljYXNlIE5PX0RFVklDRToNCj4rCQl0eXBlID0gIm5vIGRl dmljZSI7DQo+KwkJYnJlYWs7DQo+KwljYXNlIFNBU19FTkRfREVWOg0KPisJCWlmIChkci0+YXR0 YWNoZWRfc2F0YV9kZXYpDQo+KwkJCXR5cGUgPSAic3RwIjsNCj4rCQllbHNlDQo+KwkJCXR5cGUg PSAic3NwIjsNCj4rCQlicmVhazsNCj4rCWNhc2UgRURHRV9ERVY6DQo+KwljYXNlIEZBTk9VVF9E RVY6DQo+KwkJdHlwZSA9ICJzbXAiOw0KPisJCWJyZWFrOw0KPisJZGVmYXVsdDoNCj4rCQl0eXBl ID0gInVua25vd24iOw0KPisJfQ0KPisNCj4rCVNBU19EUFJJTlRLKCJleCAlMDE2bGx4IHBoeSUw MmQ6JWMgYXR0YWNoZWQ6ICUwMTZsbHggKCVzKVxuIiwNCj4gCQkgICAgU0FTX0FERFIoZGV2LT5z YXNfYWRkciksIHBoeS0+cGh5X2lkLA0KPiAJCSAgICBwaHktPnJvdXRpbmdfYXR0ciA9PSBUQUJM RV9ST1VUSU5HID8gJ1QnIDoNCj4gCQkgICAgcGh5LT5yb3V0aW5nX2F0dHIgPT0gRElSRUNUX1JP VVRJTkcgPyAnRCcgOg0KPiAJCSAgICBwaHktPnJvdXRpbmdfYXR0ciA9PSBTVUJUUkFDVElWRV9S T1VUSU5HID8gJ1MnIDogJz8nLA0KPi0JCSAgICBTQVNfQUREUihwaHktPmF0dGFjaGVkX3Nhc19h ZGRyKSk7DQo+LQ0KPi0JcmV0dXJuOw0KPisJCSAgICBTQVNfQUREUihwaHktPmF0dGFjaGVkX3Nh c19hZGRyKSwgdHlwZSk7DQo+IH0NCj4gDQo+IC8qIGNoZWNrIGlmIHdlIGhhdmUgYW4gZXhpc3Rp bmcgYXR0YWNoZWQgYXRhIGRldmljZSBvbiB0aGlzIGV4cGFuZGVyIHBoeSAqLw0KPkBAIC0yNjcs NTAgKzI5MCwyNSBAQCBzdHJ1Y3QgZG9tYWluX2RldmljZSAqc2FzX2V4X3RvX2F0YShzdHJ1Y3Qg ZG9tYWluX2RldmljZSAqZXhfZGV2LCBpbnQgcGh5X2lkKQ0KPiBzdGF0aWMgaW50IHNhc19leF9w aHlfZGlzY292ZXJfaGVscGVyKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIHU4ICpkaXNjX3Jl cSwNCj4gCQkJCSAgICAgIHU4ICpkaXNjX3Jlc3AsIGludCBzaW5nbGUpDQo+IHsNCj4tCXN0cnVj dCBkb21haW5fZGV2aWNlICphdGFfZGV2ID0gc2FzX2V4X3RvX2F0YShkZXYsIHNpbmdsZSk7DQo+ LQlpbnQgaSwgcmVzOw0KPisJc3RydWN0IGRpc2NvdmVyX3Jlc3AgKmRyOw0KPisJaW50IHJlczsN Cj4gDQo+IAlkaXNjX3JlcVs5XSA9IHNpbmdsZTsNCj4tCWZvciAoaSA9IDEgOyBpIDwgMzsgaSsr KSB7DQo+LQkJc3RydWN0IGRpc2NvdmVyX3Jlc3AgKmRyOw0KPiANCj4tCQlyZXMgPSBzbXBfZXhl Y3V0ZV90YXNrKGRldiwgZGlzY19yZXEsIERJU0NPVkVSX1JFUV9TSVpFLA0KPi0JCQkJICAgICAg IGRpc2NfcmVzcCwgRElTQ09WRVJfUkVTUF9TSVpFKTsNCj4tCQlpZiAocmVzKQ0KPi0JCQlyZXR1 cm4gcmVzOw0KPi0JCWRyID0gJigoc3RydWN0IHNtcF9yZXNwICopZGlzY19yZXNwKS0+ZGlzYzsN Cj4tCQlpZiAobWVtY21wKGRldi0+c2FzX2FkZHIsIGRyLT5hdHRhY2hlZF9zYXNfYWRkciwNCj4t CQkJICBTQVNfQUREUl9TSVpFKSA9PSAwKSB7DQo+LQkJCXNhc19wcmludGsoIkZvdW5kIGxvb3Bi YWNrIHRvcG9sb2d5LCBqdXN0IGlnbm9yZSBpdCFcbiIpOw0KPi0JCQlyZXR1cm4gMDsNCj4tCQl9 DQo+LQ0KPi0JCS8qIFRoaXMgaXMgZGV0ZWN0aW5nIGEgZmFpbHVyZSB0byB0cmFuc21pdCBpbml0 aWFsDQo+LQkJICogZGV2IHRvIGhvc3QgRklTIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIEouNSBv Zg0KPi0JCSAqIHNhcy0yIHIxNg0KPi0JCSAqLw0KPi0JCWlmICghKGRyLT5hdHRhY2hlZF9kZXZf dHlwZSA9PSAwICYmDQo+LQkJICAgICAgZHItPmF0dGFjaGVkX3NhdGFfZGV2KSkNCj4tCQkJYnJl YWs7DQo+LQ0KPi0JCS8qIEluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBkZXYgdG8gaG9zdCBGSVMs IHdlIHNlbmQgYQ0KPi0JCSAqIGxpbmsgcmVzZXQgdG8gdGhlIGV4cGFuZGVyIHBvcnQuICBJZiBh IGRldmljZSB3YXMNCj4tCQkgKiBwcmV2aW91c2x5IGRldGVjdGVkIG9uIHRoaXMgcG9ydCB3ZSBh c2sgbGliYXRhIHRvDQo+LQkJICogbWFuYWdlIHRoZSByZXNldCBhbmQgbGluayByZWNvdmVyeS4N Cj4tCQkgKi8NCj4tCQlpZiAoYXRhX2Rldikgew0KPi0JCQlzYXNfYXRhX3NjaGVkdWxlX3Jlc2V0 KGF0YV9kZXYpOw0KPi0JCQlicmVhazsNCj4tCQl9DQo+LQkJc2FzX3NtcF9waHlfY29udHJvbChk ZXYsIHNpbmdsZSwgUEhZX0ZVTkNfTElOS19SRVNFVCwgTlVMTCk7DQo+LQkJLyogV2FpdCBmb3Ig dGhlIHJlc2V0IHRvIHRyaWdnZXIgdGhlIG5lZ290aWF0aW9uICovDQo+LQkJbXNsZWVwKDUwMCk7 DQo+KwlyZXMgPSBzbXBfZXhlY3V0ZV90YXNrKGRldiwgZGlzY19yZXEsIERJU0NPVkVSX1JFUV9T SVpFLA0KPisJCQkgICAgICAgZGlzY19yZXNwLCBESVNDT1ZFUl9SRVNQX1NJWkUpOw0KPisJaWYg KHJlcykNCj4rCQlyZXR1cm4gcmVzOw0KPisJZHIgPSAmKChzdHJ1Y3Qgc21wX3Jlc3AgKilkaXNj X3Jlc3ApLT5kaXNjOw0KPisJaWYgKG1lbWNtcChkZXYtPnNhc19hZGRyLCBkci0+YXR0YWNoZWRf c2FzX2FkZHIsIFNBU19BRERSX1NJWkUpID09IDApIHsNCj4rCQlzYXNfcHJpbnRrKCJGb3VuZCBs b29wYmFjayB0b3BvbG9neSwganVzdCBpZ25vcmUgaXQhXG4iKTsNCj4rCQlyZXR1cm4gMDsNCj4g CX0NCj4gCXNhc19zZXRfZXhfcGh5KGRldiwgc2luZ2xlLCBkaXNjX3Jlc3ApOw0KPiAJcmV0dXJu IDA7DQo+IH0NCj4gDQo+LXN0YXRpYyBpbnQgc2FzX2V4X3BoeV9kaXNjb3ZlcihzdHJ1Y3QgZG9t YWluX2RldmljZSAqZGV2LCBpbnQgc2luZ2xlKQ0KPitpbnQgc2FzX2V4X3BoeV9kaXNjb3Zlcihz dHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgc2luZ2xlKQ0KPiB7DQo+IAlzdHJ1Y3QgZXhw YW5kZXJfZGV2aWNlICpleCA9ICZkZXYtPmV4X2RldjsNCj4gCWludCAgcmVzID0gMDsNCj5AQCAt NjE1LDkgKzYxMyw4IEBAIGludCBzYXNfc21wX2dldF9waHlfZXZlbnRzKHN0cnVjdCBzYXNfcGh5 ICpwaHkpDQo+ICNkZWZpbmUgUlBTX1JFUV9TSVpFICAxNg0KPiAjZGVmaW5lIFJQU19SRVNQX1NJ WkUgNjANCj4gDQo+LXN0YXRpYyBpbnQgc2FzX2dldF9yZXBvcnRfcGh5X3NhdGEoc3RydWN0IGRv bWFpbl9kZXZpY2UgKmRldiwNCj4tCQkJCQkgIGludCBwaHlfaWQsDQo+LQkJCQkJICBzdHJ1Y3Qg c21wX3Jlc3AgKnJwc19yZXNwKQ0KPitpbnQgc2FzX2dldF9yZXBvcnRfcGh5X3NhdGEoc3RydWN0 IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwNCj4rCQkJICAgIHN0cnVjdCBzbXBfcmVz cCAqcnBzX3Jlc3ApDQo+IHsNCj4gCWludCByZXM7DQo+IAl1OCAqcnBzX3JlcSA9IGFsbG9jX3Nt cF9yZXEoUlBTX1JFUV9TSVpFKTsNCj5AQCAtNzI3LDIxICs3MjQsOSBAQCBzdGF0aWMgc3RydWN0 IGRvbWFpbl9kZXZpY2UgKnNhc19leF9kaXNjb3Zlcl9lbmRfZGV2KA0KPiANCj4gI2lmZGVmIENP TkZJR19TQ1NJX1NBU19BVEENCj4gCWlmICgocGh5LT5hdHRhY2hlZF90cHJvdG8gJiBTQVNfUFJP VE9DT0xfU1RQKSB8fCBwaHktPmF0dGFjaGVkX3NhdGFfZGV2KSB7DQo+LQkJY2hpbGQtPmRldl90 eXBlID0gU0FUQV9ERVY7DQo+LQkJaWYgKHBoeS0+YXR0YWNoZWRfdHByb3RvICYgU0FTX1BST1RP Q09MX1NUUCkNCj4tCQkJY2hpbGQtPnRwcm90byA9IHBoeS0+YXR0YWNoZWRfdHByb3RvOw0KPi0J CWlmIChwaHktPmF0dGFjaGVkX3NhdGFfZGV2KQ0KPi0JCQljaGlsZC0+dHByb3RvIHw9IFNBVEFf REVWOw0KPi0JCXJlcyA9IHNhc19nZXRfcmVwb3J0X3BoeV9zYXRhKHBhcmVudCwgcGh5X2lkLA0K Pi0JCQkJCSAgICAgICZjaGlsZC0+c2F0YV9kZXYucnBzX3Jlc3ApOw0KPi0JCWlmIChyZXMpIHsN Cj4tCQkJU0FTX0RQUklOVEsoInJlcG9ydCBwaHkgc2F0YSB0byAlMDE2bGx4OjB4JXggcmV0dXJu ZWQgIg0KPi0JCQkJICAgICIweCV4XG4iLCBTQVNfQUREUihwYXJlbnQtPnNhc19hZGRyKSwNCj4t CQkJCSAgICBwaHlfaWQsIHJlcyk7DQo+KwkJcmVzID0gc2FzX2dldF9hdGFfaW5mbyhjaGlsZCwg cGh5KTsNCj4rCQlpZiAocmVzKQ0KPiAJCQlnb3RvIG91dF9mcmVlOw0KPi0JCX0NCj4tCQltZW1j cHkoY2hpbGQtPmZyYW1lX3JjdmQsICZjaGlsZC0+c2F0YV9kZXYucnBzX3Jlc3AucnBzLmZpcywN Cj4tCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZfdG9faG9zdF9maXMpKTsNCj4gDQo+IAkJcnBo eSA9IHNhc19lbmRfZGV2aWNlX2FsbG9jKHBoeS0+cG9ydCk7DQo+IAkJaWYgKHVubGlrZWx5KCFy cGh5KSkNCj5AQCAtOTU2LDcgKzk0MSw4IEBAIHN0YXRpYyBpbnQgc2FzX2V4X2Rpc2NvdmVyX2Rl dihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgcGh5X2lkKQ0KPiANCj4gCWlmIChleF9w aHktPmF0dGFjaGVkX2Rldl90eXBlICE9IFNBU19FTkRfREVWICYmDQo+IAkgICAgZXhfcGh5LT5h dHRhY2hlZF9kZXZfdHlwZSAhPSBGQU5PVVRfREVWICYmDQo+LQkgICAgZXhfcGh5LT5hdHRhY2hl ZF9kZXZfdHlwZSAhPSBFREdFX0RFVikgew0KPisJICAgIGV4X3BoeS0+YXR0YWNoZWRfZGV2X3R5 cGUgIT0gRURHRV9ERVYgJiYNCj4rCSAgICBleF9waHktPmF0dGFjaGVkX2Rldl90eXBlICE9IFNB VEFfUEVORElORykgew0KPiAJCVNBU19EUFJJTlRLKCJ1bmtub3duIGRldmljZSB0eXBlKDB4JXgp IGF0dGFjaGVkIHRvIGV4ICUwMTZsbHggIg0KPiAJCQkgICAgInBoeSAweCV4XG4iLCBleF9waHkt PmF0dGFjaGVkX2Rldl90eXBlLA0KPiAJCQkgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksDQo+ QEAgLTk4Miw2ICs5NjgsNyBAQCBzdGF0aWMgaW50IHNhc19leF9kaXNjb3Zlcl9kZXYoc3RydWN0 IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCkNCj4gDQo+IAlzd2l0Y2ggKGV4X3BoeS0+ YXR0YWNoZWRfZGV2X3R5cGUpIHsNCj4gCWNhc2UgU0FTX0VORF9ERVY6DQo+KwljYXNlIFNBVEFf UEVORElORzoNCj4gCQljaGlsZCA9IHNhc19leF9kaXNjb3Zlcl9lbmRfZGV2KGRldiwgcGh5X2lk KTsNCj4gCQlicmVhazsNCj4gCWNhc2UgRkFOT1VUX0RFVjoNCj5AQCAtMTY1OCw4ICsxNjQ1LDgg QEAgc3RhdGljIGludCBzYXNfZ2V0X3BoeV9jaGFuZ2VfY291bnQoc3RydWN0IGRvbWFpbl9kZXZp Y2UgKmRldiwNCj4gCXJldHVybiByZXM7DQo+IH0NCj4gDQo+LWludCBzYXNfZ2V0X3BoeV9hdHRh Y2hlZF9zYXNfYWRkcihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLA0KPi0J CQkJICB1OCAqYXR0YWNoZWRfc2FzX2FkZHIpDQo+K3N0YXRpYyBpbnQgc2FzX2dldF9waHlfYXR0 YWNoZWRfc2FzX2FkZHIoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwNCj4r CQkJCQkgdTggKmF0dGFjaGVkX3Nhc19hZGRyKQ0KPiB7DQo+IAlpbnQgcmVzOw0KPiAJc3RydWN0 IHNtcF9yZXNwICpkaXNjX3Jlc3A7DQo+ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMv c2FzX2ludGVybmFsLmggYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbnRlcm5hbC5oDQo+aW5k ZXggNDE1N2Y2ZS4uYTM3YTViZCAxMDA2NDQNCj4tLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nh c19pbnRlcm5hbC5oDQo+KysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW50ZXJuYWwuaA0K PkBAIC05MCw4ICs5MCw5IEBAIGludCBzYXNfc21wX2dldF9waHlfZXZlbnRzKHN0cnVjdCBzYXNf cGh5ICpwaHkpOw0KPiB2b2lkIHNhc19kZXZpY2Vfc2V0X3BoeShzdHJ1Y3QgZG9tYWluX2Rldmlj ZSAqZGV2LCBzdHJ1Y3Qgc2FzX3BvcnQgKnBvcnQpOw0KPiBzdHJ1Y3QgZG9tYWluX2RldmljZSAq c2FzX2ZpbmRfZGV2X2J5X3JwaHkoc3RydWN0IHNhc19ycGh5ICpycGh5KTsNCj4gc3RydWN0IGRv bWFpbl9kZXZpY2UgKnNhc19leF90b19hdGEoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmV4X2Rldiwg aW50IHBoeV9pZCk7DQo+LWludCBzYXNfZ2V0X3BoeV9hdHRhY2hlZF9zYXNfYWRkcihzdHJ1Y3Qg ZG9tYWluX2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLA0KPi0JCQkJICB1OCAqYXR0YWNoZWRfc2Fz X2FkZHIpOw0KPitpbnQgc2FzX2V4X3BoeV9kaXNjb3ZlcihzdHJ1Y3QgZG9tYWluX2RldmljZSAq ZGV2LCBpbnQgc2luZ2xlKTsNCj4raW50IHNhc19nZXRfcmVwb3J0X3BoeV9zYXRhKHN0cnVjdCBk b21haW5fZGV2aWNlICpkZXYsIGludCBwaHlfaWQsDQo+KwkJCSAgICBzdHJ1Y3Qgc21wX3Jlc3Ag KnJwc19yZXNwKTsNCj4gaW50IHNhc190cnlfYXRhX3Jlc2V0KHN0cnVjdCBhc2Rfc2FzX3BoeSAq cGh5KTsNCj4gdm9pZCBzYXNfaGFlX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7DQo+ IA0KPkBAIC0xMjEsNiArMTIyLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHNhc19maWxsX2luX3Jw aHkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwNCj4gCWNhc2UgU0FUQV9ERVY6DQo+IAkJLyog RklYTUU6IG5lZWQgc2F0YSBkZXZpY2UgdHlwZSAqLw0KPiAJY2FzZSBTQVNfRU5EX0RFVjoNCj4r CWNhc2UgU0FUQV9QRU5ESU5HOg0KPiAJCXJwaHktPmlkZW50aWZ5LmRldmljZV90eXBlID0gU0FT X0VORF9ERVZJQ0U7DQo+IAkJYnJlYWs7DQo+IAljYXNlIEVER0VfREVWOg0KPmRpZmYgLS1naXQg YS9pbmNsdWRlL3Njc2kvc2FzLmggYi9pbmNsdWRlL3Njc2kvc2FzLmgNCj5pbmRleCAzNjczZDY4 Li5hNTc3YTgzIDEwMDY0NA0KPi0tLSBhL2luY2x1ZGUvc2NzaS9zYXMuaA0KPisrKyBiL2luY2x1 ZGUvc2NzaS9zYXMuaA0KPkBAIC04OSw4ICs4OSw3IEBAIGVudW0gc2FzX29vYl9tb2RlIHsNCj4g CVNBU19PT0JfTU9ERQ0KPiB9Ow0KPiANCj4tLyogU2VlIHNhc19kaXNjb3Zlci5jIGlmIHlvdSBw bGFuIG9uIGNoYW5naW5nIHRoZXNlLg0KPi0gKi8NCj4rLyogU2VlIHNhc19kaXNjb3Zlci5jIGlm IHlvdSBwbGFuIG9uIGNoYW5naW5nIHRoZXNlICovDQo+IGVudW0gc2FzX2Rldl90eXBlIHsNCj4g CU5PX0RFVklDRSAgID0gMCwJICAvKiBwcm90b2NvbCAqLw0KPiAJU0FTX0VORF9ERVYgPSAxLAkg IC8qIHByb3RvY29sICovDQo+QEAgLTEwMCw2ICs5OSw3IEBAIGVudW0gc2FzX2Rldl90eXBlIHsN Cj4gCVNBVEFfREVWICAgID0gNSwNCj4gCVNBVEFfUE0gICAgID0gNywNCj4gCVNBVEFfUE1fUE9S VD0gOCwNCj4rCVNBVEFfUEVORElORyAgPSA5LA0KPiB9Ow0KPiANCj4gZW51bSBzYXNfcHJvdG9j b2wgew0KPmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2FzX2F0YS5oIGIvaW5jbHVkZS9zY3Np L3Nhc19hdGEuaA0KPmluZGV4IGNiNzI0ZmQuLjBjYTJmOGEgMTAwNjQ0DQo+LS0tIGEvaW5jbHVk ZS9zY3NpL3Nhc19hdGEuaA0KPisrKyBiL2luY2x1ZGUvc2NzaS9zYXNfYXRhLmgNCj5AQCAtMzMs OSArMzMsMTAgQEANCj4gc3RhdGljIGlubGluZSBpbnQgZGV2X2lzX3NhdGEoc3RydWN0IGRvbWFp bl9kZXZpY2UgKmRldikNCj4gew0KPiAJcmV0dXJuIGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYg fHwgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX1BNIHx8DQo+LQkgICAgICAgZGV2LT5kZXZfdHlwZSA9 PSBTQVRBX1BNX1BPUlQ7DQo+KwkgICAgICAgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX1BNX1BPUlQg fHwgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX1BFTkRJTkc7DQo+IH0NCj4gDQo+K2ludCBzYXNfZ2V0 X2F0YV9pbmZvKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIHN0cnVjdCBleF9waHkgKnBoeSk7 DQo+IGludCBzYXNfYXRhX2luaXRfaG9zdF9hbmRfcG9ydChzdHJ1Y3QgZG9tYWluX2RldmljZSAq Zm91bmRfZGV2LA0KPiAJCQkgICAgICAgc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KTsNCj4g DQo+QEAgLTgyLDYgKzgzLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXNfYXRhX3NjaGVkdWxl X3Jlc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpDQo+IHN0YXRpYyBpbmxpbmUgdm9pZCBz YXNfYXRhX3dhaXRfZWgoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikNCj4gew0KPiB9DQo+Kw0K PitzdGF0aWMgaW5saW5lIGludCBzYXNfZ2V0X2F0YV9pbmZvKHN0cnVjdCBkb21haW5fZGV2aWNl ICpkZXYsIHN0cnVjdCBleF9waHkgKnBoeSkNCj4rew0KPisJcmV0dXJuIDA7DQo+K30NCj4gI2Vu ZGlmDQo+IA0KPiAjZW5kaWYgLyogX1NBU19BVEFfSF8gKi8NCj4NCj4tLQ0KPlRvIHVuc3Vic2Ny aWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1zY3Np IiBpbg0KPnRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3Jn DQo+TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRv bW8taW5mby5odG1sDQo+DQo+X19fX19fX19fXyBJbmZvcm1hdGlvbiBmcm9tIEVTRVQgTk9EMzIg QW50aXZpcnVzLCB2ZXJzaW9uIG9mIHZpcnVzIHNpZ25hdHVyZSBkYXRhYmFzZSA1NjU5ICgyMDEw MTEyOSkgX19fX19fX19fXw0KPg0KPlRoZSBtZXNzYWdlIHdhcyBjaGVja2VkIGJ5IEVTRVQgTk9E MzIgQW50aXZpcnVzLg0KPg0KPmh0dHA6Ly93d3cuZXNldC5jb20NCj4NCj4NCj4=