From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Harrison Subject: Re: [PATCH v5 06/35] drm/i915: Start of GPU scheduler Date: Fri, 19 Feb 2016 17:03:37 +0000 Message-ID: <56C74AE9.90009@Intel.com> References: <1455805644-6450-1-git-send-email-John.C.Harrison@Intel.com> <1455805644-6450-7-git-send-email-John.C.Harrison@Intel.com> <1455886981.7321.89.camel@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id 3D0BC6F02B for ; Fri, 19 Feb 2016 17:03:41 +0000 (UTC) In-Reply-To: <1455886981.7321.89.camel@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Joonas Lahtinen , Intel-GFX@Lists.FreeDesktop.Org List-Id: intel-gfx@lists.freedesktop.org T24gMTkvMDIvMjAxNiAxMzowMywgSm9vbmFzIExhaHRpbmVuIHdyb3RlOgo+IEhpLAo+Cj4gTm93 IHRoZSBjb2RlIGlzIGluIHJldmlld2FibGUgY2h1bmtzLCBleGNlbGxlbnQhCj4KPiBJJ3ZlIGFk ZGVkIG15IGNvbW1lbnRzIGJlbG93LiBBIGZldyByZXBlYXRzIGZyb20gbGFzdCByb3VuZCwgYnV0 IG5vdwo+IHdpdGggbW9yZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGxvZ2ljIGl0c2VsZi4KPgo+IE9u IHRvLCAyMDE2LTAyLTE4IGF0IDE0OjI2ICswMDAwLCBKb2huLkMuSGFycmlzb25ASW50ZWwuY29t IHdyb3RlOgo+PiBGcm9tOiBKb2huIEhhcnJpc29uIDxKb2huLkMuSGFycmlzb25ASW50ZWwuY29t Pgo+Pgo+PiBJbml0aWFsIGNyZWF0aW9uIG9mIHNjaGVkdWxlciBzb3VyY2UgZmlsZXMuIE5vdGUg dGhhdCB0aGlzIHBhdGNoCj4+IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgc2NoZWR1bGVyIGZ1bmN0 aW9uYWxpdHkgYnV0IGRvZXMgbm90IGhvb2sgaXQgaW4KPj4gdG8gdGhlIGRyaXZlciB5ZXQuIEl0 IGFsc28gbGVhdmVzIHRoZSBzY2hlZHVsZXIgY29kZSBpbiAncGFzcyB0aHJvdWdoJwo+PiBtb2Rl IHNvIHRoYXQgZXZlbiB3aGVuIGl0IGlzIGhvb2tlZCBpbiwgaXQgd2lsbCBub3QgYWN0dWFsbHkg ZG8gdmVyeQo+PiBtdWNoLiBUaGlzIGFsbG93cyB0aGUgaG9va3MgdG8gYmUgYWRkZWQgb25lIGF0 IGEgdGltZSBpbiBiaXRlIHNpemUKPj4gY2h1bmtzIGFuZCBvbmx5IHdoZW4gdGhlIHNjaGVkdWxl ciBpcyBmaW5hbGx5IGVuYWJsZWQgYXQgdGhlIGVuZCBkb2VzCj4+IGFueXRoaW5nIHN0YXJ0IGhh cHBlbmluZy4KPj4KPj4gVGhlIGdlbmVyYWwgdGhlb3J5IG9mIG9wZXJhdGlvbiBpcyB0aGF0IHdo ZW4gYmF0Y2ggYnVmZmVycyBhcmUKPj4gc3VibWl0dGVkIHRvIHRoZSBkcml2ZXIsIHRoZSBleGVj YnVmZmVyKCkgY29kZSBwYWNrYWdlcyB1cCBhbGwgdGhlCj4+IGluZm9ybWF0aW9uIHJlcXVpcmVk IHRvIGV4ZWN1dGUgdGhlIGJhdGNoIGJ1ZmZlciBhdCBhIGxhdGVyIHRpbWUuIFRoaXMKPj4gcGFj a2FnZSBpcyBnaXZlbiBvdmVyIHRvIHRoZSBzY2hlZHVsZXIgd2hpY2ggYWRkcyBpdCB0byBhbiBp bnRlcm5hbAo+PiBub2RlIGxpc3QuIFRoZSBzY2hlZHVsZXIgYWxzbyBzY2FucyB0aGUgbGlzdCBv ZiBvYmplY3RzIGFzc29jaWF0ZWQKPj4gd2l0aCB0aGUgYmF0Y2ggYnVmZmVyIGFuZCBjb21wYXJl cyB0aGVtIGFnYWluc3QgdGhlIG9iamVjdHMgYWxyZWFkeSBpbgo+PiB1c2UgYnkgb3RoZXIgYnVm ZmVycyBpbiB0aGUgbm9kZSBsaXN0LiBJZiBtYXRjaGVzIGFyZSBmb3VuZCB0aGVuIHRoZQo+PiBu ZXcgYmF0Y2ggYnVmZmVyIG5vZGUgaXMgbWFya2VkIGFzIGJlaW5nIGRlcGVuZGVudCB1cG9uIHRo ZSBtYXRjaGluZwo+PiBub2RlLiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgY29udGV4dCBvYmpl Y3QuIFRoZSBzY2hlZHVsZXIgYWxzbwo+PiBidW1wcyB1cCB0aGUgcHJpb3JpdHkgb2Ygc3VjaCBt YXRjaGluZyBub2RlcyBvbiB0aGUgZ3JvdW5kcyB0aGF0IHRoZQo+PiBtb3JlIGRlcGVuZGVuY2ll cyBhIGdpdmVuIGJhdGNoIGJ1ZmZlciBoYXMgdGhlIG1vcmUgaW1wb3J0YW50IGl0IGlzCj4+IGxp a2VseSB0byBiZS4KPj4KPj4gVGhlIHNjaGVkdWxlciBhaW1zIHRvIGhhdmUgYSBnaXZlbiAodHVu ZWFibGUpIG51bWJlciBvZiBiYXRjaCBidWZmZXJzCj4+IGluIGZsaWdodCBvbiB0aGUgaGFyZHdh cmUgYXQgYW55IGdpdmVuIHRpbWUuIElmIGZld2VyIHRoYW4gdGhpcyBhcmUKPj4gY3VycmVudGx5 IGV4ZWN1dGluZyB3aGVuIGEgbmV3IG5vZGUgaXMgcXVldWVkLCB0aGVuIHRoZSBub2RlIGlzIHBh c3NlZAo+PiBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBzdWJtaXQgZnVuY3Rpb24uIE90aGVyd2lz ZSBpdCBpcyBzaW1wbHkgYWRkZWQKPj4gdG8gdGhlIHF1ZXVlIGFuZCB0aGUgZHJpdmVyIHJldHVy bnMgYmFjayB0byB1c2VyIGxhbmQuCj4+Cj4+IFRoZSBzY2hlZHVsZXIgaXMgbm90aWZpZWQgd2hl biBlYWNoIGJhdGNoIGJ1ZmZlciBjb21wbGV0ZXMgYW5kIHVwZGF0ZXMKPj4gaXRzIGludGVybmFs IHRyYWNraW5nIGFjY29yZGluZ2x5LiBBdCB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uCj4+IGlu dGVycnVwdCBwcm9jZXNzaW5nLCBpZiBhbnkgc2NoZWR1bGVyIHRyYWNrZWQgYmF0Y2hlcyB3ZXJl IHByb2Nlc3NlZCwKPj4gdGhlIHNjaGVkdWxlcidzIGRlZmVycmVkIHdvcmtlciB0aHJlYWQgaXMg d29rZW4gdXAuIFRoaXMgY2FuIGRvIG1vcmUKPj4gaW52b2x2ZWQgcHJvY2Vzc2luZyBzdWNoIGFz IGFjdHVhbGx5IHJlbW92aW5nIGNvbXBsZXRlZCBub2RlcyBmcm9tIHRoZQo+PiBxdWV1ZSBhbmQg ZnJlZWluZyB1cCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGVtIChpbnRlcm5hbAo+ PiBtZW1vcnkgYWxsb2NhdGlvbnMsIERSTSBvYmplY3QgcmVmZXJlbmNlcywgY29udGV4dCByZWZl cmVuY2UsIGV0Yy4pLgo+PiBUaGUgd29yayBoYW5kbGVyIGFsc28gY2hlY2tzIHRoZSBpbiBmbGln aHQgY291bnQgYW5kIGNhbGxzIHRoZQo+PiBzdWJtaXNzaW9uIGNvZGUgaWYgYSBuZXcgc2xvdCBo YXMgYXBwZWFyZWQuCj4+Cj4+IFdoZW4gdGhlIHNjaGVkdWxlcidzIHN1Ym1pdCBjb2RlIGlzIGNh bGxlZCwgaXQgc2NhbnMgdGhlIHF1ZXVlZCBub2RlCj4+IGxpc3QgZm9yIHRoZSBoaWdoZXN0IHBy aW9yaXR5IG5vZGUgdGhhdCBoYXMgbm8gdW5tZXQgZGVwZW5kZW5jaWVzLgo+PiBOb3RlIHRoYXQg dGhlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gaXMgY29tcGxleCBhcyBpdCBtdXN0IHRha2UKPj4g aW50ZXItcmluZyBkZXBlbmRlbmNpZXMgYW5kIHBvdGVudGlhbCBwcmVlbXB0aW9ucyBpbnRvIGFj Y291bnQuIE5vdGUKPj4gYWxzbyB0aGF0IGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIGJlIGV4dGVu ZGVkIHRvIGluY2x1ZGUgZXh0ZXJuYWwKPj4gZGVwZW5kZW5jaWVzIHN1Y2ggYXMgdGhlIEFuZHJv aWQgTmF0aXZlIFN5bmMgZmlsZSBkZXNjcmlwdG9ycyBhbmQvb3IKPj4gdGhlIGxpbnV4IGRtYS1i dWZmIHN5bmNocm9uaXNhdGlvbiBzY2hlbWUuCj4+Cj4+IElmIGEgc3VpdGFibGUgbm9kZSBpcyBm b3VuZCB0aGVuIGl0IGlzIHNlbnQgdG8gZXhlY2J1ZmZfZmluYWwoKSBmb3IKPj4gc3VibWlzc2lv biB0byB0aGUgaGFyZHdhcmUuIFRoZSBpbiBmbGlnaHQgY291bnQgaXMgdGhlbiByZS1jaGVja2Vk IGFuZAo+PiBhIG5ldyBub2RlIHBvcHBlZCBmcm9tIHRoZSBsaXN0IGlmIGFwcHJvcHJpYXRlLiBB bGwgbm9kZXMgdGhhdCBhcmUgbm90Cj4+IHN1Ym1pdHRlZCBoYXZlIHRoZWlyIHByaW9yaXR5IGJ1 bXBlZC4gVGhpcyBlbnN1cmVzIHRoYXQgbG93IHByaW9yaXR5Cj4+IHRhc2tzIGRvIG5vdCBnZXQg c3RhcnZlZCBvdXQgYnkgYnVzeSBoaWdoZXIgcHJpb3JpdHkgb25lcyAtIGV2ZXJ5dGhpbmcKPj4g d2lsbCBldmVudHVhbGx5IGdldCBpdHMgdHVybiB0byBydW4uCj4+Cj4+IE5vdGUgdGhhdCB0aGlz IHBhdGNoIGRvZXMgbm90IGltcGxlbWVudCBwcmUtZW1wdGl2ZSBzY2hlZHVsaW5nLiBPbmx5Cj4+ IGJhc2ljIHNjaGVkdWxpbmcgYnkgcmUtb3JkZXJpbmcgYmF0Y2ggYnVmZmVyIHN1Ym1pc3Npb24g aXMgY3VycmVudGx5Cj4+IGltcGxlbWVudGVkLiBQcmUtZW1wdGlvbiBvZiBhY3RpdmVseSBleGVj dXRpbmcgYmF0Y2ggYnVmZmVycyBjb21lcyBpbgo+PiB0aGUgbmV4dCBwYXRjaCBzZXJpZXMuCj4+ Cj4+IHYyOiBDaGFuZ2VkIHByaW9yaXR5IGxldmVscyB0byArLy0xMDIzIGR1ZSB0byBmZWVkYmFj ayBmcm9tIENocmlzCj4+IFdpbHNvbi4KPj4KPj4gUmVtb3ZlZCByZWR1bmRhbnQgaW5kZXggZnJv bSBzY2hlZHVsZXIgbm9kZS4KPj4KPj4gQ2hhbmdlZCB0aW1lIHN0YW1wcyB0byB1c2UgamlmZmll cyBpbnN0ZWFkIG9mIHJhdyBtb25vdG9uaWMuIFRoaXMKPj4gcHJvdmlkZXMgbG93ZXIgcmVzb2x1 dGlvbiBidXQgaW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGk5MTUKPj4gY29kZS4K Pj4KPj4gTWFqb3IgcmUtd3JpdGUgb2YgY29tcGxldGlvbiB0cmFja2luZyBjb2RlIGR1ZSB0byBz dHJ1Y3QgZmVuY2UKPj4gY29udmVyc2lvbi4gVGhlIHNjaGVkdWxlciBubyBsb25nZXIgaGFzIGl0 J3Mgb3duIHByaXZhdGUgSVJRIGhhbmRsZXIKPj4gYnV0IGp1c3QgbGV0cyB0aGUgZXhpc3Rpbmcg cmVxdWVzdCBjb2RlIGhhbmRsZSBjb21wbGV0aW9uIGV2ZW50cy4KPj4gSW5zdGVhZCwgdGhlIHNj aGVkdWxlciBub3cgaG9va3MgaW50byB0aGUgcmVxdWVzdCBub3RpZnkgY29kZSB0byBiZQo+PiB0 b2xkIHdoZW4gYSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuCj4+Cj4+IFJlZHVjZWQgZHJpdmVyIG11 dGV4IGxvY2tpbmcgc2NvcGUuIFJlbW92YWwgb2Ygc2NoZWR1bGVyIG5vZGVzIG5vCj4+IGxvbmdl ciBncmFicyB0aGUgbXV0ZXggbG9jay4KPj4KPj4gdjM6IFJlZmFjdG9yIG9mIGRlcGVuZGVuY3kg Z2VuZXJhdGlvbiB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuCj4+IEFsc28gYWRkZWQg aW4gcmVhZC1yZWFkIG9wdGltaXNhdGlvbiBzdXBwb3J0IC0gaS5lLiwgZG9uJ3QgdHJlYXQgYQo+ PiBzaGFyZWQgcmVhZC1vbmx5IGJ1ZmZlciBhcyBiZWluZyBhIGRlcGVuZGVuY3kuCj4+Cj4+IEFs bG93ZWQgdGhlIGtpbGxpbmcgb2YgcXVldWVkIG5vZGVzIHJhdGhlciB0aGFuIG9ubHkgZmx5aW5n IG9uZXMuCj4+Cj4+IHY0OiBVcGRhdGVkIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZXR0ZXIgcmVm bGVjdCB0aGUgY3VycmVudCBzdGF0ZSBvZgo+PiB0aGUgY29kZS4gRG93bmdyYWRlZCBzb21lIEJV R19PTnMgdG8gV0FSTl9PTnMuIFVzZWQgdGhlIGNvcnJlY3QgYXJyYXkKPj4gbWVtb3J5IGFsbG9j YXRvciBmdW5jdGlvbiAoa21hbGxvY19hcnJheSBpbnN0ZWFkIG9mIGttYWxsb2MpLgo+PiBDb3Jy ZWN0ZWQgdGhlIGZvcm1hdCBvZiBzb21lIGNvbW1lbnRzLiBXcmFwcGVkIHNvbWUgbGluZXMgZGlm ZmVyZW50bHkKPj4gdG8ga2VlcCB0aGUgc3R5bGUgY2hlY2tlciBoYXBweS4KPj4KPj4gRml4ZWQg YSBXQVJOX09OIHdoZW4ga2lsbGluZyBub2Rlcy4gVGhlIGRlcGVuZGVuY3kgcmVtb3ZhbCBjb2Rl IGNoZWNrcwo+PiB0aGF0IG5vZGVzIGJlaW5nIGRlc3Ryb3llZCBkbyBub3QgaGF2ZSBhbnkgb3Vz dGFuZGluZyBkZXBlbmRlbmNpZXMKPj4gKHdoaWNoIHdvdWxkIGltcGx5IHRoZXkgc2hvdWxkIG5v dCBoYXZlIGJlZW4gZXhlY3V0ZWQgeWV0KS4gSW4gdGhlCj4+IGNhc2Ugb2Ygbm9kZXMgYmVpbmcg ZGVzdHJveWVkLCBlLmcuIGR1ZSB0byBjb250ZXh0IGJhbm5pbmcsIHRoZW4gdGhpcwo+PiBtaWdo dCB3ZWxsIGJlIHRoZSBjYXNlIC0gdGhleSBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGFuZCBkbyBp bmRlZWQKPj4gaGF2ZSBvdXRzdGFuZGluZyBkZXBlbmRlbmNpZXMuCj4+Cj4+IFJlLWluc3RhdGVk IHRoZSBjb2RlIHRvIGRpc2JsZSBpbnRlcnJ1cHRzIHdoZW4gbm90IGluIHVzZS4gVGhlCj4+IHVu ZGVybHlpbmcgcHJvYmxlbSBjYXVzaW5nIGJyb2tlbiBJUlEgcmVmZXJlbmNlIGNvdW50cyBzZWVt cyB0byBoYXZlCj4+IGJlZW4gZml4ZWQgbm93Lgo+Pgo+PiB2NTogU2h1ZmZsZWQgdmFyaW91cyBm dW5jdGlvbnMgYXJvdW5kIHRvIHJlbW92ZSBmb3J3YXJkIGRlY2xhcmF0aW9ucwo+PiBhcyBhcHBh cmVudGx5IHRoZXNlIGFyZSBmcm93bmVkIHVwb24uIFJlbW92ZWQgbG90cyBvZiB3aGl0ZSBzcGFj ZSBhcwo+PiBhcHBhcmVudGx5IGhhdmluZyBlYXN5IHRvIHJlYWQgY29kZSBpcyBhbHNvIGZyb3du ZWQgdXBvbi4gU3BsaXQgdGhlCj4+IGRpcmVjdCBzdWJtaXNzaW9uIHNjaGVkdWxlciBieXBhc3Mg Y29kZSBvdXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uLgo+PiBTcXVhc2hlZCBkb3duIHRoZSBp OTE1X3NjaGVkdWxlci5jIHNlY3Rpb25zIG9mIHZhcmlvdXMgcGF0Y2hlcyBpbnRvCj4+IHRoaXMg cGF0Y2guIFRodXMgdGhlIGxhdGVyIHBhdGNoZXMgc2ltcGx5IGhvb2sgaW4gZXhpc3RpbmcgY29k ZSBpbnRvCj4+IHZhcmlvdXMgcGFydHMgb2YgdGhlIGRyaXZlciByYXRoZXIgdGhhbiBhZGRpbmcg dGhlIGNvZGUgYXMgd2VsbC4gQWRkZWQKPj4gZG9jdW1lbnRhdGlvbiB0byB2YXJpb3VzIGZ1bmN0 aW9ucy4gUmUtd29ya2VkIHRoZSBzdWJtaXQgZnVuY3Rpb24gaW4KPj4gdGVybXMgb2YgbXV0ZXgg bG9ja2luZywgZXJyb3IgaGFuZGxpbmcgYW5kIGV4aXQgcGF0aHMuIFNwbGl0IHRoZQo+PiBkZWxh eWVkIHdvcmsgaGFuZGxlciBmdW5jdGlvbiBpbiBoYWxmLiBNYWRlIHVzZSBvZiB0aGUga2VybmVs ICdjbGFtcCcKPj4gbWFjcm8uIFtKb29uYXMgTGFodGluZW5dCj4+Cj4+IEFkZGVkIHJ1bnRpbWUg UE0gY2FsbHMgYXMgdGhlc2UgbXVzdCBiZSBkb25lIGF0IHRoZSB0b3AgbGV2ZWwgYmVmb3JlCj4+ IGFjcXVpcmluZyB0aGUgZHJpdmVyIG11dGV4IGxvY2suIFtDaHJpcyBXaWxzb25dCj4+Cj4+IFJl bW92ZWQgc29tZSBvYnNvbGV0ZSBkZWJ1ZyBjb2RlIHRoYXQgaGFkIGJlZW4gZm9yZ290dGVuIGFi b3V0Lgo+Pgo+PiBNb3ZlZCBtb3JlIGNsZWFuIHVwIGNvZGUgaW50byB0aGUgJ2k5MTVfZ2VtX3Nj aGVkdWxlcl9jbGVhbl9ub2RlKCknCj4+IGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJlcGxpY2F0aW5n IGl0IGluIG11dGxpcGxlIHBsYWNlcy4KPj4KPj4gVXNlZCBsaWdodGVyIHdlaWdodCBzcGlubG9j a3MuCj4+Cj4+IEZvcjogVklaLTE1ODcKPj4gU2lnbmVkLW9mZi1ieTogSm9obiBIYXJyaXNvbiA8 Sm9obi5DLkhhcnJpc29uQEludGVsLmNvbT4KPj4gQ2M6IEpvb25hcyBMYWh0aW5lbiA8am9vbmFz LmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KPj4gLS0tCj4+ICAgZHJpdmVycy9ncHUvZHJtL2k5 MTUvTWFrZWZpbGUgICAgICAgICB8ICAgMSArCj4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9kcnYuaCAgICAgICB8ICAgNiArCj4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0u YyAgICAgICB8ICAgNSArCj4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIu YyB8IDg3NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICAgZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuaCB8ICA5NSArKysrCj4+ICAgNSBmaWxlcyBjaGFu Z2VkLCA5ODEgaW5zZXJ0aW9ucygrKQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5jCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfc2NoZWR1bGVyLmgKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUK Pj4gaW5kZXggMTUzOThjNS4uNzljYjM4YiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvTWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKPj4g QEAgLTEwLDYgKzEwLDcgQEAgY2NmbGFncy15IDo9IC1XZXJyb3IKPj4gICBpOTE1LXkgOj0gaTkx NV9kcnYubyBcCj4+ICAgCSAgaTkxNV9pcnEubyBcCj4+ICAgCSAgaTkxNV9wYXJhbXMubyBcCj4+ ICsJICBpOTE1X3NjaGVkdWxlci5vIFwKPj4gICAgICAgICAgICAgaTkxNV9zdXNwZW5kLm8gXAo+ PiAgIAkgIGk5MTVfc3lzZnMubyBcCj4+ICAgCSAgaW50ZWxfY3NyLm8gXAo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZHJ2LmgKPj4gaW5kZXggZjQ0ODdiOS4uMDNhZGQxYSAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2Rydi5oCj4+IEBAIC0xNzAzLDYgKzE3MDMsOCBAQCBzdHJ1Y3QgaTkxNV9leGVjYnVm ZmVyX3BhcmFtcyB7Cj4+ICAgCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAgICAgKnJlcXVl c3Q7Cj4+ICAgfTsKPj4gICAKPj4gK3N0cnVjdCBpOTE1X3NjaGVkdWxlcjsKPj4gKwo+PiAgIC8q IHVzZWQgaW4gY29tcHV0aW5nIHRoZSBuZXcgd2F0ZXJtYXJrcyBzdGF0ZSAqLwo+PiAgIHN0cnVj dCBpbnRlbF93bV9jb25maWcgewo+PiAgIAl1bnNpZ25lZCBpbnQgbnVtX3BpcGVzX2FjdGl2ZTsK Pj4gQEAgLTE5NjgsNiArMTk3MCw4IEBAIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlIHsKPj4gICAK Pj4gICAJc3RydWN0IGk5MTVfcnVudGltZV9wbSBwbTsKPj4gICAKPj4gKwlzdHJ1Y3QgaTkxNV9z Y2hlZHVsZXIgKnNjaGVkdWxlcjsKPj4gKwo+IEkgdGhpbmsgd2Ugc2hvdWxkIGhhdmUgaTkxNS5l bmFibGVfc2NoZWR1bGVyIHBhcmFtZXRlciAoanVzdCBsaWtlCj4gaTkxNS5lbmFibGVfZXhlY2xp c3RzKSBhbmQgbWFrZSB0aGlzIGEgZGF0YSBtZW1iZXIsIG5vdCBwb2ludGVyLgo+Cj4gVGhlbiB3 ZSBjYW4gZ28gZm9yd2FyZCBhbmQgaGF2ZSBpOTE1LmVuYWJsZV9zY2hlZHVsZXJfcHJlZW1wdCBh bmQgc28gb24KPiB0byBjb250cm9sIHRoaW5ncyBhdCBib290IHRpbWUuClRoZXJlIGFyZS4gVGhl IGVuYWJsZV9zY2hlZHVsZXIgY29tZXMgaW4gYXMgcGF0Y2ggIzIxLiBJbmNsdWRpbmcgaXQgZnJv bSAKdGhlIHN0YXJ0IG1lYW5zIG1vZGlmeWluZyBpOTE1X3BhcmFtcy5bY2hdIGluIHRoaXMgcGF0 Y2ggYXMgd2VsbC4gQW5kIAp0aGVuIHlvdSBhcmUgZ2V0dGluZyBpbnRvIG9uZSBiaWcgcGF0Y2gg dGhhdCBjb250YWlucyBldmVyeXRoaW5nIGFuZCBpcyAKdW5yZXZpZXdhYmxlIGR1ZSB0byBpdHMg c2hlZXIgc2l6ZS4gVGhlIGVuYWJsZV9wcmVlbXB0aW9uIHBhcmFtZXRlciAKY29tZXMgaW4gd2l0 aCB0aGUgcHJlLWVtcHRpb24gY29kZS4gTm8gcG9pbnQgaW4gYWRkaW5nIHRoYXQgdW50aWwgdGhl cmUgCmlzIHNvbWV0aGluZyBmb3IgaXQgdG8gY29udHJvbC4KCgo+Cj4+ICAgCS8qIEFic3RyYWN0 IHRoZSBzdWJtaXNzaW9uIG1lY2hhbmlzbSAobGVnYWN5IHJpbmdidWZmZXIgb3IgZXhlY2xpc3Rz KSBhd2F5ICovCj4+ICAgCXN0cnVjdCB7Cj4+ICAgCQlpbnQgKCpleGVjYnVmX3N1Ym1pdCkoc3Ry dWN0IGk5MTVfZXhlY2J1ZmZlcl9wYXJhbXMgKnBhcmFtcywKPj4gQEAgLTIyOTAsNiArMjI5NCw4 IEBAIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCB7Cj4+ICAgCS8qKiBwcm9jZXNzIGlkZW50 aWZpZXIgc3VibWl0dGluZyB0aGlzIHJlcXVlc3QgKi8KPj4gICAJc3RydWN0IHBpZCAqcGlkOwo+ PiAgIAo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeQkqc2NoZWR1bGVyX3Fl Owo+PiArCj4gRnVubnkgd2hpdGVzcGFjZS4KPgo+PiAgIAkvKioKPj4gICAJICogVGhlIEVMU1Ag b25seSBhY2NlcHRzIHR3byBlbGVtZW50cyBhdCBhIHRpbWUsIHNvIHdlIHF1ZXVlCj4+ICAgCSAq IGNvbnRleHQvdGFpbCBwYWlycyBvbiBhIGdpdmVuIHF1ZXVlIChyaW5nLT5leGVjbGlzdF9xdWV1 ZSkgdW50aWwgdGhlCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwo+PiBpbmRleCBkZmU0M2VhLi43 ZDlhYTI0IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCj4+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKPj4gQEAgLTMyLDYgKzMyLDcg QEAKPj4gICAjaW5jbHVkZSAiaTkxNV92Z3B1LmgiCj4+ICAgI2luY2x1ZGUgImk5MTVfdHJhY2Uu aCIKPj4gICAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCj4+ICsjaW5jbHVkZSAiaTkxNV9zY2hlZHVs ZXIuaCIKPj4gICAjaW5jbHVkZQo+PiAgICNpbmNsdWRlCj4+ICAgI2luY2x1ZGUKPj4gQEAgLTUz MTUsNiArNTMxNiwxMCBAQCBpbnQgaTkxNV9nZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 KQo+PiAgIAkgKi8KPj4gICAJaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9nZXQoZGV2X3ByaXYsIEZP UkNFV0FLRV9BTEwpOwo+PiAgIAo+PiArCXJldCA9IGk5MTVfc2NoZWR1bGVyX2luaXQoZGV2KTsK Pj4gKwlpZiAocmV0KQo+PiArCQlnb3RvIG91dF91bmxvY2s7Cj4+ICsKPj4gICAJcmV0ID0gaTkx NV9nZW1faW5pdF91c2VycHRyKGRldik7Cj4+ICAgCWlmIChyZXQpCj4+ICAgCQlnb3RvIG91dF91 bmxvY2s7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxl ci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwo+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi5mYzIzZWU3Cj4+IC0tLSAvZGV2L251bGwKPj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwo+PiBAQCAtMCwwICsx LDg3NCBAQAo+PiArLyoKPj4gKyAqIENvcHlyaWdodCAoYykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlv bgo+PiArICoKPj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hh cmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ PiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVk aW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+PiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1v ZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4+ICsgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKPj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4+ICsgKgo+PiArICogVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4 dAo+PiArICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQo+PiArICogU29mdHdhcmUuCj4+ICsgKgo+PiArICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z IEtJTkQsIEVYUFJFU1MgT1IKPj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+PiArICogRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5U IFNIQUxMCj4+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+PiArICogTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPj4g KyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRI RSBVU0UgT1IgT1RIRVIgREVBTElOR1MKPj4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPj4gKyAqCj4+ ICsgKi8KPj4gKwo+PiArI2luY2x1ZGUgImk5MTVfZHJ2LmgiCj4+ICsjaW5jbHVkZSAiaW50ZWxf ZHJ2LmgiCj4+ICsjaW5jbHVkZSAiaTkxNV9zY2hlZHVsZXIuaCIKPj4gKwo+PiArLyoqCj4+ICsg KiBpOTE1X3NjaGVkdWxlcl9pc19lbmFibGVkIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBzY2hlZHVs ZXIgaXMgZW5hYmxlZC4KPj4gKyAqIEBkZXY6IERSTSBkZXZpY2UKPj4gKyAqLwo+PiArYm9vbCBp OTE1X3NjaGVkdWxlcl9pc19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4+ICt7Cj4+ ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK Pj4gKwo+PiArCXJldHVybiBkZXZfcHJpdi0+c2NoZWR1bGVyICE9IE5VTEw7Cj4+ICt9Cj4gaTkx NS5lbmFibGVfc2NoZWR1bGVyIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC4KSXQgaXMgd2hlbiBpdCBh cnJpdmVzLgoKPgo+PiArCj4+ICsvKioKPj4gKyAqIGk5MTVfc2NoZWR1bGVyX2luaXQgLSBJbml0 aWFsaXNlIHRoZSBzY2hlZHVsZXIuCj4+ICsgKiBAZGV2OiBEUk0gZGV2aWNlCj4+ICsgKiBSZXR1 cm5zIHplcm8gb24gc3VjY2VzcyBvciAtRU5PTUVNIGlmIG1lbW9yeSBhbGxvY2F0aW9ucyBmYWls Lgo+PiArICovCj4+ICtpbnQgaTkxNV9zY2hlZHVsZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2KQo+PiArewo+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ ZGV2X3ByaXZhdGU7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIgPSBkZXZf cHJpdi0+c2NoZWR1bGVyOwo+PiArCWludCByOwo+PiArCj4gVGhpcyBwcm90ZWN0aW9uIC0tPgo+ Cj4+ICsJaWYgKHNjaGVkdWxlcikKPj4gKwkJcmV0dXJuIDA7Cj4+ICsKPj4gKwlzY2hlZHVsZXIg PSBremFsbG9jKHNpemVvZigqc2NoZWR1bGVyKSwgR0ZQX0tFUk5FTCk7Cj4+ICsJaWYgKCFzY2hl ZHVsZXIpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4gSXMgbm90IG5lZWRlZCBpZiB3ZSBo YXZlIGRhdGEgbWVtYmVyIGFuZCBpOTE1LmVuYWJsZV9zY2hlZHVsZXIuCk1ha2luZyB0aGUgc2No ZWR1bGVyIHN0cnVjdHVyZSBhIG9iamVjdCByYXRoZXIgdGhhbiBhIHBvaW50ZXIgYmFzaWNhbGx5 IAptZWFucyBtb3ZpbmcgdGhlIHdob2xlIG9mIGk5MTVfc2NoZWR1bGVyLmggaW50byBpOTE1X2Ry di5oLiBUaGVyZSBpcyB0b28gCm11Y2ggaW50ZXJjb25uZWN0ZWRuZXNzIGJldHdlZW4gdGhlIHZh cmlvdXMgc3RydWN0dXJlcy4gSSB3b3VsZCBzYXkgdGhhdCAKa2VlcGluZyB0aGUgY29kZSBuaWNl bHkgcGFydGl0aW9uZWQgYW5kIHJlYWRhYmxlIGlzIHdvcnRoIHRoZSBvbmUgCmR5bmFtaWMgYWxs b2NhdGlvbiBhdCBkcml2ZXIgbG9hZCB0aW1lLgoKPgo+PiArCXNwaW5fbG9ja19pbml0KCZzY2hl ZHVsZXItPmxvY2spOwo+PiArCj4+ICsJZm9yIChyID0gMDsgciA8IEk5MTVfTlVNX1JJTkdTOyBy KyspCj4+ICsJCUlOSVRfTElTVF9IRUFEKCZzY2hlZHVsZXItPm5vZGVfcXVldWVbcl0pOwo+PiAr Cj4+ICsJLyogRGVmYXVsdCB0dW5pbmcgdmFsdWVzOiAqLwo+PiArCXNjaGVkdWxlci0+cHJpb3Jp dHlfbGV2ZWxfbWluICAgICA9IC0xMDIzOwo+PiArCXNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxf bWF4ICAgICA9IDEwMjM7Cj4+ICsJc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9idW1wICAgID0g NTA7Cj4+ICsJc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9wcmVlbXB0ID0gOTAwOwo+PiArCXNj aGVkdWxlci0+bWluX2ZseWluZyAgICAgICAgICAgICA9IDI7Cj4+ICsKPj4gKwlkZXZfcHJpdi0+ c2NoZWR1bGVyID0gc2NoZWR1bGVyOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4g Ky8qCj4+ICsgKiBBZGQgYSBwb3BwZWQgbm9kZSBiYWNrIGluIHRvIHRoZSBxdWV1ZS4gRm9yIGV4 YW1wbGUsIGJlY2F1c2UgdGhlIHJpbmcgd2FzCj4+ICsgKiBodW5nIHdoZW4gZXhlY2ZpbmFsKCkg d2FzIGNhbGxlZCBhbmQgdGh1cyB0aGUgcmluZyBzdWJtaXNzaW9uIG5lZWRzIHRvIGJlCj4+ICsg KiByZXRyaWVkIGxhdGVyLgo+PiArICovCj4+ICtzdGF0aWMgdm9pZCBpOTE1X3NjaGVkdWxlcl9u b2RlX3JlcXVldWUoc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlKQo+PiAr ewo+PiArCVdBUk5fT04oIW5vZGUpOwo+IFJhdGhlciByZW1vdmUgdGhpcyBjb21wbGV0ZWx5IGFz IGl0IGlzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBvciB1c2UKPiBCVUdfT04gYmVjYXVzZSBuZXh0 IGxpbmUgd2lsbCBzdHJhaWdodCBsZWFkIHRvIE9PUFMgYWZ0ZXIgd2FybmluZy4gSSdsbAo+IHBh c3MgbWVudGlvbmluZyByZXN0IG9mIHRoZSBvYnZpb3VzIFdBUk5fT04gdnMgQlVHX09OJ3MuClll YWgsIG1vc3Qgb2YgdGhlIFdBUk4vQlVHX09OcyBhcmUgcHJvYmFibHkgdW5uZWNlc3Nhcnkgbm93 LiBUaGV5IHdlcmUgCnNjYXR0ZXJlZCBsaWJlcmFsbHkgYXJvdW5kIGR1cmluZyBpbml0aWFsIGRl dmVsb3BtZW50IHdoZW4gc3RyYW5nZSBhbmQgCnVuZXhwZWN0ZWQgdGhpbmdzIGNvdWxkIGhhcHBl bi4gTm93IHRoZSB0aGUgY29kZSBwYXRocyBhcmUgcHJldHR5IHdlbGwgCmVzdGFibGlzaGVkIHRo ZXkgYXJlbid0IHJlYWxseSBtdWNoIHVzZS4gSSdsbCByZWR1Y2UgdGhlbSBkb3duIHRvIGp1c3Qg CnRoZSBvbmVzIHRoYXQgc3RpbGwgbWFrZSBzZW5zZS4KCgo+Cj4+ICsJV0FSTl9PTighSTkxNV9T UVNfSVNfRkxZSU5HKG5vZGUpKTsKPj4gKwo+PiArCS8qIFNlcW5vIHdpbGwgYmUgcmVhc3NpZ25l ZCBvbiByZWxhdW5jaCAqLwo+PiArCW5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubyA9IDA7Cj4+ ICsJbm9kZS0+c3RhdHVzID0gaTkxNV9zcXNfcXVldWVkOwo+PiArfQo+PiArCj4+ICsvKgo+PiAr ICogR2l2ZSB1cCBvbiBhIG5vZGUgY29tcGxldGVseS4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgaXQg aXMgY2F1c2luZyB0aGUKPj4gKyAqIHJpbmcgdG8gaGFuZyBvciBpcyB1c2luZyBzb21lIHJlc291 cmNlIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy4KPj4gKyAqLwo+PiArc3RhdGljIHZvaWQgaTkxNV9z Y2hlZHVsZXJfbm9kZV9raWxsKHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9k ZSkKPj4gK3sKPj4gKwlXQVJOX09OKCFub2RlKTsKPj4gKwlXQVJOX09OKEk5MTVfU1FTX0lTX0NP TVBMRVRFKG5vZGUpKTsKPj4gKwo+PiArCW5vZGUtPnN0YXR1cyA9IGk5MTVfc3FzX2RlYWQ7Cj4+ ICt9Cj4+ICsKPj4gKy8qIE1hcmsgYSBub2RlIGFzIGluIGZsaWdodCBvbiB0aGUgaGFyZHdhcmUu ICovCj4gQXMgZm9yIGRvY3VtZW50YXRpb24sIGZyb20gYmVsb3csIEkgb25seSBhc3N1bWUgc2No ZWR1bGVyIGxvY2sgbXVzdCBiZQo+IGhlbGQgYW5kIG5vZGUncyBjYW4gYmUgb25seSBtYW5pcHVs YXRlZCB3aGVuIHNjaGVkdWxlciBsb2NrIGlzIGhlbGQ/Cj4gSXQncyBnb29kIHRvIGFkZCBhIGNv bW1lbnQgZGVzY3JpYmluZyB0aGUgZXhwZWN0ZWQgbG9ja2luZy4gT3IgbWF5YmUKPiBhZGQgYXNz ZXJ0X3NjaGVkdWxlcl9sb2NrX2hlbGQoKSBoZWxwZXIgYW5kIHNwcmlua2xlIGl0IGFyb3VuZCB0 aGUKPiBmdW5jdGlvbnMgc2ltaWxhciB0byBhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQoKSwgd2hp Y2ggaXMgc2VsZi0KPiBkb2N1bWVudGluZz8KPgo+PiArc3RhdGljIGludCBpOTE1X3NjaGVkdWxl cl9ub2RlX2ZseShzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGUpCj4+ICt7 Cj4+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gbm9kZS0+cGFyYW1zLmRl di0+ZGV2X3ByaXZhdGU7Cj4gSWYgbm9kZSBpcyBOVUxMLCB0aGlzIHdvdWxkIGFscmVhZHkgT09Q UywgSSBkbyBub3QgdGhpbmsgaXQncwo+IHVucmVhc29uYWJsZSB0byBleHBlY3Qgbm9kZSBub3Qg dG8gYmUgTlVMTC4gVGhlIGJlbG93IFdBUk5fT04gY2hlY2sgaXMKPiBuZXZlciByZWFjaGVkLgo+ Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1 bGVyOwo+PiArCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmc7Cj4+ICsKPj4gKwlXQVJOX09O KCFzY2hlZHVsZXIpOwo+PiArCVdBUk5fT04oIW5vZGUpOwo+PiArCVdBUk5fT04obm9kZS0+c3Rh dHVzICE9IGk5MTVfc3FzX3BvcHBlZCk7Cj4+ICsKPj4gKwlyaW5nID0gbm9kZS0+cGFyYW1zLnJp bmc7Cj4+ICsKPiBUaGlzIGFuZCBzaW1pbGFyIGFzc2lnbm1lbnRzIGNhbiBiZSBzcXVhc2hlZCB0 byBkZWNsYXJhdGlvbiBsaW5lLCBhcwo+IHRoaXMgaXMgYmFzaWNhbGx5IGFuIGFsaWFzLgo+Cj4+ ICsJLyoKPj4gKwkgKiBBZGQgdGhlIG5vZGUgKHdoaWNoIHNob3VsZCBjdXJyZW50bHkgYmUgaW4g c3RhdGUgcG9wcGVkKSB0byB0aGUKPj4gKwkgKiBmcm9udCBvZiB0aGUgcXVldWUuIFRoaXMgZW5z dXJlIHRoYXQgZmx5aW5nIG5vZGVzIGFyZSBhbHdheXMgaGVsZAo+PiArCSAqIGluIGhhcmR3YXJl IHN1Ym1pc3Npb24gb3JkZXIuCj4+ICsJICovCj4+ICsJbGlzdF9hZGQoJm5vZGUtPmxpbmssICZz Y2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRdKTsKPj4gKwo+PiArCW5vZGUtPnN0YXR1cyA9 IGk5MTVfc3FzX2ZseWluZzsKPj4gKwo+PiArCWlmICghKHNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+ aWRdICYgaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWQpKSB7Cj4+ICsJCWJvb2wgc3VjY2VzcyA9 IHRydWU7Cj4+ICsKPj4gKwkJc3VjY2VzcyA9IHJpbmctPmlycV9nZXQocmluZyk7Cj4+ICsJCWlm IChzdWNjZXNzKQo+PiArCQkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gfD0gaTkxNV9zZl9p bnRlcnJ1cHRzX2VuYWJsZWQ7Cj4+ICsJCWVsc2UKPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+IFNo b3VsZG4ndCB0aGUgbm9kZSBiZSBjbGVhbmVkIHVwIGZyb20gbm9kZV9xdWV1ZSBpbiBjYXNlIG9m IGFuIGVycm9yPwpOb3QgcmVhbGx5LiBUaGUgYmF0Y2ggYnVmZmVyIHdpbGwgc3RpbGwgYmUgZXhl Y3V0ZWQgcmVnYXJkbGVzcyBvZiAKd2hldGhlciBpbnRlcnJ1cHRzIGNvdWxkIGJlIGVuYWJsZWQg b3Igbm90LiBUaGUgcmV0dXJuIGNvZGUgaXMgYWN0dWFsbHkgCmlnbm9yZWQgc28gdGhpcyBzaG91 bGQgcmVhbGx5IGJlIGEgdm9pZCBmdW5jdGlvbiwgSSBndWVzcy4gV2l0aG91dCAKaW50ZXJydXB0 cyB0aGVuIGNvbXBsZXRpb24gbWlnaHQgdGFrZSBhIHdoaWxlIHRvIGJlIG5vdGljZWQgYnV0IHN0 dWZmIApzaG91bGQgc3RpbGwgYmFzaWNhbGx5IHdvcmsuCgoKPgo+IEFsc28sIEkgdGhpbmsgYWJv dmUgY291bGQgYmUgd3JpdHRlbiBtdWNoIG1vcmUgY29tcGFjdCBmb3JtIChiZWNhdXNlIGl0Cj4g bG9va3MgbGlrZSBzb21ldGhpbmcgd2hlcmUgbW9yZSBsb2dpYyB3aWxsIGJlIGFkZGVkIGxhdGVy KS4gSXQgbWFrZXMgaXQKPiBlYXNpZXIgdG8gd3JpdGUgYW5kIHZpc3VhbGl6ZSB0aGUgZXJyb3Ig cGF0aHMgd2hlbiByZWFkaW5nIGlmIHRoZXJlIGFyZQo+IG5vIG5lc3RlZCBpZidzLgo+Cj4gSSB3 b24ndCBtZW50aW9uIGFib3V0IHRoZSBlcnJvciBwYXRocyBvZiBmdW5jdGlvbnMgYmVsb3csIEkg ZXhwZWN0IHRoZQo+IGZvbGxvd2luZyBndWlkbGluZSB0byBiZSBhZGhlcmVkOwo+Cj4gCWlmIChz Y2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSAmIEk5MTVfU0ZfSU5UX0VOQUJMRUQpCj4gCQlnb3Rv IG91dDsKPgo+IAlpZiAoIXJpbmctPmlycV9nZXQocmluZykpCj4gCQlnb3RvIGVycl9pcnE7Cj4K PiAJaWYgKCEuLi4pCj4gCQlnb3RvIGVycl9mb287Cj4KPiAJc2NoZWR1bGVyLT5mbGFnc1tyaW5n LT5pZF0gfD0gSTkxNV9TRl9JTlRfRU5BQkxFRDsKPiBvdXQ6Cj4gCXJldHVybiAwOwo+IGVycl9m b286Cj4gCWZvb2JhcigpOwo+IGVycl9pcnE6Cj4gCWxpc3RfcmVtb3ZlKCkKPiAJcmV0dXJuIC1F SU5WQUw7Cj4KPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGlj IHVpbnQzMl90IGk5MTVfc2NoZWR1bGVyX2NvdW50X2ZseWluZyhzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXIgKnNjaGVkdWxlciwKPj4gKwkJCQkJICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcp Cj4+ICt7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlOwo+PiAr CXVpbnQzMl90IGZseWluZyA9IDA7Cj4+ICsKPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUs ICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRdLCBsaW5rKQo+ICsxIGZvciB0aGUgZm9y X2VhY2hfc2NoZWR1bGVyX25vZGUoLi4uKQo+Cj4+ICsJCWlmIChJOTE1X1NRU19JU19GTFlJTkco bm9kZSkpCj4+ICsJCQlmbHlpbmcrKzsKPj4gKwo+PiArCXJldHVybiBmbHlpbmc7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyB2b2lkIGk5MTVfc2NoZWR1bGVyX3ByaW9yaXR5X2J1bXBfY2xlYXIoc3Ry dWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIpCj4+ICt7Cj4+ICsJc3RydWN0IGk5MTVfc2No ZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlOwo+PiArCWludCBpOwo+PiArCj4+ICsJLyoKPj4gKwkg KiBFbnN1cmUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGRvbid0IGNhdXNlIHByb2JsZW1zIGFuZCB0 aGF0IGEgYnVtcAo+PiArCSAqIGJ5IG9iamVjdCB1c2FnZSBvbmx5IGJ1bXBzIGVhY2ggdXNpbmcg YnVmZmVyIG9uY2U6Cj4+ICsJICovCj4+ICsJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdT OyBpKyspIHsKPj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2Rl X3F1ZXVlW2ldLCBsaW5rKQo+PiArCQkJbm9kZS0+YnVtcGVkID0gZmFsc2U7Cj4+ICsJfQo+PiAr fQo+PiArCj4+ICtzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3ByaW9yaXR5X2J1bXAoc3RydWN0 IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCj4+ICsJCQkJc3RydWN0IGk5MTVfc2NoZWR1bGVy X3F1ZXVlX2VudHJ5ICp0YXJnZXQsCj4gSXMgdGhlcmUgc3BlY2lmaWMgcmVhc29uIHdoeSBzdHJ1 Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgYXJlIG5vdAo+IHJlZmVycmVkIHRvIGp1c3Qg YXMgIm5vZGUiIGJ1dCAicWUiIGFuZCBoZXJlIHNvbWV0aGluZyBlbHNlLCBkbyAibm9kZSIKPiBh bmQgInFlIiBoYXZlIGEgc3BlY2lhbCBzZW1hbnRpYyBtZWFuaW5nPwpOb3Qgc3VyZSB3aGF0IHlv dSBtZWFuLiBUaGUgdXNlIG9mICdub2RlJyBpcyBiZWNhdXNlIGFsbW9zdCBldmVyeXRoaW5nIAph biBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSBvYmplY3QgaXMgYmVpbmcgdXNlZCBpdCBpcyBh cyBhIG5vZGUgaW4gYSAKbGlzdCB0aGF0IGlzIGJlaW5nIGl0ZXJhdGVkIG92ZXIuIFRoZSBvbmx5 ICdxZScgdmFyaWFibGUgaXMgaW4gCidpOTE1X3NjaGVkdWxlcl9xdWV1ZV9leGVjYnVmZmVyW19i eXBhc3NdJyBhbmQgdGhlcmUgaXQgaXMgYmVjYXVzZSB0aGUgCnFlIGlzIGJlaW5nIHBhc3NlZCBp biBmcm9tIG91dHNpZGUgYW5kIGlzIGNvcGllZCB0byBhIGxvY2FsICdub2RlJyB0aGF0IAppcyB0 aGVuIGFkZGVkIHRvIHRoZSBsaXN0LiBJIHRoaW5rIHRoZSB1c2Ugb2YgJ3RhcmdldCcgaGVyZSBp cyBsYXJnZWx5IApoaXN0b3JpY2FsLiBUaGUgc3Vic2VxdWVudCBhcnJheSBzZWFyY2ggd2FzIG9y aWdpbmFsbHkgYSBsaXN0IHNlYXJjaCBhbmQgCmhlbmNlIGhhZCBhICdub2RlJyB0aGF0IHdhcyB1 c2VkIGFzIHRoZSBpdGVyYXRvci4gVGh1cyB0aGUgcWUgcGFzc2VkIGluIAp3YXMgY2FsbGVkIHNv bWV0aGluZyBlbHNlIHRvIGF2b2lkIGNvbmZsaWN0cyBhbmQgdGFyZ2V0IHNlZW1lZCBhcHByb3By aWF0ZS4KCj4+ICsJCQkJdWludDMyX3QgYnVtcCkKPj4gK3sKPj4gKwl1aW50MzJfdCBuZXdfcHJp b3JpdHk7Cj4+ICsJaW50IGksIGNvdW50Owo+PiArCj4+ICsJaWYgKHRhcmdldC0+cHJpb3JpdHkg Pj0gc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXgpCj4+ICsJCXJldHVybiAxOwo+IFNvIGlm IG9uZSBub2RlIHJlYWNoZXMgbWF4aW11bSBwcmlvcml0eSB0aGUgZGVwZW5kZW5jaWVzIGFyZSBl eHBlY3RlZAo+IHRvIGJlIG1heGVkIG91dCBhbHJlYWR5PwpZZXMuIERlcGVuZGVuY2llcyBzaG91 bGQgYWx3YXlzIGJlIG9mIGVxdWFsIG9yIGhpZ2hlciBwcmlvcml0eSB0byB0aGUgCmRlcGVuZGVl LiBXaGVuIGEgbmV3IGRlcGVuZGVuY3kgaXMgY3JlYXRlZCwgdGhlIHByaW9yaXR5IG9mIHRoZSBk ZXBlbmRlZSAKaXMgYWRkZWQgb24gdG8gZW5zdXJlIHRoYXQgc29tZXRoaW5nIG9mIGhpZ2ggcHJp b3JpdHkgY2FuIG5ldmVyIGJlIHN0dWNrIAp3YWl0aW5nIG9uIHNvbWV0aGluZyBvZiBsb3cgcHJp b3JpdHkuIEFsc28sIGl0IG1lYW5zIHRoYXQgYSBiYXRjaCBidWZmZXIgCnRoYXQgbG90cyBvZiBv dGhlciBidWZmZXJzIGFyZSB3YWl0aW5nIG9uIHdpbGwgYmUgYnVtcGVkIHRvIGhpZ2hlciBhbmQg CmhpZ2hlciBwcmlvcml0eSB0aGUgbW9yZSB3YWl0ZXJzIHRoZXJlIGFyZSBhbmQgdGh1cyBpcyBt b3JlIGxpa2VseSB0byBiZSAKZXhlY3V0ZWQgc29vbmVyIGFuZCBmcmVlIHRoZW0gYWxsIHVwLgoK Cj4+ICsKPj4gKwlpZiAodGFyZ2V0LT5idW1wZWQpCj4+ICsJCXJldHVybiAwOwo+PiArCj4+ICsJ bmV3X3ByaW9yaXR5ID0gdGFyZ2V0LT5wcmlvcml0eSArIGJ1bXA7Cj4+ICsJaWYgKChuZXdfcHJp b3JpdHkgPD0gdGFyZ2V0LT5wcmlvcml0eSkgfHwKPj4gKwkgICAgKG5ld19wcmlvcml0eSA+IHNj aGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfbWF4KSkKPj4gKwkJdGFyZ2V0LT5wcmlvcml0eSA9IHNj aGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfbWF4Owo+PiArCWVsc2UKPj4gKwkJdGFyZ2V0LT5wcmlv cml0eSA9IG5ld19wcmlvcml0eTsKPj4gKwo+PiArCWNvdW50ID0gMTsKPj4gKwl0YXJnZXQtPmJ1 bXBlZCA9IHRydWU7Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0LT5udW1fZGVwczsg aSsrKSB7Cj4+ICsJCWlmICghdGFyZ2V0LT5kZXBfbGlzdFtpXSkKPj4gKwkJCWNvbnRpbnVlOwo+ PiArCj4+ICsJCWlmICh0YXJnZXQtPmRlcF9saXN0W2ldLT5idW1wZWQpCj4+ICsJCQljb250aW51 ZTsKPj4gKwo+PiArCQljb3VudCArPSBpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wKHNjaGVk dWxlciwKPj4gKwkJCQkJCSAgICAgIHRhcmdldC0+ZGVwX2xpc3RbaV0sCj4+ICsJCQkJCQkgICAg ICBidW1wKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gY291bnQ7Cj4+ICt9Cj4+ICsKPj4gKy8q Cj4+ICsgKiBOb2RlcyBhcmUgY29uc2lkZXJlZCB2YWxpZCBkZXBlbmRlbmNpZXMgaWYgdGhleSBh cmUgcXVldWVkIG9uIGFueSByaW5nIG9yCj4+ICsgKiBpZiB0aGV5IGFyZSBpbiBmbGlnaHQgb24g YSBkaWZmZXJlbnQgcmluZy4gSW4gZmxpZ2h0IG9uIHRoZSBzYW1lIHJpbmcgaXMgbm8KPj4gKyAq IGxvbmdlciBpbnRlcmVzdGluZyBmb3Igbm9uLXByZW1wdGl2ZSBub2RlcyBhcyB0aGUgcmluZyBz ZXJpYWxpc2VzIGV4ZWN1dGlvbi4KPj4gKyAqIEZvciBwcmUtZW1wdGluZyBub2RlcywgYWxsIGlu IGZsaWdodCBkZXBlbmRlbmNpZXMgYXJlIHZhbGlkIGFzIHRoZXkgbXVzdCBub3QKPj4gKyAqIGJl IGp1bXBlZCBieSB0aGUgYWN0IG9mIHByZS1lbXB0aW5nLgo+PiArICoKPj4gKyAqIEFueXRoaW5n IHRoYXQgaXMgbmVpdGhlciBxdWV1ZWQgbm9yIGZseWluZyBpcyB1bmludGVyZXN0aW5nLgo+PiAr ICovCj4+ICtzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9zY2hlZHVsZXJfaXNfZGVwZW5kZW5jeV92 YWxpZCgKPj4gKwkJCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSwgdWlu dDMyX3QgaWR4KQo+PiArewo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAq ZGVwOwo+PiArCj4+ICsJZGVwID0gbm9kZS0+ZGVwX2xpc3RbaWR4XTsKPj4gKwlpZiAoIWRlcCkK Pj4gKwkJcmV0dXJuIGZhbHNlOwo+PiArCj4+ICsJaWYgKEk5MTVfU1FTX0lTX1FVRVVFRChkZXAp KQo+PiArCQlyZXR1cm4gdHJ1ZTsKPj4gKwo+PiArCWlmIChJOTE1X1NRU19JU19GTFlJTkcoZGVw KSkgewo+PiArCQlpZiAobm9kZS0+cGFyYW1zLnJpbmcgIT0gZGVwLT5wYXJhbXMucmluZykKPj4g KwkJCXJldHVybiB0cnVlOwo+PiArCX0KPj4gKwo+PiArCXJldHVybiBmYWxzZTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGludCBpOTE1X3NjaGVkdWxlcl9wb3BfZnJvbV9xdWV1ZV9sb2NrZWQoc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKPj4gKwkJCQlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJf cXVldWVfZW50cnkgKipwb3Bfbm9kZSkKPj4gK3sKPj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwo+PiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPj4gKwlzdHJ1Y3QgaTkx NV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKmJlc3QgPSBOVUxMOwo+PiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZTsKPj4gKwlpbnQgcmV0Owo+PiArCWludCBpOwo+PiAr CWJvb2wgYW55X3F1ZXVlZCA9IGZhbHNlOwo+PiArCWJvb2wgaGFzX2xvY2FsLCBoYXNfcmVtb3Rl LCBvbmx5X3JlbW90ZSA9IGZhbHNlOwo+PiArCj4+ICsJKnBvcF9ub2RlID0gTlVMTDsKPj4gKwly ZXQgPSAtRU5PREFUQTsKPj4gKwo+PiArCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJnNjaGVk dWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0sIGxpbmspIHsKPj4gKwkJaWYgKCFJOTE1X1NRU19J U19RVUVVRUQobm9kZSkpCj4+ICsJCQljb250aW51ZTsKPj4gKwkJYW55X3F1ZXVlZCA9IHRydWU7 Cj4+ICsKPj4gKwkJaGFzX2xvY2FsICA9IGZhbHNlOwo+PiArCQloYXNfcmVtb3RlID0gZmFsc2U7 Cj4+ICsJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fZGVwczsgaSsrKSB7Cj4+ICsJCQlpZiAo IWk5MTVfc2NoZWR1bGVyX2lzX2RlcGVuZGVuY3lfdmFsaWQobm9kZSwgaSkpCj4+ICsJCQkJY29u dGludWU7Cj4+ICsKPj4gKwkJCWlmIChub2RlLT5kZXBfbGlzdFtpXS0+cGFyYW1zLnJpbmcgPT0g bm9kZS0+cGFyYW1zLnJpbmcpCj4+ICsJCQkJaGFzX2xvY2FsID0gdHJ1ZTsKPj4gKwkJCWVsc2UK Pj4gKwkJCQloYXNfcmVtb3RlID0gdHJ1ZTsKPj4gKwkJfQo+PiArCj4+ICsJCWlmIChoYXNfcmVt b3RlICYmICFoYXNfbG9jYWwpCj4+ICsJCQlvbmx5X3JlbW90ZSA9IHRydWU7Cj4+ICsKPj4gKwkJ aWYgKCFoYXNfbG9jYWwgJiYgIWhhc19yZW1vdGUpIHsKPj4gKwkJCWlmICghYmVzdCB8fAo+PiAr CQkJICAgIChub2RlLT5wcmlvcml0eSA+IGJlc3QtPnByaW9yaXR5KSkKPj4gKwkJCQliZXN0ID0g bm9kZTsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiArCWlmIChiZXN0KSB7Cj4+ICsJCWxpc3RfZGVs KCZiZXN0LT5saW5rKTsKPj4gKwo+PiArCQlJTklUX0xJU1RfSEVBRCgmYmVzdC0+bGluayk7Cj4+ ICsJCWJlc3QtPnN0YXR1cyAgPSBpOTE1X3Nxc19wb3BwZWQ7Cj4+ICsKPj4gKwkJcmV0ID0gMDsK Pj4gKwl9IGVsc2Ugewo+PiArCQkvKiBDYW4gb25seSBnZXQgaGVyZSBpZjoKPj4gKwkJICogKGEp IHRoZXJlIGFyZSBubyBidWZmZXJzIGluIHRoZSBxdWV1ZQo+PiArCQkgKiAoYikgYWxsIHF1ZXVl ZCBidWZmZXJzIGFyZSBkZXBlbmRlbnQgb24gb3RoZXIgYnVmZmVycwo+PiArCQkgKiAgICAgZS5n LiBvbiBhIGJ1ZmZlciB0aGF0IGlzIGluIGZsaWdodCBvbiBhIGRpZmZlcmVudCByaW5nCj4+ICsJ CSAqLwo+PiArCQlpZiAob25seV9yZW1vdGUpIHsKPj4gKwkJCS8qIFRoZSBvbmx5IGRlcGVuZGVu dCBidWZmZXJzIGFyZSBvbiBhbm90aGVyIHJpbmcuICovCj4+ICsJCQlyZXQgPSAtRUFHQUlOOwo+ PiArCQl9IGVsc2UgaWYgKGFueV9xdWV1ZWQpIHsKPj4gKwkJCS8qIEl0IHNlZW1zIHRoYXQgc29t ZXRoaW5nIGhhcyBnb25lIGhvcnJpYmx5IHdyb25nISAqLwo+PiArCQkJRFJNX0VSUk9SKCJCcm9r ZW4gZGVwZW5kZW5jeSB0cmFja2luZyBvbiByaW5nICVkIVxuIiwKPj4gKwkJCQkgIChpbnQpIHJp bmctPmlkKTsKPiBXb3VsZCB0aGlzIGNvbmRpdGlvbiBiZSB3b3J0aHkgV0FSTl9PTkNFKCksIGJl Y2F1c2UgaXQgd2lsbCBrZWVwCj4gcmVwZWF0aW5nIGFzIHRoZSBzaXR1YXRpb24gd2lsbCBwZXJz aXN0Pwo+Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwkqcG9wX25vZGUgPSBiZXN0Owo+PiArCXJl dHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gKy8qCj4+ICsgKiBOQjogVGhlIGRyaXZlciBtdXRleCBs b2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBJdCBpcwo+PiAr ICogb25seSByZWFsbHkgcmVxdWlyZWQgZHVyaW5nIHRoZSBhY3R1YWwgYmFjayBlbmQgc3VibWlz c2lvbiBjYWxsLiBIb3dldmVyLAo+PiArICogYXR0ZW1wdGluZyB0byBhY3F1aXJlIGEgbXV0ZXgg d2hpbGUgaG9sZGluZyBhIHNwaW4gbG9jayBpcyBhIEJhZCBJZGVhLgo+PiArICogQW5kIHJlbGVh c2luZyB0aGUgb25lIGJlZm9yZSBhY3F1aXJpbmcgdGhlIG90aGVyIGxlYWRzIHRvIG90aGVyIGNv ZGUKPj4gKyAqIGJlaW5nIHJ1biBhbmQgaW50ZXJmZXJpbmcuCj4+ICsgKi8KPj4gK3N0YXRpYyBp bnQgaTkxNV9zY2hlZHVsZXJfc3VibWl0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCj4+ ICt7Cj4+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKPj4gKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+PiArCXN0cnVj dCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPj4gKwlz dHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4+ICsJaW50IHJldCwgY291 bnQgPSAwLCBmbHlpbmc7Cj4+ICsKPj4gKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+ c3RydWN0X211dGV4KSk7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxKCZzY2hlZHVsZXItPmxvY2sp Owo+PiArCj4+ICsJV0FSTl9PTihzY2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSAmIGk5MTVfc2Zf c3VibWl0dGluZyk7Cj4+ICsJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gfD0gaTkxNV9zZl9z dWJtaXR0aW5nOwo+PiArCj4+ICsJLyogRmlyc3QgdGltZSBhcm91bmQsIGNvbXBsYWluIGlmIGFu eXRoaW5nIHVuZXhwZWN0ZWQgb2NjdXJzOiAqLwo+PiArCXJldCA9IGk5MTVfc2NoZWR1bGVyX3Bv cF9mcm9tX3F1ZXVlX2xvY2tlZChyaW5nLCAmbm9kZSk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJZ290 byBlcnJvcjsKPj4gKwo+PiArCWRvIHsKPj4gKwkJV0FSTl9PTighbm9kZSk7Cj4+ICsJCVdBUk5f T04obm9kZS0+cGFyYW1zLnJpbmcgIT0gcmluZyk7Cj4+ICsJCVdBUk5fT04obm9kZS0+c3RhdHVz ICE9IGk5MTVfc3FzX3BvcHBlZCk7Cj4+ICsJCWNvdW50Kys7Cj4+ICsKPj4gKwkJLyoKPj4gKwkJ ICogVGhlIGNhbGwgdG8gcG9wIGFib3ZlIHdpbGwgaGF2ZSByZW1vdmVkIHRoZSBub2RlIGZyb20g dGhlCj4+ICsJCSAqIGxpc3QuIFNvIGFkZCBpdCBiYWNrIGluIGFuZCBtYXJrIGl0IGFzIGluIGZs aWdodC4KPj4gKwkJICovCj4+ICsJCWk5MTVfc2NoZWR1bGVyX25vZGVfZmx5KG5vZGUpOwo+PiAr Cj4+ICsJCXNwaW5fdW5sb2NrX2lycSgmc2NoZWR1bGVyLT5sb2NrKTsKPj4gKwkJcmV0ID0gZGV2 X3ByaXYtPmd0LmV4ZWNidWZfZmluYWwoJm5vZGUtPnBhcmFtcyk7Cj4+ICsJCXNwaW5fbG9ja19p cnEoJnNjaGVkdWxlci0+bG9jayk7Cj4+ICsKPj4gKwkJLyoKPj4gKwkJICogSGFuZGxlIGZhaWxl ZCBzdWJtaXNzaW9uIGJ1dCBmaXJzdCBjaGVjayB0aGF0IHRoZQo+PiArCQkgKiB3YXRjaGRvZy9y ZXNldCBjb2RlIGhhcyBub3QgbnVrZWQgdGhlIG5vZGUgd2hpbGUgd2UKPj4gKwkJICogd2VyZW4n dCBsb29raW5nOgo+PiArCQkgKi8KPj4gKwkJaWYgKHJldCAmJiAobm9kZS0+c3RhdHVzICE9IGk5 MTVfc3FzX2RlYWQpKSB7Cj4+ICsJCQlib29sIHJlcXVldWUgPSB0cnVlOwo+PiArCj4+ICsJCQkv Kgo+PiArCQkJICogT2ggZGVhciEgRWl0aGVyIHRoZSBub2RlIGlzIGJyb2tlbiBvciB0aGUgcmlu ZyBpcwo+PiArCQkJICogYnVzeS4gU28gbmVlZCB0byBraWxsIHRoZSBub2RlIG9yIHJlcXVldWUg aXQgYW5kIHRyeQo+PiArCQkJICogYWdhaW4gbGF0ZXIgYXMgYXBwcm9wcmlhdGUuCj4+ICsJCQkg Ki8KPj4gKwo+PiArCQkJc3dpdGNoICgtcmV0KSB7Cj4+ICsJCQljYXNlIEVOT0RFVjoKPj4gKwkJ CWNhc2UgRU5PRU5UOgo+PiArCQkJCS8qIEZhdGFsIGVycm9ycy4gS2lsbCB0aGUgbm9kZS4gKi8K Pj4gKwkJCQlyZXF1ZXVlID0gZmFsc2U7Cj4+ICsJCQkJaTkxNV9zY2hlZHVsZXJfbm9kZV9raWxs KG5vZGUpOwo+PiArCQkJYnJlYWs7Cj4gVGhlc2UgYnJlYWsgaW5kZW50cyBzdGlsbC4KPgo+PiAr Cj4+ICsJCQljYXNlIEVBR0FJTjoKPj4gKwkJCWNhc2UgRUJVU1k6Cj4+ICsJCQljYXNlIEVJTzoK Pj4gKwkJCWNhc2UgRU5PTUVNOgo+PiArCQkJY2FzZSBFUkVTVEFSVFNZUzoKPj4gKwkJCWNhc2Ug RUlOVFI6Cj4+ICsJCQkJLyogU3VwcG9zZWRseSByZWNvdmVyYWJsZSBlcnJvcnMuICovCj4+ICsJ CQlicmVhazsKPj4gKwo+PiArCQkJZGVmYXVsdDoKPj4gKwkJCQkvKgo+PiArCQkJCSAqIEFzc3Vt ZSB0aGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIGhvcGUKPj4gKwkJCQkgKiBmb3IgdGhlIGJl c3QuCj4+ICsJCQkJICovCj4+ICsJCQkJTUlTU0lOR19DQVNFKC1yZXQpOwo+PiArCQkJYnJlYWs7 Cj4+ICsJCQl9Cj4+ICsKPj4gKwkJCWlmIChyZXF1ZXVlKSB7Cj4+ICsJCQkJaTkxNV9zY2hlZHVs ZXJfbm9kZV9yZXF1ZXVlKG5vZGUpOwo+PiArCQkJCS8qCj4+ICsJCQkJICogTm8gcG9pbnQgc3Bp bm5pbmcgaWYgdGhlIHJpbmcgaXMgY3VycmVudGx5Cj4+ICsJCQkJICogdW5hdmFpbGFibGUgc28g anVzdCBnaXZlIHVwIGFuZCBjb21lIGJhY2sKPj4gKwkJCQkgKiBsYXRlci4KPj4gKwkJCQkgKi8K Pj4gKwkJCQlicmVhazsKPj4gKwkJCX0KPj4gKwkJfQo+PiArCj4+ICsJCS8qIEtlZXAgbGF1bmNo aW5nIHVudGlsIHRoZSBza3kgaXMgc3VmZmljaWVudGx5IGZ1bGwuICovCj4+ICsJCWZseWluZyA9 IGk5MTVfc2NoZWR1bGVyX2NvdW50X2ZseWluZyhzY2hlZHVsZXIsIHJpbmcpOwo+PiArCQlpZiAo Zmx5aW5nID49IHNjaGVkdWxlci0+bWluX2ZseWluZykKPj4gKwkJCWJyZWFrOwo+PiArCj4+ICsJ CS8qIEdyYWIgYW5vdGhlciBub2RlIGFuZCBnbyByb3VuZCBhZ2Fpbi4uLiAqLwo+PiArCQlyZXQg PSBpOTE1X3NjaGVkdWxlcl9wb3BfZnJvbV9xdWV1ZV9sb2NrZWQocmluZywgJm5vZGUpOwo+PiAr CX0gd2hpbGUgKHJldCA9PSAwKTsKPj4gKwo+PiArCS8qIERvbid0IGNvbXBsYWluIGFib3V0IG5v dCBiZWluZyBhYmxlIHRvIHN1Ym1pdCBleHRyYSBlbnRyaWVzICovCj4+ICsJaWYgKHJldCA9PSAt RU5PREFUQSkKPj4gKwkJcmV0ID0gMDsKPj4gKwo+PiArCS8qCj4+ICsJICogQnVtcCB0aGUgcHJp b3JpdHkgb2YgZXZlcnl0aGluZyB0aGF0IHdhcyBub3Qgc3VibWl0dGVkIHRvIHByZXZlbnQKPj4g KwkgKiBzdGFydmF0aW9uIG9mIGxvdyBwcmlvcml0eSB0YXNrcyBieSBhIHNwYW1taW5nIGhpZ2gg cHJpb3JpdHkgdGFzay4KPj4gKwkgKi8KPiBUaGlzLCB0aGlzIGNhbGxzIGZvciBhbiBJLUctVCB0 ZXN0IHRvIG1ha2Ugc3VyZSB3ZSdyZSBlZmZlY3RpdmUuClllYWgsIElHVHMgYXJlIHVuZGVyIGRl dmVsb3BtZW50LgoKPj4gKwlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wX2NsZWFyKHNjaGVk dWxlcik7Cj4+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2RlX3F1 ZXVlW3JpbmctPmlkXSwgbGluaykgewo+PiArCQlpZiAoIUk5MTVfU1FTX0lTX1FVRVVFRChub2Rl KSkKPj4gKwkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCWk5MTVfc2NoZWR1bGVyX3ByaW9yaXR5X2J1 bXAoc2NoZWR1bGVyLCBub2RlLAo+PiArCQkJCQkgICAgIHNjaGVkdWxlci0+cHJpb3JpdHlfbGV2 ZWxfYnVtcCk7Cj4+ICsJfQo+PiArCj4+ICsJLyogT24gc3VjY2VzcywgcmV0dXJuIHRoZSBudW1i ZXIgb2YgYnVmZmVycyBzdWJtaXR0ZWQuICovCj4+ICsJaWYgKHJldCA9PSAwKQo+PiArCQlyZXQg PSBjb3VudDsKPj4gKwo+PiArZXJyb3I6Cj4+ICsJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0g Jj0gfmk5MTVfc2Zfc3VibWl0dGluZzsKPj4gKwlzcGluX3VubG9ja19pcnEoJnNjaGVkdWxlci0+ bG9jayk7Cj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgaTkxNV9n ZW5lcmF0ZV9kZXBlbmRlbmNpZXMoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCj4+ ICsJCQkJICAgICAgIHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSwKPj4g KwkJCQkgICAgICAgdWludDMyX3QgcmluZykKPj4gK3sKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXJfb2JqX2VudHJ5ICp0aGlzLCAqdGhhdDsKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVl dWVfZW50cnkgKnRlc3Q7Cj4+ICsJaW50IGksIGo7Cj4+ICsJYm9vbCBmb3VuZDsKPj4gKwo+PiAr CWxpc3RfZm9yX2VhY2hfZW50cnkodGVzdCwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nXSwg bGluaykgewo+PiArCQlpZiAoSTkxNV9TUVNfSVNfQ09NUExFVEUodGVzdCkpCj4+ICsJCQljb250 aW51ZTsKPj4gKwo+PiArCQkvKgo+PiArCQkgKiBCYXRjaGVzIG9uIHRoZSBzYW1lIHJpbmcgZm9y IHRoZSBzYW1lCj4+ICsJCSAqIGNvbnRleHQgbXVzdCBiZSBrZXB0IGluIG9yZGVyLgo+PiArCQkg Ki8KPj4gKwkJZm91bmQgPSAobm9kZS0+cGFyYW1zLmN0eCA9PSB0ZXN0LT5wYXJhbXMuY3R4KSAm Jgo+PiArCQkJKG5vZGUtPnBhcmFtcy5yaW5nID09IHRlc3QtPnBhcmFtcy5yaW5nKTsKPj4gKwo+ PiArCQkvKgo+PiArCQkgKiBCYXRjaGVzIHdvcmtpbmcgb24gdGhlIHNhbWUgb2JqZWN0cyBtdXN0 Cj4+ICsJCSAqIGJlIGtlcHQgaW4gb3JkZXIuCj4+ICsJCSAqLwo+PiArCQlmb3IgKGkgPSAwOyAo aSA8IG5vZGUtPm51bV9vYmpzKSAmJiAhZm91bmQ7IGkrKykgewo+PiArCQkJdGhpcyA9IG5vZGUt PnNhdmVkX29iamVjdHMgKyBpOwo+IG5vZGUtPm9ianMgYW5kIG5vZGUtPm51bV9vYmpzIHdvdWxk IGJlIGEgYmV0dGVyIG5hbWluZyBtYXRjaC4gbnVtX29ianMKPiBhbmQgc2F2ZWRfb2JqZWN0cyBt YWtlcyBtZSB0aGluayB3ZSBoYXZlIGEgYnVnIGhlcmUsIGluZGV4aW5nIHdyb25nCj4gYXJyYXku Cj4KPj4gKwo+PiArCQkJZm9yIChqID0gMDsgaiA8IHRlc3QtPm51bV9vYmpzOyBqKyspIHsKPj4g KwkJCQl0aGF0ID0gdGVzdC0+c2F2ZWRfb2JqZWN0cyArIGo7Cj4+ICsKPj4gKwkJCQlpZiAodGhp cy0+b2JqICE9IHRoYXQtPm9iaikKPj4gKwkJCQkJY29udGludWU7Cj4+ICsKPj4gKwkJCQkvKiBP bmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgd3JpdGVzICovCj4+ICsJCQkJaWYgKHRoaXMtPnJlYWRf b25seSAmJiB0aGF0LT5yZWFkX29ubHkpCj4+ICsJCQkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCQkJ Zm91bmQgPSB0cnVlOwo+PiArCQkJCWJyZWFrOwo+PiArCQkJfQo+PiArCQl9Cj4+ICsKPj4gKwkJ aWYgKGZvdW5kKSB7Cj4+ICsJCQlub2RlLT5kZXBfbGlzdFtub2RlLT5udW1fZGVwc10gPSB0ZXN0 Owo+PiArCQkJbm9kZS0+bnVtX2RlcHMrKzsKPj4gKwkJfQo+PiArCX0KPj4gK30KPj4gKwo+PiAr c3RhdGljIGludCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9leGVjYnVmZmVyX2J5cGFzcyhzdHJ1Y3Qg aTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnFlKQo+PiArewo+PiArCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHFlLT5wYXJhbXMuZGV2LT5kZXZfcHJpdmF0ZTsKPj4gKwlz dHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7Cj4+ ICsJaW50IHJldDsKPj4gKwo+PiArCXNjaGVkdWxlci0+ZmxhZ3NbcWUtPnBhcmFtcy5yaW5nLT5p ZF0gfD0gaTkxNV9zZl9zdWJtaXR0aW5nOwo+PiArCXJldCA9IGRldl9wcml2LT5ndC5leGVjYnVm X2ZpbmFsKCZxZS0+cGFyYW1zKTsKPj4gKwlzY2hlZHVsZXItPmZsYWdzW3FlLT5wYXJhbXMucmlu Zy0+aWRdICY9IH5pOTE1X3NmX3N1Ym1pdHRpbmc7Cj4+ICsKPiBUaGUgYWJvdmUgY29kZSBtYWtl cyBtZSB0aGluayBvZiBsb2NraW5nIGFnYWluLCBtYXliZSBkb2N1bWVudCBhdCB0b3AKPiBvZiB0 aGlzIGZ1bmN0aW9uLgpObyBuZWVkIHRvIGFjcXVpcmUgdGhlIHNwaW5sb2NrIGF0IHRoaXMgcG9p bnQuIElmIHRoZSBzY2hlZHVsZXIgaXMgaW4gCmJ5cGFzcyBtb2RlIHRoZW4gdGhlcmUgaXMgbm8g aW50ZXJuYWwgc3RhdGUgdG8gcHJvdGVjdC4gVGhlIGRyaXZlciBtdXRleCAKbG9jayB3aWxsIGJl IGhlbGQgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBjb2RlIHBhdGggdG8gZ2V0IGhlcmUgd2hp Y2ggCmlzIHRoZSBleGVjYnVmZiBJT0NUTC4gVGhlIHdob2xlIHBvaW50IG9mIGJ5cGFzcyBtb2Rl IGlzIHRoYXQgaXQgaXMgYSAKc2luZ2xlIGNvbnRpZ3VvdXMgZXhlY3V0aW9uIHBhdGggZnJvbSBJ T0NUTCBlbnRyeSBhbGwgdGhlIHdheSB0aHJvdWdoIHRvIApoYXJkd2FyZSBzdWJtaXNzaW9uLiBB IG11dGV4IGNoZWNrIGNvdWxkIGJlIGFkZGVkIGJ1dCBpdCBzZWVtcyAKdW5uZWNlc3NhcnkgZ2l2 ZW4gdGhlIGxpbWl0ZWQgY2FsbGluZyBzY29wZS4KCj4KPj4gKwkvKgo+PiArCSAqIERvbid0IGRv IGFueSBjbGVhbiB1cCBvbiBmYWlsdXJlIGJlY2F1c2UgdGhlIGNhbGxlciB3aWxsCj4+ICsJICog ZG8gaXQgYWxsIGFueXdheS4KPj4gKwkgKi8KPj4gKwlpZiAocmV0KQo+PiArCQlyZXR1cm4gcmV0 Owo+PiArCj4+ICsJLyogTmVlZCB0byByZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGUg bm9kZTogKi8KPj4gKwlpOTE1X3NjaGVkdWxlcl9jbGVhbl9ub2RlKHFlKTsKPj4gKwo+PiArCXJl dHVybiAwOwo+PiArfQo+PiArCj4+ICsvKioKPj4gKyAqIGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4 ZWNidWZmZXIgLSBTdWJtaXQgYSBiYXRjaCBidWZmZXIgcmVxdWVzdCB0byB0aGUKPj4gKyAqIHNj aGVkdWxlci4KPj4gKyAqIEBxZTogVGhlIGJhdGNoIGJ1ZmZlciByZXF1ZXN0IHRvIGJlIHF1ZXVl ZC4KPj4gKyAqIFRoZSBleHBlY3RhdGlvbiBpcyB0aGUgcWUgcGFzc2VkIGluIGlzIGEgbG9jYWwg c3RhY2sgdmFyaWFibGUuIFRoaXMKPj4gKyAqIGZ1bmN0aW9uIHdpbGwgY29weSBpdHMgY29udGVu dHMgaW50byBhIGZyZXNobHkgYWxsb2NhdGVkIGxpc3Qgbm9kZS4gVGhlCj4+ICsgKiBuZXcgbm9k ZSB0YWtlcyBvd25lcnNoaXAgb2Ygc2FpZCBjb250ZW50cyBzbyB0aGUgb3JpZ2luYWwgcWUgc2hv dWxkIHNpbXBseQo+PiArICogYmUgZGlzY2FyZGVkIGFuZCBub3QgY2xlYW5lZCB1cCAoaS5lLiBk b24ndCBmcmVlIG1lbW9yeSBpdCBwb2ludHMgdG8gb3IKPj4gKyAqIGRlcmVmZXJlbmNlIG9iamVj dHMgaXQgaG9sZHMpLiBUaGUgbm9kZSBpcyBhZGRlZCB0byB0aGUgc2NoZWR1bGVyJ3MgcXVldWUK Pj4gKyAqIGFuZCB0aGUgYmF0Y2ggYnVmZmVyIHdpbGwgYmUgc3VibWl0dGVkIHRvIHRoZSBoYXJk d2FyZSBhdCBzb21lIGZ1dHVyZQo+PiArICogcG9pbnQgaW4gdGltZSAod2hpY2ggbWF5IGJlIGlt bWVkaWF0ZWx5LCBiZWZvcmUgcmV0dXJuaW5nIG9yIG1heSBiZSBxdWl0ZQo+PiArICogYSBsb3Qg bGF0ZXIpLgo+PiArICovCj4+ICtpbnQgaTkxNV9zY2hlZHVsZXJfcXVldWVfZXhlY2J1ZmZlcihz dHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnFlKQo+PiArewo+PiArCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHFlLT5wYXJhbXMuZGV2LT5kZXZfcHJpdmF0ZTsK Pj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVs ZXI7Cj4+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9IHFlLT5wYXJhbXMucmluZzsK Pj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4+ICsJc3RydWN0 IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICp0ZXN0Owo+PiArCWJvb2wgbm90X2ZseWluZzsK Pj4gKwlpbnQgaSwgcjsKPj4gKwlpbnQgaW5jb21wbGV0ZSA9IDA7Cj4+ICsKPj4gKwlXQVJOX09O KCFzY2hlZHVsZXIpOwo+PiArCj4+ICsJaWYgKDEvKiFpOTE1LmVuYWJsZV9zY2hlZHVsZXIqLykK Pj4gKwkJcmV0dXJuIGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4ZWNidWZmZXJfYnlwYXNzKHFlKTsK Pj4gKwo+IEknbSB0aGlua2luZywgc2hvdWxkIHdlIGJyYW5jaCBhbHJlYWR5IGJlZm9yZSBjYWxs aW5nIGEgZnVuY3Rpb24gbmFtZWQKPiBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9leGVjYnVmZmVyIGlm IHNjaGVkdWxlciBpcyBkaXNhYmxlZD8KVGhhdCB3b3VsZCByZXF1aXJlIHB1dHRpbmcgaWYoc2No ZWR1bGVyKSBsb2dpYyBpbiByYW5kb20gcG9pbnRzIAp0aHJvdWdob3V0IHRoZSBkcml2ZXIuIERv aW5nIGl0IHRoaXMgd2F5LCB0aGUgZHJpdmVyIGFzIGEgd2hvbGUgaGFzIGEgCnNpbmdsZSBleGVj dXRpb24gcGF0aCB3aGljaCBpcyB2aWEgdGhlIHNjaGVkdWxlci4gSXQgaXMgdGhlbiB1cCB0byB0 aGUgCnNjaGVkdWxlciBpdHNlbGYgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcnVuIGluIGJ5cGFzcyBt b2RlLCBzaW1wbGUgCnJlLW9yZGVyaW5nIG1vZGUsIGZ1bGwgcHJlLWVtcHRpb24gbW9kZSBvciBh bnkgb3RoZXIgbW9kZSB3ZSBmZWVsIGEgbmVlZCAKdG8gYWRkLgoKCj4+ICsJbm9kZSA9IGttYWxs b2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7Cj4+ICsJaWYgKCFub2RlKQo+PiArCQlyZXR1 cm4gLUVOT01FTTsKPj4gKwo+PiArCSpub2RlID0gKnFlOwo+IE5vdyBJIHJlYWQgdGhlIGFkZGVk IGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbiwgbWF5YmUgd2Ugc2hvdWxkIGF0Cj4gbGVh c3QgemVybyBvdXQgcWUgdG8gYXZvaWQgZnV0dXJlIHByb2JsZW1zPwpUaGUgZXhlY2J1ZmYgc3Vj Y2VzcyBwYXRoIGhhbmRzIHRoZSBxZSBjb250ZW50cyBvdmVyIGFuZCBwcmV0dHkgbXVjaCAKaW1t ZWRpYXRlbHkgZHJvcHMgYWxsIHRoZSB3YXkgYmFjayBvdXQgb2YgdGhlIElPQ1RMLiBUaGUgZmFp bHVyZSBwYXRoIApkb2VzIHRoZSBmdWxsIGNsZWFudXAgb2YgZGUtYWxsb2NhdGluZyBhbGwgdGhl IHFlIHN0dWZmIGl0IGhhZCAKcHJldmlvdXNseSBhbGxvY2F0ZWQuIElNTyB0aGVyZSBkb2Vzbid0 IHNlZW0gdG8gYmUgbXVjaCBuZWVkIHRvIHplcm8gb3V0IAp0aGUgc3RydWN0dXJlIGF0IHRoaXMg cG9pbnQuCgo+Cj4+ICsJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmxpbmspOwo+PiArCW5vZGUtPnN0 YXR1cyA9IGk5MTVfc3FzX3F1ZXVlZDsKPj4gKwlub2RlLT5zdGFtcCAgPSBqaWZmaWVzOwo+PiAr CWk5MTVfZ2VtX3JlcXVlc3RfcmVmZXJlbmNlKG5vZGUtPnBhcmFtcy5yZXF1ZXN0KTsKPj4gKwo+ PiArCVdBUk5fT04obm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNjaGVkdWxlcl9xZSk7Cj4+ICsJbm9k ZS0+cGFyYW1zLnJlcXVlc3QtPnNjaGVkdWxlcl9xZSA9IG5vZGU7Cj4+ICsKPj4gKwkvKiBOZWVk IHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGluY29tcGxldGUgZW50cmllcyBpbiB0aGUgbGlz dCBhcwo+PiArCSAqIHRoYXQgd2lsbCBiZSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBkZXBlbmRl bmN5IGxpc3QuCj4+ICsJICoKPj4gKwkgKiBOb3RlIHRoYXQgdGhlIGFsbG9jYXRpb24gbXVzdCBu b3QgYmUgbWFkZSB3aXRoIHRoZSBzcGlubG9jayBhY3F1aXJlZAo+PiArCSAqIGFzIGttYWxsb2Mg Y2FuIHNsZWVwLiBIb3dldmVyLCB0aGUgdW5sb2NrL3JlbG9jayBpcyBzYWZlIGJlY2F1c2Ugbm8K Pj4gKwkgKiBuZXcgZW50cmllcyBjYW4gYmUgcXVldWVkIHVwIGR1cmluZyB0aGUgdW5sb2NrIGFz IHRoZSBpOTE1IGRyaXZlcgo+PiArCSAqIG11dGV4IGlzIHN0aWxsIGhlbGQuIEVudHJpZXMgY291 bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGJ1dCB0aGF0Cj4+ICsJICoganVzdCBtZWFucyB0 aGUgZGVwX2xpc3Qgd2lsbCBiZSBvdmVyLWFsbG9jYXRlZCB3aGljaCBpcyBmaW5lLgo+PiArCSAq Lwo+PiArCXNwaW5fbG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4gLS0+Cj4KPj4gKwlmb3Ig KHIgPSAwOyByIDwgSTkxNV9OVU1fUklOR1M7IHIrKykgewo+PiArCQlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KHRlc3QsICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcl0sIGxpbmspIHsKPj4gKwkJCWlmIChJ OTE1X1NRU19JU19DT01QTEVURSh0ZXN0KSkKPj4gKwkJCQljb250aW51ZTsKPj4gKwo+PiArCQkJ aW5jb21wbGV0ZSsrOwo+PiArCQl9Cj4+ICsJfQo+PiArCj4gPC0tIFRoaXMgY291bnRpbmcgc3Ry dWN0dXJlLCBJIHN0aWxsIHRoaW5rIGl0IHdvdWxkIGJlIGdvb2QgaWRlYSB0bwo+IG1ha2UgaXQg YSBzdGF0aWMgaGVscGVyLgo+Cj4+ICsJLyogVGVtcG9yYXJpbHkgdW5sb2NrIHRvIGFsbG9jYXRl IG1lbW9yeTogKi8KPj4gKwlzcGluX3VubG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4+ICsJ aWYgKGluY29tcGxldGUpIHsKPj4gKwkJbm9kZS0+ZGVwX2xpc3QgPSBrbWFsbG9jX2FycmF5KGlu Y29tcGxldGUsCj4+ICsJCQkJCSAgICAgICBzaXplb2YoKm5vZGUtPmRlcF9saXN0KSwKPj4gKwkJ CQkJICAgICAgIEdGUF9LRVJORUwpOwo+PiArCQlpZiAoIW5vZGUtPmRlcF9saXN0KSB7Cj4+ICsJ CQlrZnJlZShub2RlKTsKPj4gKwkJCXJldHVybiAtRU5PTUVNOwo+PiArCQl9Cj4+ICsJfSBlbHNl Cj4+ICsJCW5vZGUtPmRlcF9saXN0ID0gTlVMTDsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnEoJnNj aGVkdWxlci0+bG9jayk7Cj4+ICsJbm9kZS0+bnVtX2RlcHMgPSAwOwo+PiArCj4+ICsJaWYgKG5v ZGUtPmRlcF9saXN0KSB7Cj4+ICsJCWZvciAociA9IDA7IHIgPCBJOTE1X05VTV9SSU5HUzsgcisr KQo+PiArCQkJaTkxNV9nZW5lcmF0ZV9kZXBlbmRlbmNpZXMoc2NoZWR1bGVyLCBub2RlLCByKTsK Pj4gKwo+PiArCQlXQVJOX09OKG5vZGUtPm51bV9kZXBzID4gaW5jb21wbGV0ZSk7Cj4+ICsJfQo+ PiArCj4+ICsJbm9kZS0+cHJpb3JpdHkgPSBjbGFtcChub2RlLT5wcmlvcml0eSwKPj4gKwkJCSAg ICAgICBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbiwKPj4gKwkJCSAgICAgICBzY2hlZHVs ZXItPnByaW9yaXR5X2xldmVsX21heCk7Cj4+ICsKPj4gKwlpZiAoKG5vZGUtPnByaW9yaXR5ID4g MCkgJiYgbm9kZS0+bnVtX2RlcHMpIHsKPj4gKwkJaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVt cF9jbGVhcihzY2hlZHVsZXIpOwo+PiArCj4+ICsJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1f ZGVwczsgaSsrKQo+PiArCQkJaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcChzY2hlZHVsZXIs Cj4+ICsJCQkJCW5vZGUtPmRlcF9saXN0W2ldLCBub2RlLT5wcmlvcml0eSk7Cj4gSWYgbm9kZSBp cyBwb3N0ZWQgd2l0aCBtYXhpbXVtIHByaW9yaXR5IHRvIGJlZ2luIHdpdGgsIHdvdWxkbid0IHRo ZQo+IHByaW9yaXR5IHByb3BhZ2F0aW9uIHN0b3AgYWZ0ZXIgZmlyc3QgbGV2ZWwgZGVwZW5kZW5j aWVzIGR1ZSB0byB0aGUKPiBjaGVjayBpbiB0aGUgYmVnaW5uaW5nIG9mIHByaW9yaXR5X2J1bXAg ZnVuY3Rpb24/ClRoZSByZWN1cnNpb24gd2lsbCBzdG9wIHdoZW5ldmVyIGl0IGVuY291bnRlcnMg YSBub2RlIGFscmVhZHkgYXQgbWF4aW11bSAKcHJpb3JpdHkuIEhvd2V2ZXIsIGl0IGlzIG5vdCBz dGFydGluZyBmcm9tIHRoZSBuZXdseSBzdWJtaXR0ZWQgbm9kZSBidXQgCmZyb20gdGhhdCBub2Rl J3MgZGVwZW5kZW5jaWVzLiBJZiB0aGV5IGFyZSBhbHJlYWR5IGF0IG1heCBwcmlvcml0eSB0aGVu IAp0aGVpciBkZXBlbmRlbmNpZXMgbXVzdCBhbHNvIGJlIGFuZCBzbyBvbiBkb3duIHRoZSBjaGFp biBhbmQgbm8gZnVydGhlciAKcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4gT24gdGhlIG90aGVyIGhh bmQsIGlmIHRoZXkgYXJlIG5vdCB0aGVuIHRoZXkgCndpbGwgYmUgYnVtcGVkIGFuZCB0aGVpciBk ZXBlbmRlbmNpZXMgY2hlY2tlZCBhbmQgc28gb24gZG93biB0aGUgY2hhaW4uCgo+PiArCj4+ICsJ bGlzdF9hZGRfdGFpbCgmbm9kZS0+bGluaywgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5p ZF0pOwo+PiArCj4+ICsJbm90X2ZseWluZyA9IGk5MTVfc2NoZWR1bGVyX2NvdW50X2ZseWluZyhz Y2hlZHVsZXIsIHJpbmcpIDwKPj4gKwkJCQkJCSBzY2hlZHVsZXItPm1pbl9mbHlpbmc7Cj4+ICsK Pj4gKwlzcGluX3VubG9ja19pcnEoJnNjaGVkdWxlci0+bG9jayk7Cj4+ICsKPj4gKwlpZiAobm90 X2ZseWluZykKPj4gKwkJaTkxNV9zY2hlZHVsZXJfc3VibWl0KHJpbmcpOwo+PiArCj4+ICsJcmV0 dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gKy8qKgo+PiArICogaTkxNV9zY2hlZHVsZXJfbm90aWZ5X3Jl cXVlc3QgLSBOb3RpZnkgdGhlIHNjaGVkdWxlciB0aGF0IHRoZSBnaXZlbgo+PiArICogcmVxdWVz dCBoYXMgY29tcGxldGVkIG9uIHRoZSBoYXJkd2FyZS4KPj4gKyAqIEByZXE6IFJlcXVlc3Qgc3Ry dWN0dXJlIHdoaWNoIGhhcyBjb21wbGV0ZWQKPj4gKyAqIEBwcmVlbXB0OiBEaWQgaXQgY29tcGxl dGUgcHJlLWVtcHRpdmVseT8KPj4gKyAqIEEgc2VxdWVuY2UgbnVtYmVyIGhhcyBwb3BwZWQgb3V0 IG9mIHRoZSBoYXJkd2FyZSBhbmQgdGhlIHJlcXVlc3QgaGFuZGxpbmcKPj4gKyAqIGNvZGUgaGFz IG1hcHBlZCBpdCBiYWNrIHRvIGEgcmVxdWVzdCBhbmQgd2lsbCBtYXJrIHRoYXQgcmVxdWVzdCBj b21wbGV0ZS4KPj4gKyAqIEl0IGFsc28gY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBub3RpZnkgdGhl IHNjaGVkdWxlciBhYm91dCB0aGUgY29tcGxldGlvbgo+PiArICogc28gdGhlIHNjaGVkdWxlcidz IG5vZGUgY2FuIGJlIHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KPj4gKyAqIFJldHVybnMgdHJ1ZSBp ZiB0aGUgcmVxdWVzdCBpcyBzY2hlZHVsZXIgbWFuYWdlZCwgZmFsc2UgaWYgbm90LiBUaGUgcmV0 dXJuCj4+ICsgKiB2YWx1ZSBpcyBjb21iaW5lZCBmb3IgYWxsIGZyZXNobHkgY29tcGxldGVkIHJl cXVlc3RzIGFuZCBpZiBhbnkgd2VyZSB0cnVlCj4+ICsgKiB0aGVuIGk5MTVfc2NoZWR1bGVyX3dh a2V1cCgpIGlzIGNhbGxlZCBzbyB0aGUgc2NoZWR1bGVyIGNhbiBkbyBmdXJ0aGVyCj4+ICsgKiBw cm9jZXNzaW5nIChzdWJtaXQgbW9yZSB3b3JrKSBhdCB0aGUgZW5kLgo+PiArICovCj4+ICtib29s IGk5MTVfc2NoZWR1bGVyX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVz dCAqcmVxKQo+PiArewo+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRv X2k5MTUocmVxLT5yaW5nLT5kZXYpOwo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1 bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVl dWVfZW50cnkgKm5vZGUgPSByZXEtPnNjaGVkdWxlcl9xZTsKPj4gKwl1bnNpZ25lZCBsb25nIGZs YWdzOwo+PiArCj4+ICsJaWYgKCFub2RlKQo+PiArCQlyZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKwlz cGluX2xvY2tfaXJxc2F2ZSgmc2NoZWR1bGVyLT5sb2NrLCBmbGFncyk7Cj4+ICsKPj4gKwlXQVJO X09OKCFJOTE1X1NRU19JU19GTFlJTkcobm9kZSkpOwo+PiArCj4+ICsJLyogTm9kZSB3YXMgaW4g ZmxpZ2h0IHNvIG1hcmsgaXQgYXMgY29tcGxldGUuICovCj4+ICsJaWYgKHJlcS0+Y2FuY2VsbGVk KQo+PiArCQlub2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19kZWFkOwo+PiArCWVsc2UKPj4gKwkJbm9k ZS0+c3RhdHVzID0gaTkxNV9zcXNfY29tcGxldGU7Cj4+ICsKPj4gKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCXJldHVybiB0cnVlOwo+ PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3JlbW92ZV9kZXBlbmRlbnQo c3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCj4+ICsJCQkJc3RydWN0IGk5MTVfc2No ZWR1bGVyX3F1ZXVlX2VudHJ5ICpyZW1vdmUpCj4+ICt7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1 bGVyX3F1ZXVlX2VudHJ5ICpub2RlOwo+PiArCWludCBpLCByOwo+PiArCWludCBjb3VudCA9IDA7 Cj4+ICsKPj4gKwkvKgo+PiArCSAqIEVuc3VyZSB0aGF0IGEgbm9kZSBpcyBub3QgYmVpbmcgcmVt b3ZlZCB3aGljaCBpcyBzdGlsbCBkZXBlbmRlbnQKPj4gKwkgKiB1cG9uIG90aGVyIChub3QgY29t cGxldGVkKSB3b3JrLiBJZiB0aGF0IGhhcHBlbnMsIGl0IGltcGxpZXMKPj4gKwkgKiBzb21ldGhp bmcgaGFzIGdvbmUgdmVyeSB3cm9uZyB3aXRoIHRoZSBkZXBlbmRlbmN5IHRyYWNraW5nISBOb3Rl Cj4+ICsJICogdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGlmIHRoaXMgbm9kZSBoYXMg YmVlbiBleHBsaWNpdGx5Cj4+ICsJICoga2lsbGVkIGZvciBzb21lIHJlYXNvbiAtIGl0IG1pZ2h0 IGJlIGJlaW5nIGtpbGxlZCBiZWZvcmUgaXQgZ290Cj4+ICsJICogc2VudCB0byB0aGUgaGFyZHdh cmUuCj4+ICsJICovCj4+ICsJaWYgKHJlbW92ZS0+c3RhdHVzICE9IGk5MTVfc3FzX2RlYWQpIHsK Pj4gKwkJZm9yIChpID0gMDsgaSA8IHJlbW92ZS0+bnVtX2RlcHM7IGkrKykKPj4gKwkJCWlmICgo cmVtb3ZlLT5kZXBfbGlzdFtpXSkgJiYKPj4gKwkJCSAgICAoIUk5MTVfU1FTX0lTX0NPTVBMRVRF KHJlbW92ZS0+ZGVwX2xpc3RbaV0pKSkKPj4gKwkJCQljb3VudCsrOwo+PiArCQlXQVJOX09OKGNv dW50KTsKPj4gKwl9Cj4+ICsKPj4gKwkvKgo+PiArCSAqIFJlbW92ZSB0aGlzIG5vZGUgZnJvbSB0 aGUgZGVwZW5kZW5jeSBsaXN0cyBvZiBhbnkgb3RoZXIgbm9kZSB3aGljaAo+PiArCSAqIG1pZ2h0 IGJlIHdhaXRpbmcgb24gaXQuCj4+ICsJICovCj4+ICsJZm9yIChyID0gMDsgciA8IEk5MTVfTlVN X1JJTkdTOyByKyspIHsKPj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVy LT5ub2RlX3F1ZXVlW3JdLCBsaW5rKSB7Cj4+ICsJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVt X2RlcHM7IGkrKykgewo+PiArCQkJCWlmIChub2RlLT5kZXBfbGlzdFtpXSAhPSByZW1vdmUpCj4+ ICsJCQkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCQkJbm9kZS0+ZGVwX2xpc3RbaV0gPSBOVUxMOwo+ PiArCQkJfQo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4g Ky8qKgo+PiArICogaTkxNV9zY2hlZHVsZXJfd2FrZXVwIC0gd2FrZSB0aGUgc2NoZWR1bGVyJ3Mg d29ya2VyIHRocmVhZAo+PiArICogQGRldjogRFJNIGRldmljZQo+PiArICogQ2FsbGVkIGF0IHRo ZSBlbmQgb2Ygc2Vxbm8gaW50ZXJydXB0IHByb2Nlc3NpbmcgaWYgYW55IHJlcXVlc3QgaGFzCj4+ ICsgKiBjb21wbGV0ZWQgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNjaGVkdWxlciBub2RlLgo+PiAr ICovCj4+ICt2b2lkIGk5MTVfc2NoZWR1bGVyX3dha2V1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 KQo+PiArewo+PiArCS8qIFhYWDogTmVlZCB0byBjYWxsIGk5MTVfc2NoZWR1bGVyX3JlbW92ZSgp IHZpYSB3b3JrIGhhbmRsZXIuICovCj4+ICt9Cj4+ICsKPj4gKy8qKgo+PiArICogaTkxNV9zY2hl ZHVsZXJfY2xlYW5fbm9kZSAtIGZyZWUgdXAgYW55IGFsbG9jYXRpb25zL3JlZmVyZW5jZXMKPj4g KyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2NoZWR1bGVyIHF1ZXVlIGVudHJ5Lgo+PiAr ICogQG5vZGU6IFF1ZXVlIGVudHJ5IHN0cnVjdHVyZSB3aGljaCBpcyBjb21wbGV0ZQo+PiArICog QWZ0ZXIgYSBnaXZlIGJhdGNoIGJ1ZmZlciBjb21wbGV0ZXMgb24gdGhlIGhhcmR3YXJlLCBhbGwg dGhlIGluZm9ybWF0aW9uCj4+ICsgKiByZXF1aXJlZCB0byByZXN1Ym1pdCBpdCBpcyBubyBsb25n ZXIgcmVxdWlyZWQuIEhvd2V2ZXIsIHRoZSBub2RlIGVudHJ5Cj4+ICsgKiBpdHNlbGYgbWlnaHQg c3RpbGwgYmUgcmVxdWlyZWQgZm9yIHRyYWNraW5nIHB1cnBvc2VzIGZvciBhIHdoaWxlIGxvbmdl ci4KPj4gKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBu b2RlIGlzIGtub3duIHRvIGJlIGNvbXBsZXRlCj4+ICsgKiBzbyB0aGF0IHRoZXNlIHJlc291cmNl cyBtYXkgYmUgZnJlZWQgZXZlbiB0aG91Z2ggdGhlIG5vZGUgaXRzZWxmIG1pZ2h0Cj4+ICsgKiBo YW5nIGFyb3VuZC4KPj4gKyAqLwo+PiArdm9pZCBpOTE1X3NjaGVkdWxlcl9jbGVhbl9ub2RlKHN0 cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSkKPj4gK3sKPj4gKwlpZiAoIUk5 MTVfU1FTX0lTX0NPTVBMRVRFKG5vZGUpKSB7Cj4+ICsJCVdBUk4oIW5vZGUtPnBhcmFtcy5yZXF1 ZXN0LT5jYW5jZWxsZWQsCj4+ICsJCSAgICAgIkNsZWFuaW5nIGFjdGl2ZSBub2RlOiAlZCFcbiIs IG5vZGUtPnN0YXR1cyk7Cj4+ICsJCXJldHVybjsKPj4gKwl9Cj4+ICsKPj4gKwlpZiAobm9kZS0+ cGFyYW1zLmJhdGNoX29iaikgewo+PiArCQkvKgo+PiArCQkgKiBUaGUgYmF0Y2ggYnVmZmVyIG11 c3QgYmUgdW5waW5uZWQgYmVmb3JlIGl0IGlzIHVucmVmZXJlbmNlZAo+PiArCQkgKiBvdGhlcndp c2UgdGhlIHVucGluIGZhaWxzIHdpdGggYSBtaXNzaW5nIHZtYSE/Cj4+ICsJCSAqLwo+PiArCQlp ZiAobm9kZS0+cGFyYW1zLmRpc3BhdGNoX2ZsYWdzICYgSTkxNV9ESVNQQVRDSF9TRUNVUkUpCj4+ ICsJCQlpOTE1X2dlbV9leGVjYnVmZl9yZWxlYXNlX2JhdGNoX29iaihub2RlLT5wYXJhbXMuYmF0 Y2hfb2JqKTsKPj4gKwo+IFRoaXMgY29kZSBzZWVtcyBsaXR0bGUgYml0IG91dCBvZiBwbGFjZS4K Tm90IHN1cmUgd2hlcmUgZWxzZSB5b3UgY291bGQgcHV0IGl0LiBUaGUgY29kZSBpdHNlbGYgaXMg anVzdCBhIGNvcHkgb2YgCnRoZSBleGlzdGluZyBjbGVhbiB1cCBjb2RlIHRoYXQgd2FzIGFscmVh ZHkgaW4gdGhlIGV4ZWNidWZmIGNvZGUgcGF0aC4gClRoZSBjbGVhbnVwIGNhbiBubyBsb25nZXIg YmUgZG9uZSB3aXRoaW4gdGhlIGV4ZWNidWZmIGNhbGwgZHVlIHRvIHRoZSAKYmF0Y2ggYnVmZmVy IGV4ZWN1dGlvbiBiZWluZyBhcmJpdHJhcmlseSBkZWxheWVkIGJ5IHRoZSBzY2hlZHVsZXIuIFRo dXMgCml0IGlzIGRvd24gdG8gdGhlIHNjaGVkdWxlciB0byBkbyBhbGwgdGhlIG5lY2Vzc2FyeSBj bGVhbnVwIHdoZW4gaXQgCmtub3dzIHRoYXQgdGhlIGJhdGNoIGJ1ZmZlciBpcyBubyBsb25nZXIg cmVxdWlyZWQuCgo+Cj4+ICsJCW5vZGUtPnBhcmFtcy5iYXRjaF9vYmogPSBOVUxMOwo+PiArCX0K Pj4gKwo+PiArCS8qIEFuZCBhbnl0aGluZyBlbHNlIG93bmVkIGJ5IHRoZSBub2RlOiAqLwo+PiAr CWlmIChub2RlLT5wYXJhbXMuY2xpcHJlY3RzKSB7Cj4+ICsJCWtmcmVlKG5vZGUtPnBhcmFtcy5j bGlwcmVjdHMpOwo+PiArCQlub2RlLT5wYXJhbXMuY2xpcHJlY3RzID0gTlVMTDsKPj4gKwl9Cj4+ ICt9Cj4+ICsKPiBUaGUgYmVsb3cgZnVuY3Rpb24gaXMgcXVpdGUgaGFja3ksIEkgdW5kZXJzdG9v ZCB0aGlzIHdpbGwgYmUgbWl0aWdhdGVkCj4gYnkgcGVyLWN0eCBzZXF1ZW5jZSBudW1iZXJpbmcg aW4gdGhlIGZ1dHVyZT8KVG8gYmUgaG9uZXN0LCBJIHRoaW5rIGl0IGlzIGFscmVhZHkgb2Jzb2xl dGUgZHVlIHRvIHRoZSBwcmV2aW91cyB3b3JrIG9mIApjb252ZXJ0aW5nIGZyb20gc2Vxbm8gdGVz dHMgZXZlcnl3aGVyZSB0byB0ZXN0aW5nIHJlcXVlc3Qgc3RydWN0dXJlcy4gClRoZSBwb2ludCBv ZiB0aGUgY29kZSBiZWxvdyB3YXMgdG8gY29wZSB3aXRoIHNlcW5vIHZhbHVlcyBwb3BwaW5nIG91 dCBvZiAKdGhlIGhhcmR3YXJlIGluIHJhbmRvbSBvcmRlciBkdWUgdG8gdGhlIHJlLW9yZGVyaW5n IG9mIGJhdGNoIGJ1ZmZlcnMgCnByaW9yIHRvIGV4ZWN1dGlvbi4gV2hlcmVhcywgdGhlIHN0cnVj dCByZXF1ZXN0IGNvbnZlcnNpb24gYWxsb3dlZCB0aGUgCnNlcW5vIHRvIGJlIGxhdGUgYWxsb2Nh dGVkIGFuZCB0aHVzIGtlcHQgaW4gb3JkZXIuCgpVbmZvcnR1bmF0ZWx5LCBwcmUtZW1wdGlvbiBj b25mdXNlcyBtYXR0ZXJzIGFnYWluLiBBbHRob3VnaCB0aGUgCmludGVudGlvbiBpcyB0aGF0IHNl cW5vIHZhbHVlcyB3aWxsIHN0aWxsIGJlIGtlcHQgaW4gb3JkZXIuIEl0J3MganVzdCAKdGhhdCBh IGdpdmVuIHJlcXVlc3QgbWlnaHQgaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgc2Vxbm8gdmFsdWVz IGFzc2lnbmVkIAp0byBpdCB0aHJvdWdob3V0IGl0cyBsaWZlLiBUaGUgcHJlLWVtcHRpb24gY29k ZSBoYXNuJ3QgcXVpdGUgc2V0dGxlZCAKZG93biB5ZXQgdGhvdWdoLCBlc3BlY2lhbGx5IHdpdGgg aW50ZXJlc3RpbmcgbmV3IGhhcmR3YXJlIHBsYW5uZWQgZm9yIApmdXR1cmUgY2hpcHMuIFRodXMg SSBkb24ndCByZWFsbHkgd2FudCB0byByaXAgb3V0IGFsbCBvZiB0aGlzIGNvZGUgcXVpdGUgCnll dCBqdXN0IGluIGNhc2Ugd2UgZG8gc3RpbGwgbmVlZCBpdC4KCkFzIHlvdSBzYXksIHBlci1jdHgg c2Vxbm9zIHdvdWxkIGRlZmluaXRlbHkgaGF2ZSBhbiBlZmZlY3QgaGVyZSBhcyB3ZWxsLiAKU28g eWVzLCBsb25nIHRlcm0gdGhlIGludGVudGlvbiBpcyB0byByZW1vdmUgYWxsIHRoaXMgbmFzdHlu ZXNzLiBTaG9ydCAKdGVybSwgaXQgc2VlbXMgYmVzdCB0byBrZWVwIGl0IGFyb3VuZCB1bnRpbCBw cm92ZW4gdW5uZWNlc3NhcnkuCgo+Cj4+ICtzdGF0aWMgYm9vbCBpOTE1X3NjaGVkdWxlcl9yZW1v dmUoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCj4+ICsJCQkJICBzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICpyaW5nLAo+PiArCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcmVtb3ZlKQo+ PiArewo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSwgKm5vZGVf bmV4dDsKPj4gKwlpbnQgZmx5aW5nID0gMCwgcXVldWVkID0gMDsKPj4gKwlib29sIGRvX3N1Ym1p dDsKPj4gKwl1aW50MzJfdCBtaW5fc2Vxbm87Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxKCZzY2hl ZHVsZXItPmxvY2spOwo+PiArCj4+ICsJLyoKPj4gKwkgKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUg c3lzdGVtIGlzIGlkbGUsIHN0YXJ0aW5nICdtaW5fc2Vxbm8nIGZyb20gYSBiaWcKPj4gKwkgKiBu dW1iZXIgd2lsbCBjYXVzZSBhbGwgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcyB0aGV5IGFyZSBub3cg YmFjayB0bwo+PiArCSAqIGJlaW5nIGluLW9yZGVyLiBIb3dldmVyLCB0aGlzIHdpbGwgYmUgYSBw cm9ibGVtIGlmIHRoZSBsYXN0IG9uZSB0bwo+PiArCSAqIGNvbXBsZXRlIHdhcyBhY3R1YWxseSBv dXQtb2Ytb3JkZXIgYXMgdGhlIHJpbmcgc2Vxbm8gdmFsdWUgd2lsbCBiZQo+PiArCSAqIGxvd2Vy IHRoYW4gb25lIG9yIG1vcmUgY29tcGxldGVkIGJ1ZmZlcnMuIFRodXMgY29kZSBsb29raW5nIGZv ciB0aGUKPj4gKwkgKiBjb21wbGV0aW9uIG9mIHNhaWQgYnVmZmVycyB3aWxsIHdhaXQgZm9yZXZl ci4KPj4gKwkgKiBJbnN0ZWFkLCB1c2UgdGhlIGhhcmR3YXJlIHNlcW5vIGFzIHRoZSBzdGFydGlu ZyBwb2ludC4gVGhpcyBtZWFucwo+PiArCSAqIHRoYXQgc29tZSBidWZmZXJzIG1pZ2h0IGJlIGtl cHQgYXJvdW5kIGV2ZW4gaW4gYSBjb21wbGV0ZWx5IGlkbGUKPj4gKwkgKiBzeXN0ZW0gYnV0IGl0 IHNob3VsZCBndWFyYW50ZWUgdGhhdCBuby1vbmUgZXZlciBnZXRzIGNvbmZ1c2VkIHdoZW4KPj4g KwkgKiB3YWl0aW5nIGZvciBidWZmZXIgY29tcGxldGlvbi4KPj4gKwkgKi8KPj4gKwltaW5fc2Vx bm8gPSByaW5nLT5nZXRfc2Vxbm8ocmluZywgdHJ1ZSk7Cj4+ICsKPj4gKwlsaXN0X2Zvcl9lYWNo X2VudHJ5KG5vZGUsICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRdLCBsaW5rKSB7Cj4+ ICsJCWlmIChJOTE1X1NRU19JU19RVUVVRUQobm9kZSkpCj4+ICsJCQlxdWV1ZWQrKzsKPj4gKwkJ ZWxzZSBpZiAoSTkxNV9TUVNfSVNfRkxZSU5HKG5vZGUpKQo+PiArCQkJZmx5aW5nKys7Cj4+ICsJ CWVsc2UgaWYgKEk5MTVfU1FTX0lTX0NPTVBMRVRFKG5vZGUpKQo+PiArCQkJY29udGludWU7Cj4+ ICsKPj4gKwkJaWYgKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubyA9PSAwKQo+PiArCQkJY29u dGludWU7Cj4+ICsKPj4gKwkJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChub2RlLT5wYXJhbXMucmVx dWVzdC0+c2Vxbm8sIG1pbl9zZXFubykpCj4+ICsJCQltaW5fc2Vxbm8gPSBub2RlLT5wYXJhbXMu cmVxdWVzdC0+c2Vxbm87Cj4+ICsJfQo+PiArCj4+ICsJSU5JVF9MSVNUX0hFQUQocmVtb3ZlKTsK Pj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgbm9kZV9uZXh0LCAmc2NoZWR1bGVy LT5ub2RlX3F1ZXVlW3JpbmctPmlkXSwgbGluaykgewo+PiArCQkvKgo+PiArCQkgKiBPbmx5IHJl bW92ZSBjb21wbGV0ZWQgbm9kZXMgd2hpY2ggaGF2ZSBhIGxvd2VyIHNlcW5vIHRoYW4KPj4gKwkJ ICogYWxsIHBlbmRpbmcgbm9kZXMuIFdoaWxlIHRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSBvZiB0 aGUKPj4gKwkJICogcmluZydzIHNlcW5vIGNvdW50aW5nIGJhY2t3YXJkcywgYWxsIGhpZ2hlciBi dWZmZXJzIG11c3QKPj4gKwkJICogYmUgcmVtZW1iZXJlZCBzbyB0aGF0IHRoZSAnaTkxNV9zZXFu b19wYXNzZWQoKScgdGVzdCBjYW4KPj4gKwkJICogcmVwb3J0IHRoYXQgdGhleSBoYXZlIGluIGZh Y3QgcGFzc2VkLgo+PiArCQkgKgo+PiArCQkgKiBOQjogVGhpcyBpcyBub3QgdHJ1ZSBmb3IgJ2Rl YWQnIG5vZGVzLiBUaGUgR1BVIHJlc2V0IGNhdXNlcwo+PiArCQkgKiB0aGUgc29mdHdhcmUgc2Vx bm8gdG8gcmVzdGFydCBmcm9tIGl0cyBpbml0aWFsIHZhbHVlLiBUaHVzCj4+ICsJCSAqIHRoZSBk ZWFkIG5vZGVzIG11c3QgYmUgcmVtb3ZlZCBldmVuIHRob3VnaCB0aGVpciBzZXFubyB2YWx1ZXMK Pj4gKwkJICogYXJlIHBvdGVudGlhbGx5IHZhc3RseSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQg cmluZyBzZXFuby4KPj4gKwkJICovCj4+ICsJCWlmICghSTkxNV9TUVNfSVNfQ09NUExFVEUobm9k ZSkpCj4+ICsJCQljb250aW51ZTsKPj4gKwo+PiArCQlpZiAobm9kZS0+c3RhdHVzICE9IGk5MTVf c3FzX2RlYWQpIHsKPj4gKwkJCWlmIChpOTE1X3NlcW5vX3Bhc3NlZChub2RlLT5wYXJhbXMucmVx dWVzdC0+c2Vxbm8sIG1pbl9zZXFubykgJiYKPj4gKwkJCSAgICAobm9kZS0+cGFyYW1zLnJlcXVl c3QtPnNlcW5vICE9IG1pbl9zZXFubykpCj4+ICsJCQkJY29udGludWU7Cj4+ICsJCX0KPj4gKwo+ PiArCQlsaXN0X2RlbCgmbm9kZS0+bGluayk7Cj4+ICsJCWxpc3RfYWRkKCZub2RlLT5saW5rLCBy ZW1vdmUpOwo+PiArCj4+ICsJCS8qIFN0cmlwIHRoZSBkZXBlbmRlbmN5IGluZm8gd2hpbGUgdGhl IG11dGV4IGlzIHN0aWxsIGxvY2tlZCAqLwo+PiArCQlpOTE1X3NjaGVkdWxlcl9yZW1vdmVfZGVw ZW5kZW50KHNjaGVkdWxlciwgbm9kZSk7Cj4+ICsKPj4gKwkJY29udGludWU7Cj4+ICsJfQo+PiAr Cj4+ICsJLyoKPj4gKwkgKiBSZWxlYXNlIHRoZSBpbnRlcnJ1cHQgcmVmZXJlbmNlIGNvdW50IGlm IHRoZXJlIGFyZSBubyBsb25nZXIgYW55Cj4+ICsJICogbm9kZXMgdG8gd29ycnkgYWJvdXQuCj4+ ICsJICovCj4+ICsJaWYgKCFmbHlpbmcgJiYgIXF1ZXVlZCAmJgo+PiArCSAgICAoc2NoZWR1bGVy LT5mbGFnc1tyaW5nLT5pZF0gJiBpOTE1X3NmX2ludGVycnVwdHNfZW5hYmxlZCkpIHsKPj4gKwkJ cmluZy0+aXJxX3B1dChyaW5nKTsKPj4gKwkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gJj0g fmk5MTVfc2ZfaW50ZXJydXB0c19lbmFibGVkOwo+IE1heWJlIGhhdmUgdGhpcyBwaWVjZSBvZiBj b2RlIGFzIGEgaGVscGVyPyBUbyBlbmFibGUgaW50ZXJydXB0cyBhbmQKPiBkaXNhYmxlIHRoZW0s IG1heWJlIGV2ZW4gYSByZWZlcmVuY2UgY291bnQ/Ck5vdCBzdXJlIGhvdyBtdWNoIHlvdSBjb3Vs ZCBhYnN0cmFjdCBvdXQgaW50byBhIGhlbHBlciBvdGhlciB0aGFuIHRoZSAKdHdvIGxpbmVzIG9m IGlycV9nZXR8cHV0ICsgZmxhZyBzZXR8Y2xlYXIuIFRoZSBmbHlpbmd8cXVldWVkIHRlc3QgaXMg CnBhcnRpY3VsYXIgdG8gdGhpcyBvbmUgaW5zdGFuY2UuIEFsc28sIHRoZXJlIGlzIG5vIG5lZWQg dG8gcmVmZXJlbmNlIApjb3VudCBhcyB0aGUgaXJxIGNvZGUgZG9lcyB0aGF0IGFscmVhZHkuCgo+ Cj4+ICsJfQo+PiArCj4+ICsJLyogTGF1bmNoIG1vcmUgcGFja2V0cyBub3c/ICovCj4+ICsJZG9f c3VibWl0ID0gKHF1ZXVlZCA+IDApICYmIChmbHlpbmcgPCBzY2hlZHVsZXItPm1pbl9mbHlpbmcp Owo+PiArCj4+ICsJc3Bpbl91bmxvY2tfaXJxKCZzY2hlZHVsZXItPmxvY2spOwo+PiArCj4+ICsJ cmV0dXJuIGRvX3N1Ym1pdDsKPj4gK30KPj4gKwo+PiArdm9pZCBpOTE1X3NjaGVkdWxlcl9wcm9j ZXNzX3dvcmsoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKPj4gK3sKPj4gKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwo+PiAr CXN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsK Pj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4+ICsJYm9vbCBk b19zdWJtaXQ7Cj4+ICsJc3RydWN0IGxpc3RfaGVhZCByZW1vdmU7Cj4+ICsKPj4gKwlpZiAobGlz dF9lbXB0eSgmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3JpbmctPmlkXSkpCj4+ICsJCXJldHVybjsK Pj4gKwo+PiArCS8qIFJlbW92ZSBjb21wbGV0ZWQgbm9kZXMuICovCj4+ICsJZG9fc3VibWl0ID0g aTkxNV9zY2hlZHVsZXJfcmVtb3ZlKHNjaGVkdWxlciwgcmluZywgJnJlbW92ZSk7Cj4+ICsKPj4g KwlpZiAoIWRvX3N1Ym1pdCAmJiBsaXN0X2VtcHR5KCZyZW1vdmUpKQo+PiArCQlyZXR1cm47Cj4+ ICsKPj4gKwkvKiBOZWVkIHRvIGdyYWIgdGhlIHBtIGxvY2sgb3V0c2lkZSBvZiB0aGUgbXV0ZXgg bG9jayAqLwo+PiArCWlmIChkb19zdWJtaXQpCj4+ICsJCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRl dl9wcml2KTsKPj4gKwo+PiArCW11dGV4X2xvY2soJnJpbmctPmRldi0+c3RydWN0X211dGV4KTsK Pj4gKwo+PiArCWlmIChkb19zdWJtaXQpCj4+ICsJCWk5MTVfc2NoZWR1bGVyX3N1Ym1pdChyaW5n KTsKPj4gKwo+PiArCXdoaWxlICghbGlzdF9lbXB0eSgmcmVtb3ZlKSkgewo+PiArCQlub2RlID0g bGlzdF9maXJzdF9lbnRyeSgmcmVtb3ZlLCB0eXBlb2YoKm5vZGUpLCBsaW5rKTsKPj4gKwkJbGlz dF9kZWwoJm5vZGUtPmxpbmspOwo+PiArCj4+ICsJCS8qIEZyZWUgdXAgYWxsIHRoZSBEUk0gcmVm ZXJlbmNlcyAqLwo+PiArCQlpOTE1X3NjaGVkdWxlcl9jbGVhbl9ub2RlKG5vZGUpOwo+PiArCj4+ ICsJCS8qIEFuZCBhbnl0aGluZyBlbHNlIG93bmVkIGJ5IHRoZSBub2RlOiAqLwo+PiArCQlub2Rl LT5wYXJhbXMucmVxdWVzdC0+c2NoZWR1bGVyX3FlID0gTlVMTDsKPj4gKwkJaTkxNV9nZW1fcmVx dWVzdF91bnJlZmVyZW5jZShub2RlLT5wYXJhbXMucmVxdWVzdCk7Cj4+ICsJCWtmcmVlKG5vZGUt PmRlcF9saXN0KTsKPj4gKwkJa2ZyZWUobm9kZSk7Cj4gTWF5YmUgaGF2ZSBhIHNlcGFyYXRlIGhl bHBlciBmb3IgZnJlZWluZyBhIG5vZGUsIHdvdWxkIG1ha2UgdGhpcyBtdWNoCj4gY2xlYW5lci4K VGhlcmUgaXMgYSBoZWxwZXIgZm9yIGZyZWVpbmcgdXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBub2Rl IC0gc2VlIAppOTE1X3NjaGVkdWxlcl9jbGVhbl9ub2RlKCkgYWJvdmUuIEhvd2V2ZXIsIHRoYXQg ZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gCm11bHRpcGxlIHBsYWNlcyBhbmQgdGhpcyBpcyB0aGUg b25seSBpbnN0YW5jZSB3aGVyZSB0aGUgbm9kZSBpdHNlbGYgaXMgCmFjdHVhbGx5IGZyZWVkLiBU aGUgb3RoZXIgY2FsbGVycyBlaXRoZXIgbmVlZCB0byBrZWVwIHRoZSBub2RlIGFyb3VuZCAKZm9y IGEgd2hpbGUgbG9uZ2VyIChpLmUuIHVudGlsIHRoaXMgcGllY2Ugb2YgY29kZSBjYW4gcnVuKSBv ciBkb24ndCBvd24gCnRoZSBub2RlIGJlY2F1c2UgaXQgaXMgc3RhY2sgYWxsb2NhdGVkIChpbiB0 aGUgYnlwYXNzIGNhc2UpLiBTbyB0aGUgCidhbnl0aGluZyBlbHNlJyBzZWN0aW9uIGNhbm5vdCBi ZSBtb3ZlZCBpbnRvIHRoZSBleGlzdGluZyBjbGVhbiBmdW5jdGlvbiAKYW5kIGFueSBzZWNvbmRh cnkgaGVscGVyIHdvdWxkIGJlIHNpbmdsZSB1c2FnZSBhbmQgb25seSBmb3VyIGxpbmVzIGxvbmcu IApJdCBkb2Vzbid0IHNlZW0gd29ydGggaXQuCgo+Cj4+ICsJfQo+PiArCj4+ICsJbXV0ZXhfdW5s b2NrKCZyaW5nLT5kZXYtPnN0cnVjdF9tdXRleCk7Cj4+ICsKPj4gKwlpZiAoZG9fc3VibWl0KQo+ PiArCQlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7Cj4+ICt9Cj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2hlZHVsZXIuaAo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAw MDAwMDAwLi40MTVmZWM4Cj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2hlZHVsZXIuaAo+PiBAQCAtMCwwICsxLDk1IEBACj4+ICsvKgo+PiArICog Q29weXJpZ2h0IChjKSAyMDE0IEludGVsIENvcnBvcmF0aW9uCj4+ICsgKgo+PiArICogUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0 YWluaW5nIGEKPj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1 bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4+ICsgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u Cj4+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwg ZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+PiArICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKPj4gKyAqCj4+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBw ZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4+ICsgKiBwYXJhZ3JhcGgpIHNo YWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2Yg dGhlCj4+ICsgKiBTb2Z0d2FyZS4KPj4gKyAqCj4+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklE RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+PiAr ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCj4+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPj4gKyAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCj4+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRS QUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+PiArICogRlJPTSwgT1VUIE9GIE9SIElO IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5H Uwo+PiArICogSU4gVEhFIFNPRlRXQVJFLgo+PiArICoKPj4gKyAqLwo+PiArCj4+ICsjaWZuZGVm IF9JOTE1X1NDSEVEVUxFUl9IXwo+PiArI2RlZmluZSBfSTkxNV9TQ0hFRFVMRVJfSF8KPj4gKwo+ PiArZW51bSBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9zdGF0dXMgewo+PiArCS8qIExpbWJvOiAqLwo+ PiArCWk5MTVfc3FzX25vbmUgPSAwLAo+PiArCS8qIE5vdCB5ZXQgc3VibWl0dGVkIHRvIGhhcmR3 YXJlOiAqLwo+PiArCWk5MTVfc3FzX3F1ZXVlZCwKPj4gKwkvKiBQb3BwZWQgZnJvbSBxdWV1ZSwg cmVhZHkgdG8gZmx5OiAqLwo+PiArCWk5MTVfc3FzX3BvcHBlZCwKPj4gKwkvKiBTZW50IHRvIGhh cmR3YXJlIGZvciBwcm9jZXNzaW5nOiAqLwo+PiArCWk5MTVfc3FzX2ZseWluZywKPj4gKwkvKiBG aW5pc2hlZCBwcm9jZXNzaW5nIG9uIHRoZSBoYXJkd2FyZTogKi8KPj4gKwlpOTE1X3Nxc19jb21w bGV0ZSwKPj4gKwkvKiBLaWxsZWQgYnkgd2F0Y2hkb2cgb3IgY2F0YXN0cm9waGljIHN1Ym1pc3Np b24gZmFpbHVyZTogKi8KPj4gKwlpOTE1X3Nxc19kZWFkLAo+PiArCS8qIExpbWl0IHZhbHVlIGZv ciB1c2Ugd2l0aCBhcnJheXMvbG9vcHMgKi8KPj4gKwlpOTE1X3Nxc19NQVgKPj4gK307Cj4+ICsK PiBUbyB1cHBlcmNhc2UuCkdycnIuIExpbnV4IGtlcm5lbCBzdHlsZSBndWlkZSBpcyBkYWZ0LgoK Pgo+PiArI2RlZmluZSBJOTE1X1NRU19JU19RVUVVRUQobm9kZSkJKCgobm9kZSktPnN0YXR1cyA9 PSBpOTE1X3Nxc19xdWV1ZWQpKQo+PiArI2RlZmluZSBJOTE1X1NRU19JU19GTFlJTkcobm9kZSkJ KCgobm9kZSktPnN0YXR1cyA9PSBpOTE1X3Nxc19mbHlpbmcpKQo+PiArI2RlZmluZSBJOTE1X1NR U19JU19DT01QTEVURShub2RlKQkoKChub2RlKS0+c3RhdHVzID09IGk5MTVfc3FzX2NvbXBsZXRl KSB8fCBcCj4+ICsJCQkJCSAoKG5vZGUpLT5zdGF0dXMgPT0gaTkxNV9zcXNfZGVhZCkpCj4+ICsK Pj4gK3N0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50cnkgewo+PiArCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICAgICAgICAgICpvYmo7Cj4+ICsJYm9vbCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVhZF9vbmx5Owo+PiArfTsKPj4gKwo+PiArc3RydWN0IGk5MTVfc2NoZWR1 bGVyX3F1ZXVlX2VudHJ5IHsKPj4gKwlzdHJ1Y3QgaTkxNV9leGVjYnVmZmVyX3BhcmFtcyAgICAg ICBwYXJhbXM7Cj4+ICsJLyogLTEwMjMgPSBsb3dlc3QgcHJpb3JpdHksIDAgPSBkZWZhdWx0LCAx MDIzID0gaGlnaGVzdCAqLwo+PiArCWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHByaW9yaXR5Owo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50cnkgICAgICpzYXZl ZF9vYmplY3RzOwo+PiArCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9v YmpzOwo+PiArCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBlZDsKPj4g KwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgICAqKmRlcF9saXN0Owo+PiArCWlu dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXBzOwo+PiArCWVudW0gaTkx NV9zY2hlZHVsZXJfcXVldWVfc3RhdHVzICAgIHN0YXR1czsKPj4gKwl1bnNpZ25lZCBsb25nICAg ICAgICAgICAgICAgICAgICAgICBzdGFtcDsKPj4gKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAg ICAgICAgICAgICBsaW5rOwo+IEFib3ZlIHdoaXRlc3BhY2UgaXMgc3RpbGwgaW5jb3JyZWN0IGFu ZCBJIGNvdWxkIHJlYWxseSB1c2UgY29tbWVudHMuCj4KPj4gK307Cj4+ICsKPj4gK3N0cnVjdCBp OTE1X3NjaGVkdWxlciB7Cj4+ICsJc3RydWN0IGxpc3RfaGVhZCAgICBub2RlX3F1ZXVlW0k5MTVf TlVNX1JJTkdTXTsKPj4gKwl1aW50MzJfdCAgICAgICAgICAgIGZsYWdzW0k5MTVfTlVNX1JJTkdT XTsKPj4gKwlzcGlubG9ja190ICAgICAgICAgIGxvY2s7Cj4+ICsKPj4gKwkvKiBUdW5pbmcgcGFy YW1ldGVyczogKi8KPj4gKwlpbnQzMl90ICAgICAgICAgICAgIHByaW9yaXR5X2xldmVsX21pbjsK Pj4gKwlpbnQzMl90ICAgICAgICAgICAgIHByaW9yaXR5X2xldmVsX21heDsKPj4gKwlpbnQzMl90 ICAgICAgICAgICAgIHByaW9yaXR5X2xldmVsX2J1bXA7Cj4+ICsJaW50MzJfdCAgICAgICAgICAg ICBwcmlvcml0eV9sZXZlbF9wcmVlbXB0Owo+PiArCXVpbnQzMl90ICAgICAgICAgICAgbWluX2Zs eWluZzsKPj4gK307Cj4+ICsKPj4gKy8qIEZsYWcgYml0cyBmb3IgaTkxNV9zY2hlZHVsZXI6OmZs YWdzICovCj4+ICtlbnVtIHsKPj4gKwlpOTE1X3NmX2ludGVycnVwdHNfZW5hYmxlZCAgPSAoMSA8 PCAwKSwKPj4gKwlpOTE1X3NmX3N1Ym1pdHRpbmcgICAgICAgICAgPSAoMSA8PCAxKSwKPj4gK307 Cj4gVGhlc2UgbXVzdCBiZSBJOTE1X1VQUEVSQ0FTRV9TT01FVEhJTkcgYnkgY29udmVudGlvbi4K Pgo+PiArCj4+ICtib29sIGk5MTVfc2NoZWR1bGVyX2lzX2VuYWJsZWQoc3RydWN0IGRybV9kZXZp Y2UgKmRldik7Cj4+ICtpbnQgaTkxNV9zY2hlZHVsZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2KTsKPj4gK3ZvaWQgaTkxNV9zY2hlZHVsZXJfY2xlYW5fbm9kZShzdHJ1Y3QgaTkxNV9zY2hl ZHVsZXJfcXVldWVfZW50cnkgKm5vZGUpOwo+PiAraW50IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4 ZWNidWZmZXIoc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpxZSk7Cj4+ICtib29s IGk5MTVfc2NoZWR1bGVyX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVz dCAqcmVxKTsKPj4gK3ZvaWQgaTkxNV9zY2hlZHVsZXJfd2FrZXVwKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpOwo+PiArCj4+ICsjZW5kaWYgIC8qIF9JOTE1X1NDSEVEVUxFUl9IXyAqLwoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxp bmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==