From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MIME_BASE64_TEXT,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3F929C433DF for ; Tue, 9 Jun 2020 10:46:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E734E20812 for ; Tue, 9 Jun 2020 10:46:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="jeItsakq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727122AbgFIKqK (ORCPT ); Tue, 9 Jun 2020 06:46:10 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:12518 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728756AbgFIKqA (ORCPT ); Tue, 9 Jun 2020 06:46:00 -0400 X-UUID: 3624965d442b447bb6acbcf06e960b28-20200609 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=ghj3U5Uiw5kH3QIGkUg7sf+EOxYdEDwQ77XhzksL17Y=; b=jeItsakqeF3br0mNCmMmIuRQkw57x0x0EoGebCiqDWaCzqlYtdlKNazCwrbHx4/akmuFvBcs6kXMRzYYW2KmYL14077kWK84y40yEmpRgols65q0sXMsDr+GZDmCqEfUvC0KBt0IhRwOr9Pq2LvDaibfIgQAjBketcQTzd4QH4k=; X-UUID: 3624965d442b447bb6acbcf06e960b28-20200609 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1932188074; Tue, 09 Jun 2020 18:45:38 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 9 Jun 2020 18:45:36 +0800 Received: from mtksdaap41.mediatek.inc (172.21.77.4) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 9 Jun 2020 18:45:35 +0800 From: Roger Lu To: Kevin Hilman , Rob Herring , Nicolas Boichat , Stephen Boyd CC: Fan Chen , HenryC Chen , YT Lee , Xiaoqing Liu , Charles Yang , Angus Lin , Mark Rutland , Matthias Brugger , Nishanth Menon , Roger Lu , , , , , Subject: [PATCH v9 3/4] PM / AVS: SVS: introduce SVS engine Date: Tue, 9 Jun 2020 18:45:33 +0800 Message-ID: <20200609104534.29314-4-roger.lu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200609104534.29314-1-roger.lu@mediatek.com> References: <20200609104534.29314-1-roger.lu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org VGhlIFNtYXJ0IFZvbHRhZ2UgU2NhbGluZyhTVlMpIGVuZ2luZSBpcyBhIHBpZWNlIG9mIGhhcmR3 YXJlDQp3aGljaCBoYXMgc2V2ZXJhbCBjb250cm9sbGVycyhiYW5rcykgZm9yIGNhbGN1bGF0aW5n IHN1aXRhYmxlDQp2b2x0YWdlIHRvIGRpZmZlcmVudCBwb3dlciBkb21haW5zKENQVS9HUFUvQ0NJ KSBhY2NvcmRpbmcgdG8NCmNoaXAgcHJvY2VzcyBjb3JuZXIsIHRlbXBlcmF0dXJlcyBhbmQgb3Ro ZXIgZmFjdG9ycy4gVGhlbiBEVkZTDQpkcml2ZXIgY291bGQgYXBwbHkgU1ZTIGJhbmsgdm9sdGFn ZSB0byBQTUlDL0J1Y2suDQoNClNpZ25lZC1vZmYtYnk6IFJvZ2VyIEx1IDxyb2dlci5sdUBtZWRp YXRlay5jb20+DQotLS0NCiBkcml2ZXJzL3Bvd2VyL2F2cy9LY29uZmlnICAgICB8ICAgMTAgKw0K IGRyaXZlcnMvcG93ZXIvYXZzL01ha2VmaWxlICAgIHwgICAgMSArDQogZHJpdmVycy9wb3dlci9h dnMvbXRrX3N2cy5jICAgfCAxODU4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0K IGluY2x1ZGUvbGludXgvcG93ZXIvbXRrX3N2cy5oIHwgICAyMyArDQogNCBmaWxlcyBjaGFuZ2Vk LCAxODkyIGluc2VydGlvbnMoKykNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9wb3dlci9h dnMvbXRrX3N2cy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvcG93ZXIvbXRr X3N2cy5oDQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9LY29uZmlnIGIvZHJpdmVy cy9wb3dlci9hdnMvS2NvbmZpZw0KaW5kZXggY2RiNDIzN2JmZDAyLi43NTRlOTMxNWM0ZWEgMTAw NjQ0DQotLS0gYS9kcml2ZXJzL3Bvd2VyL2F2cy9LY29uZmlnDQorKysgYi9kcml2ZXJzL3Bvd2Vy L2F2cy9LY29uZmlnDQpAQCAtMzUsMyArMzUsMTMgQEAgY29uZmlnIFJPQ0tDSElQX0lPRE9NQUlO DQogCSAgU2F5IHkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBpbyBkb21haW5zIG9uIFJvY2tjaGlw IFNvQ3MuIEl0IGlzDQogCSAgbmVjZXNzYXJ5IGZvciB0aGUgaW8gZG9tYWluIHNldHRpbmcgb2Yg dGhlIFNvQyB0byBtYXRjaCB0aGUNCiAJICB2b2x0YWdlIHN1cHBsaWVkIGJ5IHRoZSByZWd1bGF0 b3JzLg0KKw0KK2NvbmZpZyBNVEtfU1ZTDQorCXRyaXN0YXRlICJNZWRpYVRlayBTbWFydCBWb2x0 YWdlIFNjYWxpbmcoU1ZTKSINCisJZGVwZW5kcyBvbiBQT1dFUl9BVlMgJiYgTVRLX0VGVVNFICYm IE5WTUVNDQorCWhlbHANCisJICBUaGUgU21hcnQgVm9sdGFnZSBTY2FsaW5nKFNWUykgZW5naW5l IGlzIGEgcGllY2Ugb2YgaGFyZHdhcmUNCisJICB3aGljaCBoYXMgc2V2ZXJhbCBjb250cm9sbGVy cyhiYW5rcykgZm9yIGNhbGN1bGF0aW5nIHN1aXRhYmxlDQorCSAgdm9sdGFnZSB0byBkaWZmZXJl bnQgcG93ZXIgZG9tYWlucyhDUFUvR1BVL0NDSSkgYWNjb3JkaW5nIHRvDQorCSAgY2hpcCBwcm9j ZXNzIGNvcm5lciwgdGVtcGVyYXR1cmVzIGFuZCBvdGhlciBmYWN0b3JzLiBUaGVuIERWRlMNCisJ ICBkcml2ZXIgY291bGQgYXBwbHkgU1ZTIGJhbmsgdm9sdGFnZSB0byBQTUlDL0J1Y2suDQpkaWZm IC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hdnMvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL2F2cy9N YWtlZmlsZQ0KaW5kZXggOTAwN2QwNTg1M2UyLi4yMzFhZGYwNzg1ODIgMTAwNjQ0DQotLS0gYS9k cml2ZXJzL3Bvd2VyL2F2cy9NYWtlZmlsZQ0KKysrIGIvZHJpdmVycy9wb3dlci9hdnMvTWFrZWZp bGUNCkBAIC0yLDMgKzIsNCBAQA0KIG9iai0kKENPTkZJR19QT1dFUl9BVlNfT01BUCkJCSs9IHNt YXJ0cmVmbGV4Lm8NCiBvYmotJChDT05GSUdfUUNPTV9DUFIpCQkJKz0gcWNvbS1jcHIubw0KIG9i ai0kKENPTkZJR19ST0NLQ0hJUF9JT0RPTUFJTikJCSs9IHJvY2tjaGlwLWlvLWRvbWFpbi5vDQor b2JqLSQoQ09ORklHX01US19TVlMpCQkJKz0gbXRrX3N2cy5vDQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9wb3dlci9hdnMvbXRrX3N2cy5jIGIvZHJpdmVycy9wb3dlci9hdnMvbXRrX3N2cy5jDQpuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi4zZTI2MTkxZjZhM2INCi0tLSAv ZGV2L251bGwNCisrKyBiL2RyaXZlcnMvcG93ZXIvYXZzL210a19zdnMuYw0KQEAgLTAsMCArMSwx ODU4IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisvKg0KKyAqIENv cHlyaWdodCAoQykgMjAyMCBNZWRpYVRlayBJbmMuDQorICovDQorDQorI2luY2x1ZGUgPGxpbnV4 L2JpdHMuaD4NCisjaW5jbHVkZSA8bGludXgvY2xrLmg+DQorI2luY2x1ZGUgPGxpbnV4L2NvbXBs ZXRpb24uaD4NCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4NCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQorI2luY2x1ZGUgPGxpbnV4L2t0 aHJlYWQuaD4NCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQorI2luY2x1ZGUgPGxpbnV4L211 dGV4Lmg+DQorI2luY2x1ZGUgPGxpbnV4L252bWVtLWNvbnN1bWVyLmg+DQorI2luY2x1ZGUgPGxp bnV4L29mX2FkZHJlc3MuaD4NCisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+DQorI2luY2x1ZGUg PGxpbnV4L29mX3BsYXRmb3JtLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5o Pg0KKyNpbmNsdWRlIDxsaW51eC9wbV9kb21haW4uaD4NCisjaW5jbHVkZSA8bGludXgvcG1fb3Bw Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50 aW1lLmg+DQorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL210a19zdnMuaD4NCisjaW5jbHVkZSA8bGlu dXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+DQorI2lu Y2x1ZGUgPGxpbnV4L3NsYWIuaD4NCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCisjaW5j bHVkZSA8bGludXgvdGhlcm1hbC5oPg0KKw0KKy8qIHN2cyBiYW5rIDEtbGluZSBzdyBpZCAqLw0K KyNkZWZpbmUgU1ZTQl9DUFVfTElUVExFCQkJQklUKDApDQorI2RlZmluZSBTVlNCX0NQVV9CSUcJ CQlCSVQoMSkNCisjZGVmaW5lIFNWU0JfQ0NJCQkJQklUKDIpDQorI2RlZmluZSBTVlNCX0dQVQkJ CUJJVCgzKQ0KKw0KKy8qIHN2cyBiYW5rIG1vZGUgc3VwcG9ydCAqLw0KKyNkZWZpbmUgU1ZTQl9N T0RFX0FMTF9ESVNBQkxFCQkoMCkNCisjZGVmaW5lIFNWU0JfTU9ERV9JTklUMDEJCUJJVCgxKQ0K KyNkZWZpbmUgU1ZTQl9NT0RFX0lOSVQwMgkJQklUKDIpDQorI2RlZmluZSBTVlNCX01PREVfTU9O CQkJQklUKDMpDQorDQorLyogc3ZzIGJhbmsgaW5pdDAxIGNvbmRpdGlvbiAqLw0KKyNkZWZpbmUg U1ZTQl9JTklUMDFfVk9MVF9JR05PUkUJCUJJVCgxKQ0KKyNkZWZpbmUgU1ZTQl9JTklUMDFfVk9M VF9JTkNfT05MWQlCSVQoMikNCisjZGVmaW5lIFNWU0JfSU5JVDAxX0NMS19FTgkJQklUKDMxKQ0K Kw0KKy8qIHN2cyBiYW5rIGNvbW1vbiBzZXR0aW5nICovDQorI2RlZmluZSBTVlNCX1RaT05FX0hJ R0hfVEVNUF9NQVgJKFUzMl9NQVgpDQorI2RlZmluZSBTVlNCX1JVTkNPTkZJR19ERUZBVUxUCQko MHg4MDAwMDAwMCkNCisjZGVmaW5lIFNWU0JfRENfU0lHTkVEX0JJVAkJKDB4ODAwMCkNCisjZGVm aW5lIFNWU0JfSU5URU5fSU5JVDB4CQkoMHgwMDAwNWYwMSkNCisjZGVmaW5lIFNWU0JfSU5URU5f TU9OVk9QRU4JCSgweDAwZmYwMDAwKQ0KKyNkZWZpbmUgU1ZTQl9FTl9PRkYJCQkoMHgwKQ0KKyNk ZWZpbmUgU1ZTQl9FTl9NQVNLCQkJKDB4NykNCisjZGVmaW5lIFNWU0JfRU5fSU5JVDAxCQkJKDB4 MSkNCisjZGVmaW5lIFNWU0JfRU5fSU5JVDAyCQkJKDB4NSkNCisjZGVmaW5lIFNWU0JfRU5fTU9O CQkJKDB4MikNCisjZGVmaW5lIFNWU0JfSU5UU1RTX01PTlZPUAkJKDB4MDBmZjAwMDApDQorI2Rl ZmluZSBTVlNCX0lOVFNUU19DT01QTEVURQkJKDB4MSkNCisjZGVmaW5lIFNWU0JfSU5UU1RTX0NM RUFOCQkoMHgwMGZmZmZmZikNCisNCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG10a19zdnNfbG9j ayk7DQorc3RydWN0IG10a19zdnM7DQorDQorLyoNCisgKiBlbnVtIHN2c2JfcGhhc2UgLSBzdnMg YmFuayBwaGFzZSBlbnVtZXJhdGlvbg0KKyAqIEBTVlNCX1BIQVNFX0lOSVQwMTogYmFzaWMgaW5p dCBmb3Igc3ZzIGJhbmsNCisgKiBAU1ZTQl9QSEFTRV9JTklUMDI6IHN2cyBiYW5rIGNhbiBwcm92 aWRlIHZvbHRhZ2VzDQorICogQFNWU0JfUEhBU0VfTU9OOiBzdnMgYmFuayBjYW4gcHJvdmlkZSB2 b2x0YWdlcyB3aXRoIHRoZXJtYWwgZWZmZWN0DQorICogQFNWU0JfUEhBU0VfRVJST1I6IHN2cyBi YW5rIGVuY291dGVycyB1bmV4cGVjdGVkIGNvbmRpdGlvbg0KKyAqDQorICogRWFjaCBzdnMgYmFu ayBoYXMgaXRzIG93biBpbmRlcGVuZGVudCBwaGFzZS4gV2UgZW5hYmxlIGVhY2ggc3ZzIGJhbmsg YnkNCisgKiBydW5uaW5nIHRoZWlyIHBoYXNlIG9yZGVybHkuIEhvd2V2ZXIsIFdoZW4gc3ZzIGJh bmsgZWNub3VudGVycyB1bmV4cGVjdGVkDQorICogY29uZGl0aW9uLCBpdCB3aWxsIGZpcmUgYW4g aXJxIChQSEFTRV9FUlJPUikgdG8gaW5mb3JtIHN2cyBzb2Z0d2FyZS4NCisgKg0KKyAqIHN2cyBi YW5rIGdlbmVyYWwgcGhhc2UtZW5hYmxlZCBvcmRlcjoNCisgKiBTVlNCX1BIQVNFX0lOSVQwMSAt PiBTVlNCX1BIQVNFX0lOSVQwMiAtPiBTVlNCX1BIQVNFX01PTg0KKyAqLw0KK2VudW0gc3ZzYl9w aGFzZSB7DQorCVNWU0JfUEhBU0VfSU5JVDAxID0gMCwNCisJU1ZTQl9QSEFTRV9JTklUMDIsDQor CVNWU0JfUEhBU0VfTU9OLA0KKwlTVlNCX1BIQVNFX0VSUk9SLA0KK307DQorDQorZW51bSBzdnNf cmVnX2luZGV4IHsNCisJVEVNUE1PTkNUTDAgPSAwLA0KKwlURU1QTU9OQ1RMMSwNCisJVEVNUE1P TkNUTDIsDQorCVRFTVBNT05JTlQsDQorCVRFTVBNT05JTlRTVFMsDQorCVRFTVBNT05JREVUMCwN CisJVEVNUE1PTklERVQxLA0KKwlURU1QTU9OSURFVDIsDQorCVRFTVBIMk5USFJFLA0KKwlURU1Q SFRIUkUsDQorCVRFTVBDVEhSRSwNCisJVEVNUE9GRlNFVEgsDQorCVRFTVBPRkZTRVRMLA0KKwlU RU1QTVNSQ1RMMCwNCisJVEVNUE1TUkNUTDEsDQorCVRFTVBBSEJQT0xMLA0KKwlURU1QQUhCVE8s DQorCVRFTVBBRENQTlAwLA0KKwlURU1QQURDUE5QMSwNCisJVEVNUEFEQ1BOUDIsDQorCVRFTVBB RENNVVgsDQorCVRFTVBBRENFWFQsDQorCVRFTVBBRENFWFQxLA0KKwlURU1QQURDRU4sDQorCVRF TVBQTlBNVVhBRERSLA0KKwlURU1QQURDTVVYQUREUiwNCisJVEVNUEFEQ0VYVEFERFIsDQorCVRF TVBBRENFWFQxQUREUiwNCisJVEVNUEFEQ0VOQUREUiwNCisJVEVNUEFEQ1ZBTElEQUREUiwNCisJ VEVNUEFEQ1ZPTFRBRERSLA0KKwlURU1QUkRDVFJMLA0KKwlURU1QQURDVkFMSURNQVNLLA0KKwlU RU1QQURDVk9MVEFHRVNISUZULA0KKwlURU1QQURDV1JJVEVDVFJMLA0KKwlURU1QTVNSMCwNCisJ VEVNUE1TUjEsDQorCVRFTVBNU1IyLA0KKwlURU1QQURDSEFERFIsDQorCVRFTVBJTU1EMCwNCisJ VEVNUElNTUQxLA0KKwlURU1QSU1NRDIsDQorCVRFTVBNT05JREVUMywNCisJVEVNUEFEQ1BOUDMs DQorCVRFTVBNU1IzLA0KKwlURU1QSU1NRDMsDQorCVRFTVBQUk9UQ1RMLA0KKwlURU1QUFJPVFRB LA0KKwlURU1QUFJPVFRCLA0KKwlURU1QUFJPVFRDLA0KKwlURU1QU1BBUkUwLA0KKwlURU1QU1BB UkUxLA0KKwlURU1QU1BBUkUyLA0KKwlURU1QU1BBUkUzLA0KKwlURU1QTVNSMF8xLA0KKwlURU1Q TVNSMV8xLA0KKwlURU1QTVNSMl8xLA0KKwlURU1QTVNSM18xLA0KKwlERVNDSEFSLA0KKwlURU1Q Q0hBUiwNCisJREVUQ0hBUiwNCisJQUdFQ0hBUiwNCisJRENDT05GSUcsDQorCUFHRUNPTkZJRywN CisJRlJFUVBDVDMwLA0KKwlGUkVRUENUNzQsDQorCUxJTUlUVkFMUywNCisJVkJPT1QsDQorCURF VFdJTkRPVywNCisJQ09ORklHLA0KKwlUU0NBTENTLA0KKwlSVU5DT05GSUcsDQorCVNWU0VOLA0K KwlJTklUMlZBTFMsDQorCURDVkFMVUVTLA0KKwlBR0VWQUxVRVMsDQorCVZPUDMwLA0KKwlWT1A3 NCwNCisJVEVNUCwNCisJSU5UU1RTLA0KKwlJTlRTVFNSQVcsDQorCUlOVEVOLA0KKwlDSEtJTlQs DQorCUNIS1NISUZULA0KKwlTVEFUVVMsDQorCVZERVNJR04zMCwNCisJVkRFU0lHTjc0LA0KKwlE VlQzMCwNCisJRFZUNzQsDQorCUFHRUNPVU5ULA0KKwlTTVNUQVRFMCwNCisJU01TVEFURTEsDQor CUNUTDAsDQorCURFU0RFVFNFQywNCisJVEVNUEFHRVNFQywNCisJQ1RSTFNQQVJFMCwNCisJQ1RS TFNQQVJFMSwNCisJQ1RSTFNQQVJFMiwNCisJQ1RSTFNQQVJFMywNCisJQ09SRVNFTCwNCisJVEhF Uk1JTlRTVCwNCisJSU5UU1QsDQorCVRIU1RBR0UwU1QsDQorCVRIU1RBR0UxU1QsDQorCVRIU1RB R0UyU1QsDQorCVRIQUhCU1QwLA0KKwlUSEFIQlNUMSwNCisJU1BBUkUwLA0KKwlTUEFSRTEsDQor CVNQQVJFMiwNCisJU1BBUkUzLA0KKwlUSFNMUEVWRUIsDQorCXJlZ19udW0sDQorfTsNCisNCitz dGF0aWMgY29uc3QgdTMyIHN2c19yZWdzX3YyW10gPSB7DQorCVtURU1QTU9OQ1RMMF0JCT0gMHgw MDAsDQorCVtURU1QTU9OQ1RMMV0JCT0gMHgwMDQsDQorCVtURU1QTU9OQ1RMMl0JCT0gMHgwMDgs DQorCVtURU1QTU9OSU5UXQkJPSAweDAwYywNCisJW1RFTVBNT05JTlRTVFNdCQk9IDB4MDEwLA0K KwlbVEVNUE1PTklERVQwXQkJPSAweDAxNCwNCisJW1RFTVBNT05JREVUMV0JCT0gMHgwMTgsDQor CVtURU1QTU9OSURFVDJdCQk9IDB4MDFjLA0KKwlbVEVNUEgyTlRIUkVdCQk9IDB4MDI0LA0KKwlb VEVNUEhUSFJFXQkJPSAweDAyOCwNCisJW1RFTVBDVEhSRV0JCT0gMHgwMmMsDQorCVtURU1QT0ZG U0VUSF0JCT0gMHgwMzAsDQorCVtURU1QT0ZGU0VUTF0JCT0gMHgwMzQsDQorCVtURU1QTVNSQ1RM MF0JCT0gMHgwMzgsDQorCVtURU1QTVNSQ1RMMV0JCT0gMHgwM2MsDQorCVtURU1QQUhCUE9MTF0J CT0gMHgwNDAsDQorCVtURU1QQUhCVE9dCQk9IDB4MDQ0LA0KKwlbVEVNUEFEQ1BOUDBdCQk9IDB4 MDQ4LA0KKwlbVEVNUEFEQ1BOUDFdCQk9IDB4MDRjLA0KKwlbVEVNUEFEQ1BOUDJdCQk9IDB4MDUw LA0KKwlbVEVNUEFEQ01VWF0JCT0gMHgwNTQsDQorCVtURU1QQURDRVhUXQkJPSAweDA1OCwNCisJ W1RFTVBBRENFWFQxXQkJPSAweDA1YywNCisJW1RFTVBBRENFTl0JCT0gMHgwNjAsDQorCVtURU1Q UE5QTVVYQUREUl0JPSAweDA2NCwNCisJW1RFTVBBRENNVVhBRERSXQk9IDB4MDY4LA0KKwlbVEVN UEFEQ0VYVEFERFJdCT0gMHgwNmMsDQorCVtURU1QQURDRVhUMUFERFJdCT0gMHgwNzAsDQorCVtU RU1QQURDRU5BRERSXQkJPSAweDA3NCwNCisJW1RFTVBBRENWQUxJREFERFJdCT0gMHgwNzgsDQor CVtURU1QQURDVk9MVEFERFJdCT0gMHgwN2MsDQorCVtURU1QUkRDVFJMXQkJPSAweDA4MCwNCisJ W1RFTVBBRENWQUxJRE1BU0tdCT0gMHgwODQsDQorCVtURU1QQURDVk9MVEFHRVNISUZUXQk9IDB4 MDg4LA0KKwlbVEVNUEFEQ1dSSVRFQ1RSTF0JPSAweDA4YywNCisJW1RFTVBNU1IwXQkJPSAweDA5 MCwNCisJW1RFTVBNU1IxXQkJPSAweDA5NCwNCisJW1RFTVBNU1IyXQkJPSAweDA5OCwNCisJW1RF TVBBRENIQUREUl0JCT0gMHgwOWMsDQorCVtURU1QSU1NRDBdCQk9IDB4MGEwLA0KKwlbVEVNUElN TUQxXQkJPSAweDBhNCwNCisJW1RFTVBJTU1EMl0JCT0gMHgwYTgsDQorCVtURU1QTU9OSURFVDNd CQk9IDB4MGIwLA0KKwlbVEVNUEFEQ1BOUDNdCQk9IDB4MGI0LA0KKwlbVEVNUE1TUjNdCQk9IDB4 MGI4LA0KKwlbVEVNUElNTUQzXQkJPSAweDBiYywNCisJW1RFTVBQUk9UQ1RMXQkJPSAweDBjMCwN CisJW1RFTVBQUk9UVEFdCQk9IDB4MGM0LA0KKwlbVEVNUFBST1RUQl0JCT0gMHgwYzgsDQorCVtU RU1QUFJPVFRDXQkJPSAweDBjYywNCisJW1RFTVBTUEFSRTBdCQk9IDB4MGYwLA0KKwlbVEVNUFNQ QVJFMV0JCT0gMHgwZjQsDQorCVtURU1QU1BBUkUyXQkJPSAweDBmOCwNCisJW1RFTVBTUEFSRTNd CQk9IDB4MGZjLA0KKwlbVEVNUE1TUjBfMV0JCT0gMHgxOTAsDQorCVtURU1QTVNSMV8xXQkJPSAw eDE5NCwNCisJW1RFTVBNU1IyXzFdCQk9IDB4MTk4LA0KKwlbVEVNUE1TUjNfMV0JCT0gMHgxYjgs DQorCVtERVNDSEFSXQkJPSAweGMwMCwNCisJW1RFTVBDSEFSXQkJPSAweGMwNCwNCisJW0RFVENI QVJdCQk9IDB4YzA4LA0KKwlbQUdFQ0hBUl0JCT0gMHhjMGMsDQorCVtEQ0NPTkZJR10JCT0gMHhj MTAsDQorCVtBR0VDT05GSUddCQk9IDB4YzE0LA0KKwlbRlJFUVBDVDMwXQkJPSAweGMxOCwNCisJ W0ZSRVFQQ1Q3NF0JCT0gMHhjMWMsDQorCVtMSU1JVFZBTFNdCQk9IDB4YzIwLA0KKwlbVkJPT1Rd CQkJPSAweGMyNCwNCisJW0RFVFdJTkRPV10JCT0gMHhjMjgsDQorCVtDT05GSUddCQk9IDB4YzJj LA0KKwlbVFNDQUxDU10JCT0gMHhjMzAsDQorCVtSVU5DT05GSUddCQk9IDB4YzM0LA0KKwlbU1ZT RU5dCQkJPSAweGMzOCwNCisJW0lOSVQyVkFMU10JCT0gMHhjM2MsDQorCVtEQ1ZBTFVFU10JCT0g MHhjNDAsDQorCVtBR0VWQUxVRVNdCQk9IDB4YzQ0LA0KKwlbVk9QMzBdCQkJPSAweGM0OCwNCisJ W1ZPUDc0XQkJCT0gMHhjNGMsDQorCVtURU1QXQkJCT0gMHhjNTAsDQorCVtJTlRTVFNdCQk9IDB4 YzU0LA0KKwlbSU5UU1RTUkFXXQkJPSAweGM1OCwNCisJW0lOVEVOXQkJCT0gMHhjNWMsDQorCVtD SEtJTlRdCQk9IDB4YzYwLA0KKwlbQ0hLU0hJRlRdCQk9IDB4YzY0LA0KKwlbU1RBVFVTXQkJPSAw eGM2OCwNCisJW1ZERVNJR04zMF0JCT0gMHhjNmMsDQorCVtWREVTSUdONzRdCQk9IDB4YzcwLA0K KwlbRFZUMzBdCQkJPSAweGM3NCwNCisJW0RWVDc0XQkJCT0gMHhjNzgsDQorCVtBR0VDT1VOVF0J CT0gMHhjN2MsDQorCVtTTVNUQVRFMF0JCT0gMHhjODAsDQorCVtTTVNUQVRFMV0JCT0gMHhjODQs DQorCVtDVEwwXQkJCT0gMHhjODgsDQorCVtERVNERVRTRUNdCQk9IDB4Y2UwLA0KKwlbVEVNUEFH RVNFQ10JCT0gMHhjZTQsDQorCVtDVFJMU1BBUkUwXQkJPSAweGNmMCwNCisJW0NUUkxTUEFSRTFd CQk9IDB4Y2Y0LA0KKwlbQ1RSTFNQQVJFMl0JCT0gMHhjZjgsDQorCVtDVFJMU1BBUkUzXQkJPSAw eGNmYywNCisJW0NPUkVTRUxdCQk9IDB4ZjAwLA0KKwlbVEhFUk1JTlRTVF0JCT0gMHhmMDQsDQor CVtJTlRTVF0JCQk9IDB4ZjA4LA0KKwlbVEhTVEFHRTBTVF0JCT0gMHhmMGMsDQorCVtUSFNUQUdF MVNUXQkJPSAweGYxMCwNCisJW1RIU1RBR0UyU1RdCQk9IDB4ZjE0LA0KKwlbVEhBSEJTVDBdCQk9 IDB4ZjE4LA0KKwlbVEhBSEJTVDFdCQk9IDB4ZjFjLA0KKwlbU1BBUkUwXQkJPSAweGYyMCwNCisJ W1NQQVJFMV0JCT0gMHhmMjQsDQorCVtTUEFSRTJdCQk9IDB4ZjI4LA0KKwlbU1BBUkUzXQkJPSAw eGYyYywNCisJW1RIU0xQRVZFQl0JCT0gMHhmMzAsDQorfTsNCisNCisvKg0KKyAqIHN0cnVjdCB0 aGVybWFsX3BhcmFtZXRlciAtIFRoaXMgaXMgZm9yIHN0b3JpbmcgdGhlcm1hbCBlZnVzZSBkYXRh Lg0KKyAqIFdlIGNhY2x1YXRlIHRoZXJtYWwgZWZ1c2UgZGF0YSB0byBwcm9kdWNlICJtdHMiIGFu ZCAiYnRzIiBmb3INCisgKiBzdnMgYmFuayBtb24gbW9kZS4NCisgKi8NCitzdHJ1Y3QgdGhlcm1h bF9wYXJhbWV0ZXIgew0KKwlpbnQgYWRjX2dlX3Q7DQorCWludCBhZGNfb2VfdDsNCisJaW50IGdl Ow0KKwlpbnQgb2U7DQorCWludCBnYWluOw0KKwlpbnQgb192dHNhYmI7DQorCWludCBvX3Z0c21j dTE7DQorCWludCBvX3Z0c21jdTI7DQorCWludCBvX3Z0c21jdTM7DQorCWludCBvX3Z0c21jdTQ7 DQorCWludCBvX3Z0c21jdTU7DQorCWludCBkZWdjX2NhbGk7DQorCWludCBhZGNfY2FsaV9lbl90 Ow0KKwlpbnQgb19zbG9wZTsNCisJaW50IG9fc2xvcGVfc2lnbjsNCisJaW50IHRzX2lkOw0KK307 DQorDQorLyoNCisgKiBzdHJ1Y3Qgc3ZzX2JhbmsgLSBzdnMgYmFuayByZXByZXNlbnRhdGlvbg0K KyAqIEBkZXY6IGJhbmsgZGV2aWNlIGZvciBvcHAgdGFibGUvbXRjbW9zL2J1Y2sgY29udHJvbA0K KyAqIEBpbml0X2NvbXBsZXRpb246IHRoZSB0aW1lb3V0IGNvbXBsZXRpb24gZm9yIGJhbmsgaW5p dA0KKyAqIEBidWNrOiBwaGFuZGxlIG9mIHRoZSByZWd1bGF0b3INCisgKiBAbG9jazogbXV0ZXgg bG9jayB0byBwcm90ZWN0IHZvbHRhZ2UgdXBkYXRlIHByb2Nlc3MNCisgKiBAc3VzcGVuZGVkOiBz dXNwZW5kIGZsYWcgb2YgdGhpcyBiYW5rDQorICogQG10Y21vc19yZXF1ZXN0OiBiYW5rJ3MgcG93 ZXItZG9tYWluIG9uIHJlcXVlc3QNCisgKiBAdm9sdF9vZmZzZXQ6IGJhbmsgdm9sdGFnZSBvZmZz ZXQgY29udHJvbGxlZCBieSBzdnMgc29mdHdhcmUNCisgKiBAbW9kZV9zdXBwb3J0OiBiYW5rIG1v ZGUgc3VwcG9ydC4NCisgKiBAb3BwX2ZyZXFzOiBzaWduZWQtb2ZmIGZyZXF1ZW5jaWVzIGZyb20g ZGVmYXVsdCBvcHAgdGFibGUNCisgKiBAb3BwX3ZvbHRzOiBzaWduZWQtb2ZmIHZvbHRhZ2VzIGZy b20gZGVmYXVsdCBvcHAgdGFibGUNCisgKiBAZnJlcXNfcGN0OiBwZXJjZW50IG9mICJvcHBfZnJl cXMgLyBmcmVxX2Jhc2UiIGZvciBiYW5rIGluaXQNCisgKiBAdm9sdHM6IGJhbmsgdm9sdGFnZXMN CisgKiBAZnJlcV9iYXNlOiByZWZlcmVuY2UgZnJlcXVlbmN5IGZvciBiYW5rIGluaXQNCisgKiBA dmJvb3Q6IHZvbHRhZ2UgcmVxdWVzdCBmb3IgYmFuayBpbml0MDEgc3RhZ2Ugb25seQ0KKyAqIEB2 b2x0X3N0ZXA6IGJhbmsgdm9sdGFnZSBzdGVwDQorICogQHZvbHRfYmFzZTogYmFuayB2b2x0YWdl IGJhc2UNCisgKiBAaW5pdDAxX3ZvbHRfZmxhZzogYmFuayBpbml0MDEgdm9sdGFnZSBmbGFnDQor ICogQHBoYXNlOiBiYW5rIGN1cnJlbnQgcGhhc2UNCisgKiBAdm1heDogYmFuayB2b2x0YWdlIG1h eGltdW0NCisgKiBAdm1pbjogYmFuayB2b3RsYWdlIG1pbmltdW0NCisgKiBAdGVtcDogYmFuayB0 ZW1wZXJhdHVyZQ0KKyAqIEB0ZW1wX3VwcGVyX2JvdW5kOiBiYW5rIHRlbXBlcmF0dXJlIHVwcGVy IGJvdW5kDQorICogQHRlbXBfbG93ZXJfYm91bmQ6IGJhbmsgdGVtcGVyYXR1cmUgbG93ZXIgYm91 bmQNCisgKiBAdHpvbmVfaGlnaF90ZW1wOiB0aGVybWFsIHpvbmUgaGlnaCB0ZW1wZXJhdHVyZSB0 aHJlc2hvbGQNCisgKiBAdHpvbmVfaGlnaF90ZW1wX29mZnNldDogdGhlcm1hbCB6b25lIGhpZ2gg dGVtcGVyYXR1cmUgb2Zmc2V0DQorICogQHR6b25lX2xvd190ZW1wOiB0aGVybWFsIHpvbmUgbG93 IHRlbXBlcmF0dXJlIHRocmVzaG9sZA0KKyAqIEB0em9uZV9sb3dfdGVtcF9vZmZzZXQ6IHRoZXJt YWwgem9uZSBsb3cgdGVtcGVyYXR1cmUgb2Zmc2V0DQorICogQGNvcmVfc2VsOiBiYW5rIHNlbGVj dGlvbg0KKyAqIEBvcHBfY291bnQ6IGJhbmsgb3BwIGNvdW50DQorICogQGludF9zdDogYmFuayBp bnRlcnJ1cHQgaWRlbnRpZmljYXRpb24NCisgKiBAc3dfaWQ6IGJhbmsgc29mdHdhcmUgaWRlbnRp ZmljYXRpb24NCisgKiBAY3RsMDogYmFuayB0aGVybWFsIHNlbnNvciBzZWxlY3Rpb24NCisgKiBA b2ZfY29tcGF0aWJsZTogb2ZfY29tcGF0aWJsZSBzdHJpbmcgb2YgYmFuaw0KKyAqIEBuYW1lOiBi YW5rIG5hbWUNCisgKiBAdHpvbmVfbmFtZTogdGhlcm1hbCB6b25lIG5hbWUNCisgKiBAYnVja19u YW1lOiByZWd1bGF0b3IgbmFtZQ0KKyAqDQorICogT3RoZXIgc3RydWN0dXJlIG1lbWJlcnMgd2hp Y2ggYXJlIG5vdCBsaXN0ZWQgYWJvdmUgYXJlIHN2cyBwbGF0Zm9ybQ0KKyAqIGVmdXNlIGRhdGEg Zm9yIGJhbmsgaW5pdA0KKyAqLw0KK3N0cnVjdCBzdnNfYmFuayB7DQorCXN0cnVjdCBkZXZpY2Ug KmRldjsNCisJc3RydWN0IGNvbXBsZXRpb24gaW5pdF9jb21wbGV0aW9uOw0KKwlzdHJ1Y3QgcmVn dWxhdG9yICpidWNrOw0KKwlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogbG9jayB0byBwcm90ZWN0IHZv bHRhZ2UgdXBkYXRlIHByb2Nlc3MgKi8NCisJYm9vbCBzdXNwZW5kZWQ7DQorCWJvb2wgbXRjbW9z X3JlcXVlc3Q7DQorCXMzMiB2b2x0X29mZnNldDsNCisJdTMyIG1vZGVfc3VwcG9ydDsNCisJdTMy IG9wcF9mcmVxc1sxNl07DQorCXUzMiBvcHBfdm9sdHNbMTZdOw0KKwl1MzIgZnJlcXNfcGN0WzE2 XTsNCisJdTMyIHZvbHRzWzE2XTsNCisJdTMyIGZyZXFfYmFzZTsNCisJdTMyIHZib290Ow0KKwl1 MzIgdm9sdF9zdGVwOw0KKwl1MzIgdm9sdF9iYXNlOw0KKwl1MzIgaW5pdDAxX3ZvbHRfZmxhZzsN CisJdTMyIHBoYXNlOw0KKwl1MzIgdm1heDsNCisJdTMyIHZtaW47DQorCXUzMiBidHM7DQorCXUz MiBtdHM7DQorCXUzMiBiZGVzOw0KKwl1MzIgbWRlczsNCisJdTMyIG10ZGVzOw0KKwl1MzIgZGNi ZGV0Ow0KKwl1MzIgZGNtZGV0Ow0KKwl1MzIgZHRoaTsNCisJdTMyIGR0bG87DQorCXUzMiBkZXRf d2luZG93Ow0KKwl1MzIgZGV0X21heDsNCisJdTMyIGFnZV9jb25maWc7DQorCXUzMiBhZ2Vfdm9m ZnNldF9pbjsNCisJdTMyIGFnZW07DQorCXUzMiBkY19jb25maWc7DQorCXUzMiBkY192b2Zmc2V0 X2luOw0KKwl1MzIgZHZ0X2ZpeGVkOw0KKwl1MzIgdmNvOw0KKwl1MzIgY2hrX3NoaWZ0Ow0KKwl1 MzIgdGVtcDsNCisJdTMyIHRlbXBfdXBwZXJfYm91bmQ7DQorCXUzMiB0ZW1wX2xvd2VyX2JvdW5k Ow0KKwl1MzIgdHpvbmVfaGlnaF90ZW1wOw0KKwl1MzIgdHpvbmVfaGlnaF90ZW1wX29mZnNldDsN CisJdTMyIHR6b25lX2xvd190ZW1wOw0KKwl1MzIgdHpvbmVfbG93X3RlbXBfb2Zmc2V0Ow0KKwl1 MzIgY29yZV9zZWw7DQorCXUzMiBvcHBfY291bnQ7DQorCXUzMiBpbnRfc3Q7DQorCXUzMiBzd19p ZDsNCisJdTMyIGN0bDA7DQorCXU4ICpvZl9jb21wYXRpYmxlOw0KKwl1OCAqbmFtZTsNCisJdTgg KnR6b25lX25hbWU7DQorCXU4ICpidWNrX25hbWU7DQorfTsNCisNCisvKg0KKyAqIHN0cnVjdCBz dnNfcGxhdGZvcm0gLSBzdnMgcGxhdGZvcm0gZGF0YQ0KKyAqIEBiYW5rczogcGhhbmRsZSBvZiB0 aGUgYmFua3MgdGhhdCBzdXBwb3J0DQorICogQGVmdXNlX3BhcnNpbmc6IHBoYW5kbGUgb2YgZWZ1 c2UgcGFyc2luZyBmdW5jdGlvbg0KKyAqIEBzZXRfZnJlcXNfcGN0OiBwaGFuZGxlIG9mIHNldCBm cmVxdWVuY2llcyBwZXJjZW50IGZ1bmN0aW9uDQorICogQGdldF92b3BzOiBwaGFuZGxlIG9mICBn ZXQgYmFuayB2b2x0YWdlcyBmdW5jdGlvbg0KKyAqIEBpcnFmbGFnczogaXJxIHNldHRpbmdzIGZs YWdzDQorICogQGZha2VfZWZ1c2U6IHRoZSBmbGFnIGZvciBydW5uaW5nIHN2cyB3aXRoIGZha2Ug ZWZ1c2UNCisgKiBAbmVlZF9od19yZXNldDogdGhlIGZsYWcgZm9yIHJlc2V0IHN2cyBIVyB3aGVu IHN5c3RlbSBzdXNwZW5kDQorICogQHJlZ3M6IHBoYW5kbGUgdG8gdGhlIHJlZ2lzdGVycyBtYXAN CisgKiBAYmFua19udW06IHRoZSB0b3RhbCBudW1iZXIgb2YgYmFua3MNCisgKiBAZWZ1c2VfY2hl Y2s6IHRoZSBzdnMgZWZ1c2UgY2hlY2sgaW5kZXgNCisgKiBAc3VwcGxpZXJzOiB0aGUgZGV2aWNl cyB3aGljaCBuZWVkcyB0byBiZSBwcm9iZWQgZmlyc3QNCisgKiBAbmFtZTogc3ZzIHBsYXRmb3Jt IG5hbWUNCisgKg0KKyAqIHN2cyBwbGF0b3JtIGRhdGEgd2lsbCBiZSBpbnN0YW5jZWQgd2l0aCBj b25zdCBmbGFnIGFuZCBzdG9yZWQNCisgKiBhcyBkYXRhIG1lbWViZXIgaW4gc3RydWN0IG9mX2Rl dmljZV9pZC4NCisgKi8NCitzdHJ1Y3Qgc3ZzX3BsYXRmb3JtIHsNCisJc3RydWN0IHN2c19iYW5r ICpiYW5rczsNCisJYm9vbCAoKmVmdXNlX3BhcnNpbmcpKHN0cnVjdCBtdGtfc3ZzICpzdnMpOw0K Kwl2b2lkICgqc2V0X2ZyZXFzX3BjdCkoc3RydWN0IG10a19zdnMgKnN2cyk7DQorCXZvaWQgKCpn ZXRfdm9wcykoc3RydWN0IG10a19zdnMgKnN2cyk7DQorCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7 DQorCWJvb2wgZmFrZV9lZnVzZTsNCisJYm9vbCBuZWVkX2h3X3Jlc2V0Ow0KKwljb25zdCB1MzIg KnJlZ3M7DQorCXUzMiBiYW5rX251bTsNCisJdTMyIGVmdXNlX2NoZWNrOw0KKwl1OCAqc3VwcGxp ZXJzWzJdOw0KKwl1OCAqbmFtZTsNCit9Ow0KKw0KKy8qDQorICogc3RydWN0IG10a19zdnMgLSBn ZW5lcmljIHN2cw0KKyAqIEBzdnNfcGxhdGZvcm06IHBoYW5kbGUgb2Ygc3ZzIHBsYXRmb3JtIGRh dGENCisgKiBAcGJhbms6IHBoYW5kbGUgb2Ygc3ZzIGJhbmsgd2hvc2UgcmVnaXN0ZXIgaXMgZ29p bmcgYmUgdXBkYXRlZA0KKyAqIEBkZXY6IHN2cyBwbGF0Zm9ybSBkZXZpY2UNCisgKiBAYmFzZTog c3ZzIHBsYXRmb3JtIHJlZ2lzdGVyIGFkZHJlc3MgYmFzZQ0KKyAqIEBtYWluX2NsazogbWFpbiBj bG9jayBmb3Igc3ZzIGJhbmsNCisgKiBAZWZ1c2VfbnVtOiB0aGUgdG90YWwgbnVtYmVyIG9mIHN2 cyBwbGF0Zm9ybSBlZnVzZQ0KKyAqIEB0aGVybWFsX2VmdXNlX251bTogdGhlIHRvdGFsIG51bWJl ciBvZiB0aGVybWFsIGVmdXNlDQorICogQGVmdXNlOiBzdnMgcGxhdGZvcm0gZWZ1c2UgZGF0YSBy ZWNlaXZlZCBmcm9tIE5WTUVNIGZyYW1ld29yaw0KKyAqIEB0aGVybWFsX2VmdXNlOiB0aGVybWFs IGVmdXNlIGRhdGEgcmVjZWl2ZWQgZnJvbSBOVk1FTSBmcmFtZXdvcmsNCisgKg0KKyAqIFRoaXMg Z2VuZXJpYyBzdnMgaGVscHMgcmV0cmlldmUgZGlmZmVyZW50IHN2cyBwbGF0Zm9ybSByZXNvdXJj ZQ0KKyAqIGZyb20gZHRzIGFuZCBoYXMgYSBwaGFuZGxlIHRvIGEgc3ZzIGJhbmsgZm9yIHVzIHRv IHVwZGF0ZSBpdHMgcmVnaXN0ZXJzLg0KKyAqLw0KK3N0cnVjdCBtdGtfc3ZzIHsNCisJY29uc3Qg c3RydWN0IHN2c19wbGF0Zm9ybSAqcGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqcGJhbms7 DQorCXN0cnVjdCBkZXZpY2UgKmRldjsNCisJdm9pZCBfX2lvbWVtICpiYXNlOw0KKwlzdHJ1Y3Qg Y2xrICptYWluX2NsazsNCisJc2l6ZV90IGVmdXNlX251bTsNCisJc2l6ZV90IHRoZXJtYWxfZWZ1 c2VfbnVtOw0KKwl1MzIgKmVmdXNlOw0KKwl1MzIgKnRoZXJtYWxfZWZ1c2U7DQorfTsNCisNCit1 bnNpZ25lZCBsb25nIGNsYWltX210a19zdnNfbG9jayh2b2lkKQ0KKwlfX2FjcXVpcmVzKCZtdGtf c3ZzX2xvY2spDQorew0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KKw0KKwlzcGluX2xvY2tfaXJx c2F2ZSgmbXRrX3N2c19sb2NrLCBmbGFncyk7DQorDQorCXJldHVybiBmbGFnczsNCit9DQorRVhQ T1JUX1NZTUJPTF9HUEwoY2xhaW1fbXRrX3N2c19sb2NrKTsNCisNCit2b2lkIHJlbGVhc2VfbXRr X3N2c19sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpDQorCV9fcmVsZWFzZXMoJm10a19zdnNfbG9j aykNCit7DQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10a19zdnNfbG9jaywgZmxhZ3MpOw0K K30NCitFWFBPUlRfU1lNQk9MX0dQTChyZWxlYXNlX210a19zdnNfbG9jayk7DQorDQorc3RhdGlj IHUzMiBwZXJjZW50KHUzMiBudW1lcmF0b3IsIHUzMiBkZW5vbWluYXRvcikNCit7DQorCXUzMiBw Y3Q7DQorDQorCS8qIElmIG5vdCBkaXZpZGUgMTAwMCwgIm51bWVyYXRvciAqIDEwMCIgd2lsbCBo YXZlIGRhdGEgb3ZlcmZsb3cuICovDQorCW51bWVyYXRvciAvPSAxMDAwOw0KKwlkZW5vbWluYXRv ciAvPSAxMDAwOw0KKwlwY3QgPSAoKG51bWVyYXRvciAqIDEwMCkgKyBkZW5vbWluYXRvciAtIDEp IC8gZGVub21pbmF0b3I7DQorCXBjdCAmPSBHRU5NQVNLKDcsIDApOw0KKw0KKwlyZXR1cm4gcGN0 Ow0KK30NCisNCitzdGF0aWMgdTMyIHN2c19yZWFkbChzdHJ1Y3QgbXRrX3N2cyAqc3ZzLCBlbnVt IHN2c19yZWdfaW5kZXggcmdfaSkNCit7DQorCXJldHVybiByZWFkbChzdnMtPmJhc2UgKyBzdnMt PnBsYXRmb3JtLT5yZWdzW3JnX2ldKTsNCit9DQorDQorc3RhdGljIHZvaWQgc3ZzX3dyaXRlbChz dHJ1Y3QgbXRrX3N2cyAqc3ZzLCB1MzIgdmFsLCBlbnVtIHN2c19yZWdfaW5kZXggcmdfaSkNCit7 DQorCXdyaXRlbCh2YWwsIHN2cy0+YmFzZSArIHN2cy0+cGxhdGZvcm0tPnJlZ3NbcmdfaV0pOw0K K30NCisNCitzdGF0aWMgdm9pZCBzdnNfc3dpdGNoX2Jhbmsoc3RydWN0IG10a19zdnMgKnN2cykN Cit7DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+cGJhbms7DQorDQorCXN2c193cml0 ZWwoc3ZzLCBzdnNiLT5jb3JlX3NlbCwgQ09SRVNFTCk7DQorfQ0KKw0KK3N0YXRpYyB1MzIgc3Zz X2Jhbmtfdm9sdF90b19vcHBfdm9sdCh1MzIgc3ZzYl92b2x0LCB1MzIgc3ZzYl92b2x0X3N0ZXAs DQorCQkJCSAgICAgdTMyIHN2c2Jfdm9sdF9iYXNlKQ0KK3sNCisJdTMyIG9wcF91X3ZvbHQ7DQor DQorCW9wcF91X3ZvbHQgPSAoc3ZzYl92b2x0ICogc3ZzYl92b2x0X3N0ZXApICsgc3ZzYl92b2x0 X2Jhc2U7DQorDQorCXJldHVybiBvcHBfdV92b2x0Ow0KK30NCisNCitzdGF0aWMgaW50IHN2c19n ZXRfYmFua196b25lX3RlbXBlcmF0dXJlKHU4ICp0em9uZV9uYW1lLCBpbnQgKnR6b25lX3RlbXAp DQorew0KKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpkOw0KKw0KKwl0emQgPSB0aGVy bWFsX3pvbmVfZ2V0X3pvbmVfYnlfbmFtZSh0em9uZV9uYW1lKTsNCisJaWYgKElTX0VSUih0emQp KQ0KKwkJcmV0dXJuIFBUUl9FUlIodHpkKTsNCisNCisJcmV0dXJuIHRoZXJtYWxfem9uZV9nZXRf dGVtcCh0emQsIHR6b25lX3RlbXApOw0KK30NCisNCitzdGF0aWMgaW50IHN2c19hZGp1c3RfcG1f b3BwX3ZvbHRzKHN0cnVjdCBzdnNfYmFuayAqc3ZzYiwgYm9vbCBmb3JjZV91cGRhdGUpDQorew0K Kwl1MzIgaSwgc3ZzYl92b2x0LCBvcHBfdm9sdCwgdGVtcF9vZmZzZXQgPSAwOw0KKwlpbnQgdHpv bmVfdGVtcCwgcmV0ID0gLUVQRVJNOw0KKw0KKwltdXRleF9sb2NrKCZzdnNiLT5sb2NrKTsNCisN CisJLyoNCisJICogSWYgc3ZzIGJhbmsgaXMgc3VzcGVuZGVkLCBpdCBtZWFucyBzaWduZWQtb2Zm IHZvbHRhZ2VzIGFyZSBhcHBsaWVkLg0KKwkgKiBEb24ndCBuZWVkIHRvIHVwZGF0ZSBvcHAgdm9s dGFnZSBhbnltb3JlLg0KKwkgKi8NCisJaWYgKHN2c2ItPnN1c3BlbmRlZCAmJiAhZm9yY2VfdXBk YXRlKSB7DQorCQlkZXZfbm90aWNlKHN2c2ItPmRldiwgImJhbmsgaXMgc3VzcGVuZGVkXG4iKTsN CisJCXJldCA9IC1FUEVSTTsNCisJCWdvdG8gdW5sb2NrX211dGV4Ow0KKwl9DQorDQorCS8qIEdl dCB0aGVybWFsIGVmZmVjdCAqLw0KKwlpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFTRV9NT04p IHsNCisJCWlmIChzdnNiLT50ZW1wID4gc3ZzYi0+dGVtcF91cHBlcl9ib3VuZCAmJg0KKwkJICAg IHN2c2ItPnRlbXAgPCBzdnNiLT50ZW1wX2xvd2VyX2JvdW5kKSB7DQorCQkJZGV2X3dhcm4oc3Zz Yi0+ZGV2LCAic3ZzYi0+dGVtcCA9IDB4JXgsIGFibm9ybWFsP1xuIiwNCisJCQkJIHN2c2ItPnRl bXApOw0KKwkJCXJldCA9IC1FSU5WQUw7DQorCQkJZ290byB1bmxvY2tfbXV0ZXg7DQorCQl9DQor DQorCQlyZXQgPSBzdnNfZ2V0X2Jhbmtfem9uZV90ZW1wZXJhdHVyZShzdnNiLT50em9uZV9uYW1l LA0KKwkJCQkJCSAgICAmdHpvbmVfdGVtcCk7DQorCQlpZiAocmV0KSB7DQorCQkJZGV2X2Vycihz dnNiLT5kZXYsICJubyBcIiVzXCIgem9uZSB0ZW1wZXJhdHVyZSglZCk/XG4iLA0KKwkJCQlzdnNi LT50em9uZV9uYW1lLCByZXQpOw0KKwkJCWRldl9lcnIoc3ZzYi0+ZGV2LCAic2V0IHNpZ25lZC1v ZmYgdm9sdGFnZSBpbnN0ZWFkXG4iKTsNCisJCQlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfRVJS T1I7DQorCQl9DQorDQorCQlpZiAodHpvbmVfdGVtcCA+PSBzdnNiLT50em9uZV9oaWdoX3RlbXAp DQorCQkJdGVtcF9vZmZzZXQgKz0gc3ZzYi0+dHpvbmVfaGlnaF90ZW1wX29mZnNldDsNCisJCWVs c2UgaWYgKHR6b25lX3RlbXAgPD0gc3ZzYi0+dHpvbmVfbG93X3RlbXApDQorCQkJdGVtcF9vZmZz ZXQgKz0gc3ZzYi0+dHpvbmVfbG93X3RlbXBfb2Zmc2V0Ow0KKwl9DQorDQorCS8qIHZtaW4gPD0g c3ZzYl92b2x0IChvcHBfdm9sdCkgPD0gc2lnbmVkLW9mZiB2b2x0YWdlICovDQorCWZvciAoaSA9 IDA7IGkgPCBzdnNiLT5vcHBfY291bnQ7IGkrKykgew0KKwkJaWYgKHN2c2ItPnBoYXNlID09IFNW U0JfUEhBU0VfTU9OKSB7DQorCQkJc3ZzYl92b2x0ID0gbWF4KChzdnNiLT52b2x0c1tpXSArIHN2 c2ItPnZvbHRfb2Zmc2V0ICsNCisJCQkJCSB0ZW1wX29mZnNldCksIHN2c2ItPnZtaW4pOw0KKwkJ CW9wcF92b2x0ID0gc3ZzX2Jhbmtfdm9sdF90b19vcHBfdm9sdChzdnNiX3ZvbHQsDQorCQkJCQkJ CSAgICAgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCQkgICAgIHN2c2ItPnZvbHRfYmFzZSk7DQor CQl9IGVsc2UgaWYgKHN2c2ItPnBoYXNlID09IFNWU0JfUEhBU0VfSU5JVDAyKSB7DQorCQkJc3Zz Yl92b2x0ID0gbWF4KChzdnNiLT52b2x0c1tpXSArIHN2c2ItPnZvbHRfb2Zmc2V0KSwNCisJCQkJ CXN2c2ItPnZtaW4pOw0KKwkJCW9wcF92b2x0ID0gc3ZzX2Jhbmtfdm9sdF90b19vcHBfdm9sdChz dnNiX3ZvbHQsDQorCQkJCQkJCSAgICAgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCQkgICAgIHN2 c2ItPnZvbHRfYmFzZSk7DQorCQl9IGVsc2UgaWYgKHN2c2ItPnBoYXNlID09IFNWU0JfUEhBU0Vf RVJST1IpIHsNCisJCQlvcHBfdm9sdCA9IHN2c2ItPm9wcF92b2x0c1tpXTsNCisJCX0gZWxzZSB7 DQorCQkJZGV2X2VycihzdnNiLT5kZXYsICJ1bmtub3duIHBoYXNlOiAldT9cbiIsDQorCQkJCXN2 c2ItPnBoYXNlKTsNCisJCQlyZXQgPSAtRUlOVkFMOw0KKwkJCWdvdG8gdW5sb2NrX211dGV4Ow0K KwkJfQ0KKw0KKwkJb3BwX3ZvbHQgPSBtaW4ob3BwX3ZvbHQsIHN2c2ItPm9wcF92b2x0c1tpXSk7 DQorCQlyZXQgPSBkZXZfcG1fb3BwX2FkanVzdF92b2x0YWdlKHN2c2ItPmRldiwgc3ZzYi0+b3Bw X2ZyZXFzW2ldLA0KKwkJCQkJCW9wcF92b2x0LCBvcHBfdm9sdCwNCisJCQkJCQlzdnNiLT5vcHBf dm9sdHNbaV0pOw0KKwkJaWYgKHJldCkgew0KKwkJCWRldl9lcnIoc3ZzYi0+ZGV2LCAic2V0IHZv bHRhZ2UgZmFpbDogJWRcbiIsIHJldCk7DQorCQkJZ290byB1bmxvY2tfbXV0ZXg7DQorCQl9DQor CX0NCisNCit1bmxvY2tfbXV0ZXg6DQorCW11dGV4X3VubG9jaygmc3ZzYi0+bG9jayk7DQorDQor CXJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyB1MzIgaW50ZXJwb2xhdGUodTMyIGYwLCB1MzIg ZjEsIHUzMiB2MCwgdTMyIHYxLCB1MzIgZngpDQorew0KKwl1MzIgdnk7DQorDQorCWlmICh2MCA9 PSB2MSB8fCBmMCA9PSBmMSkNCisJCXJldHVybiB2MDsNCisNCisJLyogKjEwMCB0byBoYXZlIGRl Y2ltYWwgZnJhY3Rpb24gZmFjdG9yLCArOTkgZm9yIHJvdW5kaW5nIHVwLiAqLw0KKwl2eSA9ICh2 MCAqIDEwMCkgLSAoKCgodjAgLSB2MSkgKiAxMDApIC8gKGYwIC0gZjEpKSAqIChmMCAtIGZ4KSk7 DQorCXZ5ID0gKHZ5ICsgOTkpIC8gMTAwOw0KKw0KKwlyZXR1cm4gdnk7DQorfQ0KKw0KK3N0YXRp YyB2b2lkIHN2c19nZXRfdm9wc192MihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJc3RydWN0 IHN2c19iYW5rICpzdnNiID0gc3ZzLT5wYmFuazsNCisJdTMyIHRlbXAsIGk7DQorDQorCXRlbXAg PSBzdnNfcmVhZGwoc3ZzLCBWT1AzMCk7DQorCXN2c2ItPnZvbHRzWzZdID0gKHRlbXAgPj4gMjQp ICYgR0VOTUFTSyg3LCAwKTsNCisJc3ZzYi0+dm9sdHNbNF0gPSAodGVtcCA+PiAxNikgJiBHRU5N QVNLKDcsIDApOw0KKwlzdnNiLT52b2x0c1syXSA9ICh0ZW1wID4+IDgpICAmIEdFTk1BU0soNywg MCk7DQorCXN2c2ItPnZvbHRzWzBdID0gKHRlbXAgJiBHRU5NQVNLKDcsIDApKTsNCisNCisJdGVt cCA9IHN2c19yZWFkbChzdnMsIFZPUDc0KTsNCisJc3ZzYi0+dm9sdHNbMTRdID0gKHRlbXAgPj4g MjQpICYgR0VOTUFTSyg3LCAwKTsNCisJc3ZzYi0+dm9sdHNbMTJdID0gKHRlbXAgPj4gMTYpICYg R0VOTUFTSyg3LCAwKTsNCisJc3ZzYi0+dm9sdHNbMTBdID0gKHRlbXAgPj4gOCkgICYgR0VOTUFT Syg3LCAwKTsNCisJc3ZzYi0+dm9sdHNbOF0gPSAodGVtcCAmIEdFTk1BU0soNywgMCkpOw0KKw0K Kwlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykgew0KKwkJaWYgKGkgPCA3KSB7DQorCQkJc3ZzYi0+ dm9sdHNbKGkgKiAyKSArIDFdID0NCisJCQkJaW50ZXJwb2xhdGUoc3ZzYi0+ZnJlcXNfcGN0W2kg KiAyXSwNCisJCQkJCSAgICBzdnNiLT5mcmVxc19wY3RbKGkgKyAxKSAqIDJdLA0KKwkJCQkJICAg IHN2c2ItPnZvbHRzW2kgKiAyXSwNCisJCQkJCSAgICBzdnNiLT52b2x0c1soaSArIDEpICogMl0s DQorCQkJCQkgICAgc3ZzYi0+ZnJlcXNfcGN0WyhpICogMikgKyAxXSk7DQorCQl9IGVsc2UgaWYg KGkgPT0gNykgew0KKwkJCXN2c2ItPnZvbHRzWyhpICogMikgKyAxXSA9DQorCQkJCWludGVycG9s YXRlKHN2c2ItPmZyZXFzX3BjdFsoaSAtIDEpICogMl0sDQorCQkJCQkgICAgc3ZzYi0+ZnJlcXNf cGN0W2kgKiAyXSwNCisJCQkJCSAgICBzdnNiLT52b2x0c1soaSAtIDEpICogMl0sDQorCQkJCQkg ICAgc3ZzYi0+dm9sdHNbaSAqIDJdLA0KKwkJCQkJICAgIHN2c2ItPmZyZXFzX3BjdFsoaSAqIDIp ICsgMV0pOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHN2c19zZXRfZnJlcXNfcGN0 X3YyKHN0cnVjdCBtdGtfc3ZzICpzdnMpDQorew0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSBz dnMtPnBiYW5rOw0KKw0KKwlzdnNfd3JpdGVsKHN2cywNCisJCSAgICgoc3ZzYi0+ZnJlcXNfcGN0 WzZdIDw8IDI0KSAmIEdFTk1BU0soMzEsIDI0KSkgfA0KKwkJICAgKChzdnNiLT5mcmVxc19wY3Rb NF0gPDwgMTYpICYgR0VOTUFTSygyMywgMTYpKSB8DQorCQkgICAoKHN2c2ItPmZyZXFzX3BjdFsy XSA8PCA4KSAmIEdFTk1BU0soMTUsIDgpKSB8DQorCQkgICAoc3ZzYi0+ZnJlcXNfcGN0WzBdICYg R0VOTUFTSyg3LCAwKSksDQorCQkgICBGUkVRUENUMzApOw0KKwlzdnNfd3JpdGVsKHN2cywNCisJ CSAgICgoc3ZzYi0+ZnJlcXNfcGN0WzE0XSA8PCAyNCkgJiBHRU5NQVNLKDMxLCAyNCkpIHwNCisJ CSAgICgoc3ZzYi0+ZnJlcXNfcGN0WzEyXSA8PCAxNikgJiBHRU5NQVNLKDIzLCAxNikpIHwNCisJ CSAgICgoc3ZzYi0+ZnJlcXNfcGN0WzEwXSA8PCA4KSAmIEdFTk1BU0soMTUsIDgpKSB8DQorCQkg ICAoKHN2c2ItPmZyZXFzX3BjdFs4XSkgJiBHRU5NQVNLKDcsIDApKSwNCisJCSAgIEZSRVFQQ1Q3 NCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHN2c19zZXRfYmFua19waGFzZShzdHJ1Y3QgbXRrX3N2 cyAqc3ZzLCB1MzIgdGFyZ2V0X3BoYXNlKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9y bSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+ cGJhbms7DQorCXUzMiBkZXNfY2hhciwgdGVtcF9jaGFyLCBkZXRfY2hhciwgbGltaXRfdmFsczsN CisJdTMyIGluaXQydmFscywgdHNfY2FsY3MsIHZhbCwgZmlsdGVyLCBpOw0KKw0KKwlzdnNfc3dp dGNoX2Jhbmsoc3ZzKTsNCisNCisJZGVzX2NoYXIgPSAoKHN2c2ItPmJkZXMgPDwgOCkgJiBHRU5N QVNLKDE1LCA4KSkgfA0KKwkJICAgKHN2c2ItPm1kZXMgJiBHRU5NQVNLKDcsIDApKTsNCisJc3Zz X3dyaXRlbChzdnMsIGRlc19jaGFyLCBERVNDSEFSKTsNCisNCisJdGVtcF9jaGFyID0gKChzdnNi LT52Y28gPDwgMTYpICYgR0VOTUFTSygyMywgMTYpKSB8DQorCQkgICAgKChzdnNiLT5tdGRlcyA8 PCA4KSAmIEdFTk1BU0soMTUsIDgpKSB8DQorCQkgICAgKHN2c2ItPmR2dF9maXhlZCAmIEdFTk1B U0soNywgMCkpOw0KKwlzdnNfd3JpdGVsKHN2cywgdGVtcF9jaGFyLCBURU1QQ0hBUik7DQorDQor CWRldF9jaGFyID0gKChzdnNiLT5kY2JkZXQgPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkgfA0KKwkJ ICAgKHN2c2ItPmRjbWRldCAmIEdFTk1BU0soNywgMCkpOw0KKwlzdnNfd3JpdGVsKHN2cywgZGV0 X2NoYXIsIERFVENIQVIpOw0KKw0KKwlzdnNfd3JpdGVsKHN2cywgc3ZzYi0+ZGNfY29uZmlnLCBE Q0NPTkZJRyk7DQorCXN2c193cml0ZWwoc3ZzLCBzdnNiLT5hZ2VfY29uZmlnLCBBR0VDT05GSUcp Ow0KKw0KKwlpZiAoIXN2c2ItPmFnZW0pIHsNCisJCXN2c193cml0ZWwoc3ZzLCBTVlNCX1JVTkNP TkZJR19ERUZBVUxULCBSVU5DT05GSUcpOw0KKwl9IGVsc2Ugew0KKwkJdmFsID0gMHgwOw0KKw0K KwkJZm9yIChpID0gMDsgaSA8IDI0OyBpICs9IDIpIHsNCisJCQlmaWx0ZXIgPSAweDMgPDwgaTsN CisNCisJCQlpZiAoIShzdnNiLT5hZ2VfY29uZmlnICYgZmlsdGVyKSkNCisJCQkJdmFsIHw9ICgw eDEgPDwgaSk7DQorCQkJZWxzZQ0KKwkJCQl2YWwgfD0gKHN2c2ItPmFnZV9jb25maWcgJiBmaWx0 ZXIpOw0KKwkJfQ0KKwkJc3ZzX3dyaXRlbChzdnMsIHZhbCwgUlVOQ09ORklHKTsNCisJfQ0KKw0K KwlzdnNwLT5zZXRfZnJlcXNfcGN0KHN2cyk7DQorDQorCWxpbWl0X3ZhbHMgPSAoKHN2c2ItPnZt YXggPDwgMjQpICYgR0VOTUFTSygzMSwgMjQpKSB8DQorCQkgICAgICgoc3ZzYi0+dm1pbiA8PCAx NikgJiBHRU5NQVNLKDIzLCAxNikpIHwNCisJCSAgICAgKChzdnNiLT5kdGhpIDw8IDgpICYgR0VO TUFTSygxNSwgOCkpIHwNCisJCSAgICAgKHN2c2ItPmR0bG8gJiBHRU5NQVNLKDcsIDApKTsNCisJ c3ZzX3dyaXRlbChzdnMsIGxpbWl0X3ZhbHMsIExJTUlUVkFMUyk7DQorCXN2c193cml0ZWwoc3Zz LCAoc3ZzYi0+dmJvb3QgJiBHRU5NQVNLKDcsIDApKSwgVkJPT1QpOw0KKwlzdnNfd3JpdGVsKHN2 cywgKHN2c2ItPmRldF93aW5kb3cgJiBHRU5NQVNLKDE1LCAwKSksIERFVFdJTkRPVyk7DQorCXN2 c193cml0ZWwoc3ZzLCAoc3ZzYi0+ZGV0X21heCAmIEdFTk1BU0soMTUsIDApKSwgQ09ORklHKTsN CisNCisJaWYgKHN2c2ItPmNoa19zaGlmdCkNCisJCXN2c193cml0ZWwoc3ZzLCAoc3ZzYi0+Y2hr X3NoaWZ0ICYgR0VOTUFTSyg3LCAwKSksIENIS1NISUZUKTsNCisNCisJaWYgKHN2c2ItPmN0bDAp DQorCQlzdnNfd3JpdGVsKHN2cywgc3ZzYi0+Y3RsMCwgQ1RMMCk7DQorDQorCXN2c193cml0ZWwo c3ZzLCBTVlNCX0lOVFNUU19DTEVBTiwgSU5UU1RTKTsNCisNCisJc3dpdGNoICh0YXJnZXRfcGhh c2UpIHsNCisJY2FzZSBTVlNCX1BIQVNFX0lOSVQwMToNCisJCXN2c193cml0ZWwoc3ZzLCBTVlNC X0lOVEVOX0lOSVQweCwgSU5URU4pOw0KKwkJc3ZzX3dyaXRlbChzdnMsIFNWU0JfRU5fSU5JVDAx LCBTVlNFTik7DQorCQlicmVhazsNCisJY2FzZSBTVlNCX1BIQVNFX0lOSVQwMjoNCisJCXN2c193 cml0ZWwoc3ZzLCBTVlNCX0lOVEVOX0lOSVQweCwgSU5URU4pOw0KKwkJaW5pdDJ2YWxzID0gKChz dnNiLT5hZ2Vfdm9mZnNldF9pbiA8PCAxNikgJiBHRU5NQVNLKDMxLCAxNikpIHwNCisJCQkgICAg KHN2c2ItPmRjX3ZvZmZzZXRfaW4gJiBHRU5NQVNLKDE1LCAwKSk7DQorCQlzdnNfd3JpdGVsKHN2 cywgaW5pdDJ2YWxzLCBJTklUMlZBTFMpOw0KKwkJc3ZzX3dyaXRlbChzdnMsIFNWU0JfRU5fSU5J VDAyLCBTVlNFTik7DQorCQlicmVhazsNCisJY2FzZSBTVlNCX1BIQVNFX01PTjoNCisJCXRzX2Nh bGNzID0gKChzdnNiLT5idHMgPDwgMTIpICYgR0VOTUFTSygyMywgMTIpKSB8DQorCQkJICAgKHN2 c2ItPm10cyAmIEdFTk1BU0soMTEsIDApKTsNCisJCXN2c193cml0ZWwoc3ZzLCB0c19jYWxjcywg VFNDQUxDUyk7DQorCQlzdnNfd3JpdGVsKHN2cywgU1ZTQl9JTlRFTl9NT05WT1BFTiwgSU5URU4p Ow0KKwkJc3ZzX3dyaXRlbChzdnMsIFNWU0JfRU5fTU9OLCBTVlNFTik7DQorCQlicmVhazsNCisJ ZGVmYXVsdDoNCisJCVdBUk5fT04oMSk7DQorCQlicmVhazsNCisJfQ0KK30NCisNCitzdGF0aWMg aW5saW5lIHZvaWQgc3ZzX2luaXQwMV9pc3JfaGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0K K3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gc3ZzLT5wYmFuazsNCisNCisJZGV2X25vdGlj ZShzdnNiLT5kZXYsICIlczogVkRONzQ6MHglMDh4LCBWRE4zMDoweCUwOHgsIERDOjB4JTA4eFxu IiwNCisJCSAgIF9fZnVuY19fLCBzdnNfcmVhZGwoc3ZzLCBWREVTSUdONzQpLA0KKwkJICAgc3Zz X3JlYWRsKHN2cywgVkRFU0lHTjMwKSwgc3ZzX3JlYWRsKHN2cywgRENWQUxVRVMpKTsNCisNCisJ c3ZzYi0+cGhhc2UgPSBTVlNCX1BIQVNFX0lOSVQwMTsNCisJc3ZzYi0+ZGNfdm9mZnNldF9pbiA9 IH4oc3ZzX3JlYWRsKHN2cywgRENWQUxVRVMpICYgR0VOTUFTSygxNSwgMCkpICsgMTsNCisJaWYg KHN2c2ItPmluaXQwMV92b2x0X2ZsYWcgPT0gU1ZTQl9JTklUMDFfVk9MVF9JR05PUkUpDQorCQlz dnNiLT5kY192b2Zmc2V0X2luID0gMDsNCisJZWxzZSBpZiAoKHN2c2ItPmRjX3ZvZmZzZXRfaW4g JiBTVlNCX0RDX1NJR05FRF9CSVQpICYmDQorCQkgKHN2c2ItPmluaXQwMV92b2x0X2ZsYWcgPT0g U1ZTQl9JTklUMDFfVk9MVF9JTkNfT05MWSkpDQorCQlzdnNiLT5kY192b2Zmc2V0X2luID0gMDsN CisNCisJc3ZzYi0+YWdlX3ZvZmZzZXRfaW4gPSBzdnNfcmVhZGwoc3ZzLCBBR0VWQUxVRVMpICYg R0VOTUFTSygxNSwgMCk7DQorDQorCXN2c193cml0ZWwoc3ZzLCBTVlNCX0VOX09GRiwgU1ZTRU4p Ow0KKwlzdnNfd3JpdGVsKHN2cywgU1ZTQl9JTlRTVFNfQ09NUExFVEUsIElOVFNUUyk7DQorDQor CS8qIHN2cyBpbml0MDEgY2xvY2sgZ2F0aW5nICovDQorCXN2c2ItPmNvcmVfc2VsICY9IH5TVlNC X0lOSVQwMV9DTEtfRU47DQorCWNvbXBsZXRlKCZzdnNiLT5pbml0X2NvbXBsZXRpb24pOw0KK30N CisNCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZzX2luaXQwMl9pc3JfaGFuZGxlcihzdHJ1Y3QgbXRr X3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+ cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+cGJhbms7DQorDQorCWRl dl9ub3RpY2Uoc3ZzYi0+ZGV2LCAiJXM6IFZPUDc0OjB4JTA4eCwgVk9QMzA6MHglMDh4LCBEQzow eCUwOHhcbiIsDQorCQkgICBfX2Z1bmNfXywgc3ZzX3JlYWRsKHN2cywgVk9QNzQpLCBzdnNfcmVh ZGwoc3ZzLCBWT1AzMCksDQorCQkgICBzdnNfcmVhZGwoc3ZzLCBEQ1ZBTFVFUykpOw0KKw0KKwlz dnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfSU5JVDAyOw0KKwlzdnNwLT5nZXRfdm9wcyhzdnMpOw0K Kw0KKwlzdnNfd3JpdGVsKHN2cywgU1ZTQl9FTl9PRkYsIFNWU0VOKTsNCisJc3ZzX3dyaXRlbChz dnMsIFNWU0JfSU5UU1RTX0NPTVBMRVRFLCBJTlRTVFMpOw0KKw0KKwljb21wbGV0ZSgmc3ZzYi0+ aW5pdF9jb21wbGV0aW9uKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIHN2c19tb25fbW9k ZV9pc3JfaGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2 c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3Zz YiA9IHN2cy0+cGJhbms7DQorDQorCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9NT047DQorCXN2 c2ItPnRlbXAgPSBzdnNfcmVhZGwoc3ZzLCBURU1QKSAmIEdFTk1BU0soNywgMCk7DQorCXN2c3At PmdldF92b3BzKHN2cyk7DQorDQorCXN2c193cml0ZWwoc3ZzLCBTVlNCX0lOVFNUU19NT05WT1As IElOVFNUUyk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdnNfZXJyb3JfaXNyX2hhbmRs ZXIoc3RydWN0IG10a19zdnMgKnN2cykNCit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0g KnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2IgPSBzdnMtPnBi YW5rOw0KKw0KKwlkZXZfZXJyKHN2c2ItPmRldiwgIiVzOiAlcywgQ09SRVNFTCA9IDB4JTA4eFxu IiwNCisJCV9fZnVuY19fLCBzdnNwLT5uYW1lLCBzdnNfcmVhZGwoc3ZzLCBDT1JFU0VMKSk7DQor CWRldl9lcnIoc3ZzYi0+ZGV2LCAiU1ZTRU4gPSAweCUwOHgsIElOVFNUUyA9IDB4JTA4eFxuIiwN CisJCXN2c19yZWFkbChzdnMsIFNWU0VOKSwgc3ZzX3JlYWRsKHN2cywgSU5UU1RTKSk7DQorCWRl dl9lcnIoc3ZzYi0+ZGV2LCAiU01TVEFURTAgPSAweCUwOHgsIFNNU1RBVEUxID0gMHglMDh4XG4i LA0KKwkJc3ZzX3JlYWRsKHN2cywgU01TVEFURTApLCBzdnNfcmVhZGwoc3ZzLCBTTVNUQVRFMSkp Ow0KKwlkZXZfZXJyKHN2c2ItPmRldiwgIlRFTVAgPSAweCUwOHgsIFRFTVBNU1IwID0gMHglMDh4 XG4iLA0KKwkJc3ZzX3JlYWRsKHN2cywgVEVNUCksIHN2c19yZWFkbChzdnMsIFRFTVBNU1IwKSk7 DQorCWRldl9lcnIoc3ZzYi0+ZGV2LCAiVEVNUE1TUjEgPSAweCUwOHgsIFRFTVBNU1IyID0gMHgl MDh4XG4iLA0KKwkJc3ZzX3JlYWRsKHN2cywgVEVNUE1TUjEpLCBzdnNfcmVhZGwoc3ZzLCBURU1Q TVNSMikpOw0KKwlkZXZfZXJyKHN2c2ItPmRldiwgIlRFTVBNT05DVEwwID0gMHglMDh4LCBURU1Q TVNSQ1RMMSA9IDB4JTA4eFxuIiwNCisJCXN2c19yZWFkbChzdnMsIFRFTVBNT05DVEwwKSwgc3Zz X3JlYWRsKHN2cywgVEVNUE1TUkNUTDEpKTsNCisNCisJc3ZzYi0+bW9kZV9zdXBwb3J0ID0gU1ZT Ql9NT0RFX0FMTF9ESVNBQkxFOw0KKw0KKwlpZiAoc3ZzYi0+cGhhc2UgIT0gU1ZTQl9QSEFTRV9J TklUMDEpDQorCQlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfRVJST1I7DQorDQorCXN2c193cml0 ZWwoc3ZzLCBTVlNCX0VOX09GRiwgU1ZTRU4pOw0KKwlzdnNfd3JpdGVsKHN2cywgU1ZTQl9JTlRT VFNfQ0xFQU4sIElOVFNUUyk7DQorfQ0KKw0KK3N0YXRpYyBpcnFyZXR1cm5fdCBzdnNfaXNyKGlu dCBpcnEsIHZvaWQgKmRhdGEpDQorew0KKwlzdHJ1Y3QgbXRrX3N2cyAqc3ZzID0gKHN0cnVjdCBt dGtfc3ZzICopZGF0YTsNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+ cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IE5VTEw7DQorCXVuc2lnbmVkIGxv bmcgZmxhZ3M7DQorCXUzMiBpZHgsIGludF9zdHMsIHN2c19lbjsNCisNCisJZmxhZ3MgPSBjbGFp bV9tdGtfc3ZzX2xvY2soKTsNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNwLT5iYW5rX251bTsg aWR4KyspIHsNCisJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCXN2cy0+cGJhbmsgPSBz dnNiOw0KKw0KKwkJLyogRmluZCBvdXQgd2hpY2ggc3ZzIGJhbmsgZmlyZXMgaW50ZXJydXB0ICov DQorCQlpZiAoc3ZzYi0+aW50X3N0ICYgc3ZzX3JlYWRsKHN2cywgSU5UU1QpKQ0KKwkJCWNvbnRp bnVlOw0KKw0KKwkJaWYgKCFzdnNiLT5zdXNwZW5kZWQpIHsNCisJCQlzdnNfc3dpdGNoX2Jhbmso c3ZzKTsNCisJCQlpbnRfc3RzID0gc3ZzX3JlYWRsKHN2cywgSU5UU1RTKTsNCisJCQlzdnNfZW4g PSBzdnNfcmVhZGwoc3ZzLCBTVlNFTik7DQorDQorCQkJaWYgKGludF9zdHMgPT0gU1ZTQl9JTlRT VFNfQ09NUExFVEUgJiYNCisJCQkgICAgKChzdnNfZW4gJiBTVlNCX0VOX01BU0spID09IFNWU0Jf RU5fSU5JVDAxKSkNCisJCQkJc3ZzX2luaXQwMV9pc3JfaGFuZGxlcihzdnMpOw0KKwkJCWVsc2Ug aWYgKChpbnRfc3RzID09IFNWU0JfSU5UU1RTX0NPTVBMRVRFKSAmJg0KKwkJCQkgKChzdnNfZW4g JiBTVlNCX0VOX01BU0spID09IFNWU0JfRU5fSU5JVDAyKSkNCisJCQkJc3ZzX2luaXQwMl9pc3Jf aGFuZGxlcihzdnMpOw0KKwkJCWVsc2UgaWYgKCEhKGludF9zdHMgJiBTVlNCX0lOVFNUU19NT05W T1ApKQ0KKwkJCQlzdnNfbW9uX21vZGVfaXNyX2hhbmRsZXIoc3ZzKTsNCisJCQllbHNlDQorCQkJ CXN2c19lcnJvcl9pc3JfaGFuZGxlcihzdnMpOw0KKwkJfQ0KKw0KKwkJYnJlYWs7DQorCX0NCisJ cmVsZWFzZV9tdGtfc3ZzX2xvY2soZmxhZ3MpOw0KKw0KKwlpZiAoc3ZzYi0+cGhhc2UgIT0gU1ZT Ql9QSEFTRV9JTklUMDEpDQorCQlzdnNfYWRqdXN0X3BtX29wcF92b2x0cyhzdnNiLCBmYWxzZSk7 DQorDQorCXJldHVybiBJUlFfSEFORExFRDsNCit9DQorDQorc3RhdGljIHZvaWQgc3ZzX21vbl9t b2RlKHN0cnVjdCBtdGtfc3ZzICpzdnMpDQorew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3Jt ICpzdnNwID0gc3ZzLT5wbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwl1bnNp Z25lZCBsb25nIGZsYWdzOw0KKwl1MzIgaWR4Ow0KKw0KKwlmbGFncyA9IGNsYWltX210a19zdnNf bG9jaygpOw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0K KwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJc3ZzLT5wYmFuayA9IHN2c2I7DQorDQor CQlpZiAoIShzdnNiLT5tb2RlX3N1cHBvcnQgJiBTVlNCX01PREVfTU9OKSkNCisJCQljb250aW51 ZTsNCisNCisJCXN2c19zZXRfYmFua19waGFzZShzdnMsIFNWU0JfUEhBU0VfTU9OKTsNCisJfQ0K KwlyZWxlYXNlX210a19zdnNfbG9jayhmbGFncyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzX2lu aXQwMihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9y bSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYjsNCisJdW5z aWduZWQgbG9uZyBmbGFncywgdGltZV9sZWZ0Ow0KKwl1MzIgaWR4Ow0KKw0KKwlmb3IgKGlkeCA9 IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5r c1tpZHhdOw0KKwkJc3ZzLT5wYmFuayA9IHN2c2I7DQorDQorCQlpZiAoIShzdnNiLT5tb2RlX3N1 cHBvcnQgJiBTVlNCX01PREVfSU5JVDAyKSkNCisJCQljb250aW51ZTsNCisNCisJCXJlaW5pdF9j b21wbGV0aW9uKCZzdnNiLT5pbml0X2NvbXBsZXRpb24pOw0KKwkJZmxhZ3MgPSBjbGFpbV9tdGtf c3ZzX2xvY2soKTsNCisJCXN2c19zZXRfYmFua19waGFzZShzdnMsIFNWU0JfUEhBU0VfSU5JVDAy KTsNCisJCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZsYWdzKTsNCisJCXRpbWVfbGVmdCA9DQorCQkJ d2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzdnNiLT5pbml0X2NvbXBsZXRpb24sDQorCQkJ CQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOw0KKwkJaWYgKCF0aW1lX2xlZnQpIHsNCisJ CQlkZXZfZXJyKHN2c2ItPmRldiwgImluaXQwMiBjb21wbGV0aW9uIHRpbWVvdXRcbiIpOw0KKwkJ CXJldHVybiAtRUJVU1k7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRp YyBpbnQgc3ZzX2luaXQwMShzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0 IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAq c3ZzYjsNCisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0ICpxb3NfcmVxdWVzdDsNCisJdW5zaWduZWQg bG9uZyBmbGFncywgdGltZV9sZWZ0Ow0KKwlib29sIHNlYXJjaF9kb25lOw0KKwlpbnQgcmV0ID0g LUVQRVJNOw0KKwl1MzIgb3BwX2ZyZXFzLCBvcHBfdmJvb3QsIGJ1Y2tfdm9sdCwgaWR4LCBpOw0K Kw0KKwlxb3NfcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpxb3NfcmVxdWVzdCksIEdGUF9LRVJO RUwpOw0KKwlpZiAoIXFvc19yZXF1ZXN0KQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorDQorCS8qIExl dCBDUFVzIGxlYXZlIGlkbGUtb2ZmIHN0YXRlIGZvciBpbml0aWFsaXppbmcgc3ZzX2luaXQwMS4g Ki8NCisJY3B1X2xhdGVuY3lfcW9zX2FkZF9yZXF1ZXN0KHFvc19yZXF1ZXN0LCAwKTsNCisNCisJ LyoNCisJICogU29tZXRpbWVzIHR3byBzdnMgYmFua3MgdXNlIHRoZSBzYW1lIGJ1Y2suDQorCSAq IFRoZXJlZm9yZSwgd2Ugc2V0IGVhY2ggc3ZzIGJhbmsgdG8gdmJvb3Qgdm9sdGFnZSBmaXJzdC4N CisJICovDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQor CQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzZWFyY2hfZG9uZSA9IGZhbHNlOw0KKw0K KwkJcmV0ID0gcmVndWxhdG9yX3NldF9tb2RlKHN2c2ItPmJ1Y2ssIFJFR1VMQVRPUl9NT0RFX0ZB U1QpOw0KKwkJaWYgKHJldCkNCisJCQlkZXZfbm90aWNlKHN2c2ItPmRldiwgInNldCBmYXN0IG1v ZGUgZmFpbDogJWRcbiIsIHJldCk7DQorDQorCQlpZiAoc3ZzYi0+bXRjbW9zX3JlcXVlc3QpIHsN CisJCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN2c2ItPmJ1Y2spOw0KKwkJCWlmIChyZXQpIHsN CisJCQkJZGV2X2VycihzdnNiLT5kZXYsICJlbmFibGUgXCIlc1wiIGZhaWw6ICVkXG4iLA0KKwkJ CQkJc3ZzYi0+YnVja19uYW1lLCByZXQpOw0KKwkJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQkJ fQ0KKw0KKwkJCXJldCA9IGRldl9wbV9kb21haW5fYXR0YWNoKHN2c2ItPmRldiwgZmFsc2UpOw0K KwkJCWlmIChyZXQpIHsNCisJCQkJZGV2X2VycihzdnNiLT5kZXYsDQorCQkJCQkiYXR0YWNoIHBt IGRvbWFpbiBmYWlsOiAlZFxuIiwgcmV0KTsNCisJCQkJZ290byBpbml0MDFfZmluaXNoOw0KKwkJ CX0NCisNCisJCQlwbV9ydW50aW1lX2VuYWJsZShzdnNiLT5kZXYpOw0KKwkJCXJldCA9IHBtX3J1 bnRpbWVfZ2V0X3N5bmMoc3ZzYi0+ZGV2KTsNCisJCQlpZiAocmV0IDwgMCkgew0KKwkJCQlkZXZf ZXJyKHN2c2ItPmRldiwgIm10Y21vcyBvbiBmYWlsOiAlZFxuIiwNCisJCQkJCXJldCk7DQorCQkJ CWdvdG8gaW5pdDAxX2ZpbmlzaDsNCisJCQl9DQorCQl9DQorDQorCQkvKg0KKwkJICogRmluZCB0 aGUgZmFzdGVzdCBmcmVxIHRoYXQgY2FuIGJlIHJ1biBhdCB2Ym9vdCBhbmQNCisJCSAqIGZpeCB0 byB0aGF0IGZyZXEgdW50aWwgc3ZzX2luaXQwMSBpcyBkb25lLg0KKwkJICovDQorCQlvcHBfdmJv b3QgPSBzdnNfYmFua192b2x0X3RvX29wcF92b2x0KHN2c2ItPnZib290LA0KKwkJCQkJCSAgICAg IHN2c2ItPnZvbHRfc3RlcCwNCisJCQkJCQkgICAgICBzdnNiLT52b2x0X2Jhc2UpOw0KKw0KKwkJ Zm9yIChpID0gMDsgaSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrKSB7DQorCQkJb3BwX2ZyZXFzID0g c3ZzYi0+b3BwX2ZyZXFzW2ldOw0KKwkJCWlmICghc2VhcmNoX2RvbmUgJiYgc3ZzYi0+b3BwX3Zv bHRzW2ldIDw9IG9wcF92Ym9vdCkgew0KKwkJCQlyZXQgPSBkZXZfcG1fb3BwX2FkanVzdF92b2x0 YWdlKHN2c2ItPmRldiwNCisJCQkJCQkJCW9wcF9mcmVxcywNCisJCQkJCQkJCW9wcF92Ym9vdCwN CisJCQkJCQkJCW9wcF92Ym9vdCwNCisJCQkJCQkJCW9wcF92Ym9vdCk7DQorCQkJCWlmIChyZXQp IHsNCisJCQkJCWRldl9lcnIoc3ZzYi0+ZGV2LA0KKwkJCQkJCSJzZXQgdm9sdGFnZSBmYWlsOiAl ZFxuIiwgcmV0KTsNCisJCQkJCWdvdG8gaW5pdDAxX2ZpbmlzaDsNCisJCQkJfQ0KKw0KKwkJCQlz ZWFyY2hfZG9uZSA9IHRydWU7DQorCQkJfSBlbHNlIHsNCisJCQkJZGV2X3BtX29wcF9kaXNhYmxl KHN2c2ItPmRldiwNCisJCQkJCQkgICBzdnNiLT5vcHBfZnJlcXNbaV0pOw0KKwkJCX0NCisJCX0N CisJfQ0KKw0KKwkvKiBzdnMgYmFuayBpbml0MDEgYmVnaW5zICovDQorCWZvciAoaWR4ID0gMDsg aWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lk eF07DQorCQlzdnMtPnBiYW5rID0gc3ZzYjsNCisNCisJCWlmICghKHN2c2ItPm1vZGVfc3VwcG9y dCAmIFNWU0JfTU9ERV9JTklUMDEpKQ0KKwkJCWNvbnRpbnVlOw0KKw0KKwkJb3BwX3Zib290ID0g c3ZzX2Jhbmtfdm9sdF90b19vcHBfdm9sdChzdnNiLT52Ym9vdCwNCisJCQkJCQkgICAgICBzdnNi LT52b2x0X3N0ZXAsDQorCQkJCQkJICAgICAgc3ZzYi0+dm9sdF9iYXNlKTsNCisNCisJCWJ1Y2tf dm9sdCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdnNiLT5idWNrKTsNCisJCWlmIChidWNrX3Zv bHQgIT0gb3BwX3Zib290KSB7DQorCQkJZGV2X2VycihzdnNiLT5kZXYsDQorCQkJCSJidWNrIHZv bHRhZ2U6ICV1LCBleHBlY3RlZCB2Ym9vdDogJXVcbiIsDQorCQkJCWJ1Y2tfdm9sdCwgb3BwX3Zi b290KTsNCisJCQlyZXQgPSAtRVBFUk07DQorCQkJZ290byBpbml0MDFfZmluaXNoOw0KKwkJfQ0K Kw0KKwkJaW5pdF9jb21wbGV0aW9uKCZzdnNiLT5pbml0X2NvbXBsZXRpb24pOw0KKwkJZmxhZ3Mg PSBjbGFpbV9tdGtfc3ZzX2xvY2soKTsNCisJCXN2c19zZXRfYmFua19waGFzZShzdnMsIFNWU0Jf UEhBU0VfSU5JVDAxKTsNCisJCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZsYWdzKTsNCisJCXRpbWVf bGVmdCA9DQorCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzdnNiLT5pbml0X2NvbXBs ZXRpb24sDQorCQkJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOw0KKwkJaWYgKCF0aW1l X2xlZnQpIHsNCisJCQlkZXZfZXJyKHN2c2ItPmRldiwgImluaXQwMSBjb21wbGV0aW9uIHRpbWVv dXRcbiIpOw0KKwkJCXJldCA9IC1FQlVTWTsNCisJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQl9 DQorCX0NCisNCitpbml0MDFfZmluaXNoOg0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJh bmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKw0KKwkJZm9y IChpID0gMDsgaSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrKQ0KKwkJCWRldl9wbV9vcHBfZW5hYmxl KHN2c2ItPmRldiwgc3ZzYi0+b3BwX2ZyZXFzW2ldKTsNCisNCisJCWlmIChyZWd1bGF0b3Jfc2V0 X21vZGUoc3ZzYi0+YnVjaywgUkVHVUxBVE9SX01PREVfTk9STUFMKSkNCisJCQlkZXZfbm90aWNl KHN2c2ItPmRldiwgImZhaWwgdG8gc2V0IG5vcm1hbCBtb2RlOiAlZFxuIiwNCisJCQkJICAgcmV0 KTsNCisNCisJCWlmIChzdnNiLT5tdGNtb3NfcmVxdWVzdCkgew0KKwkJCWlmIChwbV9ydW50aW1l X3B1dF9zeW5jKHN2c2ItPmRldikpDQorCQkJCWRldl9lcnIoc3ZzYi0+ZGV2LCAibXRjbW9zIG9m ZiBmYWlsOiAlZFxuIiwNCisJCQkJCXJldCk7DQorCQkJcG1fcnVudGltZV9kaXNhYmxlKHN2c2It PmRldik7DQorCQkJZGV2X3BtX2RvbWFpbl9kZXRhY2goc3ZzYi0+ZGV2LCAwKTsNCisJCQlpZiAo cmVndWxhdG9yX2Rpc2FibGUoc3ZzYi0+YnVjaykpDQorCQkJCWRldl9lcnIoc3ZzYi0+ZGV2LA0K KwkJCQkJImRpc2FibGUgXCIlc1wiIHBvd2VyIGZhaWw6ICVkXG4iLA0KKwkJCQkJc3ZzYi0+YnVj a19uYW1lLCByZXQpOw0KKwkJfQ0KKwl9DQorDQorCWNwdV9sYXRlbmN5X3Fvc19yZW1vdmVfcmVx dWVzdChxb3NfcmVxdWVzdCk7DQorCWtmcmVlKHFvc19yZXF1ZXN0KTsNCisNCisJcmV0dXJuIHJl dDsNCit9DQorDQorc3RhdGljIGludCBzdnNfc3RhcnQoc3RydWN0IG10a19zdnMgKnN2cykNCit7 DQorCWludCByZXQ7DQorDQorCXJldCA9IHN2c19pbml0MDEoc3ZzKTsNCisJaWYgKHJldCkNCisJ CXJldHVybiByZXQ7DQorDQorCXJldCA9IHN2c19pbml0MDIoc3ZzKTsNCisJaWYgKHJldCkNCisJ CXJldHVybiByZXQ7DQorDQorCXN2c19tb25fbW9kZShzdnMpOw0KKw0KKwlyZXR1cm4gcmV0Ow0K K30NCisNCitzdGF0aWMgYm9vbCBzdnNfbXQ4MTgzX2VmdXNlX3BhcnNpbmcoc3RydWN0IG10a19z dnMgKnN2cykNCit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBs YXRmb3JtOw0KKwlzdHJ1Y3QgdGhlcm1hbF9wYXJhbWV0ZXIgdHA7DQorCXN0cnVjdCBzdnNfYmFu ayAqc3ZzYjsNCisJYm9vbCBtb25fbW9kZV9zdXBwb3J0ID0gdHJ1ZTsNCisJaW50IGZvcm1hdFs2 XSwgeF9yb29tdFs2XSwgdGJfcm9vbXQgPSAwOw0KKwlzdHJ1Y3QgbnZtZW1fY2VsbCAqY2VsbDsN CisJdTMyIGlkeCwgaSwgZnRfcGdtLCBtdHMsIHRlbXAwLCB0ZW1wMSwgdGVtcDI7DQorDQorCWlm IChzdnNwLT5mYWtlX2VmdXNlKSB7DQorCQlwcl9ub3RpY2UoImZha2UgZWZ1c2VcbiIpOw0KKwkJ c3ZzLT5lZnVzZVswXSA9IDB4MDAzMTAwODA7DQorCQlzdnMtPmVmdXNlWzFdID0gMHhhYmZiZjc1 NzsNCisJCXN2cy0+ZWZ1c2VbMl0gPSAweDQ3Yzc0N2M3Ow0KKwkJc3ZzLT5lZnVzZVszXSA9IDB4 YWJmYmY3NTc7DQorCQlzdnMtPmVmdXNlWzRdID0gMHhlN2ZjYTBlYzsNCisJCXN2cy0+ZWZ1c2Vb NV0gPSAweDQ3YmY0Yjg4Ow0KKwkJc3ZzLT5lZnVzZVs2XSA9IDB4YWJmYjhmYTU7DQorCQlzdnMt PmVmdXNlWzddID0gMHhhYmZiMjE3YjsNCisJCXN2cy0+ZWZ1c2VbOF0gPSAweDRiZjM0YmUxOw0K KwkJc3ZzLT5lZnVzZVs5XSA9IDB4YWJmYjY3MGQ7DQorCQlzdnMtPmVmdXNlWzE2XSA9IDB4YWJm YmM2NTM7DQorCQlzdnMtPmVmdXNlWzE3XSA9IDB4NDdmMzQ3ZTE7DQorCQlzdnMtPmVmdXNlWzE4 XSA9IDB4YWJmYmQ4NDg7DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IHN2cy0+ZWZ1c2VfbnVt OyBpKyspDQorCQlpZiAoc3ZzLT5lZnVzZVtpXSkNCisJCQlkZXZfbm90aWNlKHN2cy0+ZGV2LCAi TV9IV19SRVMlZDogMHglMDh4XG4iLA0KKwkJCQkgICBpLCBzdnMtPmVmdXNlW2ldKTsNCisNCisJ Lyogc3ZzIGVmdXNlIHBhcnNpbmcgKi8NCisJZnRfcGdtID0gKHN2cy0+ZWZ1c2VbMF0gPj4gNCkg JiBHRU5NQVNLKDMsIDApOw0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVt OyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJaWYgKGZ0X3BnbSA8 PSAxKQ0KKwkJCXN2c2ItPmluaXQwMV92b2x0X2ZsYWcgPSBTVlNCX0lOSVQwMV9WT0xUX0lHTk9S RTsNCisNCisJCXN3aXRjaCAoc3ZzYi0+c3dfaWQpIHsNCisJCWNhc2UgU1ZTQl9DUFVfTElUVExF Og0KKwkJCXN2c2ItPmJkZXMgPSBzdnMtPmVmdXNlWzE2XSAmIEdFTk1BU0soNywgMCk7DQorCQkJ c3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzE2XSA+PiA4KSAmIEdFTk1BU0soNywgMCk7DQorCQkJ c3ZzYi0+ZGNiZGV0ID0gKHN2cy0+ZWZ1c2VbMTZdID4+IDE2KSAmIEdFTk1BU0soNywgMCk7DQor CQkJc3ZzYi0+ZGNtZGV0ID0gKHN2cy0+ZWZ1c2VbMTZdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7 DQorCQkJc3ZzYi0+bXRkZXMgID0gKHN2cy0+ZWZ1c2VbMTddID4+IDE2KSAmIEdFTk1BU0soNywg MCk7DQorDQorCQkJaWYgKGZ0X3BnbSA8PSAzKQ0KKwkJCQlzdnNiLT52b2x0X29mZnNldCArPSAx MDsNCisJCQllbHNlDQorCQkJCXN2c2ItPnZvbHRfb2Zmc2V0ICs9IDI7DQorCQkJYnJlYWs7DQor CQljYXNlIFNWU0JfQ1BVX0JJRzoNCisJCQlzdnNiLT5iZGVzID0gc3ZzLT5lZnVzZVsxOF0gJiBH RU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPm1kZXMgPSAoc3ZzLT5lZnVzZVsxOF0gPj4gOCkgJiBH RU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjYmRldCA9IChzdnMtPmVmdXNlWzE4XSA+PiAxNikg JiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjbWRldCA9IChzdnMtPmVmdXNlWzE4XSA+PiAy NCkgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPm10ZGVzICA9IHN2cy0+ZWZ1c2VbMTddICYg R0VOTUFTSyg3LCAwKTsNCisNCisJCQlpZiAoZnRfcGdtIDw9IDMpDQorCQkJCXN2c2ItPnZvbHRf b2Zmc2V0ICs9IDE1Ow0KKwkJCWVsc2UNCisJCQkJc3ZzYi0+dm9sdF9vZmZzZXQgKz0gMTI7DQor CQkJYnJlYWs7DQorCQljYXNlIFNWU0JfQ0NJOg0KKwkJCXN2c2ItPmJkZXMgPSBzdnMtPmVmdXNl WzRdICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5tZGVzID0gKHN2cy0+ZWZ1c2VbNF0gPj4g OCkgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjYmRldCA9IChzdnMtPmVmdXNlWzRdID4+ IDE2KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNtZGV0ID0gKHN2cy0+ZWZ1c2VbNF0g Pj4gMjQpICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5tdGRlcyAgPSAoc3ZzLT5lZnVzZVs1 XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKw0KKwkJCWlmIChmdF9wZ20gPD0gMykNCisJCQkJ c3ZzYi0+dm9sdF9vZmZzZXQgKz0gMTA7DQorCQkJZWxzZQ0KKwkJCQlzdnNiLT52b2x0X29mZnNl dCArPSAyOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTVlNCX0dQVToNCisJCQlzdnNiLT5iZGVzID0g c3ZzLT5lZnVzZVs2XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVm dXNlWzZdID4+IDgpICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5kY2JkZXQgPSAoc3ZzLT5l ZnVzZVs2XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjbWRldCA9IChzdnMt PmVmdXNlWzZdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0gc3Zz LT5lZnVzZVs1XSAmIEdFTk1BU0soNywgMCk7DQorDQorCQkJaWYgKGZ0X3BnbSA+PSAyKSB7DQor CQkJCXN2c2ItPmZyZXFfYmFzZSA9IDgwMDAwMDAwMDsgLyogODAwTUh6ICovDQorCQkJCXN2c2It PmR2dF9maXhlZCA9IDI7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlicmVh azsNCisJCX0NCisJfQ0KKw0KKwkvKiBHZXQgdGhlcm1hbCBlZnVzZSBieSBudm1lbSAqLw0KKwlj ZWxsID0gbnZtZW1fY2VsbF9nZXQoc3ZzLT5kZXYsICJjYWxpYnJhdGlvbi1kYXRhIik7DQorCWlm IChJU19FUlIoY2VsbCkpIHsNCisJCWRldl9lcnIoc3ZzLT5kZXYsICJubyB0aGVybWFsIGNlbGws IG5vIG1vbiBtb2RlXG4iKTsNCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07 IGlkeCsrKSB7DQorCQkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJCXN2c2ItPm1vZGVf c3VwcG9ydCAmPSB+U1ZTQl9NT0RFX01PTjsNCisJCX0NCisJCQlyZXR1cm4gdHJ1ZTsNCisJfQ0K Kw0KKwlzdnMtPnRoZXJtYWxfZWZ1c2UgPSAodTMyICopbnZtZW1fY2VsbF9yZWFkKGNlbGwsDQor CQkJCQkJICAgICZzdnMtPnRoZXJtYWxfZWZ1c2VfbnVtKTsNCisJc3ZzLT50aGVybWFsX2VmdXNl X251bSAvPSBzaXplb2YodTMyKTsNCisJbnZtZW1fY2VsbF9wdXQoY2VsbCk7DQorDQorCWlmIChz dnNwLT5mYWtlX2VmdXNlKSB7DQorCQlzdnMtPnRoZXJtYWxfZWZ1c2VbMF0gPSAweDAyODczZjY5 Ow0KKwkJc3ZzLT50aGVybWFsX2VmdXNlWzFdID0gMHhhMTFkOTE0MjsNCisJCXN2cy0+dGhlcm1h bF9lZnVzZVsyXSA9IDB4YTI1MjY5MDA7DQorCX0NCisNCisJLyogVGhlcm1hbCBlZnVzZSBwYXJz aW5nICovDQorCXRwLmFkY19nZV90ID0gKHN2cy0+dGhlcm1hbF9lZnVzZVsxXSA+PiAyMikgJiBH RU5NQVNLKDksIDApOw0KKwl0cC5hZGNfb2VfdCA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMV0gPj4g MTIpICYgR0VOTUFTSyg5LCAwKTsNCisNCisJdHAub192dHNtY3UxID0gKHN2cy0+dGhlcm1hbF9l ZnVzZVswXSA+PiAxNykgJiBHRU5NQVNLKDgsIDApOw0KKwl0cC5vX3Z0c21jdTIgPSAoc3ZzLT50 aGVybWFsX2VmdXNlWzBdID4+IDgpICYgR0VOTUFTSyg4LCAwKTsNCisJdHAub192dHNtY3UzID0g c3ZzLT50aGVybWFsX2VmdXNlWzFdICYgR0VOTUFTSyg4LCAwKTsNCisJdHAub192dHNtY3U0ID0g KHN2cy0+dGhlcm1hbF9lZnVzZVsyXSA+PiAyMykgJiBHRU5NQVNLKDgsIDApOw0KKwl0cC5vX3Z0 c21jdTUgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzJdID4+IDUpICYgR0VOTUFTSyg4LCAwKTsNCisJ dHAub192dHNhYmIgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzJdID4+IDE0KSAmIEdFTk1BU0soOCwg MCk7DQorDQorCXRwLmRlZ2NfY2FsaSA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMF0gPj4gMSkgJiBH RU5NQVNLKDUsIDApOw0KKwl0cC5hZGNfY2FsaV9lbl90ID0gc3ZzLT50aGVybWFsX2VmdXNlWzBd ICYgQklUKDApOw0KKwl0cC5vX3Nsb3BlX3NpZ24gPSAoc3ZzLT50aGVybWFsX2VmdXNlWzBdID4+ IDcpICYgQklUKDApOw0KKw0KKwl0cC50c19pZCA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMV0gPj4g OSkgJiBCSVQoMCk7DQorCXRwLm9fc2xvcGUgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzBdID4+IDI2 KSAmIEdFTk1BU0soNSwgMCk7DQorDQorCWlmICh0cC5hZGNfY2FsaV9lbl90ID09IDEpIHsNCisJ CWlmICghdHAudHNfaWQpDQorCQkJdHAub19zbG9wZSA9IDA7DQorDQorCQlpZiAoKHRwLmFkY19n ZV90IDwgMjY1IHx8IHRwLmFkY19nZV90ID4gNzU4KSB8fA0KKwkJICAgICh0cC5hZGNfb2VfdCA8 IDI2NSB8fCB0cC5hZGNfb2VfdCA+IDc1OCkgfHwNCisJCSAgICAodHAub192dHNtY3UxIDwgLTgg fHwgdHAub192dHNtY3UxID4gNDg0KSB8fA0KKwkJICAgICh0cC5vX3Z0c21jdTIgPCAtOCB8fCB0 cC5vX3Z0c21jdTIgPiA0ODQpIHx8DQorCQkgICAgKHRwLm9fdnRzbWN1MyA8IC04IHx8IHRwLm9f dnRzbWN1MyA+IDQ4NCkgfHwNCisJCSAgICAodHAub192dHNtY3U0IDwgLTggfHwgdHAub192dHNt Y3U0ID4gNDg0KSB8fA0KKwkJICAgICh0cC5vX3Z0c21jdTUgPCAtOCB8fCB0cC5vX3Z0c21jdTUg PiA0ODQpIHx8DQorCQkgICAgKHRwLm9fdnRzYWJiIDwgLTggfHwgdHAub192dHNhYmIgPiA0ODQp IHx8DQorCQkgICAgKHRwLmRlZ2NfY2FsaSA8IDEgfHwgdHAuZGVnY19jYWxpID4gNjMpKSB7DQor CQkJZGV2X2VycihzdnMtPmRldiwgImJhZCB0aGVybWFsIGVmdXNlLCBubyBtb24gbW9kZVxuIik7 DQorCQkJbW9uX21vZGVfc3VwcG9ydCA9IGZhbHNlOw0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJZGV2 X2VycihzdnMtPmRldiwgIm5vIHRoZXJtYWwgZWZ1c2UsIG5vIG1vbiBtb2RlXG4iKTsNCisJCW1v bl9tb2RlX3N1cHBvcnQgPSBmYWxzZTsNCisJfQ0KKw0KKwlpZiAoIW1vbl9tb2RlX3N1cHBvcnQp IHsNCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQkJ c3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJCXN2c2ItPm1vZGVfc3VwcG9ydCAmPSB+U1ZT Ql9NT0RFX01PTjsNCisJCX0NCisNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXRwLmdlID0g KCh0cC5hZGNfZ2VfdCAtIDUxMikgKiAxMDAwMCkgLyA0MDk2Ow0KKwl0cC5vZSA9ICh0cC5hZGNf b2VfdCAtIDUxMik7DQorCXRwLmdhaW4gPSAoMTAwMDAgKyB0cC5nZSk7DQorDQorCWZvcm1hdFsw XSA9ICh0cC5vX3Z0c21jdTEgKyAzMzUwIC0gdHAub2UpOw0KKwlmb3JtYXRbMV0gPSAodHAub192 dHNtY3UyICsgMzM1MCAtIHRwLm9lKTsNCisJZm9ybWF0WzJdID0gKHRwLm9fdnRzbWN1MyArIDMz NTAgLSB0cC5vZSk7DQorCWZvcm1hdFszXSA9ICh0cC5vX3Z0c21jdTQgKyAzMzUwIC0gdHAub2Up Ow0KKwlmb3JtYXRbNF0gPSAodHAub192dHNtY3U1ICsgMzM1MCAtIHRwLm9lKTsNCisJZm9ybWF0 WzVdID0gKHRwLm9fdnRzYWJiICsgMzM1MCAtIHRwLm9lKTsNCisNCisJZm9yIChpID0gMDsgaSA8 IDY7IGkrKykNCisJCXhfcm9vbXRbaV0gPSAoKChmb3JtYXRbaV0gKiAxMDAwMCkgLyA0MDk2KSAq IDEwMDAwKSAvIHRwLmdhaW47DQorDQorCXRlbXAwID0gKDEwMDAwICogMTAwMDAwIC8gdHAuZ2Fp bikgKiAxNSAvIDE4Ow0KKw0KKwlpZiAoIXRwLm9fc2xvcGVfc2lnbikNCisJCW10cyA9ICh0ZW1w MCAqIDEwKSAvICgxNTM0ICsgdHAub19zbG9wZSAqIDEwKTsNCisJZWxzZQ0KKwkJbXRzID0gKHRl bXAwICogMTApIC8gKDE1MzQgLSB0cC5vX3Nsb3BlICogMTApOw0KKw0KKwlmb3IgKGlkeCA9IDA7 IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tp ZHhdOw0KKwkJc3ZzYi0+bXRzID0gbXRzOw0KKw0KKwkJc3dpdGNoIChzdnNiLT5zd19pZCkgew0K KwkJY2FzZSBTVlNCX0NQVV9MSVRUTEU6DQorCQkJdGJfcm9vbXQgPSB4X3Jvb210WzNdOw0KKwkJ CWJyZWFrOw0KKwkJY2FzZSBTVlNCX0NQVV9CSUc6DQorCQkJdGJfcm9vbXQgPSB4X3Jvb210WzRd Ow0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTVlNCX0NDSToNCisJCQl0Yl9yb29tdCA9IHhfcm9vbXRb M107DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU0JfR1BVOg0KKwkJCXRiX3Jvb210ID0geF9yb29t dFsxXTsNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJYnJlYWs7DQorCQl9DQorDQorCQl0 ZW1wMCA9ICh0cC5kZWdjX2NhbGkgKiAxMCAvIDIpOw0KKwkJdGVtcDEgPSAoKDEwMDAwICogMTAw MDAwIC8gNDA5NiAvIHRwLmdhaW4pICoNCisJCQkgdHAub2UgKyB0Yl9yb29tdCAqIDEwKSAqIDE1 IC8gMTg7DQorDQorCQlpZiAoIXRwLm9fc2xvcGVfc2lnbikNCisJCQl0ZW1wMiA9IHRlbXAxICog MTAwIC8gKDE1MzQgKyB0cC5vX3Nsb3BlICogMTApOw0KKwkJZWxzZQ0KKwkJCXRlbXAyID0gdGVt cDEgKiAxMDAgLyAoMTUzNCAtIHRwLm9fc2xvcGUgKiAxMCk7DQorDQorCQlzdnNiLT5idHMgPSAo dGVtcDAgKyB0ZW1wMiAtIDI1MCkgKiA0IC8gMTA7DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQor fQ0KKw0KK3N0YXRpYyBib29sIHN2c19pc19zdXBwb3J0ZWQoc3RydWN0IG10a19zdnMgKnN2cykN Cit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0K KwlzdHJ1Y3QgbnZtZW1fY2VsbCAqY2VsbDsNCisNCisJLyogR2V0IHN2cyBlZnVzZSBieSBudm1l bSAqLw0KKwljZWxsID0gbnZtZW1fY2VsbF9nZXQoc3ZzLT5kZXYsICJzdnMtY2FsaWJyYXRpb24t ZGF0YSIpOw0KKwlpZiAoSVNfRVJSKGNlbGwpKSB7DQorCQlkZXZfZXJyKHN2cy0+ZGV2LA0KKwkJ CSJubyBcInN2cy1jYWxpYnJhdGlvbi1kYXRhXCIgZnJvbSBkdHM/IGRpc2FibGUgc3ZzXG4iKTsN CisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlzdnMtPmVmdXNlID0gKHUzMiAqKW52bWVtX2Nl bGxfcmVhZChjZWxsLCAmc3ZzLT5lZnVzZV9udW0pOw0KKwlzdnMtPmVmdXNlX251bSAvPSBzaXpl b2YodTMyKTsNCisJbnZtZW1fY2VsbF9wdXQoY2VsbCk7DQorDQorCWlmICghc3ZzcC0+ZmFrZV9l ZnVzZSAmJiAhc3ZzLT5lZnVzZVtzdnNwLT5lZnVzZV9jaGVja10pIHsNCisJCWRldl9lcnIoc3Zz LT5kZXYsICJzdnNfZWZ1c2VbJXVdID0gMHgleD9cbiIsDQorCQkJc3ZzcC0+ZWZ1c2VfY2hlY2ss IHN2cy0+ZWZ1c2Vbc3ZzcC0+ZWZ1c2VfY2hlY2tdKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0K Kw0KKwlyZXR1cm4gc3ZzcC0+ZWZ1c2VfcGFyc2luZyhzdnMpOw0KK30NCisNCitzdGF0aWMgaW50 IHN2c19yZXNvdXJjZV9zZXR1cChzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3Ry dWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFu ayAqc3ZzYjsNCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsNCisJc3RydWN0IGRldmlj ZV9ub2RlICpucCA9IE5VTEw7DQorCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7DQorCXVuc2lnbmVk IGxvbmcgZnJlcTsNCisJaW50IGNvdW50LCByZXQ7DQorCXUzMiBpZHgsIGk7DQorDQorCWRldl9z ZXRfZHJ2ZGF0YShzdnMtPmRldiwgc3ZzKTsNCisNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNw LT5iYW5rX251bTsgaWR4KyspIHsNCisJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisNCisJ CXN3aXRjaCAoc3ZzYi0+c3dfaWQpIHsNCisJCWNhc2UgU1ZTQl9DUFVfTElUVExFOg0KKwkJCXN2 c2ItPm5hbWUgPSAiU1ZTQl9DUFVfTElUVExFIjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTQl9D UFVfQklHOg0KKwkJCXN2c2ItPm5hbWUgPSAiU1ZTQl9DUFVfQklHIjsNCisJCQlicmVhazsNCisJ CWNhc2UgU1ZTQl9DQ0k6DQorCQkJc3ZzYi0+bmFtZSA9ICJTVlNCX0NDSSI7DQorCQkJYnJlYWs7 DQorCQljYXNlIFNWU0JfR1BVOg0KKwkJCXN2c2ItPm5hbWUgPSAiU1ZTQl9HUFUiOw0KKwkJCWJy ZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlXQVJOX09OKDEpOw0KKwkJCXJldHVybiAtRUlOVkFMOw0K KwkJfQ0KKw0KKwkJLyogQWRkIHN2cyBiYW5rIGRldmljZSBmb3Igb3BwLXRhYmxlL210Y21vcy9i dWNrIGNvbnRyb2wgKi8NCisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2Moc3ZzYi0+bmFt ZSwgMCk7DQorCQlpZiAoIXBkZXYpIHsNCisJCQlkZXZfZXJyKHN2cy0+ZGV2LCAiJXM6IGFsbG9j IHBkZXYgZmFpbFxuIiwgc3ZzYi0+bmFtZSk7DQorCQkJcmV0dXJuIC1FTk9NRU07DQorCQl9DQor DQorCQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHN2cy0+ZGV2LT5vZl9ub2RlLCBucCkgew0KKwkJ CWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgc3ZzYi0+b2ZfY29tcGF0aWJsZSkpIHsN CisJCQkJcGRldi0+ZGV2Lm9mX25vZGUgPSBucDsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0K Kw0KKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsNCisJCWlmIChyZXQpIHsNCisJ CQlkZXZfZXJyKHN2cy0+ZGV2LCAiJXM6IGFkZCBkZXZpY2UgZmFpbDogJWRcbiIsDQorCQkJCXN2 c2ItPm5hbWUsIHJldCk7DQorCQkJcmV0dXJuIHJldDsNCisJCX0NCisNCisJCXN2c2ItPmRldiA9 ICZwZGV2LT5kZXY7DQorCQlkZXZfc2V0X2RydmRhdGEoc3ZzYi0+ZGV2LCBzdnMpOw0KKwkJcmV0 ID0gZGV2X3BtX29wcF9vZl9hZGRfdGFibGUoc3ZzYi0+ZGV2KTsNCisJCWlmIChyZXQpIHsNCisJ CQlkZXZfZXJyKHN2c2ItPmRldiwgImFkZCBvcHAgdGFibGUgZmFpbDogJWRcbiIsIHJldCk7DQor CQkJcmV0dXJuIHJldDsNCisJCX0NCisNCisJCW11dGV4X2luaXQoJnN2c2ItPmxvY2spOw0KKw0K KwkJc3ZzYi0+YnVjayA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChzdnNiLT5kZXYsDQor CQkJCQkJCSBzdnNiLT5idWNrX25hbWUpOw0KKwkJaWYgKElTX0VSUihzdnNiLT5idWNrKSkgew0K KwkJCWRldl9lcnIoc3ZzYi0+ZGV2LCAiY2Fubm90IGdldCBcIiVzLXN1cHBseVwiXG4iLA0KKwkJ CQlzdnNiLT5idWNrX25hbWUpOw0KKwkJCXJldHVybiBQVFJfRVJSKHN2c2ItPmJ1Y2spOw0KKwkJ fQ0KKw0KKwkJY291bnQgPSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoc3ZzYi0+ZGV2KTsNCisJ CWlmIChzdnNiLT5vcHBfY291bnQgIT0gY291bnQpIHsNCisJCQlkZXZfZXJyKHN2c2ItPmRldiwN CisJCQkJIm9wcF9jb3VudCBub3QgXCIldVwiIGJ1dCBnZXQgXCIlZFwiP1xuIiwNCisJCQkJc3Zz Yi0+b3BwX2NvdW50LCBjb3VudCk7DQorCQkJcmV0dXJuIGNvdW50Ow0KKwkJfQ0KKw0KKwkJZm9y IChpID0gMCwgZnJlcSA9IFUzMl9NQVg7IGkgPCBzdnNiLT5vcHBfY291bnQ7IGkrKywgZnJlcS0t KSB7DQorCQkJb3BwID0gZGV2X3BtX29wcF9maW5kX2ZyZXFfZmxvb3Ioc3ZzYi0+ZGV2LCAmZnJl cSk7DQorCQkJaWYgKElTX0VSUihvcHApKSB7DQorCQkJCWRldl9lcnIoc3ZzYi0+ZGV2LCAiY2Fu bm90IGZpbmQgZnJlcSA9ICVsZFxuIiwNCisJCQkJCVBUUl9FUlIob3BwKSk7DQorCQkJCXJldHVy biBQVFJfRVJSKG9wcCk7DQorCQkJfQ0KKw0KKwkJCXN2c2ItPm9wcF9mcmVxc1tpXSA9IGZyZXE7 DQorCQkJc3ZzYi0+b3BwX3ZvbHRzW2ldID0gZGV2X3BtX29wcF9nZXRfdm9sdGFnZShvcHApOw0K KwkJCXN2c2ItPmZyZXFzX3BjdFtpXSA9IHBlcmNlbnQoc3ZzYi0+b3BwX2ZyZXFzW2ldLA0KKwkJ CQkJCSAgICAgc3ZzYi0+ZnJlcV9iYXNlKTsNCisJCQlkZXZfcG1fb3BwX3B1dChvcHApOw0KKwkJ fQ0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHN2c19zdXNwZW5kKHN0 cnVjdCBkZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCBtdGtfc3ZzICpzdnMgPSBkZXZfZ2V0X2Ry dmRhdGEoZGV2KTsNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxh dGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYjsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsN CisJaW50IHJldDsNCisJdTMyIGlkeDsNCisNCisJLyogV2FpdCBpZiBzdnNfaXNyKCkgaXMgc3Rp bGwgaW4gcHJvZWNlc3MuIFN1c3BlbmQgYWxsIGJhbmtzLiAqLw0KKwlmbGFncyA9IGNsYWltX210 a19zdnNfbG9jaygpOw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgr Kykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJc3ZzLT5wYmFuayA9IHN2c2I7 DQorCQlzdnNfc3dpdGNoX2Jhbmsoc3ZzKTsNCisJCXN2c193cml0ZWwoc3ZzLCBTVlNCX0VOX09G RiwgU1ZTRU4pOw0KKwkJc3ZzX3dyaXRlbChzdnMsIFNWU0JfSU5UU1RTX0NMRUFOLCBJTlRTVFMp Ow0KKwkJc3ZzYi0+c3VzcGVuZGVkID0gdHJ1ZTsNCisJfQ0KKwlyZWxlYXNlX210a19zdnNfbG9j ayhmbGFncyk7DQorDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsr KSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlpZiAoc3ZzYi0+cGhhc2UgIT0g U1ZTQl9QSEFTRV9JTklUMDEpIHsNCisJCQlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfRVJST1I7 DQorCQkJc3ZzX2FkanVzdF9wbV9vcHBfdm9sdHMoc3ZzYiwgdHJ1ZSk7DQorCQl9DQorCX0NCisN CisJaWYgKHN2c3AtPm5lZWRfaHdfcmVzZXQpIHsNCisJCXJldCA9IGRldmljZV9yZXNldChzdnMt PmRldik7DQorCQlpZiAocmV0KSB7DQorCQkJZGV2X2VycihzdnMtPmRldiwgImRldmljZSByZXNl dCBmYWlsID0gJWRcbiIsIHJldCk7DQorCQkJcmV0dXJuIHJldDsNCisJCX0NCisJfQ0KKw0KKwlj bGtfZGlzYWJsZV91bnByZXBhcmUoc3ZzLT5tYWluX2Nsayk7DQorDQorCXJldHVybiAwOw0KK30N CisNCitzdGF0aWMgaW50IHN2c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQ0KK3sNCisJc3Ry dWN0IG10a19zdnMgKnN2cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KKwljb25zdCBzdHJ1Y3Qg c3ZzX3BsYXRmb3JtICpzdnNwID0gc3ZzLT5wbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpz dnNiOw0KKwlpbnQgcmV0Ow0KKwl1MzIgaWR4Ow0KKw0KKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFi bGUoc3ZzLT5tYWluX2Nsayk7DQorCWlmIChyZXQpIHsNCisJCWRldl9lcnIoc3ZzLT5kZXYsICJj YW5ub3QgZW5hYmxlIG1haW5fY2xrLCBkaXNhYmxlIHN2c1xuIik7DQorCQlyZXR1cm4gcmV0Ow0K Kwl9DQorDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQor CQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzdnNiLT5zdXNwZW5kZWQgPSBmYWxzZTsN CisJfQ0KKw0KKwlyZXQgPSBzdnNfaW5pdDAyKHN2cyk7DQorCWlmIChyZXQpDQorCQlyZXR1cm4g cmV0Ow0KKw0KKwlzdnNfbW9uX21vZGUoc3ZzKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0 YXRpYyBzdHJ1Y3Qgc3ZzX2Jhbmsgc3ZzX210ODE4M19iYW5rc1s0XSA9IHsNCisJew0KKwkJLm9m X2NvbXBhdGlibGUJCT0gIm1lZGlhdGVrLG10ODE4My1zdnMtY3B1LWxpdHRsZSIsDQorCQkuc3df aWQJCQk9IFNWU0JfQ1BVX0xJVFRMRSwNCisJCS50em9uZV9uYW1lCQk9ICJ0enRzNCIsDQorCQku YnVja19uYW1lCQk9ICJ2Y3B1LWxpdHRsZSIsDQorCQkubXRjbW9zX3JlcXVlc3QJCT0gZmFsc2Us DQorCQkuaW5pdDAxX3ZvbHRfZmxhZwk9IFNWU0JfSU5JVDAxX1ZPTFRfSU5DX09OTFksDQorCQku bW9kZV9zdXBwb3J0CQk9IFNWU0JfTU9ERV9JTklUMDEgfCBTVlNCX01PREVfSU5JVDAyLA0KKwkJ Lm9wcF9jb3VudAkJPSAxNiwNCisJCS5mcmVxX2Jhc2UJCT0gMTk4OTAwMDAwMCwNCisJCS52Ym9v dAkJCT0gMHgzMCwNCisJCS52b2x0X3N0ZXAJCT0gNjI1MCwNCisJCS52b2x0X2Jhc2UJCT0gNTAw MDAwLA0KKwkJLnZvbHRfb2Zmc2V0CQk9IDAsDQorCQkudm1heAkJCT0gMHg2NCwNCisJCS52bWlu CQkJPSAweDE4LA0KKwkJLmR0aGkJCQk9IDB4MSwNCisJCS5kdGxvCQkJPSAweGZlLA0KKwkJLmRl dF93aW5kb3cJCT0gMHhhMjgsDQorCQkuZGV0X21heAkJPSAweGZmZmYsDQorCQkuYWdlX2NvbmZp ZwkJPSAweDU1NTU1NSwNCisJCS5hZ2VtCQkJPSAwLA0KKwkJLmRjX2NvbmZpZwkJPSAweDU1NTU1 NSwNCisJCS5kdnRfZml4ZWQJCT0gMHg3LA0KKwkJLnZjbwkJCT0gMHgxMCwNCisJCS5jaGtfc2hp ZnQJCT0gMHg3NywNCisJCS50ZW1wX3VwcGVyX2JvdW5kCT0gMHg2NCwNCisJCS50ZW1wX2xvd2Vy X2JvdW5kCT0gMHhiMiwNCisJCS50em9uZV9oaWdoX3RlbXAJPSBTVlNCX1RaT05FX0hJR0hfVEVN UF9NQVgsDQorCQkudHpvbmVfbG93X3RlbXAJCT0gMjUwMDAsDQorCQkudHpvbmVfbG93X3RlbXBf b2Zmc2V0CT0gMCwNCisJCS5jb3JlX3NlbAkJPSAweDhmZmYwMDAwLA0KKwkJLmludF9zdAkJCT0g QklUKDApLA0KKwkJLmN0bDAJCQk9IDB4MDAwMTAwMDEsDQorCX0sDQorCXsNCisJCS5vZl9jb21w YXRpYmxlCQk9ICJtZWRpYXRlayxtdDgxODMtc3ZzLWNwdS1iaWciLA0KKwkJLnN3X2lkCQkJPSBT VlNCX0NQVV9CSUcsDQorCQkudHpvbmVfbmFtZQkJPSAidHp0czUiLA0KKwkJLmJ1Y2tfbmFtZQkJ PSAidmNwdS1iaWciLA0KKwkJLm10Y21vc19yZXF1ZXN0CQk9IGZhbHNlLA0KKwkJLmluaXQwMV92 b2x0X2ZsYWcJPSBTVlNCX0lOSVQwMV9WT0xUX0lOQ19PTkxZLA0KKwkJLm1vZGVfc3VwcG9ydAkJ PSBTVlNCX01PREVfSU5JVDAxIHwgU1ZTQl9NT0RFX0lOSVQwMiwNCisJCS5vcHBfY291bnQJCT0g MTYsDQorCQkuZnJlcV9iYXNlCQk9IDE5ODkwMDAwMDAsDQorCQkudmJvb3QJCQk9IDB4MzAsDQor CQkudm9sdF9zdGVwCQk9IDYyNTAsDQorCQkudm9sdF9iYXNlCQk9IDUwMDAwMCwNCisJCS52b2x0 X29mZnNldAkJPSAwLA0KKwkJLnZtYXgJCQk9IDB4NTgsDQorCQkudm1pbgkJCT0gMHgxMCwNCisJ CS5kdGhpCQkJPSAweDEsDQorCQkuZHRsbwkJCT0gMHhmZSwNCisJCS5kZXRfd2luZG93CQk9IDB4 YTI4LA0KKwkJLmRldF9tYXgJCT0gMHhmZmZmLA0KKwkJLmFnZV9jb25maWcJCT0gMHg1NTU1NTUs DQorCQkuYWdlbQkJCT0gMCwNCisJCS5kY19jb25maWcJCT0gMHg1NTU1NTUsDQorCQkuZHZ0X2Zp eGVkCQk9IDB4NywNCisJCS52Y28JCQk9IDB4MTAsDQorCQkuY2hrX3NoaWZ0CQk9IDB4NzcsDQor CQkudGVtcF91cHBlcl9ib3VuZAk9IDB4NjQsDQorCQkudGVtcF9sb3dlcl9ib3VuZAk9IDB4YjIs DQorCQkudHpvbmVfaGlnaF90ZW1wCT0gU1ZTQl9UWk9ORV9ISUdIX1RFTVBfTUFYLA0KKwkJLnR6 b25lX2xvd190ZW1wCQk9IDI1MDAwLA0KKwkJLnR6b25lX2xvd190ZW1wX29mZnNldAk9IDAsDQor CQkuY29yZV9zZWwJCT0gMHg4ZmZmMDAwMSwNCisJCS5pbnRfc3QJCQk9IEJJVCgxKSwNCisJCS5j dGwwCQkJPSAweDAwMDAwMDAxLA0KKwl9LA0KKwl7DQorCQkub2ZfY29tcGF0aWJsZQkJPSAibWVk aWF0ZWssbXQ4MTgzLXN2cy1jY2kiLA0KKwkJLnN3X2lkCQkJPSBTVlNCX0NDSSwNCisJCS50em9u ZV9uYW1lCQk9ICJ0enRzNCIsDQorCQkuYnVja19uYW1lCQk9ICJ2Y2NpIiwNCisJCS5tdGNtb3Nf cmVxdWVzdAkJPSBmYWxzZSwNCisJCS5pbml0MDFfdm9sdF9mbGFnCT0gU1ZTQl9JTklUMDFfVk9M VF9JTkNfT05MWSwNCisJCS5tb2RlX3N1cHBvcnQJCT0gU1ZTQl9NT0RFX0lOSVQwMSB8IFNWU0Jf TU9ERV9JTklUMDIsDQorCQkub3BwX2NvdW50CQk9IDE2LA0KKwkJLmZyZXFfYmFzZQkJPSAxMTk2 MDAwMDAwLA0KKwkJLnZib290CQkJPSAweDMwLA0KKwkJLnZvbHRfc3RlcAkJPSA2MjUwLA0KKwkJ LnZvbHRfYmFzZQkJPSA1MDAwMDAsDQorCQkudm9sdF9vZmZzZXQJCT0gMCwNCisJCS52bWF4CQkJ PSAweDY0LA0KKwkJLnZtaW4JCQk9IDB4MTgsDQorCQkuZHRoaQkJCT0gMHgxLA0KKwkJLmR0bG8J CQk9IDB4ZmUsDQorCQkuZGV0X3dpbmRvdwkJPSAweGEyOCwNCisJCS5kZXRfbWF4CQk9IDB4ZmZm ZiwNCisJCS5hZ2VfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmFnZW0JCQk9IDAsDQorCQkuZGNf Y29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmR2dF9maXhlZAkJPSAweDcsDQorCQkudmNvCQkJPSAw eDEwLA0KKwkJLmNoa19zaGlmdAkJPSAweDc3LA0KKwkJLnRlbXBfdXBwZXJfYm91bmQJPSAweDY0 LA0KKwkJLnRlbXBfbG93ZXJfYm91bmQJPSAweGIyLA0KKwkJLnR6b25lX2hpZ2hfdGVtcAk9IFNW U0JfVFpPTkVfSElHSF9URU1QX01BWCwNCisJCS50em9uZV9sb3dfdGVtcAkJPSAyNTAwMCwNCisJ CS50em9uZV9sb3dfdGVtcF9vZmZzZXQJPSAwLA0KKwkJLmNvcmVfc2VsCQk9IDB4OGZmZjAwMDIs DQorCQkuaW50X3N0CQkJPSBCSVQoMiksDQorCQkuY3RsMAkJCT0gMHgwMDEwMDAwMywNCisJfSwN CisJew0KKwkJLm9mX2NvbXBhdGlibGUJCT0gIm1lZGlhdGVrLG10ODE4My1zdnMtZ3B1IiwNCisJ CS5zd19pZAkJCT0gU1ZTQl9HUFUsDQorCQkudHpvbmVfbmFtZQkJPSAidHp0czIiLA0KKwkJLmJ1 Y2tfbmFtZQkJPSAidmdwdSIsDQorCQkubXRjbW9zX3JlcXVlc3QJCT0gdHJ1ZSwNCisJCS5pbml0 MDFfdm9sdF9mbGFnCT0gU1ZTQl9JTklUMDFfVk9MVF9JTkNfT05MWSwNCisJCS5tb2RlX3N1cHBv cnQJCT0gU1ZTQl9NT0RFX0lOSVQwMSB8IFNWU0JfTU9ERV9JTklUMDIgfA0KKwkJCQkJICBTVlNC X01PREVfTU9OLA0KKwkJLm9wcF9jb3VudAkJPSAxNiwNCisJCS5mcmVxX2Jhc2UJCT0gOTAwMDAw MDAwLA0KKwkJLnZib290CQkJPSAweDMwLA0KKwkJLnZvbHRfc3RlcAkJPSA2MjUwLA0KKwkJLnZv bHRfYmFzZQkJPSA1MDAwMDAsDQorCQkudm9sdF9vZmZzZXQJCT0gMCwNCisJCS52bWF4CQkJPSAw eDQwLA0KKwkJLnZtaW4JCQk9IDB4MTQsDQorCQkuZHRoaQkJCT0gMHgxLA0KKwkJLmR0bG8JCQk9 IDB4ZmUsDQorCQkuZGV0X3dpbmRvdwkJPSAweGEyOCwNCisJCS5kZXRfbWF4CQk9IDB4ZmZmZiwN CisJCS5hZ2VfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmFnZW0JCQk9IDAsDQorCQkuZGNfY29u ZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmR2dF9maXhlZAkJPSAweDMsDQorCQkudmNvCQkJPSAweDEw LA0KKwkJLmNoa19zaGlmdAkJPSAweDc3LA0KKwkJLnRlbXBfdXBwZXJfYm91bmQJPSAweDY0LA0K KwkJLnRlbXBfbG93ZXJfYm91bmQJPSAweGIyLA0KKwkJLnR6b25lX2hpZ2hfdGVtcAk9IFNWU0Jf VFpPTkVfSElHSF9URU1QX01BWCwNCisJCS50em9uZV9sb3dfdGVtcAkJPSAyNTAwMCwNCisJCS50 em9uZV9sb3dfdGVtcF9vZmZzZXQJPSAzLA0KKwkJLmNvcmVfc2VsCQk9IDB4OGZmZjAwMDMsDQor CQkuaW50X3N0CQkJPSBCSVQoMyksDQorCQkuY3RsMAkJCT0gMHgwMDA1MDAwMSwNCisJfSwNCit9 Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtIHN2c19tdDgxODNfcGxhdGZv cm0gPSB7DQorCS5uYW1lCQkJPSAibXQ4MTgzLXN2cyIsDQorCS5zdXBwbGllcnMJCT0geyJ0aGVy bWFsIiwgIm1hbGkifSwNCisJLmJhbmtzCQkJPSBzdnNfbXQ4MTgzX2JhbmtzLA0KKwkuZWZ1c2Vf cGFyc2luZwkJPSBzdnNfbXQ4MTgzX2VmdXNlX3BhcnNpbmcsDQorCS5zZXRfZnJlcXNfcGN0CQk9 IHN2c19zZXRfZnJlcXNfcGN0X3YyLA0KKwkuZ2V0X3ZvcHMJCT0gc3ZzX2dldF92b3BzX3YyLA0K KwkucmVncwkJCT0gc3ZzX3JlZ3NfdjIsDQorCS5pcnFmbGFncwkJPSBJUlFGX1RSSUdHRVJfTE9X IHwgSVJRRl9PTkVTSE9ULA0KKwkubmVlZF9od19yZXNldAkJPSBmYWxzZSwNCisJLmZha2VfZWZ1 c2UJCT0gZmFsc2UsDQorCS5iYW5rX251bQkJPSA0LA0KKwkuZWZ1c2VfY2hlY2sJCT0gMiwNCit9 Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10a19zdnNfb2ZfbWF0Y2hb XSA9IHsNCisJew0KKwkJLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTgzLXN2cyIsDQorCQku ZGF0YSA9ICZzdnNfbXQ4MTgzX3BsYXRmb3JtLA0KKwl9LCB7DQorCQkvKiBTZW50aW5lbCAqLw0K Kwl9LA0KK307DQorDQorc3RhdGljIGludCBzdnNfYWRkX3N1cHBsaWVyX2RldmljZV9saW5rKHN0 cnVjdCBtdGtfc3ZzICpzdnMpDQorew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpzdnNw ID0gc3ZzLT5wbGF0Zm9ybTsNCisJc3RydWN0IGRldmljZV9ub2RlICpzdXBfbm9kZTsNCisJc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqc3VwX3BkZXY7DQorCXN0cnVjdCBkZXZpY2VfbGluayAqc3Vw X2xpbms7DQorCXUzMiBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdnNwLT5z dXBwbGllcnMpOyBpKyspIHsNCisJCWlmICghc3ZzcC0+c3VwcGxpZXJzW2ldKQ0KKwkJCWNvbnRp bnVlOw0KKw0KKwkJc3VwX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCBzdnNwLT5z dXBwbGllcnNbaV0pOw0KKwkJaWYgKCFzdXBfbm9kZSkgew0KKwkJCWRldl9ub3RpY2Uoc3ZzLT5k ZXYsICJubyAlcyBub2RlPyBwYXNzIGRldi1saW5rXG4iLA0KKwkJCQkgICBzdnNwLT5zdXBwbGll cnNbaV0pOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKw0KKwkJc3VwX3BkZXYgPSBvZl9maW5kX2Rl dmljZV9ieV9ub2RlKHN1cF9ub2RlKTsNCisJCWlmICghc3VwX3BkZXYpIHsNCisJCQlkZXZfbm90 aWNlKHN2cy0+ZGV2LCAibm8gJXBPRiBwZGV2PyBwYXNzIGRldi1saW5rXG4iLA0KKwkJCQkgICBz dXBfbm9kZSk7DQorCQkJb2Zfbm9kZV9wdXQoc3VwX25vZGUpOw0KKwkJCWNvbnRpbnVlOw0KKwkJ fQ0KKw0KKwkJb2Zfbm9kZV9wdXQoc3VwX25vZGUpOw0KKw0KKwkJc3VwX2xpbmsgPSBkZXZpY2Vf bGlua19hZGQoc3ZzLT5kZXYsICZzdXBfcGRldi0+ZGV2LA0KKwkJCQkJICAgRExfRkxBR19BVVRP UkVNT1ZFX0NPTlNVTUVSKTsNCisNCisJCWlmIChzdXBfbGluay0+c3RhdHVzID09IERMX1NUQVRF X0RPUk1BTlQpDQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7DQorCX0NCisNCisJcmV0dXJuIDA7 DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQorew0KKwlzdHJ1Y3QgbXRrX3N2cyAqc3ZzOw0KKwl1bnNpZ25lZCBpbnQgc3ZzX2lycTsN CisJaW50IHJldDsNCisNCisJc3ZzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigq c3ZzKSwgR0ZQX0tFUk5FTCk7DQorCWlmICghc3ZzKQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorDQor CXN2cy0+ZGV2ID0gJnBkZXYtPmRldjsNCisJc3ZzLT5wbGF0Zm9ybSA9IG9mX2RldmljZV9nZXRf bWF0Y2hfZGF0YShzdnMtPmRldik7DQorCWlmICghc3ZzLT5wbGF0Zm9ybSkgew0KKwkJZGV2X2Vy cihzdnMtPmRldiwgInN2cyBwbGF0Zm9ybSBkYXRhIGlzbid0IHNldCB5ZXRcbiIpOw0KKwkJcmV0 dXJuIC1FUEVSTTsNCisJfQ0KKw0KKwlyZXQgPSBzdnNfYWRkX3N1cHBsaWVyX2RldmljZV9saW5r KHN2cyk7DQorCWlmIChyZXQpDQorCQlyZXR1cm4gcmV0Ow0KKw0KKwlzdnMtPmJhc2UgPSBvZl9p b21hcChzdnMtPmRldi0+b2Zfbm9kZSwgMCk7DQorCWlmIChJU19FUlIoc3ZzLT5iYXNlKSkgew0K KwkJZGV2X2VycihzdnMtPmRldiwgImNhbm5vdCBmaW5kIHN2cyByZWdpc3RlciBiYXNlXG4iKTsN CisJCXJldHVybiBQVFJfRVJSKHN2cy0+YmFzZSk7DQorCX0NCisNCisJc3ZzX2lycSA9IGlycV9v Zl9wYXJzZV9hbmRfbWFwKHN2cy0+ZGV2LT5vZl9ub2RlLCAwKTsNCisJcmV0ID0gZGV2bV9yZXF1 ZXN0X3RocmVhZGVkX2lycShzdnMtPmRldiwgc3ZzX2lycSwgTlVMTCwgc3ZzX2lzciwNCisJCQkJ CXN2cy0+cGxhdGZvcm0tPmlycWZsYWdzLCAibXRrLXN2cyIsDQorCQkJCQlzdnMpOw0KKwlpZiAo cmV0KSB7DQorCQlkZXZfZXJyKHN2cy0+ZGV2LCAicmVnaXN0ZXIgaXJxKCVkKSBmYWlsZWQ6ICVk XG4iLA0KKwkJCXN2c19pcnEsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorDQorCXN2cy0+ bWFpbl9jbGsgPSBkZXZtX2Nsa19nZXQoc3ZzLT5kZXYsICJtYWluIik7DQorCWlmIChJU19FUlIo c3ZzLT5tYWluX2NsaykpIHsNCisJCWRldl9lcnIoc3ZzLT5kZXYsICJmYWlsZWQgdG8gZ2V0IGNs b2NrOiAlbGRcbiIsDQorCQkJUFRSX0VSUihzdnMtPm1haW5fY2xrKSk7DQorCQlyZXR1cm4gUFRS X0VSUihzdnMtPm1haW5fY2xrKTsNCisJfQ0KKw0KKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUo c3ZzLT5tYWluX2Nsayk7DQorCWlmIChyZXQpIHsNCisJCWRldl9lcnIoc3ZzLT5kZXYsICJjYW5u b3QgZW5hYmxlIG1haW4gY2xrOiAlZFxuIiwgcmV0KTsNCisJCXJldHVybiByZXQ7DQorCX0NCisN CisJaWYgKCFzdnNfaXNfc3VwcG9ydGVkKHN2cykpIHsNCisJCWRldl9ub3RpY2Uoc3ZzLT5kZXYs ICJzdnMgaXMgbm90IHN1cHBvcnRlZFxuIik7DQorCQlyZXQgPSAtRVBFUk07DQorCQlnb3RvIHN2 c19wcm9iZV9jbGtfZGlzYWJsZTsNCisJfQ0KKw0KKwlyZXQgPSBzdnNfcmVzb3VyY2Vfc2V0dXAo c3ZzKTsNCisJaWYgKHJldCkNCisJCWdvdG8gc3ZzX3Byb2JlX2Nsa19kaXNhYmxlOw0KKw0KKwly ZXQgPSBzdnNfc3RhcnQoc3ZzKTsNCisJaWYgKHJldCkNCisJCWdvdG8gc3ZzX3Byb2JlX2Nsa19k aXNhYmxlOw0KKw0KKwlyZXR1cm4gMDsNCisNCitzdnNfcHJvYmVfY2xrX2Rpc2FibGU6DQorCWNs a19kaXNhYmxlX3VucHJlcGFyZShzdnMtPm1haW5fY2xrKTsNCisNCisJcmV0dXJuIHJldDsNCit9 DQorDQorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHN2c19wbV9vcHMsIHN2c19zdXNwZW5kLCBz dnNfcmVzdW1lKTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdnNfZHJpdmVy ID0gew0KKwkucHJvYmUJPSBzdnNfcHJvYmUsDQorCS5kcml2ZXIJPSB7DQorCQkubmFtZQkJPSAi bXRrLXN2cyIsDQorCQkucG0JCT0gJnN2c19wbV9vcHMsDQorCQkub2ZfbWF0Y2hfdGFibGUJPSBv Zl9tYXRjaF9wdHIobXRrX3N2c19vZl9tYXRjaCksDQorCX0sDQorfTsNCisNCittb2R1bGVfcGxh dGZvcm1fZHJpdmVyKHN2c19kcml2ZXIpOw0KKw0KK01PRFVMRV9BVVRIT1IoIlJvZ2VyIEx1IDxy b2dlci5sdUBtZWRpYXRlay5jb20+Iik7DQorTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYVRlayBT VlMgZHJpdmVyIik7DQorTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOw0KZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvcG93ZXIvbXRrX3N2cy5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9tdGtfc3Zz LmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjVjMDM5ODJlMzU3 Ng0KLS0tIC9kZXYvbnVsbA0KKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9tdGtfc3ZzLmgNCkBA IC0wLDAgKzEsMjMgQEANCisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKyAq DQorICogQ29weXJpZ2h0IChDKSAyMDIwIE1lZGlhVGVrIEluYy4NCisgKi8NCisNCisjaWZuZGVm IF9fTVRLX1NWU19IX18NCisjZGVmaW5lIF9fTVRLX1NWU19IX18NCisNCisjaWYgSVNfRU5BQkxF RChDT05GSUdfTVRLX1NWUykNCit1bnNpZ25lZCBsb25nIGNsYWltX210a19zdnNfbG9jayh2b2lk KTsNCit2b2lkIHJlbGVhc2VfbXRrX3N2c19sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpOw0KKyNl bHNlDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNsYWltX210a19zdnNfbG9jayh2b2lk KQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX210 a19zdnNfbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKQ0KK3sNCit9DQorI2VuZGlmIC8qIENPTkZJ R19NVEtfU1ZTICovDQorDQorI2VuZGlmIC8qIF9fTVRLX1NWU19IX18gKi8NCi0tIA0KMi4xOC4w DQo=