From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10189 invoked by alias); 26 Apr 2017 10:13:05 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 10167 invoked by uid 89); 26 Apr 2017 10:13:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=PLUS, rat, facts, presenting X-HELO: mail-vk0-f41.google.com Received: from mail-vk0-f41.google.com (HELO mail-vk0-f41.google.com) (209.85.213.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 26 Apr 2017 10:12:57 +0000 Received: by mail-vk0-f41.google.com with SMTP id j127so68749705vkh.0 for ; Wed, 26 Apr 2017 03:12:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=N1vrB0EVWKpmEfdtM4O1U+YZx50h710p0OrfjteY0iM=; b=jwrgTek3urFUYsUxA+l3/RojM7E2Rqw/0RSg3+bC5x16J0+VW77re0UDrFAYuJ70lO w9YD7ELyXlpRVtYubFpWHSlSkpLzaq0VNtWfK9FxksO3DU8quqtP3bJANNkhLcPnyA0C Lxvdf0AEWYZc3uPx/eqhOrk1PRWRbliAbtl9zDOLf2XXb1HZukEQQdLe+elC4sY+3QUt xPAzIpIDoYy6RAY+n2knMBav7qTgn7je634w6Vblh6FqnR7lcSKqM3FwaIq4PADK7hcG +Gryj+UQOm29cxuEecIYU1bSBXwEd7uglrB71R7dXUzBRD/bChxVqMpCHOKjlDp0Vu0e gxgQ== X-Gm-Message-State: AN3rC/5GxPTHJ+PGBZa4K/EjYPnrUQTs/Fe1/1DiJdi7Nf+T3WElGO1Y zscLM1315UKbIvvAj15bvAQdE2IVQw== X-Received: by 10.31.97.198 with SMTP id v189mr2505839vkb.43.1493201577502; Wed, 26 Apr 2017 03:12:57 -0700 (PDT) MIME-Version: 1.0 Received: by 10.103.33.70 with HTTP; Wed, 26 Apr 2017 03:12:56 -0700 (PDT) In-Reply-To: References: From: "Bin.Cheng" Date: Wed, 26 Apr 2017 10:59:00 -0000 Message-ID: Subject: Re: [PATCH GCC8][13/33]Rewrite cost computation of ivopts To: Richard Biener Cc: "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary=94eb2c0942ea9b8792054e0f156a X-IsSubscribed: yes X-SW-Source: 2017-04/txt/msg01276.txt.bz2 --94eb2c0942ea9b8792054e0f156a Content-Type: text/plain; charset=UTF-8 Content-length: 4164 On Wed, Apr 26, 2017 at 10:50 AM, Richard Biener wrote: > On Tue, Apr 18, 2017 at 12:43 PM, Bin Cheng wrote: >> Hi, >> This is the major part of this patch series. It rewrites cost computation of ivopts using tree affine. >> Apart from description given by cover message: >> A) New computation cost model. Currently, there are big amount code trying to understand >> tree expression and estimate its computation cost. The model is designed long ago >> for generic tree expressions. In order to process generic expression (even address >> expression of array/memory references), it has code for too many corner cases. The >> problem is it's somehow impossible to handle all complicated expressions, even with >> complicated logic in functions like get_computation_cost_at, difference_cost, >> ptr_difference_cost, get_address_cost and so on... The second problem is it's hard >> to keep cost model consistent among special cases. As special cases being added >> from time to time, the model is no long unified any more. There are cases that right >> cost results in bad code, or vice versa, wrong cost results in good code. Finally, >> it's difficult to add code for new cases. >> This patch introduces a new cost computation model by using tree affine. Tree exprs >> are lowered to aff_tree which is simple arithmetic operation usually. Code handling >> special cases is no longer necessary, which brings us quite simplicity. It is also >> easier to compute consistent costs among different expressions using tree affine, >> which gives us a unified cost model. >> This patch also fixes issue that cost computation for address type iv_use is inconsistent >> with how it is re-rewritten in the end. It greatly simplified cost computation. >> >> Is it OK? > > The patch is quite hard to follow (diff messes up here -- this is a > case where a context Hi Richard, Thanks for reviewing, attachment is the updated context diff. It also includes a minor fix handling pre-increment addressing mode, specifically, it adds two lines of code: if (stmt_after_increment (data->current_loop, cand, use->stmt)) ainc_offset += ainc_step; > diff is easier to read). I trust you on the implementation details > here, the overall structure > looks ok to me. The only question I have is with regarding to > get_loop_invariant_expr > which seems to be much less sophisticated than before (basically it's > now what was > record_inv_expr?). I suppose the old functionality is superseeded by > using affines > everywhere else. Yes, previous version tries a lot to cancel common sub expression when representing use with cand. New version relies on tree affine which is much better. One problem with invariant expression estimation is we don't know in IVOPT if the inv_expr would be hoisted or not by later passes. This problem exists all the time, we can only make assumptions here, I think new version is bit more aggressive in recording new inv_expr here. Thanks, bin > > Otherwise ok. > > Thanks, > Richard. > > >> Thanks, >> bin >> 2017-04-11 Bin Cheng >> >> * tree-ssa-loop-ivopts.c (get_loop_invariant_expr): Simplify. >> (adjust_setup_cost): New parameter supporting round up adjustment. >> (struct address_cost_data): Delete. >> (force_expr_to_var_cost): Don't bound cost with spill_cost. >> (split_address_cost, ptr_difference_cost): Delete. >> (difference_cost, compare_aff_trees, record_inv_expr): Delete. >> (struct ainc_cost_data): New struct. >> (get_address_cost_ainc): New function. >> (get_address_cost, get_computation_cost): Reimplement. >> (determine_group_iv_cost_address): Record inv_expr for all uses of >> a group. >> (determine_group_iv_cost_cond): Call get_loop_invariant_expr. >> (iv_ca_has_deps): Reimplemented to ... >> (iv_ca_more_deps): ... this. Check if NEW_CP introduces more deps >> than OLD_CP. >> (iv_ca_extend): Call iv_ca_more_deps. --94eb2c0942ea9b8792054e0f156a Content-Type: text/plain; charset=US-ASCII; name="0013-rewrite-cost-computation-20170401.txt" Content-Disposition: attachment; filename="0013-rewrite-cost-computation-20170401.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j1ytlbvd0 Content-length: 65527 ZGlmZiAtLWdpdCBnY2MvdHJlZS1zc2EtbG9vcC1pdm9wdHMuYyBnY2MvdHJl ZS1zc2EtbG9vcC1pdm9wdHMuYwppbmRleCA1NTZiZGM4Li42MGJkODVmIDEw MDY0NAotLS0gZ2NjL3RyZWUtc3NhLWxvb3AtaXZvcHRzLmMKKysrIGdjYy90 cmVlLXNzYS1sb29wLWl2b3B0cy5jCkBAIC0yOTEwLDIwICsyOTEwLDU5IEBA IGZpbmRfaW52X3ZhcnMgKHN0cnVjdCBpdm9wdHNfZGF0YSAqZGF0YSwgdHJl ZSAqZXhwcl9wLCBiaXRtYXAgKmludl92YXJzKQogICBzdHJ1Y3Qgd2Fsa190 cmVlX2RhdGEgd2RhdGE7CiAKICAgaWYgKCFpbnZfdmFycykKICAgICByZXR1 cm47CiAKICAgd2RhdGEuaWRhdGEgPSBkYXRhOwogICB3ZGF0YS5pbnZfdmFy cyA9IGludl92YXJzOwogICB3YWxrX3RyZWUgKGV4cHJfcCwgZmluZF9pbnZf dmFyc19jYiwgJndkYXRhLCBOVUxMKTsKIH0KIAorLyogR2V0IGVudHJ5IGZy b20gaW52YXJpYW50IGV4cHIgaGFzaCB0YWJsZSBmb3IgSU5WX0VYUFIuICBO ZXcgZW50cnkKKyAgIHdpbGwgYmUgcmVjb3JkZWQgaWYgaXQgZG9lc24ndCBl eGlzdCB5ZXQuICBHaXZlbiBiZWxvdyB0d28gZXhwcnM6CisgICAgIGludl9l eHByICsgY3N0MSwgaW52X2V4cHIgKyBjc3QyCisgICBJdCdzIGhhcmQgdG8g bWFrZSBkZWNpc2lvbiB3aGV0aGVyIGNvbnN0YW50IHBhcnQgc2hvdWxkIGJl IHN0cmlwcGVkCisgICBvciBub3QuICBXZSBjaG9vc2UgdG8gbm90IHN0cmlw IGJhc2VkIG9uIGJlbG93IGZhY3RzOgorICAgICAxKSBXZSBuZWVkIHRvIGNv dW50IEFERCBjb3N0IGZvciBjb25zdGFudCBwYXJ0IGlmIGl0J3Mgc3RyaXBw ZWQsCisJd2hpY2ggaXMndCBhbHdheXMgdHJpdmlhbCB3aGVyZSB0aGlzIGZ1 bmN0aW9ucyBpcyBjYWxsZWQuCisgICAgIDIpIFN0cmlwcGluZyBjb25zdGFu dCBhd2F5IG1heSBiZSBjb25mbGljdCB3aXRoIGZvbGxvd2luZyBsb29wCisJ aW52YXJpYW50IGhvaXN0aW5nIHBhc3MuCisgICAgIDMpIE5vdCBzdHJpcHBp bmcgY29uc3RhbnQgYXdheSByZXN1bHRzIGluIG1vcmUgaW52YXJpYW50IGV4 cHJzLAorCXdoaWNoIHVzdWFsbHkgbGVhZHMgdG8gZGVjaXNpb24gcHJlZmVy cmluZyBsb3dlciByZWcgcHJlc3N1cmUuICAqLworCitzdGF0aWMgaXZfaW52 X2V4cHJfZW50ICoKK2dldF9sb29wX2ludmFyaWFudF9leHByIChzdHJ1Y3Qg aXZvcHRzX2RhdGEgKmRhdGEsIHRyZWUgaW52X2V4cHIpCit7CisgIFNUUklQ X05PUFMgKGludl9leHByKTsKKworICBpZiAoVFJFRV9DT0RFIChpbnZfZXhw cikgPT0gSU5URUdFUl9DU1QgfHwgVFJFRV9DT0RFIChpbnZfZXhwcikgPT0g U1NBX05BTUUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRG9uJ3Qgc3Ry aXAgY29uc3RhbnQgcGFydCBhd2F5IGFzIHdlIHVzZWQgdG8uICAqLworCisg IC8qIFN0b3JlcyBFWFBSIGluIERBVEEtPmludl9leHByX3RhYiwgcmV0dXJu IHBvaW50ZXIgdG8gaXZfaW52X2V4cHJfZW50LiAgKi8KKyAgc3RydWN0IGl2 X2ludl9leHByX2VudCBlbnQ7CisgIGVudC5leHByID0gaW52X2V4cHI7Cisg IGVudC5oYXNoID0gaXRlcmF0aXZlX2hhc2hfZXhwciAoaW52X2V4cHIsIDAp OworICBzdHJ1Y3QgaXZfaW52X2V4cHJfZW50ICoqc2xvdCA9IGRhdGEtPmlu dl9leHByX3RhYi0+ZmluZF9zbG90ICgmZW50LCBJTlNFUlQpOworCisgIGlm ICghKnNsb3QpCisgICAgeworICAgICAgKnNsb3QgPSBYTkVXIChzdHJ1Y3Qg aXZfaW52X2V4cHJfZW50KTsKKyAgICAgICgqc2xvdCktPmV4cHIgPSBpbnZf ZXhwcjsKKyAgICAgICgqc2xvdCktPmhhc2ggPSBlbnQuaGFzaDsKKyAgICAg ICgqc2xvdCktPmlkID0gKytkYXRhLT5tYXhfaW52X2V4cHJfaWQ7CisgICAg fQorCisgIHJldHVybiAqc2xvdDsKK30KKwogLyogQWRkcyBhIGNhbmRpZGF0 ZSBCQVNFICsgU1RFUCAqIGkuICBJbXBvcnRhbnQgZmllbGQgaXMgc2V0IHRv IElNUE9SVEFOVCBhbmQKICAgIHBvc2l0aW9uIHRvIFBPUy4gIElmIFVTRSBp cyBub3QgTlVMTCwgdGhlIGNhbmRpZGF0ZSBpcyBzZXQgYXMgcmVsYXRlZCB0 bwogICAgaXQuICBJZiBib3RoIEJBU0UgYW5kIFNURVAgYXJlIE5VTEwsIHdl IGFkZCBhIHBzZXVkb2NhbmRpZGF0ZSBmb3IgdGhlCiAgICByZXBsYWNlbWVu dCBvZiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIGl2IGJ5IGEgZGlyZWN0IGNv bXB1dGF0aW9uLiAgKi8KIAogc3RhdGljIHN0cnVjdCBpdl9jYW5kICoKIGFk ZF9jYW5kaWRhdGVfMSAoc3RydWN0IGl2b3B0c19kYXRhICpkYXRhLAogCQkg dHJlZSBiYXNlLCB0cmVlIHN0ZXAsIGJvb2wgaW1wb3J0YW50LCBlbnVtIGl2 X3Bvc2l0aW9uIHBvcywKIAkJIHN0cnVjdCBpdl91c2UgKnVzZSwgZ2ltcGxl ICppbmNyZW1lbnRlZF9hdCwKIAkJIHN0cnVjdCBpdiAqb3JpZ19pdiA9IE5V TEwpCkBAIC0zODQxLDI4ICszODgwLDM0IEBAIGdldF9jb21wdXRhdGlvbl9h dCAoc3RydWN0IGxvb3AgKmxvb3AsIGdpbXBsZSAqYXQsCiAgIHRyZWUgdHlw ZSA9IGdldF91c2VfdHlwZSAodXNlKTsKIAogICBpZiAoIWdldF9jb21wdXRh dGlvbl9hZmYgKGxvb3AsIGF0LCB1c2UsIGNhbmQsICZhZmYpKQogICAgIHJl dHVybiBOVUxMX1RSRUU7CiAgIHVuc2hhcmVfYWZmX2NvbWJpbmF0aW9uICgm YWZmKTsKICAgcmV0dXJuIGZvbGRfY29udmVydCAodHlwZSwgYWZmX2NvbWJp bmF0aW9uX3RvX3RyZWUgKCZhZmYpKTsKIH0KIAogLyogQWRqdXN0IHRoZSBj b3N0IENPU1QgZm9yIGJlaW5nIGluIGxvb3Agc2V0dXAgcmF0aGVyIHRoYW4g bG9vcCBib2R5LgogICAgSWYgd2UncmUgb3B0aW1pemluZyBmb3Igc3BhY2Us IHRoZSBsb29wIHNldHVwIG92ZXJoZWFkIGlzIGNvbnN0YW50OwotICAgaWYg d2UncmUgb3B0aW1pemluZyBmb3Igc3BlZWQsIGFtb3J0aXplIGl0IG92ZXIg dGhlIHBlci1pdGVyYXRpb24gY29zdC4gICovCisgICBpZiB3ZSdyZSBvcHRp bWl6aW5nIGZvciBzcGVlZCwgYW1vcnRpemUgaXQgb3ZlciB0aGUgcGVyLWl0 ZXJhdGlvbiBjb3N0LgorICAgSWYgUk9VTkRfVVBfUCBpcyB0cnVlLCB0aGUg cmVzdWx0IGlzIHJvdW5kIHVwIHJhdGhlciB0aGFuIHRvIHplcm8gd2hlbgor ICAgb3B0aW1pemluZyBmb3Igc3BlZWQuICAqLwogc3RhdGljIHVuc2lnbmVk Ci1hZGp1c3Rfc2V0dXBfY29zdCAoc3RydWN0IGl2b3B0c19kYXRhICpkYXRh LCB1bnNpZ25lZCBjb3N0KQorYWRqdXN0X3NldHVwX2Nvc3QgKHN0cnVjdCBp dm9wdHNfZGF0YSAqZGF0YSwgdW5zaWduZWQgY29zdCwKKwkJICAgYm9vbCBy b3VuZF91cF9wID0gZmFsc2UpCiB7CiAgIGlmIChjb3N0ID09IElORlRZKQog ICAgIHJldHVybiBjb3N0OwogICBlbHNlIGlmIChvcHRpbWl6ZV9sb29wX2Zv cl9zcGVlZF9wIChkYXRhLT5jdXJyZW50X2xvb3ApKQotICAgIHJldHVybiBj b3N0IC8gYXZnX2xvb3Bfbml0ZXIgKGRhdGEtPmN1cnJlbnRfbG9vcCk7Cisg ICAgeworICAgICAgSE9TVF9XSURFX0lOVCBuaXRlcnMgPSBhdmdfbG9vcF9u aXRlciAoZGF0YS0+Y3VycmVudF9sb29wKTsKKyAgICAgIHJldHVybiAoKEhP U1RfV0lERV9JTlQpIGNvc3QgKyAocm91bmRfdXBfcCA/IG5pdGVycyAtIDEg OiAwKSkgLyBuaXRlcnM7CisgICAgfQogICBlbHNlCiAgICAgcmV0dXJuIGNv c3Q7CiB9CiAKIC8qIFJldHVybnMgdHJ1ZSBpZiBtdWx0aXBseWluZyBieSBS QVRJTyBpcyBhbGxvd2VkIGluIGFuIGFkZHJlc3MuICBUZXN0IHRoZQogICAg dmFsaWRpdHkgZm9yIGEgbWVtb3J5IHJlZmVyZW5jZSBhY2Nlc3NpbmcgbWVt b3J5IG9mIG1vZGUgTU9ERSBpbgogICAgYWRkcmVzcyBzcGFjZSBBUy4gICov CiAKIAogYm9vbApAQCAtMzkxMCwzNjcgKzM5NTUsMjAgQEAgbXVsdGlwbGll cl9hbGxvd2VkX2luX2FkZHJlc3NfcCAoSE9TVF9XSURFX0lOVCByYXRpbywg bWFjaGluZV9tb2RlIG1vZGUsCiAKICAgICAgIHZhbGlkX211bHRfbGlzdFtk YXRhX2luZGV4XSA9IHZhbGlkX211bHQ7CiAgICAgfQogCiAgIGlmIChyYXRp byA+IE1BWF9SQVRJTyB8fCByYXRpbyA8IC1NQVhfUkFUSU8pCiAgICAgcmV0 dXJuIGZhbHNlOwogCiAgIHJldHVybiBiaXRtYXBfYml0X3AgKHZhbGlkX211 bHQsIHJhdGlvICsgTUFYX1JBVElPKTsKIH0KIAotLyogUmV0dXJucyBjb3N0 IG9mIGFkZHJlc3MgaW4gc2hhcGUgc3ltYm9sICsgdmFyICsgT0ZGU0VUICsg UkFUSU8gKiBpbmRleC4KLSAgIElmIFNZTUJPTF9QUkVTRU5UIGlzIGZhbHNl LCBzeW1ib2wgaXMgb21pdHRlZC4gIElmIFZBUl9QUkVTRU5UIGlzIGZhbHNl LAotICAgdmFyaWFibGUgaXMgb21pdHRlZC4gIENvbXB1dGUgdGhlIGNvc3Qg Zm9yIGEgbWVtb3J5IHJlZmVyZW5jZSB0aGF0IGFjY2Vzc2VzCi0gICBhIG1l bW9yeSBsb2NhdGlvbiBvZiBtb2RlIE1FTV9NT0RFIGluIGFkZHJlc3Mgc3Bh Y2UgQVMuCi0KLSAgIE1BWV9BVVRPSU5DIGlzIHNldCB0byB0cnVlIGlmIHRo ZSBhdXRvaW5jcmVtZW50IChpbmNyZWFzaW5nIGluZGV4IGJ5Ci0gICBzaXpl IG9mIE1FTV9NT0RFIC8gUkFUSU8pIGlzIGF2YWlsYWJsZS4gIFRvIG1ha2Ug dGhpcyBkZXRlcm1pbmF0aW9uLCB3ZQotICAgbG9vayBhdCB0aGUgc2l6ZSBv ZiB0aGUgaW5jcmVtZW50IHRvIGJlIG1hZGUsIHdoaWNoIGlzIGdpdmVuIGlu IENTVEVQLgotICAgQ1NURVAgbWF5IGJlIHplcm8gaWYgdGhlIHN0ZXAgaXMg dW5rbm93bi4KLSAgIFNUTVRfQUZURVJfSU5DIGlzIHRydWUgaWZmIHRoZSBz dGF0ZW1lbnQgd2UncmUgbG9va2luZyBhdCBpcyBhZnRlciB0aGUKLSAgIGlu Y3JlbWVudCBvZiB0aGUgb3JpZ2luYWwgYml2LgotCi0gICBUT0RPIC0tIHRo ZXJlIG11c3QgYmUgc29tZSBiZXR0ZXIgd2F5LiAgVGhpcyBhbGwgaXMgcXVp dGUgY3J1ZGUuICAqLwotCi1lbnVtIGFpbmNfdHlwZQotewotICBBSU5DX1BS RV9JTkMsCQkvKiBQcmUgaW5jcmVtZW50LiAgKi8KLSAgQUlOQ19QUkVfREVD LAkJLyogUHJlIGRlY3JlbWVudC4gICovCi0gIEFJTkNfUE9TVF9JTkMsCS8q IFBvc3QgaW5jcmVtZW50LiAgKi8KLSAgQUlOQ19QT1NUX0RFQywJLyogUG9z dCBkZWNyZW1lbnQuICAqLwotICBBSU5DX05PTkUJCS8qIEFsc28gdGhlIG51 bWJlciBvZiBhdXRvIGluY3JlbWVudCB0eXBlcy4gICovCi19OwotCi1zdHJ1 Y3QgYWRkcmVzc19jb3N0X2RhdGEKLXsKLSAgSE9TVF9XSURFX0lOVCBtaW5f b2Zmc2V0LCBtYXhfb2Zmc2V0OwotICB1bnNpZ25lZCBjb3N0c1syXVsyXVsy XVsyXTsKLSAgdW5zaWduZWQgYWluY19jb3N0c1tBSU5DX05PTkVdOwotfTsK LQotCi1zdGF0aWMgY29tcF9jb3N0Ci1nZXRfYWRkcmVzc19jb3N0IChib29s IHN5bWJvbF9wcmVzZW50LCBib29sIHZhcl9wcmVzZW50LAotCQkgIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgb2Zmc2V0LCBIT1NUX1dJREVfSU5UIHJhdGlv LAotCQkgIEhPU1RfV0lERV9JTlQgY3N0ZXAsIG1hY2hpbmVfbW9kZSBtZW1f bW9kZSwKLQkJICBhZGRyX3NwYWNlX3QgYXMsIGJvb2wgc3BlZWQsCi0JCSAg Ym9vbCBzdG10X2FmdGVyX2luYywgYm9vbCAqbWF5X2F1dG9pbmMpCi17Ci0g IG1hY2hpbmVfbW9kZSBhZGRyZXNzX21vZGUgPSB0YXJnZXRtLmFkZHJfc3Bh Y2UuYWRkcmVzc19tb2RlIChhcyk7Ci0gIHN0YXRpYyB2ZWM8YWRkcmVzc19j b3N0X2RhdGEgKj4gYWRkcmVzc19jb3N0X2RhdGFfbGlzdDsKLSAgdW5zaWdu ZWQgaW50IGRhdGFfaW5kZXggPSAoaW50KSBhcyAqIE1BWF9NQUNISU5FX01P REUgKyAoaW50KSBtZW1fbW9kZTsKLSAgYWRkcmVzc19jb3N0X2RhdGEgKmRh dGE7Ci0gIHN0YXRpYyBib29sIGhhc19wcmVpbmNbTUFYX01BQ0hJTkVfTU9E RV0sIGhhc19wb3N0aW5jW01BWF9NQUNISU5FX01PREVdOwotICBzdGF0aWMg Ym9vbCBoYXNfcHJlZGVjW01BWF9NQUNISU5FX01PREVdLCBoYXNfcG9zdGRl Y1tNQVhfTUFDSElORV9NT0RFXTsKLSAgdW5zaWduZWQgY29zdCwgYWNvc3Qs IGNvbXBsZXhpdHk7Ci0gIGVudW0gYWluY190eXBlIGF1dG9pbmNfdHlwZTsK LSAgYm9vbCBvZmZzZXRfcCwgcmF0aW9fcCwgYXV0b2luYzsKLSAgSE9TVF9X SURFX0lOVCBzX29mZnNldCwgYXV0b2luY19vZmZzZXQsIG1zaXplOwotICB1 bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1hc2s7Ci0gIHVuc2lnbmVkIGJpdHM7 Ci0KLSAgaWYgKGRhdGFfaW5kZXggPj0gYWRkcmVzc19jb3N0X2RhdGFfbGlz dC5sZW5ndGggKCkpCi0gICAgYWRkcmVzc19jb3N0X2RhdGFfbGlzdC5zYWZl X2dyb3dfY2xlYXJlZCAoZGF0YV9pbmRleCArIDEpOwotCi0gIGRhdGEgPSBh ZGRyZXNzX2Nvc3RfZGF0YV9saXN0W2RhdGFfaW5kZXhdOwotICBpZiAoIWRh dGEpCi0gICAgewotICAgICAgSE9TVF9XSURFX0lOVCBpOwotICAgICAgSE9T VF9XSURFX0lOVCByYXQsIG9mZiA9IDA7Ci0gICAgICBpbnQgb2xkX2NzZV9u b3RfZXhwZWN0ZWQsIHdpZHRoOwotICAgICAgdW5zaWduZWQgc3ltX3AsIHZh cl9wLCBvZmZfcCwgcmF0X3AsIGFkZF9jOwotICAgICAgcnR4X2luc24gKnNl cTsKLSAgICAgIHJ0eCBhZGRyLCBiYXNlOwotICAgICAgcnR4IHJlZzAsIHJl ZzE7Ci0KLSAgICAgIGRhdGEgPSAoYWRkcmVzc19jb3N0X2RhdGEgKikgeGNh bGxvYyAoMSwgc2l6ZW9mICgqZGF0YSkpOwotCi0gICAgICByZWcxID0gZ2Vu X3Jhd19SRUcgKGFkZHJlc3NfbW9kZSwgTEFTVF9WSVJUVUFMX1JFR0lTVEVS ICsgMSk7Ci0KLSAgICAgIHdpZHRoID0gR0VUX01PREVfQklUU0laRSAoYWRk cmVzc19tb2RlKSAtIDE7Ci0gICAgICBpZiAod2lkdGggPiAoSE9TVF9CSVRT X1BFUl9XSURFX0lOVCAtIDEpKQotCXdpZHRoID0gSE9TVF9CSVRTX1BFUl9X SURFX0lOVCAtIDE7Ci0gICAgICBhZGRyID0gZ2VuX3J0eF9mbXRfZWUgKFBM VVMsIGFkZHJlc3NfbW9kZSwgcmVnMSwgTlVMTF9SVFgpOwotCi0gICAgICBm b3IgKGkgPSB3aWR0aDsgaSA+PSAwOyBpLS0pCi0JewotCSAgb2ZmID0gLShI T1NUX1dJREVfSU5UXzFVIDw8IGkpOwotCSAgWEVYUCAoYWRkciwgMSkgPSBn ZW5faW50X21vZGUgKG9mZiwgYWRkcmVzc19tb2RlKTsKLQkgIGlmIChtZW1v cnlfYWRkcmVzc19hZGRyX3NwYWNlX3AgKG1lbV9tb2RlLCBhZGRyLCBhcykp Ci0JICAgIGJyZWFrOwotCX0KLSAgICAgIGRhdGEtPm1pbl9vZmZzZXQgPSAo aSA9PSAtMT8gMCA6IG9mZik7Ci0KLSAgICAgIGZvciAoaSA9IHdpZHRoOyBp ID49IDA7IGktLSkKLQl7Ci0JICBvZmYgPSAoSE9TVF9XSURFX0lOVF8xVSA8 PCBpKSAtIDE7Ci0JICBYRVhQIChhZGRyLCAxKSA9IGdlbl9pbnRfbW9kZSAo b2ZmLCBhZGRyZXNzX21vZGUpOwotCSAgaWYgKG1lbW9yeV9hZGRyZXNzX2Fk ZHJfc3BhY2VfcCAobWVtX21vZGUsIGFkZHIsIGFzKSkKLQkgICAgYnJlYWs7 Ci0JICAvKiBGb3Igc29tZSBzdHJpY3QtYWxpZ25tZW50IHRhcmdldHMsIHRo ZSBvZmZzZXQgbXVzdCBiZSBuYXR1cmFsbHkKLQkgICAgIGFsaWduZWQuICBU cnkgYW4gYWxpZ25lZCBvZmZzZXQgaWYgbWVtX21vZGUgaXMgbm90IFFJbW9k ZS4gICovCi0JICBvZmYgPSBtZW1fbW9kZSAhPSBRSW1vZGUKLQkJPyAoSE9T VF9XSURFX0lOVF8xVSA8PCBpKQotCQkgICAgLSBHRVRfTU9ERV9TSVpFICht ZW1fbW9kZSkKLQkJOiAwOwotCSAgaWYgKG9mZiA+IDApCi0JICAgIHsKLQkg ICAgICBYRVhQIChhZGRyLCAxKSA9IGdlbl9pbnRfbW9kZSAob2ZmLCBhZGRy ZXNzX21vZGUpOwotCSAgICAgIGlmIChtZW1vcnlfYWRkcmVzc19hZGRyX3Nw YWNlX3AgKG1lbV9tb2RlLCBhZGRyLCBhcykpCi0JCWJyZWFrOwotCSAgICB9 Ci0JfQotICAgICAgaWYgKGkgPT0gLTEpCi0Jb2ZmID0gMDsKLSAgICAgIGRh dGEtPm1heF9vZmZzZXQgPSBvZmY7Ci0KLSAgICAgIGlmIChkdW1wX2ZpbGUg JiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JewotCSAgZnByaW50 ZiAoZHVtcF9maWxlLCAiZ2V0X2FkZHJlc3NfY29zdDpcbiIpOwotCSAgZnBy aW50ZiAoZHVtcF9maWxlLCAiICBtaW4gb2Zmc2V0ICVzICIgSE9TVF9XSURF X0lOVF9QUklOVF9ERUMgIlxuIiwKLQkJICAgR0VUX01PREVfTkFNRSAobWVt X21vZGUpLAotCQkgICBkYXRhLT5taW5fb2Zmc2V0KTsKLQkgIGZwcmludGYg KGR1bXBfZmlsZSwgIiAgbWF4IG9mZnNldCAlcyAiIEhPU1RfV0lERV9JTlRf UFJJTlRfREVDICJcbiIsCi0JCSAgIEdFVF9NT0RFX05BTUUgKG1lbV9tb2Rl KSwKLQkJICAgZGF0YS0+bWF4X29mZnNldCk7Ci0JfQotCi0gICAgICByYXQg PSAxOwotICAgICAgZm9yIChpID0gMjsgaSA8PSBNQVhfUkFUSU87IGkrKykK LQlpZiAobXVsdGlwbGllcl9hbGxvd2VkX2luX2FkZHJlc3NfcCAoaSwgbWVt X21vZGUsIGFzKSkKLQkgIHsKLQkgICAgcmF0ID0gaTsKLQkgICAgYnJlYWs7 Ci0JICB9Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIGNvc3Qgb2YgdmFyaW91 cyBhZGRyZXNzaW5nIG1vZGVzLiAgKi8KLSAgICAgIGFjb3N0ID0gMDsKLSAg ICAgIHJlZzAgPSBnZW5fcmF3X1JFRyAoYWRkcmVzc19tb2RlLCBMQVNUX1ZJ UlRVQUxfUkVHSVNURVIgKyAxKTsKLSAgICAgIHJlZzEgPSBnZW5fcmF3X1JF RyAoYWRkcmVzc19tb2RlLCBMQVNUX1ZJUlRVQUxfUkVHSVNURVIgKyAyKTsK LQotICAgICAgaWYgKFVTRV9MT0FEX1BSRV9ERUNSRU1FTlQgKG1lbV9tb2Rl KQotCSAgfHwgVVNFX1NUT1JFX1BSRV9ERUNSRU1FTlQgKG1lbV9tb2RlKSkK LQl7Ci0JICBhZGRyID0gZ2VuX3J0eF9QUkVfREVDIChhZGRyZXNzX21vZGUs IHJlZzApOwotCSAgaGFzX3ByZWRlY1ttZW1fbW9kZV0KLQkgICAgPSBtZW1v cnlfYWRkcmVzc19hZGRyX3NwYWNlX3AgKG1lbV9tb2RlLCBhZGRyLCBhcyk7 Ci0KLQkgIGlmIChoYXNfcHJlZGVjW21lbV9tb2RlXSkKLQkgICAgZGF0YS0+ YWluY19jb3N0c1tBSU5DX1BSRV9ERUNdCi0JICAgICAgPSBhZGRyZXNzX2Nv c3QgKGFkZHIsIG1lbV9tb2RlLCBhcywgc3BlZWQpOwotCX0KLSAgICAgIGlm IChVU0VfTE9BRF9QT1NUX0RFQ1JFTUVOVCAobWVtX21vZGUpCi0JICB8fCBV U0VfU1RPUkVfUE9TVF9ERUNSRU1FTlQgKG1lbV9tb2RlKSkKLQl7Ci0JICBh ZGRyID0gZ2VuX3J0eF9QT1NUX0RFQyAoYWRkcmVzc19tb2RlLCByZWcwKTsK LQkgIGhhc19wb3N0ZGVjW21lbV9tb2RlXQotCSAgICA9IG1lbW9yeV9hZGRy ZXNzX2FkZHJfc3BhY2VfcCAobWVtX21vZGUsIGFkZHIsIGFzKTsKLQotCSAg aWYgKGhhc19wb3N0ZGVjW21lbV9tb2RlXSkKLQkgICAgZGF0YS0+YWluY19j b3N0c1tBSU5DX1BPU1RfREVDXQotCSAgICAgID0gYWRkcmVzc19jb3N0IChh ZGRyLCBtZW1fbW9kZSwgYXMsIHNwZWVkKTsKLQl9Ci0gICAgICBpZiAoVVNF X0xPQURfUFJFX0lOQ1JFTUVOVCAobWVtX21vZGUpCi0JICB8fCBVU0VfU1RP UkVfUFJFX0RFQ1JFTUVOVCAobWVtX21vZGUpKQotCXsKLQkgIGFkZHIgPSBn ZW5fcnR4X1BSRV9JTkMgKGFkZHJlc3NfbW9kZSwgcmVnMCk7Ci0JICBoYXNf cHJlaW5jW21lbV9tb2RlXQotCSAgICA9IG1lbW9yeV9hZGRyZXNzX2FkZHJf c3BhY2VfcCAobWVtX21vZGUsIGFkZHIsIGFzKTsKLQotCSAgaWYgKGhhc19w cmVpbmNbbWVtX21vZGVdKQotCSAgICBkYXRhLT5haW5jX2Nvc3RzW0FJTkNf UFJFX0lOQ10KLQkgICAgICA9IGFkZHJlc3NfY29zdCAoYWRkciwgbWVtX21v ZGUsIGFzLCBzcGVlZCk7Ci0JfQotICAgICAgaWYgKFVTRV9MT0FEX1BPU1Rf SU5DUkVNRU5UIChtZW1fbW9kZSkKLQkgIHx8IFVTRV9TVE9SRV9QT1NUX0lO Q1JFTUVOVCAobWVtX21vZGUpKQotCXsKLQkgIGFkZHIgPSBnZW5fcnR4X1BP U1RfSU5DIChhZGRyZXNzX21vZGUsIHJlZzApOwotCSAgaGFzX3Bvc3RpbmNb bWVtX21vZGVdCi0JICAgID0gbWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFjZV9w IChtZW1fbW9kZSwgYWRkciwgYXMpOwotCi0JICBpZiAoaGFzX3Bvc3RpbmNb bWVtX21vZGVdKQotCSAgICBkYXRhLT5haW5jX2Nvc3RzW0FJTkNfUE9TVF9J TkNdCi0JICAgICAgPSBhZGRyZXNzX2Nvc3QgKGFkZHIsIG1lbV9tb2RlLCBh cywgc3BlZWQpOwotCX0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsr KQotCXsKLQkgIHN5bV9wID0gaSAmIDE7Ci0JICB2YXJfcCA9IChpID4+IDEp ICYgMTsKLQkgIG9mZl9wID0gKGkgPj4gMikgJiAxOwotCSAgcmF0X3AgPSAo aSA+PiAzKSAmIDE7Ci0KLQkgIGFkZHIgPSByZWcwOwotCSAgaWYgKHJhdF9w KQotCSAgICBhZGRyID0gZ2VuX3J0eF9mbXRfZWUgKE1VTFQsIGFkZHJlc3Nf bW9kZSwgYWRkciwKLQkJCQkgICBnZW5faW50X21vZGUgKHJhdCwgYWRkcmVz c19tb2RlKSk7Ci0KLQkgIGlmICh2YXJfcCkKLQkgICAgYWRkciA9IGdlbl9y dHhfZm10X2VlIChQTFVTLCBhZGRyZXNzX21vZGUsIGFkZHIsIHJlZzEpOwot Ci0JICBpZiAoc3ltX3ApCi0JICAgIHsKLQkgICAgICBiYXNlID0gZ2VuX3J0 eF9TWU1CT0xfUkVGIChhZGRyZXNzX21vZGUsIGdnY19zdHJkdXAgKCIiKSk7 Ci0JICAgICAgLyogPz8/IFdlIGNhbiBydW4gaW50byB0cm91YmxlIHdpdGgg c29tZSBiYWNrZW5kcyBieSBwcmVzZW50aW5nCi0JCSBpdCB3aXRoIHN5bWJv bHMgd2hpY2ggaGF2ZW4ndCBiZWVuIHByb3Blcmx5IHBhc3NlZCB0aHJvdWdo Ci0JCSB0YXJnZXRtLmVuY29kZV9zZWN0aW9uX2luZm8uICBCeSBzZXR0aW5n IHRoZSBsb2NhbCBiaXQsIHdlCi0JCSBlbmhhbmNlIHRoZSBwcm9iYWJpbGl0 eSBvZiB0aGluZ3Mgd29ya2luZy4gICovCi0JICAgICAgU1lNQk9MX1JFRl9G TEFHUyAoYmFzZSkgPSBTWU1CT0xfRkxBR19MT0NBTDsKLQotCSAgICAgIGlm IChvZmZfcCkKLQkJYmFzZSA9IGdlbl9ydHhfZm10X2UgKENPTlNULCBhZGRy ZXNzX21vZGUsCi0JCQkJICAgICAgZ2VuX3J0eF9mbXRfZWUKLQkJCQkJKFBM VVMsIGFkZHJlc3NfbW9kZSwgYmFzZSwKLQkJCQkJIGdlbl9pbnRfbW9kZSAo b2ZmLCBhZGRyZXNzX21vZGUpKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9m Zl9wKQotCSAgICBiYXNlID0gZ2VuX2ludF9tb2RlIChvZmYsIGFkZHJlc3Nf bW9kZSk7Ci0JICBlbHNlCi0JICAgIGJhc2UgPSBOVUxMX1JUWDsKLQotCSAg aWYgKGJhc2UpCi0JICAgIGFkZHIgPSBnZW5fcnR4X2ZtdF9lZSAoUExVUywg YWRkcmVzc19tb2RlLCBhZGRyLCBiYXNlKTsKLQotCSAgc3RhcnRfc2VxdWVu Y2UgKCk7Ci0JICAvKiBUbyBhdm9pZCBzcGxpdHRpbmcgYWRkcmVzc2luZyBt b2RlcywgcHJldGVuZCB0aGF0IG5vIGNzZSB3aWxsCi0JICAgICBmb2xsb3cu ICAqLwotCSAgb2xkX2NzZV9ub3RfZXhwZWN0ZWQgPSBjc2Vfbm90X2V4cGVj dGVkOwotCSAgY3NlX25vdF9leHBlY3RlZCA9IHRydWU7Ci0JICBhZGRyID0g bWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFjZSAobWVtX21vZGUsIGFkZHIsIGFz KTsKLQkgIGNzZV9ub3RfZXhwZWN0ZWQgPSBvbGRfY3NlX25vdF9leHBlY3Rl ZDsKLQkgIHNlcSA9IGdldF9pbnNucyAoKTsKLQkgIGVuZF9zZXF1ZW5jZSAo KTsKLQotCSAgYWNvc3QgPSBzZXFfY29zdCAoc2VxLCBzcGVlZCk7Ci0JICBh Y29zdCArPSBhZGRyZXNzX2Nvc3QgKGFkZHIsIG1lbV9tb2RlLCBhcywgc3Bl ZWQpOwotCi0JICBpZiAoIWFjb3N0KQotCSAgICBhY29zdCA9IDE7Ci0JICBk YXRhLT5jb3N0c1tzeW1fcF1bdmFyX3BdW29mZl9wXVtyYXRfcF0gPSBhY29z dDsKLQl9Ci0KLSAgICAgIC8qIE9uIHNvbWUgdGFyZ2V0cywgaXQgaXMgcXVp dGUgZXhwZW5zaXZlIHRvIGxvYWQgc3ltYm9sIHRvIGEgcmVnaXN0ZXIsCi0J IHdoaWNoIG1ha2VzIGFkZHJlc3NlcyB0aGF0IGNvbnRhaW4gc3ltYm9scyBs b29rIG11Y2ggbW9yZSBleHBlbnNpdmUuCi0JIEhvd2V2ZXIsIHRoZSBzeW1i b2wgd2lsbCBoYXZlIHRvIGJlIGxvYWRlZCBpbiBhbnkgY2FzZSBiZWZvcmUg dGhlCi0JIGxvb3AgKGFuZCBxdWl0ZSBsaWtlbHkgd2UgaGF2ZSBpdCBpbiBy ZWdpc3RlciBhbHJlYWR5KSwgc28gaXQgZG9lcyBub3QKLQkgbWFrZSBtdWNo IHNlbnNlIHRvIHBlbmFsaXplIHRoZW0gdG9vIGhlYXZpbHkuICBTbyBtYWtl IHNvbWUgZmluYWwKLQkgdHdlYWtzIGZvciB0aGUgU1lNQk9MX1BSRVNFTlQg bW9kZXM6Ci0KLQkgSWYgVkFSX1BSRVNFTlQgaXMgZmFsc2UsIGFuZCB0aGUg bW9kZSBvYnRhaW5lZCBieSBjaGFuZ2luZyBzeW1ib2wgdG8KLQkgdmFyIGlz IGNoZWFwZXIsIHVzZSB0aGlzIG1vZGUgd2l0aCBzbWFsbCBwZW5hbHR5Lgot CSBJZiBWQVJfUFJFU0VOVCBpcyB0cnVlLCB0cnkgd2hldGhlciB0aGUgbW9k ZSB3aXRoCi0JIFNZTUJPTF9QUkVTRU5UID0gZmFsc2UgaXMgY2hlYXBlciBl dmVuIHdpdGggY29zdCBvZiBhZGRpdGlvbiwgYW5kCi0JIGlmIHRoaXMgaXMg dGhlIGNhc2UsIHVzZSBpdC4gICovCi0gICAgICBhZGRfYyA9IGFkZF9jb3N0 IChzcGVlZCwgYWRkcmVzc19tb2RlKTsKLSAgICAgIGZvciAoaSA9IDA7IGkg PCA4OyBpKyspCi0JewotCSAgdmFyX3AgPSBpICYgMTsKLQkgIG9mZl9wID0g KGkgPj4gMSkgJiAxOwotCSAgcmF0X3AgPSAoaSA+PiAyKSAmIDE7Ci0KLQkg IGFjb3N0ID0gZGF0YS0+Y29zdHNbMF1bMV1bb2ZmX3BdW3JhdF9wXSArIDE7 Ci0JICBpZiAodmFyX3ApCi0JICAgIGFjb3N0ICs9IGFkZF9jOwotCi0JICBp ZiAoYWNvc3QgPCBkYXRhLT5jb3N0c1sxXVt2YXJfcF1bb2ZmX3BdW3JhdF9w XSkKLQkgICAgZGF0YS0+Y29zdHNbMV1bdmFyX3BdW29mZl9wXVtyYXRfcF0g PSBhY29zdDsKLQl9Ci0KLSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JewotCSAgZnByaW50ZiAoZHVtcF9m aWxlLCAiPEFkZHJlc3MgQ29zdHM+OlxuIik7Ci0KLQkgIGZvciAoaSA9IDA7 IGkgPCAxNjsgaSsrKQotCSAgICB7Ci0JICAgICAgc3ltX3AgPSBpICYgMTsK LQkgICAgICB2YXJfcCA9IChpID4+IDEpICYgMTsKLQkgICAgICBvZmZfcCA9 IChpID4+IDIpICYgMTsKLQkgICAgICByYXRfcCA9IChpID4+IDMpICYgMTsK LQotCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIiAgIik7Ci0JICAgICAg aWYgKHN5bV9wKQotCQlmcHJpbnRmIChkdW1wX2ZpbGUsICJzeW0gKyAiKTsK LQkgICAgICBpZiAodmFyX3ApCi0JCWZwcmludGYgKGR1bXBfZmlsZSwgInZh ciArICIpOwotCSAgICAgIGlmIChvZmZfcCkKLQkJZnByaW50ZiAoZHVtcF9m aWxlLCAiY3N0ICsgIik7Ci0JICAgICAgaWYgKHJhdF9wKQotCQlmcHJpbnRm IChkdW1wX2ZpbGUsICJyYXQgKiAiKTsKLQotCSAgICAgIGFjb3N0ID0gZGF0 YS0+Y29zdHNbc3ltX3BdW3Zhcl9wXVtvZmZfcF1bcmF0X3BdOwotCSAgICAg IGZwcmludGYgKGR1bXBfZmlsZSwgImluZGV4IGNvc3RzICVkXG4iLCBhY29z dCk7Ci0JICAgIH0KLQkgIGlmIChoYXNfcHJlZGVjW21lbV9tb2RlXSB8fCBo YXNfcG9zdGRlY1ttZW1fbW9kZV0KLQkgICAgICB8fCBoYXNfcHJlaW5jW21l bV9tb2RlXSB8fCBoYXNfcG9zdGluY1ttZW1fbW9kZV0pCi0JICAgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIiAgTWF5IGluY2x1ZGUgYXV0b2luYy9kZWNcbiIp OwotCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKLQl9Ci0KLSAgICAg IGFkZHJlc3NfY29zdF9kYXRhX2xpc3RbZGF0YV9pbmRleF0gPSBkYXRhOwot ICAgIH0KLQotICBiaXRzID0gR0VUX01PREVfQklUU0laRSAoYWRkcmVzc19t b2RlKTsKLSAgbWFzayA9IH4oSE9TVF9XSURFX0lOVF9NMVUgPDwgKGJpdHMg LSAxKSA8PCAxKTsKLSAgb2Zmc2V0ICY9IG1hc2s7Ci0gIGlmICgob2Zmc2V0 ID4+IChiaXRzIC0gMSkgJiAxKSkKLSAgICBvZmZzZXQgfD0gfm1hc2s7Ci0g IHNfb2Zmc2V0ID0gb2Zmc2V0OwotCi0gIGF1dG9pbmMgPSBmYWxzZTsKLSAg YXV0b2luY190eXBlID0gQUlOQ19OT05FOwotICBtc2l6ZSA9IEdFVF9NT0RF X1NJWkUgKG1lbV9tb2RlKTsKLSAgYXV0b2luY19vZmZzZXQgPSBvZmZzZXQ7 Ci0gIGlmIChzdG10X2FmdGVyX2luYykKLSAgICBhdXRvaW5jX29mZnNldCAr PSByYXRpbyAqIGNzdGVwOwotICBpZiAoc3ltYm9sX3ByZXNlbnQgfHwgdmFy X3ByZXNlbnQgfHwgcmF0aW8gIT0gMSkKLSAgICBhdXRvaW5jID0gZmFsc2U7 Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaGFzX3Bvc3RpbmNbbWVtX21v ZGVdICYmIGF1dG9pbmNfb2Zmc2V0ID09IDAKLQkgICYmIG1zaXplID09IGNz dGVwKQotCWF1dG9pbmNfdHlwZSA9IEFJTkNfUE9TVF9JTkM7Ci0gICAgICBl bHNlIGlmIChoYXNfcG9zdGRlY1ttZW1fbW9kZV0gJiYgYXV0b2luY19vZmZz ZXQgPT0gMAotCSAgICAgICAmJiBtc2l6ZSA9PSAtY3N0ZXApCi0JYXV0b2lu Y190eXBlID0gQUlOQ19QT1NUX0RFQzsKLSAgICAgIGVsc2UgaWYgKGhhc19w cmVpbmNbbWVtX21vZGVdICYmIGF1dG9pbmNfb2Zmc2V0ID09IG1zaXplCi0J ICAgICAgICYmIG1zaXplID09IGNzdGVwKQotCWF1dG9pbmNfdHlwZSA9IEFJ TkNfUFJFX0lOQzsKLSAgICAgIGVsc2UgaWYgKGhhc19wcmVkZWNbbWVtX21v ZGVdICYmIGF1dG9pbmNfb2Zmc2V0ID09IC1tc2l6ZQotCSAgICAgICAmJiBt c2l6ZSA9PSAtY3N0ZXApCi0JYXV0b2luY190eXBlID0gQUlOQ19QUkVfREVD OwotCi0gICAgICBpZiAoYXV0b2luY190eXBlICE9IEFJTkNfTk9ORSkKLQlh dXRvaW5jID0gdHJ1ZTsKLSAgICB9Ci0KLSAgY29zdCA9IDA7Ci0gIG9mZnNl dF9wID0gKHNfb2Zmc2V0ICE9IDAKLQkgICAgICAmJiBkYXRhLT5taW5fb2Zm c2V0IDw9IHNfb2Zmc2V0Ci0JICAgICAgJiYgc19vZmZzZXQgPD0gZGF0YS0+ bWF4X29mZnNldCk7Ci0gIHJhdGlvX3AgPSAocmF0aW8gIT0gMQotCSAgICAg JiYgbXVsdGlwbGllcl9hbGxvd2VkX2luX2FkZHJlc3NfcCAocmF0aW8sIG1l bV9tb2RlLCBhcykpOwotCi0gIGlmIChyYXRpbyAhPSAxICYmICFyYXRpb19w KQotICAgIGNvc3QgKz0gbXVsdF9ieV9jb2VmZl9jb3N0IChyYXRpbywgYWRk cmVzc19tb2RlLCBzcGVlZCk7Ci0KLSAgaWYgKHNfb2Zmc2V0ICYmICFvZmZz ZXRfcCAmJiAhc3ltYm9sX3ByZXNlbnQpCi0gICAgY29zdCArPSBhZGRfY29z dCAoc3BlZWQsIGFkZHJlc3NfbW9kZSk7Ci0KLSAgaWYgKG1heV9hdXRvaW5j KQotICAgICptYXlfYXV0b2luYyA9IGF1dG9pbmM7Ci0gIGlmIChhdXRvaW5j KQotICAgIGFjb3N0ID0gZGF0YS0+YWluY19jb3N0c1thdXRvaW5jX3R5cGVd OwotICBlbHNlCi0gICAgYWNvc3QgPSBkYXRhLT5jb3N0c1tzeW1ib2xfcHJl c2VudF1bdmFyX3ByZXNlbnRdW29mZnNldF9wXVtyYXRpb19wXTsKLSAgY29t cGxleGl0eSA9IChzeW1ib2xfcHJlc2VudCAhPSAwKSArICh2YXJfcHJlc2Vu dCAhPSAwKSArIG9mZnNldF9wICsgcmF0aW9fcDsKLSAgcmV0dXJuIGNvbXBf Y29zdCAoY29zdCArIGFjb3N0LCBjb21wbGV4aXR5KTsKLX0KLQogIC8qIENh bGN1bGF0ZSB0aGUgU1BFRUQgb3Igc2l6ZSBjb3N0IG9mIHNoaWZ0YWRkIEVY UFIgaW4gTU9ERS4gIE1VTFQgaXMgdGhlCiAgICAgRVhQUiBvcGVyYW5kIGhv bGRpbmcgdGhlIHNoaWZ0LiAgQ09TVDAgYW5kIENPU1QxIGFyZSB0aGUgY29z dHMgZm9yCiAgICAgY2FsY3VsYXRpbmcgdGhlIG9wZXJhbmRzIG9mIEVYUFIu ICBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgYW5kIHJldHVybnMKICAg ICB0aGUgY29zdCBpbiBDT1NULiAgKi8KIAogc3RhdGljIGJvb2wKIGdldF9z aGlmdGFkZF9jb3N0ICh0cmVlIGV4cHIsIG1hY2hpbmVfbW9kZSBtb2RlLCBj b21wX2Nvc3QgY29zdDAsCiAJCSAgIGNvbXBfY29zdCBjb3N0MSwgdHJlZSBt dWx0LCBib29sIHNwZWVkLCBjb21wX2Nvc3QgKmNvc3QpCiB7CiAgIGNvbXBf Y29zdCByZXM7CkBAIC00NDY0LDMyOSArNDE2MiwyODQgQEAgZm9yY2VfZXhw cl90b192YXJfY29zdCAodHJlZSBleHByLCBib29sIHNwZWVkKQogICAgICAg ZWxzZQogCXJldHVybiBjb21wX2Nvc3QgKHRhcmdldF9zcGlsbF9jb3N0IFtz cGVlZF0sIDApOwogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgogICAg ICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgIH0KIAogICBjb3N0ICs9IGNv c3QwOwogICBjb3N0ICs9IGNvc3QxOwotCi0gIC8qIEJvdW5kIHRoZSBjb3N0 IGJ5IHRhcmdldF9zcGlsbF9jb3N0LiAgVGhlIHBhcnRzIG9mIGNvbXBsaWNh dGVkCi0gICAgIGNvbXB1dGF0aW9ucyBvZnRlbiBhcmUgZWl0aGVyIGxvb3Ag aW52YXJpYW50IG9yIGF0IGxlYXN0IGNhbgotICAgICBiZSBzaGFyZWQgYmV0 d2VlbiBzZXZlcmFsIGl2IHVzZXMsIHNvIGxldHRpbmcgdGhpcyBncm93IHdp dGhvdXQKLSAgICAgbGltaXRzIHdvdWxkIG5vdCBnaXZlIHJlYXNvbmFibGUg cmVzdWx0cy4gICovCi0gIGlmIChjb3N0LmNvc3QgPiAoaW50KSB0YXJnZXRf c3BpbGxfY29zdCBbc3BlZWRdKQotICAgIGNvc3QuY29zdCA9IHRhcmdldF9z cGlsbF9jb3N0IFtzcGVlZF07Ci0KICAgcmV0dXJuIGNvc3Q7CiB9CiAKIC8q IEVzdGltYXRlcyBjb3N0IG9mIGZvcmNpbmcgRVhQUiBpbnRvIGEgdmFyaWFi bGUuICBJTlZfVkFSUyBpcyBhIHNldCBvZiB0aGUKICAgIGludmFyaWFudHMg dGhlIGNvbXB1dGF0aW9uIGRlcGVuZHMgb24uICAqLwogCiBzdGF0aWMgY29t cF9jb3N0CiBmb3JjZV92YXJfY29zdCAoc3RydWN0IGl2b3B0c19kYXRhICpk YXRhLCB0cmVlIGV4cHIsIGJpdG1hcCAqaW52X3ZhcnMpCiB7CiAgIGlmICgh ZXhwcikKICAgICByZXR1cm4gbm9fY29zdDsKIAogICBmaW5kX2ludl92YXJz IChkYXRhLCAmZXhwciwgaW52X3ZhcnMpOwogICByZXR1cm4gZm9yY2VfZXhw cl90b192YXJfY29zdCAoZXhwciwgZGF0YS0+c3BlZWQpOwogfQogCi0vKiBF c3RpbWF0ZXMgY29zdCBvZiBleHByZXNzaW5nIGFkZHJlc3MgQUREUiAgYXMg dmFyICsgc3ltYm9sICsgb2Zmc2V0LiAgVGhlCi0gICB2YWx1ZSBvZiBvZmZz ZXQgaXMgYWRkZWQgdG8gT0ZGU0VULCBTWU1CT0xfUFJFU0VOVCBhbmQgVkFS X1BSRVNFTlQgYXJlIHNldAotICAgdG8gZmFsc2UgaWYgdGhlIGNvcnJlc3Bv bmRpbmcgcGFydCBpcyBtaXNzaW5nLiAgaW52X3ZhcnMgaXMgYSBzZXQgb2Yg dGhlCi0gICBpbnZhcmlhbnRzIHRoZSBjb21wdXRhdGlvbiBkZXBlbmRzIG9u LiAgKi8KLQotc3RhdGljIGNvbXBfY29zdAotc3BsaXRfYWRkcmVzc19jb3N0 IChzdHJ1Y3QgaXZvcHRzX2RhdGEgKmRhdGEsCi0JCSAgICB0cmVlIGFkZHIs IGJvb2wgKnN5bWJvbF9wcmVzZW50LCBib29sICp2YXJfcHJlc2VudCwKLQkJ ICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgKm9mZnNldCwgYml0bWFwICpp bnZfdmFycykKLXsKLSAgdHJlZSBjb3JlOwotICBIT1NUX1dJREVfSU5UIGJp dHNpemU7Ci0gIEhPU1RfV0lERV9JTlQgYml0cG9zOwotICB0cmVlIHRvZmZz ZXQ7Ci0gIG1hY2hpbmVfbW9kZSBtb2RlOwotICBpbnQgdW5zaWduZWRwLCBy ZXZlcnNlcCwgdm9sYXRpbGVwOwotCi0gIGNvcmUgPSBnZXRfaW5uZXJfcmVm ZXJlbmNlIChhZGRyLCAmYml0c2l6ZSwgJmJpdHBvcywgJnRvZmZzZXQsICZt b2RlLAotCQkJICAgICAgJnVuc2lnbmVkcCwgJnJldmVyc2VwLCAmdm9sYXRp bGVwKTsKLQotICBpZiAodG9mZnNldCAhPSAwCi0gICAgICB8fCBiaXRwb3Mg JSBCSVRTX1BFUl9VTklUICE9IDAKLSAgICAgIHx8IHJldmVyc2VwCi0gICAg ICB8fCAhVkFSX1AgKGNvcmUpKQotICAgIHsKLSAgICAgICpzeW1ib2xfcHJl c2VudCA9IGZhbHNlOwotICAgICAgKnZhcl9wcmVzZW50ID0gdHJ1ZTsKLSAg ICAgIGZpbmRfaW52X3ZhcnMgKGRhdGEsICZhZGRyLCBpbnZfdmFycyk7Ci0g ICAgICByZXR1cm4gY29tcF9jb3N0ICh0YXJnZXRfc3BpbGxfY29zdFtkYXRh LT5zcGVlZF0sIDApOwotICAgIH0KLQotICAqb2Zmc2V0ICs9IGJpdHBvcyAv IEJJVFNfUEVSX1VOSVQ7Ci0gIGlmIChUUkVFX1NUQVRJQyAoY29yZSkKLSAg ICAgIHx8IERFQ0xfRVhURVJOQUwgKGNvcmUpKQotICAgIHsKLSAgICAgICpz eW1ib2xfcHJlc2VudCA9IHRydWU7Ci0gICAgICAqdmFyX3ByZXNlbnQgPSBm YWxzZTsKLSAgICAgIHJldHVybiBub19jb3N0OwotICAgIH0KKy8qIFJldHVy bnMgY29zdCBvZiBhdXRvLW1vZGlmeWluZyBhZGRyZXNzIGV4cHJlc3Npb24g aW4gc2hhcGUgYmFzZSArIG9mZnNldC4KKyAgIEFJTkNfU1RFUCBpcyBzdGVw IHNpemUgb2YgdGhlIGFkZHJlc3MgSVYuICBBSU5DX09GRlNFVCBpcyBvZmZz ZXQgb2YgdGhlCisgICBhZGRyZXNzIGV4cHJlc3Npb24uICBUaGUgYWRkcmVz cyBleHByZXNzaW9uIGhhcyBBRERSX01PREUgaW4gYWRkciBzcGFjZQorICAg QVMuICBUaGUgbWVtb3J5IGFjY2VzcyBoYXMgTUVNX01PREUuICBTUEVFRCBt ZWFucyB3ZSBhcmUgb3B0aW1pemluZyBmb3IKKyAgIHNwZWVkIG9yIHNpemUu ICAqLwogCi0gICpzeW1ib2xfcHJlc2VudCA9IGZhbHNlOwotICAqdmFyX3By ZXNlbnQgPSB0cnVlOwotICByZXR1cm4gbm9fY29zdDsKLX0KLQotLyogRXN0 aW1hdGVzIGNvc3Qgb2YgZXhwcmVzc2luZyBkaWZmZXJlbmNlIG9mIGFkZHJl c3NlcyBFMSAtIEUyIGFzCi0gICB2YXIgKyBzeW1ib2wgKyBvZmZzZXQuICBU aGUgdmFsdWUgb2Ygb2Zmc2V0IGlzIGFkZGVkIHRvIE9GRlNFVCwKLSAgIFNZ TUJPTF9QUkVTRU5UIGFuZCBWQVJfUFJFU0VOVCBhcmUgc2V0IHRvIGZhbHNl IGlmIHRoZSBjb3JyZXNwb25kaW5nCi0gICBwYXJ0IGlzIG1pc3NpbmcuICBp bnZfdmFycyBpcyBhIHNldCBvZiB0aGUgaW52YXJpYW50cyB0aGUgY29tcHV0 YXRpb24KLSAgIGRlcGVuZHMgb24uICAqLwotCi1zdGF0aWMgY29tcF9jb3N0 Ci1wdHJfZGlmZmVyZW5jZV9jb3N0IChzdHJ1Y3QgaXZvcHRzX2RhdGEgKmRh dGEsCi0JCSAgICAgdHJlZSBlMSwgdHJlZSBlMiwgYm9vbCAqc3ltYm9sX3By ZXNlbnQsIGJvb2wgKnZhcl9wcmVzZW50LAotCQkgICAgIHVuc2lnbmVkIEhP U1RfV0lERV9JTlQgKm9mZnNldCwgYml0bWFwICppbnZfdmFycykKK2VudW0g YWluY190eXBlCiB7Ci0gIEhPU1RfV0lERV9JTlQgZGlmZiA9IDA7Ci0gIGFm Zl90cmVlIGFmZl9lMSwgYWZmX2UyOwotICB0cmVlIHR5cGU7Ci0KLSAgZ2Nj X2Fzc2VydCAoVFJFRV9DT0RFIChlMSkgPT0gQUREUl9FWFBSKTsKLQotICBp ZiAocHRyX2RpZmZlcmVuY2VfY29uc3QgKGUxLCBlMiwgJmRpZmYpKQotICAg IHsKLSAgICAgICpvZmZzZXQgKz0gZGlmZjsKLSAgICAgICpzeW1ib2xfcHJl c2VudCA9IGZhbHNlOwotICAgICAgKnZhcl9wcmVzZW50ID0gZmFsc2U7Ci0g ICAgICByZXR1cm4gbm9fY29zdDsKLSAgICB9Ci0KLSAgaWYgKGludGVnZXJf emVyb3AgKGUyKSkKLSAgICByZXR1cm4gc3BsaXRfYWRkcmVzc19jb3N0IChk YXRhLCBUUkVFX09QRVJBTkQgKGUxLCAwKSwKLQkJCSAgICAgICBzeW1ib2xf cHJlc2VudCwgdmFyX3ByZXNlbnQsIG9mZnNldCwgaW52X3ZhcnMpOwotCi0g ICpzeW1ib2xfcHJlc2VudCA9IGZhbHNlOwotICAqdmFyX3ByZXNlbnQgPSB0 cnVlOwotCi0gIHR5cGUgPSBzaWduZWRfdHlwZV9mb3IgKFRSRUVfVFlQRSAo ZTEpKTsKLSAgdHJlZV90b19hZmZfY29tYmluYXRpb24gKGUxLCB0eXBlLCAm YWZmX2UxKTsKLSAgdHJlZV90b19hZmZfY29tYmluYXRpb24gKGUyLCB0eXBl LCAmYWZmX2UyKTsKLSAgYWZmX2NvbWJpbmF0aW9uX3NjYWxlICgmYWZmX2Uy LCAtMSk7Ci0gIGFmZl9jb21iaW5hdGlvbl9hZGQgKCZhZmZfZTEsICZhZmZf ZTIpOwotCi0gIHJldHVybiBmb3JjZV92YXJfY29zdCAoZGF0YSwgYWZmX2Nv bWJpbmF0aW9uX3RvX3RyZWUgKCZhZmZfZTEpLCBpbnZfdmFycyk7Ci19Ci0K LS8qIEVzdGltYXRlcyBjb3N0IG9mIGV4cHJlc3NpbmcgZGlmZmVyZW5jZSBF MSAtIEUyIGFzCi0gICB2YXIgKyBzeW1ib2wgKyBvZmZzZXQuICBUaGUgdmFs dWUgb2Ygb2Zmc2V0IGlzIGFkZGVkIHRvIE9GRlNFVCwKLSAgIFNZTUJPTF9Q UkVTRU5UIGFuZCBWQVJfUFJFU0VOVCBhcmUgc2V0IHRvIGZhbHNlIGlmIHRo ZSBjb3JyZXNwb25kaW5nCi0gICBwYXJ0IGlzIG1pc3NpbmcuICBJTlZfVkFS UyBpcyBhIHNldCBvZiB0aGUgaW52YXJpYW50cyB0aGUgY29tcHV0YXRpb24K LSAgIGRlcGVuZHMgb24uICAqLworICBBSU5DX1BSRV9JTkMsCQkvKiBQcmUg aW5jcmVtZW50LiAgKi8KKyAgQUlOQ19QUkVfREVDLAkJLyogUHJlIGRlY3Jl bWVudC4gICovCisgIEFJTkNfUE9TVF9JTkMsCS8qIFBvc3QgaW5jcmVtZW50 LiAgKi8KKyAgQUlOQ19QT1NUX0RFQywJLyogUG9zdCBkZWNyZW1lbnQuICAq LworICBBSU5DX05PTkUJCS8qIEFsc28gdGhlIG51bWJlciBvZiBhdXRvIGlu Y3JlbWVudCB0eXBlcy4gICovCit9OwogCi1zdGF0aWMgY29tcF9jb3N0Ci1k aWZmZXJlbmNlX2Nvc3QgKHN0cnVjdCBpdm9wdHNfZGF0YSAqZGF0YSwKLQkJ IHRyZWUgZTEsIHRyZWUgZTIsIGJvb2wgKnN5bWJvbF9wcmVzZW50LCBib29s ICp2YXJfcHJlc2VudCwKLQkJIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgKm9m ZnNldCwgYml0bWFwICppbnZfdmFycykKK3N0cnVjdCBhaW5jX2Nvc3RfZGF0 YQogewotICBtYWNoaW5lX21vZGUgbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9U WVBFIChlMSkpOwotICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG9mZjEsIG9m ZjI7Ci0gIGFmZl90cmVlIGFmZl9lMSwgYWZmX2UyOwotICB0cmVlIHR5cGU7 Ci0KLSAgZTEgPSBzdHJpcF9vZmZzZXQgKGUxLCAmb2ZmMSk7Ci0gIGUyID0g c3RyaXBfb2Zmc2V0IChlMiwgJm9mZjIpOwotICAqb2Zmc2V0ICs9IG9mZjEg LSBvZmYyOwotCi0gIFNUUklQX05PUFMgKGUxKTsKLSAgU1RSSVBfTk9QUyAo ZTIpOworICB1bnNpZ25lZCBjb3N0c1tBSU5DX05PTkVdOworfTsKIAotICBp ZiAoVFJFRV9DT0RFIChlMSkgPT0gQUREUl9FWFBSKQotICAgIHJldHVybiBw dHJfZGlmZmVyZW5jZV9jb3N0IChkYXRhLCBlMSwgZTIsIHN5bWJvbF9wcmVz ZW50LCB2YXJfcHJlc2VudCwKLQkJCQlvZmZzZXQsIGludl92YXJzKTsKLSAg KnN5bWJvbF9wcmVzZW50ID0gZmFsc2U7CitzdGF0aWMgY29tcF9jb3N0Citn ZXRfYWRkcmVzc19jb3N0X2FpbmMgKEhPU1RfV0lERV9JTlQgYWluY19zdGVw LCBIT1NUX1dJREVfSU5UIGFpbmNfb2Zmc2V0LAorCQkgICAgICAgbWFjaGlu ZV9tb2RlIGFkZHJfbW9kZSwgbWFjaGluZV9tb2RlIG1lbV9tb2RlLAorCQkg ICAgICAgYWRkcl9zcGFjZV90IGFzLCBib29sIHNwZWVkKQoreworICBpZiAo IVVTRV9MT0FEX1BSRV9ERUNSRU1FTlQgKG1lbV9tb2RlKQorICAgICAgJiYg IVVTRV9TVE9SRV9QUkVfREVDUkVNRU5UIChtZW1fbW9kZSkKKyAgICAgICYm ICFVU0VfTE9BRF9QT1NUX0RFQ1JFTUVOVCAobWVtX21vZGUpCisgICAgICAm JiAhVVNFX1NUT1JFX1BPU1RfREVDUkVNRU5UIChtZW1fbW9kZSkKKyAgICAg ICYmICFVU0VfTE9BRF9QUkVfSU5DUkVNRU5UIChtZW1fbW9kZSkKKyAgICAg ICYmICFVU0VfU1RPUkVfUFJFX0lOQ1JFTUVOVCAobWVtX21vZGUpCisgICAg ICAmJiAhVVNFX0xPQURfUE9TVF9JTkNSRU1FTlQgKG1lbV9tb2RlKQorICAg ICAgJiYgIVVTRV9TVE9SRV9QT1NUX0lOQ1JFTUVOVCAobWVtX21vZGUpKQor ICAgIHJldHVybiBpbmZpbml0ZV9jb3N0OwogCi0gIGlmIChvcGVyYW5kX2Vx dWFsX3AgKGUxLCBlMiwgMCkpCisgIHN0YXRpYyB2ZWM8YWluY19jb3N0X2Rh dGEgKj4gYWluY19jb3N0X2RhdGFfbGlzdDsKKyAgdW5zaWduZWQgaWR4ID0g KHVuc2lnbmVkKSBhcyAqIE1BWF9NQUNISU5FX01PREUgKyAodW5zaWduZWQp IG1lbV9tb2RlOworICBpZiAoaWR4ID49IGFpbmNfY29zdF9kYXRhX2xpc3Qu bGVuZ3RoICgpKQogICAgIHsKLSAgICAgICp2YXJfcHJlc2VudCA9IGZhbHNl OwotICAgICAgcmV0dXJuIG5vX2Nvc3Q7Ci0gICAgfQorICAgICAgdW5zaWdu ZWQgbnNpemUgPSAoKHVuc2lnbmVkKSBhcyArIDEpICpNQVhfTUFDSElORV9N T0RFOwogCi0gICp2YXJfcHJlc2VudCA9IHRydWU7Ci0KLSAgaWYgKGludGVn ZXJfemVyb3AgKGUyKSkKLSAgICByZXR1cm4gZm9yY2VfdmFyX2Nvc3QgKGRh dGEsIGUxLCBpbnZfdmFycyk7Ci0KLSAgaWYgKGludGVnZXJfemVyb3AgKGUx KSkKLSAgICB7Ci0gICAgICBjb21wX2Nvc3QgY29zdCA9IGZvcmNlX3Zhcl9j b3N0IChkYXRhLCBlMiwgaW52X3ZhcnMpOwotICAgICAgY29zdCArPSBtdWx0 X2J5X2NvZWZmX2Nvc3QgKC0xLCBtb2RlLCBkYXRhLT5zcGVlZCk7Ci0gICAg ICByZXR1cm4gY29zdDsKKyAgICAgIGdjY19hc3NlcnQgKG5zaXplID4gaWR4 KTsKKyAgICAgIGFpbmNfY29zdF9kYXRhX2xpc3Quc2FmZV9ncm93X2NsZWFy ZWQgKG5zaXplKTsKICAgICB9CiAKLSAgdHlwZSA9IHNpZ25lZF90eXBlX2Zv ciAoVFJFRV9UWVBFIChlMSkpOwotICB0cmVlX3RvX2FmZl9jb21iaW5hdGlv biAoZTEsIHR5cGUsICZhZmZfZTEpOwotICB0cmVlX3RvX2FmZl9jb21iaW5h dGlvbiAoZTIsIHR5cGUsICZhZmZfZTIpOwotICBhZmZfY29tYmluYXRpb25f c2NhbGUgKCZhZmZfZTIsIC0xKTsKLSAgYWZmX2NvbWJpbmF0aW9uX2FkZCAo JmFmZl9lMSwgJmFmZl9lMik7Ci0KLSAgcmV0dXJuIGZvcmNlX3Zhcl9jb3N0 IChkYXRhLCBhZmZfY29tYmluYXRpb25fdG9fdHJlZSAoJmFmZl9lMSksIGlu dl92YXJzKTsKLX0KLQotLyogUmV0dXJucyB0cnVlIGlmIEFGRjEgYW5kIEFG RjIgYXJlIGlkZW50aWNhbC4gICovCi0KLXN0YXRpYyBib29sCi1jb21wYXJl X2FmZl90cmVlcyAoYWZmX3RyZWUgKmFmZjEsIGFmZl90cmVlICphZmYyKQot ewotICB1bnNpZ25lZCBpOwotCi0gIGlmIChhZmYxLT5uICE9IGFmZjItPm4p Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBhZmYx LT5uOyBpKyspCisgIGFpbmNfY29zdF9kYXRhICpkYXRhID0gYWluY19jb3N0 X2RhdGFfbGlzdFtpZHhdOworICBpZiAoZGF0YSA9PSBOVUxMKQogICAgIHsK LSAgICAgIGlmIChhZmYxLT5lbHRzW2ldLmNvZWYgIT0gYWZmMi0+ZWx0c1tp XS5jb2VmKQotCXJldHVybiBmYWxzZTsKKyAgICAgIHJ0eCByZWcgPSBnZW5f cmF3X1JFRyAoYWRkcl9tb2RlLCBMQVNUX1ZJUlRVQUxfUkVHSVNURVIgKyAx KTsKIAotICAgICAgaWYgKCFvcGVyYW5kX2VxdWFsX3AgKGFmZjEtPmVsdHNb aV0udmFsLCBhZmYyLT5lbHRzW2ldLnZhbCwgMCkpCi0JcmV0dXJuIGZhbHNl OwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19CisgICAgICBkYXRhID0gKGFp bmNfY29zdF9kYXRhICopIHhjYWxsb2MgKDEsIHNpemVvZiAoKmRhdGEpKTsK KyAgICAgIGRhdGEtPmNvc3RzW0FJTkNfUFJFX0RFQ10gPSBJTkZUWTsKKyAg ICAgIGRhdGEtPmNvc3RzW0FJTkNfUE9TVF9ERUNdID0gSU5GVFk7CisgICAg ICBkYXRhLT5jb3N0c1tBSU5DX1BSRV9JTkNdID0gSU5GVFk7CisgICAgICBk YXRhLT5jb3N0c1tBSU5DX1BPU1RfSU5DXSA9IElORlRZOworICAgICAgaWYg KFVTRV9MT0FEX1BSRV9ERUNSRU1FTlQgKG1lbV9tb2RlKQorCSAgfHwgVVNF X1NUT1JFX1BSRV9ERUNSRU1FTlQgKG1lbV9tb2RlKSkKKwl7CisJICBydHgg YWRkciA9IGdlbl9ydHhfUFJFX0RFQyAoYWRkcl9tb2RlLCByZWcpOwogCi0v KiBTdG9yZXMgRVhQUiBpbiBEQVRBLT5pbnZfZXhwcl90YWIsIHJldHVybiBw b2ludGVyIHRvIGl2X2ludl9leHByX2VudC4gICovCisJICBpZiAobWVtb3J5 X2FkZHJlc3NfYWRkcl9zcGFjZV9wIChtZW1fbW9kZSwgYWRkciwgYXMpKQor CSAgICBkYXRhLT5jb3N0c1tBSU5DX1BSRV9ERUNdCisJICAgICAgPSBhZGRy ZXNzX2Nvc3QgKGFkZHIsIG1lbV9tb2RlLCBhcywgc3BlZWQpOworCX0KKyAg ICAgIGlmIChVU0VfTE9BRF9QT1NUX0RFQ1JFTUVOVCAobWVtX21vZGUpCisJ ICB8fCBVU0VfU1RPUkVfUE9TVF9ERUNSRU1FTlQgKG1lbV9tb2RlKSkKKwl7 CisJICBydHggYWRkciA9IGdlbl9ydHhfUE9TVF9ERUMgKGFkZHJfbW9kZSwg cmVnKTsKIAotc3RhdGljIGl2X2ludl9leHByX2VudCAqCi1yZWNvcmRfaW52 X2V4cHIgKHN0cnVjdCBpdm9wdHNfZGF0YSAqZGF0YSwgdHJlZSBleHByKQot ewotICBzdHJ1Y3QgaXZfaW52X2V4cHJfZW50IGVudDsKLSAgc3RydWN0IGl2 X2ludl9leHByX2VudCAqKnNsb3Q7CisJICBpZiAobWVtb3J5X2FkZHJlc3Nf YWRkcl9zcGFjZV9wIChtZW1fbW9kZSwgYWRkciwgYXMpKQorCSAgICBkYXRh LT5jb3N0c1tBSU5DX1BPU1RfREVDXQorCSAgICAgID0gYWRkcmVzc19jb3N0 IChhZGRyLCBtZW1fbW9kZSwgYXMsIHNwZWVkKTsKKwl9CisgICAgICBpZiAo VVNFX0xPQURfUFJFX0lOQ1JFTUVOVCAobWVtX21vZGUpCisJICB8fCBVU0Vf U1RPUkVfUFJFX0lOQ1JFTUVOVCAobWVtX21vZGUpKQorCXsKKwkgIHJ0eCBh ZGRyID0gZ2VuX3J0eF9QUkVfSU5DIChhZGRyX21vZGUsIHJlZyk7CiAKLSAg ZW50LmV4cHIgPSBleHByOwotICBlbnQuaGFzaCA9IGl0ZXJhdGl2ZV9oYXNo X2V4cHIgKGV4cHIsIDApOwotICBzbG90ID0gZGF0YS0+aW52X2V4cHJfdGFi LT5maW5kX3Nsb3QgKCZlbnQsIElOU0VSVCk7CisJICBpZiAobWVtb3J5X2Fk ZHJlc3NfYWRkcl9zcGFjZV9wIChtZW1fbW9kZSwgYWRkciwgYXMpKQorCSAg ICBkYXRhLT5jb3N0c1tBSU5DX1BSRV9JTkNdCisJICAgICAgPSBhZGRyZXNz X2Nvc3QgKGFkZHIsIG1lbV9tb2RlLCBhcywgc3BlZWQpOworCX0KKyAgICAg IGlmIChVU0VfTE9BRF9QT1NUX0lOQ1JFTUVOVCAobWVtX21vZGUpCisJICB8 fCBVU0VfU1RPUkVfUE9TVF9JTkNSRU1FTlQgKG1lbV9tb2RlKSkKKwl7CisJ ICBydHggYWRkciA9IGdlbl9ydHhfUE9TVF9JTkMgKGFkZHJfbW9kZSwgcmVn KTsKIAotICBpZiAoISpzbG90KQotICAgIHsKLSAgICAgICpzbG90ID0gWE5F VyAoc3RydWN0IGl2X2ludl9leHByX2VudCk7Ci0gICAgICAoKnNsb3QpLT5l eHByID0gZXhwcjsKLSAgICAgICgqc2xvdCktPmhhc2ggPSBlbnQuaGFzaDsK LSAgICAgICgqc2xvdCktPmlkID0gZGF0YS0+bWF4X2ludl9leHByX2lkKys7 CisJICBpZiAobWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFjZV9wIChtZW1fbW9k ZSwgYWRkciwgYXMpKQorCSAgICBkYXRhLT5jb3N0c1tBSU5DX1BPU1RfSU5D XQorCSAgICAgID0gYWRkcmVzc19jb3N0IChhZGRyLCBtZW1fbW9kZSwgYXMs IHNwZWVkKTsKKwl9CisgICAgICBhaW5jX2Nvc3RfZGF0YV9saXN0W2lkeF0g PSBkYXRhOwogICAgIH0KIAotICByZXR1cm4gKnNsb3Q7Ci19CisgIEhPU1Rf V0lERV9JTlQgbXNpemUgPSBHRVRfTU9ERV9TSVpFIChtZW1fbW9kZSk7Cisg IGlmIChhaW5jX29mZnNldCA9PSAwICYmIG1zaXplID09IGFpbmNfc3RlcCkK KyAgICByZXR1cm4gY29tcF9jb3N0IChkYXRhLT5jb3N0c1tBSU5DX1BPU1Rf SU5DXSwgMCk7CisgIGlmIChhaW5jX29mZnNldCA9PSAwICYmIG1zaXplID09 IC1haW5jX3N0ZXApCisgICAgcmV0dXJuIGNvbXBfY29zdCAoZGF0YS0+Y29z dHNbQUlOQ19QT1NUX0RFQ10sIDApOworICBpZiAoYWluY19vZmZzZXQgPT0g bXNpemUgJiYgbXNpemUgPT0gYWluY19zdGVwKQorICAgIHJldHVybiBjb21w X2Nvc3QgKGRhdGEtPmNvc3RzW0FJTkNfUFJFX0lOQ10sIDApOworICBpZiAo YWluY19vZmZzZXQgPT0gLW1zaXplICYmIG1zaXplID09IC1haW5jX3N0ZXAp CisgICAgcmV0dXJuIGNvbXBfY29zdCAoZGF0YS0+Y29zdHNbQUlOQ19QUkVf REVDXSwgMCk7CiAKLS8qIFJldHVybnMgdGhlIGludmFyaWFudCBleHByZXNz aW9uIGlmIGV4cHJlc3Npb24gVUJBU0UgLSBSQVRJTyAqIENCQVNFCi0gICBy ZXF1aXJlcyBhIG5ldyBjb21waWxlciBnZW5lcmF0ZWQgdGVtcG9yYXJ5LiAg UmV0dXJucyAtMSBvdGhlcndpc2UuCi0gICBBRERSRVNTX1AgaXMgYSBmbGFn IGluZGljYXRpbmcgaWYgdGhlIGV4cHJlc3Npb24gaXMgZm9yIGFkZHJlc3MK LSAgIGNvbXB1dGF0aW9uLiAgKi8KLQotc3RhdGljIGl2X2ludl9leHByX2Vu dCAqCi1nZXRfbG9vcF9pbnZhcmlhbnRfZXhwciAoc3RydWN0IGl2b3B0c19k YXRhICpkYXRhLCB0cmVlIHViYXNlLAotCQkJIHRyZWUgY2Jhc2UsIEhPU1Rf V0lERV9JTlQgcmF0aW8sCi0JCQkgYm9vbCBhZGRyZXNzX3ApCi17Ci0gIGFm Zl90cmVlIHViYXNlX2FmZiwgY2Jhc2VfYWZmOwotICB0cmVlIGV4cHIsIHVi LCBjYjsKKyAgcmV0dXJuIGluZmluaXRlX2Nvc3Q7Cit9CiAKLSAgU1RSSVBf Tk9QUyAodWJhc2UpOwotICBTVFJJUF9OT1BTIChjYmFzZSk7Ci0gIHViID0g dWJhc2U7Ci0gIGNiID0gY2Jhc2U7CisvKiBSZXR1cm4gY29zdCBvZiBjb21w dXRpbmcgVVNFJ3MgYWRkcmVzcyBleHByZXNzaW9uIGJ5IHVzaW5nIENBTkQu CisgICBBRkZfSU5WIGFuZCBBRkZfVkFSIHJlcHJlc2VudCBpbnZhcmlhbnQg YW5kIHZhcmlhbnQgcGFydHMgb2YgdGhlCisgICBhZGRyZXNzIGV4cHJlc3Np b24sIHJlc3BlY3RpdmVseS4gIFNJTVBMRV9JTlYgaXMgVFJVRSBpZiBBRkZf SU5WCisgICBpcyBzaW1wbGUgZW5vdWdoLiAgSWYgQUZGX0lOViBpcyBzaW1w bGUsIHN0b3JlIHRoZSBsb29wIGludmFyaWFudAorICAgdmFyaWFibGVzIHdo aWNoIGFyZSBkZXBlbmRlZCBieSBpdCBpbiBJTlZfVkFSUzsgaWYgQUZGX0lO ViBpcworICAgY29tcGxpY2F0ZWQsIGhhbmRsZSBpdCBhcyBhIG5ldyBpbnZh cmlhbnQgZXhwcmVzc2lvbiBhbmQgcmVjb3JkCisgICBpdCBpbiBJTlZfRVhQ Ui4gIFJBVElPIGluZGljYXRlcyBtdWx0aXBsZSB0aW1lcyBiZXR3ZWVuIHN0 ZXBzIG9mCisgICBVU0UgYW5kIENBTkQuICBJZiBDQU5fQVVUT0lOQyBpcyBu b25OVUxMLCBzdG9yZSBib29sZWFuIHZhbHVlIHRvCisgICBpdCBpbmRpY2F0 aW5nIGlmIHRoaXMgaXMgYW4gYXV0by1pbmNyZW1lbnQgYWRkcmVzcy4gICov CiAKLSAgaWYgKChUUkVFX0NPREUgKHViYXNlKSA9PSBJTlRFR0VSX0NTVCkK LSAgICAgICYmIChUUkVFX0NPREUgKGNiYXNlKSA9PSBJTlRFR0VSX0NTVCkp Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU3RyaXBzIHRoZSBjb25zdGFu dCBwYXJ0LiAqLwotICBpZiAoVFJFRV9DT0RFICh1YmFzZSkgPT0gUExVU19F WFBSCi0gICAgICB8fCBUUkVFX0NPREUgKHViYXNlKSA9PSBNSU5VU19FWFBS Ci0gICAgICB8fCBUUkVFX0NPREUgKHViYXNlKSA9PSBQT0lOVEVSX1BMVVNf RVhQUikKLSAgICB7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChUUkVFX09QRVJB TkQgKHViYXNlLCAxKSkgPT0gSU5URUdFUl9DU1QpCi0JdWJhc2UgPSBUUkVF X09QRVJBTkQgKHViYXNlLCAwKTsKLSAgICB9CitzdGF0aWMgY29tcF9jb3N0 CitnZXRfYWRkcmVzc19jb3N0IChzdHJ1Y3QgaXZvcHRzX2RhdGEgKmRhdGEs IHN0cnVjdCBpdl91c2UgKnVzZSwKKwkJICBzdHJ1Y3QgaXZfY2FuZCAqY2Fu ZCwgYWZmX3RyZWUgKmFmZl9pbnYsCisJCSAgYWZmX3RyZWUgKmFmZl92YXIs IEhPU1RfV0lERV9JTlQgcmF0aW8sCisJCSAgYml0bWFwICppbnZfdmFycywg aXZfaW52X2V4cHJfZW50ICoqaW52X2V4cHIsCisJCSAgYm9vbCAqY2FuX2F1 dG9pbmMsIGJvb2wgc3BlZWQpCit7CisgIHJ0eCBhZGRyOworICBib29sIHNp bXBsZV9pbnYgPSB0cnVlOworICB0cmVlIGNvbXBfaW52ID0gTlVMTF9UUkVF LCB0eXBlID0gYWZmX3Zhci0+dHlwZTsKKyAgY29tcF9jb3N0IHZhcl9jb3N0 ID0gbm9fY29zdCwgY29zdCA9IG5vX2Nvc3Q7CisgIHN0cnVjdCBtZW1fYWRk cmVzcyBwYXJ0cyA9IHtOVUxMX1RSRUUsIGludGVnZXJfb25lX25vZGUsCisJ CQkgICAgICBOVUxMX1RSRUUsIE5VTExfVFJFRSwgTlVMTF9UUkVFfTsKKyAg bWFjaGluZV9tb2RlIGFkZHJfbW9kZSA9IFRZUEVfTU9ERSAodHlwZSk7Cisg IG1hY2hpbmVfbW9kZSBtZW1fbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9UWVBF ICgqdXNlLT5vcF9wKSk7CisgIGFkZHJfc3BhY2VfdCBhcyA9IFRZUEVfQURE Ul9TUEFDRSAoVFJFRV9UWVBFICh1c2UtPml2LT5iYXNlKSk7CisKKyAgaWYg KCFhZmZfY29tYmluYXRpb25fY29uc3RfcCAoYWZmX2ludikpCisgICAgewor ICAgICAgcGFydHMuaW5kZXggPSBpbnRlZ2VyX29uZV9ub2RlOworICAgICAg LyogQWRkcmVzc2luZyBtb2RlICJiYXNlICsgaW5kZXgiLiAgKi8KKyAgICAg IGlmICh2YWxpZF9tZW1fcmVmX3AgKG1lbV9tb2RlLCBhcywgJnBhcnRzKSkK Kwl7CisJICBwYXJ0cy5zdGVwID0gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwg cmF0aW8pOworCSAgLyogQWRkcmVzc2luZyBtb2RlICJiYXNlICsgaW5kZXgg PDwgc2NhbGUiLiAgKi8KKwkgIGlmIChyYXRpbyAhPSAxICYmICF2YWxpZF9t ZW1fcmVmX3AgKG1lbV9tb2RlLCBhcywgJnBhcnRzKSkKKwkgICAgcGFydHMu c3RlcCA9IE5VTExfVFJFRTsKIAotICAvKiBTdHJpcHMgdGhlIGNvbnN0YW50 IHBhcnQuICovCi0gIGlmIChUUkVFX0NPREUgKGNiYXNlKSA9PSBQTFVTX0VY UFIKLSAgICAgIHx8IFRSRUVfQ09ERSAoY2Jhc2UpID09IE1JTlVTX0VYUFIK LSAgICAgIHx8IFRSRUVfQ09ERSAoY2Jhc2UpID09IFBPSU5URVJfUExVU19F WFBSKQotICAgIHsKLSAgICAgIGlmIChUUkVFX0NPREUgKFRSRUVfT1BFUkFO RCAoY2Jhc2UsIDEpKSA9PSBJTlRFR0VSX0NTVCkKLQljYmFzZSA9IFRSRUVf T1BFUkFORCAoY2Jhc2UsIDApOwotICAgIH0KKwkgIGlmIChhZmZfaW52LT5v ZmZzZXQgIT0gMCkKKwkgICAgeworCSAgICAgIHBhcnRzLm9mZnNldCA9IHdp ZGVfaW50X3RvX3RyZWUgKHNpemV0eXBlLCBhZmZfaW52LT5vZmZzZXQpOwor CSAgICAgIC8qIEFkZHJlc3NpbmcgbW9kZSAiYmFzZSArIGluZGV4IFs8PCBz Y2FsZV0gKyBvZmZzZXQiLiAgKi8KKwkgICAgICBpZiAoIXZhbGlkX21lbV9y ZWZfcCAobWVtX21vZGUsIGFzLCAmcGFydHMpKQorCQlwYXJ0cy5vZmZzZXQg PSBOVUxMX1RSRUU7CisJICAgICAgZWxzZQorCQlhZmZfaW52LT5vZmZzZXQg PSAwOworCSAgICB9CiAKLSAgaWYgKGFkZHJlc3NfcCkKLSAgICB7Ci0gICAg ICBpZiAoKChUUkVFX0NPREUgKHViYXNlKSA9PSBTU0FfTkFNRSkKLQkgICB8 fCAoVFJFRV9DT0RFICh1YmFzZSkgPT0gQUREUl9FWFBSCi0JICAgICAgICYm IGlzX2dpbXBsZV9taW5faW52YXJpYW50ICh1YmFzZSkpKQotCSAgJiYgKFRS RUVfQ09ERSAoY2Jhc2UpID09IElOVEVHRVJfQ1NUKSkKLQlyZXR1cm4gTlVM TDsKKwkgIG1vdmVfZml4ZWRfYWRkcmVzc190b19zeW1ib2wgKCZwYXJ0cywg YWZmX2ludik7CisJICAvKiBCYXNlIGlzIGZpeGVkIGFkZHJlc3MgYW5kIGlz IG1vdmVkIHRvIHN5bWJvbCBwYXJ0LiAgKi8KKwkgIGlmIChwYXJ0cy5zeW1i b2wgIT0gTlVMTF9UUkVFICYmIGFmZl9jb21iaW5hdGlvbl96ZXJvX3AgKGFm Zl9pbnYpKQorCSAgICBwYXJ0cy5iYXNlID0gTlVMTF9UUkVFOwogCi0gICAg ICBpZiAoKChUUkVFX0NPREUgKGNiYXNlKSA9PSBTU0FfTkFNRSkKLQkgICB8 fCAoVFJFRV9DT0RFIChjYmFzZSkgPT0gQUREUl9FWFBSCi0JICAgICAgICYm IGlzX2dpbXBsZV9taW5faW52YXJpYW50IChjYmFzZSkpKQotCSAgJiYgKFRS RUVfQ09ERSAodWJhc2UpID09IElOVEVHRVJfQ1NUKSkKLQlyZXR1cm4gTlVM TDsKKwkgIC8qIEFkZHJlc3NpbmcgbW9kZSAic3ltYm9sICsgYmFzZSArIGlu ZGV4IFs8PCBzY2FsZV0gWysgb2Zmc2V0XSIuICAqLworCSAgaWYgKHBhcnRz LnN5bWJvbCAhPSBOVUxMX1RSRUUKKwkgICAgICAmJiAhdmFsaWRfbWVtX3Jl Zl9wIChtZW1fbW9kZSwgYXMsICZwYXJ0cykpCisJICAgIHsKKwkgICAgICBh ZmZfY29tYmluYXRpb25fYWRkX2VsdCAoYWZmX2ludiwgcGFydHMuc3ltYm9s LCAxKTsKKwkgICAgICBwYXJ0cy5zeW1ib2wgPSBOVUxMX1RSRUU7CisJICAg ICAgLyogUmVzZXQgU0lNUExFX0lOViBzaW5jZSBzeW1ib2wgYWRkcmVzcyBu ZWVkcyB0byBiZSBjb21wdXRlZAorCQkgb3V0c2lkZSBvZiBhZGRyZXNzIGV4 cHJlc3Npb24gaW4gdGhpcyBjYXNlLiAgKi8KKwkgICAgICBzaW1wbGVfaW52 ID0gZmFsc2U7CisJICAgICAgLyogU3ltYm9sIHBhcnQgaXMgbW92ZWQgYmFj ayB0byBiYXNlIHBhcnQsIGl0IGNhbid0IGJlIE5VTEwuICAqLworCSAgICAg IHBhcnRzLmJhc2UgPSBpbnRlZ2VyX29uZV9ub2RlOworCSAgICB9CisJfQor ICAgICAgZWxzZQorCXBhcnRzLmluZGV4ID0gTlVMTF9UUkVFOwogICAgIH0K LQotICBpZiAocmF0aW8gPT0gMSkKKyAgZWxzZQogICAgIHsKLSAgICAgIGlm IChvcGVyYW5kX2VxdWFsX3AgKHViYXNlLCBjYmFzZSwgMCkpCi0JcmV0dXJu IE5VTEw7Ci0KLSAgICAgIGlmIChUUkVFX0NPREUgKHViYXNlKSA9PSBBRERS X0VYUFIKLQkgICYmIFRSRUVfQ09ERSAoY2Jhc2UpID09IEFERFJfRVhQUikK KyAgICAgIGlmIChjYW5fYXV0b2luYyAmJiByYXRpbyA9PSAxICYmIGNzdF9h bmRfZml0c19pbl9od2kgKGNhbmQtPml2LT5zdGVwKSkKIAl7Ci0JICB0cmVl IHVzeW0sIGNzeW07Ci0KLQkgIHVzeW0gPSBUUkVFX09QRVJBTkQgKHViYXNl LCAwKTsKLQkgIGNzeW0gPSBUUkVFX09QRVJBTkQgKGNiYXNlLCAwKTsKLQkg IGlmIChUUkVFX0NPREUgKHVzeW0pID09IEFSUkFZX1JFRikKLQkgICAgewot CSAgICAgIHRyZWUgaW5kID0gVFJFRV9PUEVSQU5EICh1c3ltLCAxKTsKLQkg ICAgICBpZiAoVFJFRV9DT0RFIChpbmQpID09IElOVEVHRVJfQ1NUCi0JCSAg JiYgdHJlZV9maXRzX3Nod2lfcCAoaW5kKQotCQkgICYmIHRyZWVfdG9fc2h3 aSAoaW5kKSA9PSAwKQotCQl1c3ltID0gVFJFRV9PUEVSQU5EICh1c3ltLCAw KTsKLQkgICAgfQotCSAgaWYgKFRSRUVfQ09ERSAoY3N5bSkgPT0gQVJSQVlf UkVGKQorCSAgSE9TVF9XSURFX0lOVCBhaW5jX3N0ZXAgPSBpbnRfY3N0X3Zh bHVlIChjYW5kLT5pdi0+c3RlcCk7CisJICBIT1NUX1dJREVfSU5UIGFpbmNf b2Zmc2V0ID0gKGFmZl9pbnYtPm9mZnNldCkudG9fc2h3aSAoKTsKKworCSAg aWYgKHN0bXRfYWZ0ZXJfaW5jcmVtZW50IChkYXRhLT5jdXJyZW50X2xvb3As IGNhbmQsIHVzZS0+c3RtdCkpCisJICAgIGFpbmNfb2Zmc2V0ICs9IGFpbmNf c3RlcDsKKwkgIGNvc3QgPSBnZXRfYWRkcmVzc19jb3N0X2FpbmMgKGFpbmNf c3RlcCwgYWluY19vZmZzZXQsCisJCQkJCWFkZHJfbW9kZSwgbWVtX21vZGUs IGFzLCBzcGVlZCk7CisJICBpZiAoIWNvc3QuaW5maW5pdGVfY29zdF9wICgp KQogCSAgICB7Ci0JICAgICAgdHJlZSBpbmQgPSBUUkVFX09QRVJBTkQgKGNz eW0sIDEpOwotCSAgICAgIGlmIChUUkVFX0NPREUgKGluZCkgPT0gSU5URUdF Ul9DU1QKLQkJICAmJiB0cmVlX2ZpdHNfc2h3aV9wIChpbmQpCi0JCSAgJiYg dHJlZV90b19zaHdpIChpbmQpID09IDApCi0JCWNzeW0gPSBUUkVFX09QRVJB TkQgKGNzeW0sIDApOworCSAgICAgICpjYW5fYXV0b2luYyA9IHRydWU7CisJ ICAgICAgcmV0dXJuIGNvc3Q7CiAJICAgIH0KLQkgIGlmIChvcGVyYW5kX2Vx dWFsX3AgKHVzeW0sIGNzeW0sIDApKQotCSAgICByZXR1cm4gTlVMTDsKKwkg IGNvc3QgPSBub19jb3N0OworCX0KKyAgICAgIGlmICghYWZmX2NvbWJpbmF0 aW9uX3plcm9fcCAoYWZmX2ludikpCisJeworCSAgcGFydHMub2Zmc2V0ID0g d2lkZV9pbnRfdG9fdHJlZSAoc2l6ZXR5cGUsIGFmZl9pbnYtPm9mZnNldCk7 CisJICAvKiBBZGRyZXNzaW5nIG1vZGUgImJhc2UgKyBvZmZzZXQiLiAgKi8K KwkgIGlmICghdmFsaWRfbWVtX3JlZl9wIChtZW1fbW9kZSwgYXMsICZwYXJ0 cykpCisJICAgIHBhcnRzLm9mZnNldCA9IE5VTExfVFJFRTsKKwkgIGVsc2UK KwkgICAgYWZmX2ludi0+b2Zmc2V0ID0gMDsKIAl9Ci0gICAgICAvKiBOb3cg ZG8gbW9yZSBjb21wbGV4IGNvbXBhcmlzb24gICovCi0gICAgICB0cmVlX3Rv X2FmZl9jb21iaW5hdGlvbiAodWJhc2UsIFRSRUVfVFlQRSAodWJhc2UpLCAm dWJhc2VfYWZmKTsKLSAgICAgIHRyZWVfdG9fYWZmX2NvbWJpbmF0aW9uIChj YmFzZSwgVFJFRV9UWVBFIChjYmFzZSksICZjYmFzZV9hZmYpOwotICAgICAg aWYgKGNvbXBhcmVfYWZmX3RyZWVzICgmdWJhc2VfYWZmLCAmY2Jhc2VfYWZm KSkKLQlyZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgdHJlZV90b19hZmZfY29t YmluYXRpb24gKHViLCBUUkVFX1RZUEUgKHViKSwgJnViYXNlX2FmZik7Ci0g IHRyZWVfdG9fYWZmX2NvbWJpbmF0aW9uIChjYiwgVFJFRV9UWVBFIChjYiks ICZjYmFzZV9hZmYpOworICBpZiAoc2ltcGxlX2ludikKKyAgICBzaW1wbGVf aW52ID0gYWZmX2NvbWJpbmF0aW9uX3NpbXBsZV9wIChhZmZfaW52KTsKKyAg aWYgKCFhZmZfY29tYmluYXRpb25femVyb19wIChhZmZfaW52KSkKKyAgICBj b21wX2ludiA9IGFmZl9jb21iaW5hdGlvbl90b190cmVlIChhZmZfaW52KTsK KyAgaWYgKGNvbXBfaW52ICE9IE5VTExfVFJFRSkKKyAgICBjb3N0ID0gZm9y Y2VfdmFyX2Nvc3QgKGRhdGEsIGNvbXBfaW52LCBpbnZfdmFycyk7CisgIGlm IChyYXRpbyAhPSAxICYmIHBhcnRzLnN0ZXAgPT0gTlVMTF9UUkVFKQorICAg IHZhcl9jb3N0ICs9IG11bHRfYnlfY29lZmZfY29zdCAocmF0aW8sIGFkZHJf bW9kZSwgc3BlZWQpOworICBpZiAoY29tcF9pbnYgIT0gTlVMTF9UUkVFICYm IHBhcnRzLmluZGV4ID09IE5VTExfVFJFRSkKKyAgICB2YXJfY29zdCArPSBh ZGRfY29zdCAoc3BlZWQsIGFkZHJfbW9kZSk7CiAKLSAgYWZmX2NvbWJpbmF0 aW9uX3NjYWxlICgmY2Jhc2VfYWZmLCAtMSAqIHJhdGlvKTsKLSAgYWZmX2Nv bWJpbmF0aW9uX2FkZCAoJnViYXNlX2FmZiwgJmNiYXNlX2FmZik7Ci0gIGV4 cHIgPSBhZmZfY29tYmluYXRpb25fdG9fdHJlZSAoJnViYXNlX2FmZik7Ci0g IHJldHVybiByZWNvcmRfaW52X2V4cHIgKGRhdGEsIGV4cHIpOworICBpZiAo Y29tcF9pbnYgJiYgaW52X2V4cHIgJiYgIXNpbXBsZV9pbnYpCisgICAgewor ICAgICAgKmludl9leHByID0gZ2V0X2xvb3BfaW52YXJpYW50X2V4cHIgKGRh dGEsIGNvbXBfaW52KTsKKyAgICAgIC8qIENsZWFyIGRlcGVuZHMgb24uICAq LworICAgICAgaWYgKCppbnZfZXhwciAhPSBOVUxMICYmIGludl92YXJzICYm ICppbnZfdmFycykKKwliaXRtYXBfY2xlYXIgKCppbnZfdmFycyk7CisKKyAg ICAgIC8qIENvc3Qgb2Ygc21hbGwgaW52YXJpYW50IGV4cHJlc3Npb24gYWRq dXN0ZWQgYWdhaW5zdCBsb29wIG5pdGVycworCSBpcyB1c3VhbGx5IHplcm8s IHdoaWNoIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBiZSBkaWZmZXJlbnRpYXRl ZAorCSBmcm9tIGNhbmRpZGF0ZSBiYXNlZCBvbiBsb29wIGludmFyaWFudCB2 YXJpYWJsZXMuICBTZWNvbmRseSwgdGhlCisJIGdlbmVyYXRlZCBpbnZhcmlh bnQgZXhwcmVzc2lvbiBtYXkgbm90IGJlIGhvaXN0ZWQgb3V0IG9mIGxvb3Ag YnkKKwkgZm9sbG93aW5nIHBhc3MuICBXZSBwZW5hbGl6ZSB0aGUgY29zdCBi eSByb3VuZGluZyB1cCBpbiBvcmRlciB0bworCSBuZXV0cmFsaXplIHN1Y2gg ZWZmZWN0cy4gICovCisgICAgICBjb3N0LmNvc3QgPSBhZGp1c3Rfc2V0dXBf Y29zdCAoZGF0YSwgY29zdC5jb3N0LCB0cnVlKTsKKyAgICAgIGNvc3Quc2Ny YXRjaCA9IGNvc3QuY29zdDsKKyAgICB9CisKKyAgY29zdCArPSB2YXJfY29z dDsKKyAgYWRkciA9IGFkZHJfZm9yX21lbV9yZWYgKCZwYXJ0cywgYXMsIGZh bHNlKTsKKyAgZ2NjX2Fzc2VydCAobWVtb3J5X2FkZHJlc3NfYWRkcl9zcGFj ZV9wIChtZW1fbW9kZSwgYWRkciwgYXMpKTsKKyAgY29zdCArPSBhZGRyZXNz X2Nvc3QgKGFkZHIsIG1lbV9tb2RlLCBhcywgc3BlZWQpOworCisgIGlmIChw YXJ0cy5zeW1ib2wgIT0gTlVMTF9UUkVFKQorICAgIGNvc3QuY29tcGxleGl0 eSArPSAxOworICBpZiAocGFydHMuc3RlcCAhPSBOVUxMX1RSRUUgJiYgIWlu dGVnZXJfb25lcCAocGFydHMuc3RlcCkpCisgICAgY29zdC5jb21wbGV4aXR5 ICs9IDE7CisgIGlmIChwYXJ0cy5iYXNlICE9IE5VTExfVFJFRSAmJiBwYXJ0 cy5pbmRleCAhPSBOVUxMX1RSRUUpCisgICAgY29zdC5jb21wbGV4aXR5ICs9 IDE7CisgIGlmIChwYXJ0cy5vZmZzZXQgIT0gTlVMTF9UUkVFICYmICFpbnRl Z2VyX3plcm9wIChwYXJ0cy5vZmZzZXQpKQorICAgIGNvc3QuY29tcGxleGl0 eSArPSAxOworCisgIHJldHVybiBjb3N0OwogfQogCiAvKiBTY2FsZSAobXVs dGlwbHkpIHRoZSBjb21wdXRlZCBDT1NUIChleGNlcHQgc2NyYXRjaCBwYXJ0 IHRoYXQgc2hvdWxkIGJlCiAgICBob2lzdGVkIG91dCBhIGxvb3ApIGJ5IGhl YWRlci0+ZnJlcXVlbmN5IC8gQVQtPmZyZXF1ZW5jeSwgd2hpY2ggbWFrZXMK ICAgIGV4cGVjdGVkIGNvc3QgbW9yZSBhY2N1cmF0ZS4gICovCiAKIHN0YXRp YyBjb21wX2Nvc3QKIGdldF9zY2FsZWRfY29tcHV0YXRpb25fY29zdF9hdCAo aXZvcHRzX2RhdGEgKmRhdGEsIGdpbXBsZSAqYXQsIGNvbXBfY29zdCBjb3N0 KQogewogICAgaW50IGxvb3BfZnJlcSA9IGRhdGEtPmN1cnJlbnRfbG9vcC0+ aGVhZGVyLT5mcmVxdWVuY3k7CkBAIC00ODE2LDIzNyArNDQ2OSwxMTUgQEAg Z2V0X3NjYWxlZF9jb21wdXRhdGlvbl9jb3N0X2F0IChpdm9wdHNfZGF0YSAq ZGF0YSwgZ2ltcGxlICphdCwgY29tcF9jb3N0IGNvc3QpCiAgICBJZiBDQU5f QVVUT0lOQyBpcyBub25udWxsLCB1c2UgaXQgdG8gcmVjb3JkIHdoZXRoZXIg YXV0b2luYwogICAgYWRkcmVzc2luZyBpcyBsaWtlbHkuICBJZiBJTlZfRVhQ UiBpcyBub25udWxsLCByZWNvcmQgaW52YXJpYW50CiAgICBleHByIGVudHJ5 IGluIGl0LiAgKi8KIAogc3RhdGljIGNvbXBfY29zdAogZ2V0X2NvbXB1dGF0 aW9uX2Nvc3QgKHN0cnVjdCBpdm9wdHNfZGF0YSAqZGF0YSwgc3RydWN0IGl2 X3VzZSAqdXNlLAogCQkgICAgICBzdHJ1Y3QgaXZfY2FuZCAqY2FuZCwgYm9v bCBhZGRyZXNzX3AsIGJpdG1hcCAqaW52X3ZhcnMsCiAJCSAgICAgIGJvb2wg KmNhbl9hdXRvaW5jLCBpdl9pbnZfZXhwcl9lbnQgKippbnZfZXhwcikKIHsK ICAgZ2ltcGxlICphdCA9IHVzZS0+c3RtdDsKLSAgdHJlZSB1YmFzZSA9IHVz ZS0+aXYtPmJhc2UsIHVzdGVwID0gdXNlLT5pdi0+c3RlcDsKLSAgdHJlZSBj YmFzZSwgY3N0ZXA7Ci0gIHRyZWUgdXR5cGUgPSBUUkVFX1RZUEUgKHViYXNl KSwgY3R5cGU7Ci0gIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgY3N0ZXBpLCBv ZmZzZXQgPSAwOworICB0cmVlIHViYXNlID0gdXNlLT5pdi0+YmFzZSwgY2Jh c2UgPSBjYW5kLT5pdi0+YmFzZTsKKyAgdHJlZSB1dHlwZSA9IFRSRUVfVFlQ RSAodWJhc2UpLCBjdHlwZSA9IFRSRUVfVFlQRSAoY2Jhc2UpOworICB0cmVl IGNvbXBfaW52ID0gTlVMTF9UUkVFOwogICBIT1NUX1dJREVfSU5UIHJhdGlv LCBhcmF0aW87Ci0gIGJvb2wgdmFyX3ByZXNlbnQsIHN5bWJvbF9wcmVzZW50 LCBzdG10X2lzX2FmdGVyX2luYzsKICAgY29tcF9jb3N0IGNvc3Q7CiAgIHdp ZGVzdF9pbnQgcmF0OworICBhZmZfdHJlZSBhZmZfaW52LCBhZmZfdmFyOwog ICBib29sIHNwZWVkID0gb3B0aW1pemVfYmJfZm9yX3NwZWVkX3AgKGdpbXBs ZV9iYiAoYXQpKTsKLSAgbWFjaGluZV9tb2RlIG1lbV9tb2RlID0gKGFkZHJl c3NfcAotCQkJCT8gVFlQRV9NT0RFIChUUkVFX1RZUEUgKCp1c2UtPm9wX3Ap KQotCQkJCTogVk9JRG1vZGUpOwogCiAgIGlmIChpbnZfdmFycykKICAgICAq aW52X3ZhcnMgPSBOVUxMOworICBpZiAoY2FuX2F1dG9pbmMpCisgICAgKmNh bl9hdXRvaW5jID0gZmFsc2U7CisgIGlmIChpbnZfZXhwcikKKyAgICAqaW52 X2V4cHIgPSBOVUxMOwogCi0gIGNiYXNlID0gY2FuZC0+aXYtPmJhc2U7Ci0g IGNzdGVwID0gY2FuZC0+aXYtPnN0ZXA7Ci0gIGN0eXBlID0gVFJFRV9UWVBF IChjYmFzZSk7Ci0KKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggcHJl Y2lzaW9uIHRvIGV4cHJlc3MgdGhlIHZhbHVlcyBvZiB1c2UuICAqLwogICBp ZiAoVFlQRV9QUkVDSVNJT04gKHV0eXBlKSA+IFRZUEVfUFJFQ0lTSU9OIChj dHlwZSkpCi0gICAgewotICAgICAgLyogV2UgZG8gbm90IGhhdmUgYSBwcmVj aXNpb24gdG8gZXhwcmVzcyB0aGUgdmFsdWVzIG9mIHVzZS4gICovCi0gICAg ICByZXR1cm4gaW5maW5pdGVfY29zdDsKLSAgICB9CisgICAgcmV0dXJuIGlu ZmluaXRlX2Nvc3Q7CiAKICAgaWYgKGFkZHJlc3NfcAogICAgICAgfHwgKHVz ZS0+aXYtPmJhc2Vfb2JqZWN0CiAJICAmJiBjYW5kLT5pdi0+YmFzZV9vYmpl Y3QKIAkgICYmIFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKHVzZS0+aXYt PmJhc2Vfb2JqZWN0KSkKIAkgICYmIFBPSU5URVJfVFlQRV9QIChUUkVFX1RZ UEUgKGNhbmQtPml2LT5iYXNlX29iamVjdCkpKSkKICAgICB7CiAgICAgICAv KiBEbyBub3QgdHJ5IHRvIGV4cHJlc3MgYWRkcmVzcyBvZiBhbiBvYmplY3Qg d2l0aCBjb21wdXRhdGlvbiBiYXNlZAogCSBvbiBhZGRyZXNzIG9mIGEgZGlm ZmVyZW50IG9iamVjdC4gIFRoaXMgbWF5IGNhdXNlIHByb2JsZW1zIGluIHJ0 bAogCSBsZXZlbCBhbGlhcyBhbmFseXNpcyAodGhhdCBkb2VzIG5vdCBleHBl Y3QgdGhpcyB0byBiZSBoYXBwZW5pbmcsCiAJIGFzIHRoaXMgaXMgaWxsZWdh bCBpbiBDKSwgYW5kIHdvdWxkIGJlIHVubGlrZWx5IHRvIGJlIHVzZWZ1bAog CSBhbnl3YXkuICAqLwogICAgICAgaWYgKHVzZS0+aXYtPmJhc2Vfb2JqZWN0 CiAJICAmJiBjYW5kLT5pdi0+YmFzZV9vYmplY3QKIAkgICYmICFvcGVyYW5k X2VxdWFsX3AgKHVzZS0+aXYtPmJhc2Vfb2JqZWN0LCBjYW5kLT5pdi0+YmFz ZV9vYmplY3QsIDApKQogCXJldHVybiBpbmZpbml0ZV9jb3N0OwogICAgIH0K IAotICBpZiAoVFlQRV9QUkVDSVNJT04gKHV0eXBlKSA8IFRZUEVfUFJFQ0lT SU9OIChjdHlwZSkpCi0gICAgewotICAgICAgLyogVE9ETyAtLSBhZGQgZGly ZWN0IGhhbmRsaW5nIG9mIHRoaXMgY2FzZS4gICovCi0gICAgICBnb3RvIGZh bGxiYWNrOwotICAgIH0KLQotICAvKiBDU1RFUEkgaXMgcmVtb3ZlZCBmcm9t IHRoZSBvZmZzZXQgaW4gY2FzZSBzdGF0ZW1lbnQgaXMgYWZ0ZXIgdGhlCi0g ICAgIGluY3JlbWVudC4gIElmIHRoZSBzdGVwIGlzIG5vdCBjb25zdGFudCwg d2UgdXNlIHplcm8gaW5zdGVhZC4KLSAgICAgVGhpcyBpcyBhIGJpdCBpbXBy ZWNpc2UgKHRoZXJlIGlzIHRoZSBleHRyYSBhZGRpdGlvbiksIGJ1dAotICAg ICByZWR1bmRhbmN5IGVsaW1pbmF0aW9uIGlzIGxpa2VseSB0byB0cmFuc2Zv cm0gdGhlIGNvZGUgc28gdGhhdAotICAgICBpdCB1c2VzIHZhbHVlIG9mIHRo ZSB2YXJpYWJsZSBiZWZvcmUgaW5jcmVtZW50IGFueXdheSwKLSAgICAgc28g aXQgaXMgbm90IHRoYXQgbXVjaCB1bnJlYWxpc3RpYy4gICovCi0gIGlmIChj c3RfYW5kX2ZpdHNfaW5faHdpIChjc3RlcCkpCi0gICAgY3N0ZXBpID0gaW50 X2NzdF92YWx1ZSAoY3N0ZXApOwotICBlbHNlCi0gICAgY3N0ZXBpID0gMDsK LQotICBpZiAoIWNvbnN0YW50X211bHRpcGxlX29mICh1c3RlcCwgY3N0ZXAs ICZyYXQpKQotICAgIHJldHVybiBpbmZpbml0ZV9jb3N0OwotCi0gIGlmICh3 aTo6Zml0c19zaHdpX3AgKHJhdCkpCi0gICAgcmF0aW8gPSByYXQudG9fc2h3 aSAoKTsKLSAgZWxzZQorICBpZiAoIWdldF9jb21wdXRhdGlvbl9hZmZfMSAo ZGF0YS0+Y3VycmVudF9sb29wLCBhdCwgdXNlLAorCQkJICAgICAgY2FuZCwg JmFmZl9pbnYsICZhZmZfdmFyLCAmcmF0KQorICAgICAgfHwgIXdpOjpmaXRz X3Nod2lfcCAocmF0KSkKICAgICByZXR1cm4gaW5maW5pdGVfY29zdDsKIAot ICBTVFJJUF9OT1BTIChjYmFzZSk7Ci0gIGN0eXBlID0gVFJFRV9UWVBFIChj YmFzZSk7Ci0KLSAgc3RtdF9pc19hZnRlcl9pbmMgPSBzdG10X2FmdGVyX2lu Y3JlbWVudCAoZGF0YS0+Y3VycmVudF9sb29wLCBjYW5kLCBhdCk7Ci0KLSAg LyogdXNlID0gdWJhc2UgKyByYXRpbyAqICh2YXIgLSBjYmFzZSkuICBJZiBl aXRoZXIgY2Jhc2UgaXMgYSBjb25zdGFudAotICAgICBvciByYXRpbyA9PSAx LCBpdCBpcyBiZXR0ZXIgdG8gaGFuZGxlIHRoaXMgbGlrZQotCi0gICAgIHVi YXNlIC0gcmF0aW8gKiBjYmFzZSArIHJhdGlvICogdmFyCi0KLSAgICAgKGFs c28gaG9sZHMgaW4gdGhlIGNhc2UgcmF0aW8gPT0gLTEsIFRPRE8uICAqLwot Ci0gIGlmIChjc3RfYW5kX2ZpdHNfaW5faHdpIChjYmFzZSkpCi0gICAgewot ICAgICAgb2Zmc2V0ID0gLSByYXRpbyAqICh1bnNpZ25lZCBIT1NUX1dJREVf SU5UKSBpbnRfY3N0X3ZhbHVlIChjYmFzZSk7Ci0gICAgICBjb3N0ID0gZGlm ZmVyZW5jZV9jb3N0IChkYXRhLAotCQkJICAgICAgdWJhc2UsIGJ1aWxkX2lu dF9jc3QgKHV0eXBlLCAwKSwKLQkJCSAgICAgICZzeW1ib2xfcHJlc2VudCwg JnZhcl9wcmVzZW50LCAmb2Zmc2V0LAotCQkJICAgICAgaW52X3ZhcnMpOwot ICAgICAgY29zdCAvPSBhdmdfbG9vcF9uaXRlciAoZGF0YS0+Y3VycmVudF9s b29wKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJhdGlvID09IDEpCi0gICAgewot ICAgICAgdHJlZSByZWFsX2NiYXNlID0gY2Jhc2U7Ci0KLSAgICAgIC8qIENo ZWNrIHRvIHNlZSBpZiBhbnkgYWRqdXN0bWVudCBpcyBuZWVkZWQuICAqLwot ICAgICAgaWYgKGNzdGVwaSA9PSAwICYmIHN0bXRfaXNfYWZ0ZXJfaW5jKQot CXsKLQkgIGFmZl90cmVlIHJlYWxfY2Jhc2VfYWZmOwotCSAgYWZmX3RyZWUg Y3N0ZXBfYWZmOwotCi0JICB0cmVlX3RvX2FmZl9jb21iaW5hdGlvbiAoY2Jh c2UsIFRSRUVfVFlQRSAocmVhbF9jYmFzZSksCi0JCQkJICAgJnJlYWxfY2Jh c2VfYWZmKTsKLQkgIHRyZWVfdG9fYWZmX2NvbWJpbmF0aW9uIChjc3RlcCwg VFJFRV9UWVBFIChjc3RlcCksICZjc3RlcF9hZmYpOwotCi0JICBhZmZfY29t YmluYXRpb25fYWRkICgmcmVhbF9jYmFzZV9hZmYsICZjc3RlcF9hZmYpOwot CSAgcmVhbF9jYmFzZSA9IGFmZl9jb21iaW5hdGlvbl90b190cmVlICgmcmVh bF9jYmFzZV9hZmYpOwotCX0KLQotICAgICAgY29zdCA9IGRpZmZlcmVuY2Vf Y29zdCAoZGF0YSwKLQkJCSAgICAgIHViYXNlLCByZWFsX2NiYXNlLAotCQkJ ICAgICAgJnN5bWJvbF9wcmVzZW50LCAmdmFyX3ByZXNlbnQsICZvZmZzZXQs Ci0JCQkgICAgICBpbnZfdmFycyk7Ci0gICAgICBjb3N0IC89IGF2Z19sb29w X25pdGVyIChkYXRhLT5jdXJyZW50X2xvb3ApOwotICAgIH0KLSAgZWxzZSBp ZiAoYWRkcmVzc19wCi0JICAgJiYgIVBPSU5URVJfVFlQRV9QIChjdHlwZSkK LQkgICAmJiBtdWx0aXBsaWVyX2FsbG93ZWRfaW5fYWRkcmVzc19wCi0JCShy YXRpbywgbWVtX21vZGUsCi0JCQlUWVBFX0FERFJfU1BBQ0UgKFRSRUVfVFlQ RSAodXR5cGUpKSkpCi0gICAgewotICAgICAgdHJlZSByZWFsX2NiYXNlID0g Y2Jhc2U7Ci0KLSAgICAgIGlmIChjc3RlcGkgPT0gMCAmJiBzdG10X2lzX2Fm dGVyX2luYykKLQl7Ci0JICBpZiAoUE9JTlRFUl9UWVBFX1AgKGN0eXBlKSkK LQkgICAgcmVhbF9jYmFzZSA9IGZvbGRfYnVpbGQyIChQT0lOVEVSX1BMVVNf RVhQUiwgY3R5cGUsIGNiYXNlLCBjc3RlcCk7Ci0JICBlbHNlCi0JICAgIHJl YWxfY2Jhc2UgPSBmb2xkX2J1aWxkMiAoUExVU19FWFBSLCBjdHlwZSwgY2Jh c2UsIGNzdGVwKTsKLQl9Ci0gICAgICByZWFsX2NiYXNlID0gZm9sZF9idWls ZDIgKE1VTFRfRVhQUiwgY3R5cGUsIHJlYWxfY2Jhc2UsCi0JCQkJYnVpbGRf aW50X2NzdCAoY3R5cGUsIHJhdGlvKSk7Ci0gICAgICBjb3N0ID0gZGlmZmVy ZW5jZV9jb3N0IChkYXRhLAotCQkJICAgICAgdWJhc2UsIHJlYWxfY2Jhc2Us Ci0JCQkgICAgICAmc3ltYm9sX3ByZXNlbnQsICZ2YXJfcHJlc2VudCwgJm9m ZnNldCwKLQkJCSAgICAgIGludl92YXJzKTsKLSAgICAgIGNvc3QgLz0gYXZn X2xvb3Bfbml0ZXIgKGRhdGEtPmN1cnJlbnRfbG9vcCk7Ci0gICAgfQotICBl bHNlCisgIHJhdGlvID0gcmF0LnRvX3Nod2kgKCk7CisgIGlmIChhZGRyZXNz X3ApCiAgICAgewotICAgICAgY29zdCA9IGZvcmNlX3Zhcl9jb3N0IChkYXRh LCBjYmFzZSwgaW52X3ZhcnMpOwotICAgICAgY29zdCArPSBkaWZmZXJlbmNl X2Nvc3QgKGRhdGEsIHViYXNlLCBidWlsZF9pbnRfY3N0ICh1dHlwZSwgMCks Ci0JCQkgICAgICAgJnN5bWJvbF9wcmVzZW50LCAmdmFyX3ByZXNlbnQsICZv ZmZzZXQsCi0JCQkgICAgICAgaW52X3ZhcnMpOwotICAgICAgY29zdCAvPSBh dmdfbG9vcF9uaXRlciAoZGF0YS0+Y3VycmVudF9sb29wKTsKLSAgICAgIGNv c3QgKz0gYWRkX2Nvc3QgKGRhdGEtPnNwZWVkLCBUWVBFX01PREUgKGN0eXBl KSk7CisgICAgICBjb3N0ID0gZ2V0X2FkZHJlc3NfY29zdCAoZGF0YSwgdXNl LCBjYW5kLCAmYWZmX2ludiwgJmFmZl92YXIsIHJhdGlvLAorCQkJICAgICAg IGludl92YXJzLCBpbnZfZXhwciwgY2FuX2F1dG9pbmMsIHNwZWVkKTsKKyAg ICAgIHJldHVybiBnZXRfc2NhbGVkX2NvbXB1dGF0aW9uX2Nvc3RfYXQgKGRh dGEsIGF0LCBjb3N0KTsKICAgICB9CiAKLSAgLyogUmVjb3JkIHNldHVwIGNv c3QgaW4gc2NyYXRjaCBmaWVsZC4gICovCi0gIGNvc3Quc2NyYXRjaCA9IGNv c3QuY29zdDsKKyAgYm9vbCBzaW1wbGVfaW52ID0gYWZmX2NvbWJpbmF0aW9u X3NpbXBsZV9wICgmYWZmX2ludik7CisgIHRyZWUgc2lnbmVkX3R5cGUgPSBz aWduZWRfdHlwZV9mb3IgKGFmZl9jb21iaW5hdGlvbl90eXBlICgmYWZmX2lu dikpOworICBhZmZfY29tYmluYXRpb25fY29udmVydCAoJmFmZl9pbnYsIHNp Z25lZF90eXBlKTsKKyAgaWYgKCFhZmZfY29tYmluYXRpb25femVyb19wICgm YWZmX2ludikpCisgICAgY29tcF9pbnYgPSBhZmZfY29tYmluYXRpb25fdG9f dHJlZSAoJmFmZl9pbnYpOwogCi0gIGlmIChpbnZfZXhwciAmJiBpbnZfdmFy cyAmJiAqaW52X3ZhcnMpCisgIGNvc3QgPSBmb3JjZV92YXJfY29zdCAoZGF0 YSwgY29tcF9pbnYsIGludl92YXJzKTsKKyAgaWYgKGNvbXBfaW52ICYmIGlu dl9leHByICYmICFzaW1wbGVfaW52KQogICAgIHsKLSAgICAgICppbnZfZXhw ciA9IGdldF9sb29wX2ludmFyaWFudF9leHByIChkYXRhLCB1YmFzZSwgY2Jh c2UsIHJhdGlvLAotCQkJCQkgICBhZGRyZXNzX3ApOworICAgICAgKmludl9l eHByID0gZ2V0X2xvb3BfaW52YXJpYW50X2V4cHIgKGRhdGEsIGNvbXBfaW52 KTsKICAgICAgIC8qIENsZWFyIGRlcGVuZHMgb24uICAqLwotICAgICAgaWYg KCppbnZfZXhwciAhPSBOVUxMKQorICAgICAgaWYgKCppbnZfZXhwciAhPSBO VUxMICYmIGludl92YXJzICYmICppbnZfdmFycykKIAliaXRtYXBfY2xlYXIg KCppbnZfdmFycyk7Ci0gICAgfQogCi0gIC8qIElmIHdlIGFyZSBhZnRlciB0 aGUgaW5jcmVtZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNhbmRpZGF0ZSBpcyBo aWdoZXIgYnkKLSAgICAgb25lIGl0ZXJhdGlvbi4gICovCi0gIGlmIChzdG10 X2lzX2FmdGVyX2luYykKLSAgICBvZmZzZXQgLT0gcmF0aW8gKiBjc3RlcGk7 Ci0KLSAgLyogTm93IHRoZSBjb21wdXRhdGlvbiBpcyBpbiBzaGFwZSBzeW1i b2wgKyB2YXIxICsgY29uc3QgKyByYXRpbyAqIHZhcjIuCi0gICAgIChzeW1i b2wvdmFyMS9jb25zdCBwYXJ0cyBtYXkgYmUgb21pdHRlZCkuICBJZiB3ZSBh cmUgbG9va2luZyBmb3IgYW4KLSAgICAgYWRkcmVzcywgZmluZCB0aGUgY29z dCBvZiBhZGRyZXNzaW5nIHRoaXMuICAqLwotICBpZiAoYWRkcmVzc19wKQot ICAgIHsKLSAgICAgIGNvc3QgKz0gZ2V0X2FkZHJlc3NfY29zdCAoc3ltYm9s X3ByZXNlbnQsIHZhcl9wcmVzZW50LAotCQkJCW9mZnNldCwgcmF0aW8sIGNz dGVwaSwKLQkJCQltZW1fbW9kZSwKLQkJCQlUWVBFX0FERFJfU1BBQ0UgKFRS RUVfVFlQRSAodXR5cGUpKSwKLQkJCQlzcGVlZCwgc3RtdF9pc19hZnRlcl9p bmMsIGNhbl9hdXRvaW5jKTsKLSAgICAgIHJldHVybiBnZXRfc2NhbGVkX2Nv bXB1dGF0aW9uX2Nvc3RfYXQgKGRhdGEsIGF0LCBjb3N0KTsKKyAgICAgIGNv c3QuY29zdCA9IGFkanVzdF9zZXR1cF9jb3N0IChkYXRhLCBjb3N0LmNvc3Qp OworICAgICAgLyogUmVjb3JkIHNldHVwIGNvc3QgaW4gc2NyYXRjaCBmaWVs ZC4gICovCisgICAgICBjb3N0LnNjcmF0Y2ggPSBjb3N0LmNvc3Q7CiAgICAg fQorICAvKiBDb3N0IG9mIGNvbnN0YW50IGludGVnZXIgY2FuIGJlIGNvdmVy ZWQgd2hlbiBhZGRpbmcgaW52YXJpYW50IHBhcnQgdG8KKyAgICAgdmFyaWFu dCBwYXJ0LiAgKi8KKyAgZWxzZSBpZiAoY29tcF9pbnYgJiYgQ09OU1RBTlRf Q0xBU1NfUCAoY29tcF9pbnYpKQorICAgIGNvc3QgPSBub19jb3N0OwogCi0g IC8qIE90aGVyd2lzZSBlc3RpbWF0ZSB0aGUgY29zdHMgZm9yIGNvbXB1dGlu ZyB0aGUgZXhwcmVzc2lvbi4gICovCi0gIGlmICghc3ltYm9sX3ByZXNlbnQg JiYgIXZhcl9wcmVzZW50ICYmICFvZmZzZXQpCisgIC8qIE5lZWQgdHlwZSBu YXJyb3dpbmcgdG8gcmVwcmVzZW50IHVzZSB3aXRoIGNhbmQuICAqLworICBp ZiAoVFlQRV9QUkVDSVNJT04gKHV0eXBlKSA8IFRZUEVfUFJFQ0lTSU9OIChj dHlwZSkpCiAgICAgewotICAgICAgaWYgKHJhdGlvICE9IDEpCi0JY29zdCAr PSBtdWx0X2J5X2NvZWZmX2Nvc3QgKHJhdGlvLCBUWVBFX01PREUgKGN0eXBl KSwgc3BlZWQpOwotICAgICAgcmV0dXJuIGdldF9zY2FsZWRfY29tcHV0YXRp b25fY29zdF9hdCAoZGF0YSwgYXQsIGNvc3QpOworICAgICAgbWFjaGluZV9t b2RlIG91dGVyX21vZGUgPSBUWVBFX01PREUgKHV0eXBlKTsKKyAgICAgIG1h Y2hpbmVfbW9kZSBpbm5lcl9tb2RlID0gVFlQRV9NT0RFIChjdHlwZSk7Cisg ICAgICBjb3N0ICs9IGNvbXBfY29zdCAoY29udmVydF9jb3N0IChvdXRlcl9t b2RlLCBpbm5lcl9tb2RlLCBzcGVlZCksIDApOwogICAgIH0KIAotICAvKiBT eW1ib2wgKyBvZmZzZXQgc2hvdWxkIGJlIGNvbXBpbGUtdGltZSBjb21wdXRh YmxlIHNvIGNvbnNpZGVyIHRoYXQgdGhleQotICAgICAgYXJlIGFkZGVkIG9u Y2UgdG8gdGhlIHZhcmlhYmxlLCBpZiBwcmVzZW50LiAgKi8KLSAgaWYgKHZh cl9wcmVzZW50ICYmIChzeW1ib2xfcHJlc2VudCB8fCBvZmZzZXQpKQotICAg IGNvc3QgKz0gYWRqdXN0X3NldHVwX2Nvc3QgKGRhdGEsCi0JCQkJICAgIGFk ZF9jb3N0IChzcGVlZCwgVFlQRV9NT0RFIChjdHlwZSkpKTsKLQotICAvKiBI YXZpbmcgb2Zmc2V0IGRvZXMgbm90IGFmZmVjdCBydW50aW1lIGNvc3QgaW4g Y2FzZSBpdCBpcyBhZGRlZCB0bwotICAgICBzeW1ib2wsIGJ1dCBpdCBpbmNy ZWFzZXMgY29tcGxleGl0eS4gICovCi0gIGlmIChvZmZzZXQpCi0gICAgY29z dC5jb21wbGV4aXR5Kys7Ci0KLSAgY29zdCArPSBhZGRfY29zdCAoc3BlZWQs IFRZUEVfTU9ERSAoY3R5cGUpKTsKLQotICBhcmF0aW8gPSByYXRpbyA+IDAg PyByYXRpbyA6IC1yYXRpbzsKLSAgaWYgKGFyYXRpbyAhPSAxKQotICAgIGNv c3QgKz0gbXVsdF9ieV9jb2VmZl9jb3N0IChhcmF0aW8sIFRZUEVfTU9ERSAo Y3R5cGUpLCBzcGVlZCk7Ci0KLSAgcmV0dXJuIGdldF9zY2FsZWRfY29tcHV0 YXRpb25fY29zdF9hdCAoZGF0YSwgYXQsIGNvc3QpOwotCi1mYWxsYmFjazoK LSAgaWYgKGNhbl9hdXRvaW5jKQotICAgICpjYW5fYXV0b2luYyA9IGZhbHNl OwotCi0gIC8qIEp1c3QgZ2V0IHRoZSBleHByZXNzaW9uLCBleHBhbmQgaXQg YW5kIG1lYXN1cmUgdGhlIGNvc3QuICAqLwotICB0cmVlIGNvbXAgPSBnZXRf Y29tcHV0YXRpb25fYXQgKGRhdGEtPmN1cnJlbnRfbG9vcCwgYXQsIHVzZSwg Y2FuZCk7Ci0KLSAgaWYgKCFjb21wKQotICAgIHJldHVybiBpbmZpbml0ZV9j b3N0OworICAvKiBUdXJuIGEgKyBpICogKC1jKSBpbnRvIGEgLSBpICogYy4g ICovCisgIGlmIChyYXRpbyA8IDAgJiYgY29tcF9pbnYgJiYgIWludGVnZXJf emVyb3AgKGNvbXBfaW52KSkKKyAgICBhcmF0aW8gPSAtcmF0aW87CisgIGVs c2UKKyAgICBhcmF0aW8gPSByYXRpbzsKIAotICBpZiAoYWRkcmVzc19wKQot ICAgIGNvbXAgPSBidWlsZF9zaW1wbGVfbWVtX3JlZiAoY29tcCk7CisgIGlm IChyYXRpbyAhPSAxKQorICAgIGNvc3QgKz0gbXVsdF9ieV9jb2VmZl9jb3N0 IChhcmF0aW8sIFRZUEVfTU9ERSAodXR5cGUpLCBzcGVlZCk7CiAKLSAgY29z dCA9IGNvbXBfY29zdCAoY29tcHV0YXRpb25fY29zdCAoY29tcCwgc3BlZWQp LCAwKTsKKyAgLyogVE9ETzogV2UgbWF5IGFsc28gbmVlZCB0byBjaGVjayBp ZiB3ZSBjYW4gY29tcHV0ZSAgYSArIGkgKiA0IGluIG9uZQorICAgICBpbnN0 cnVjdGlvbi4gICovCisgIC8qIE5lZWQgdG8gYWRkIHVwIHRoZSBpbnZhcmlh bnQgYW5kIHZhcmlhbnQgcGFydHMuICAqLworICBpZiAoY29tcF9pbnYgJiYg IWludGVnZXJfemVyb3AgKGNvbXBfaW52KSkKKyAgICBjb3N0ICs9IGFkZF9j b3N0IChzcGVlZCwgVFlQRV9NT0RFICh1dHlwZSkpOwogCiAgIHJldHVybiBn ZXRfc2NhbGVkX2NvbXB1dGF0aW9uX2Nvc3RfYXQgKGRhdGEsIGF0LCBjb3N0 KTsKIH0KIAogLyogRGV0ZXJtaW5lcyBjb3N0IG9mIGNvbXB1dGluZyB0aGUg dXNlIGluIEdST1VQIHdpdGggQ0FORCBpbiBhIGdlbmVyaWMKICAgIGV4cHJl c3Npb24uICAqLwogCiBzdGF0aWMgYm9vbAogZGV0ZXJtaW5lX2dyb3VwX2l2 X2Nvc3RfZ2VuZXJpYyAoc3RydWN0IGl2b3B0c19kYXRhICpkYXRhLAogCQkJ CSBzdHJ1Y3QgaXZfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgaXZfY2FuZCAqY2Fu ZCkKQEAgLTUxMTMsMjEgKzQ2NDQsMjggQEAgZGV0ZXJtaW5lX2dyb3VwX2l2 X2Nvc3RfYWRkcmVzcyAoc3RydWN0IGl2b3B0c19kYXRhICpkYXRhLAogICBj b3N0IC09IGNvc3Quc2NyYXRjaDsKICAgLyogQ29tcHV0ZSBhbmQgYWRkIGNv c3RzIGZvciByZXN0IHVzZXMgb2YgdGhpcyBncm91cC4gICovCiAgIGZvciAo aSA9IDE7IGkgPCBncm91cC0+dnVzZXMubGVuZ3RoICgpICYmICFzdW1fY29z dC5pbmZpbml0ZV9jb3N0X3AgKCk7IGkrKykKICAgICB7CiAgICAgICBzdHJ1 Y3QgaXZfdXNlICpuZXh0ID0gZ3JvdXAtPnZ1c2VzW2ldOwogCiAgICAgICAv KiBUT0RPOiBXZSBjb3VsZCBza2lwIGNvbXB1dGluZyBjb3N0IGZvciBzdWIg aXZfdXNlIHdoZW4gaXQgaGFzIHRoZQogCSBzYW1lIGNvc3QgYXMgdGhlIGZp cnN0IGl2X3VzZSwgYnV0IHRoZSBjb3N0IHJlYWxseSBkZXBlbmRzIG9uIHRo ZQogCSBvZmZzZXQgYW5kIHdoZXJlIHRoZSBpdl91c2UgaXMuICAqLwogCWNv c3QgPSBnZXRfY29tcHV0YXRpb25fY29zdCAoZGF0YSwgbmV4dCwgY2FuZCwg dHJ1ZSwKLQkJCQkgICAgIE5VTEwsICZjYW5fYXV0b2luYywgTlVMTCk7CisJ CQkJICAgICBOVUxMLCAmY2FuX2F1dG9pbmMsICZpbnZfZXhwcik7CisJaWYg KGludl9leHByKQorCSAgeworCSAgICBpZiAoIWludl9leHBycykKKwkgICAg ICBpbnZfZXhwcnMgPSBCSVRNQVBfQUxMT0MgKE5VTEwpOworCisJICAgIGJp dG1hcF9zZXRfYml0IChpbnZfZXhwcnMsIGludl9leHByLT5pZCk7CisJICB9 CiAgICAgICBzdW1fY29zdCArPSBjb3N0OwogICAgIH0KICAgc2V0X2dyb3Vw X2l2X2Nvc3QgKGRhdGEsIGdyb3VwLCBjYW5kLCBzdW1fY29zdCwgaW52X3Zh cnMsCiAJCSAgICAgTlVMTF9UUkVFLCBFUlJPUl9NQVJLLCBpbnZfZXhwcnMp OwogCiAgIHJldHVybiAhc3VtX2Nvc3QuaW5maW5pdGVfY29zdF9wICgpOwog fQogCiAvKiBDb21wdXRlcyB2YWx1ZSBvZiBjYW5kaWRhdGUgQ0FORCBhdCBw b3NpdGlvbiBBVCBpbiBpdGVyYXRpb24gTklURVIsIGFuZAogICAgc3RvcmVz IGl0IHRvIFZBTC4gICovCkBAIC01NTYwLDIxICs1MDk4LDIxIEBAIGRldGVy bWluZV9ncm91cF9pdl9jb3N0X2NvbmQgKHN0cnVjdCBpdm9wdHNfZGF0YSAq ZGF0YSwKICAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoYm91bmQpID09IElO VEVHRVJfQ1NUKQogCWVsaW1fY29zdC5jb3N0ID0gMDsKICAgICAgIC8qIElm IHdlIHJlcGxhY2UgYSBsb29wIGNvbmRpdGlvbiAnaSA8IG4nIHdpdGggJ3Ag PCBiYXNlICsgbicsCiAJIGludl92YXJzX2VsaW0gd2lsbCBoYXZlICdiYXNl JyBhbmQgJ24nIHNldCwgd2hpY2ggaW1wbGllcyB0aGF0IGJvdGgKIAkgJ2Jh c2UnIGFuZCAnbicgd2lsbCBiZSBsaXZlIGR1cmluZyB0aGUgbG9vcC4JIE1v cmUgbGlrZWx5LAogCSAnYmFzZSArIG4nIHdpbGwgYmUgbG9vcCBpbnZhcmlh bnQsIHJlc3VsdGluZyBpbiBvbmx5IG9uZSBsaXZlIHZhbHVlCiAJIGR1cmlu ZyB0aGUgbG9vcC4gIFNvIGluIHRoYXQgY2FzZSB3ZSBjbGVhciBpbnZfdmFy c19lbGltIGFuZCBzZXQKIAkgaW52X2V4cHJfZWxpbSBpbnN0ZWFkLiAgKi8K ICAgICAgIGlmIChpbnZfdmFyc19lbGltICYmIGJpdG1hcF9jb3VudF9iaXRz IChpbnZfdmFyc19lbGltKSA+IDEpCiAJewotCSAgaW52X2V4cHJfZWxpbSA9 IHJlY29yZF9pbnZfZXhwciAoZGF0YSwgYm91bmQpOworCSAgaW52X2V4cHJf ZWxpbSA9IGdldF9sb29wX2ludmFyaWFudF9leHByIChkYXRhLCBib3VuZCk7 CiAJICBiaXRtYXBfY2xlYXIgKGludl92YXJzX2VsaW0pOwogCX0KICAgICAg IC8qIFRoZSBib3VuZCBpcyBhIGxvb3AgaW52YXJpYW50LCBzbyBpdCB3aWxs IGJlIG9ubHkgY29tcHV0ZWQKIAkgb25jZS4gICovCiAgICAgICBlbGltX2Nv c3QuY29zdCA9IGFkanVzdF9zZXR1cF9jb3N0IChkYXRhLCBlbGltX2Nvc3Qu Y29zdCk7CiAgICAgfQogICBlbHNlCiAgICAgZWxpbV9jb3N0ID0gaW5maW5p dGVfY29zdDsKIAogICAvKiBUcnkgZXhwcmVzc2luZyB0aGUgb3JpZ2luYWwg Z2l2LiAgSWYgaXQgaXMgY29tcGFyZWQgd2l0aCBhbiBpbnZhcmlhbnQsCkBA IC02MjIxLDM5ICs1NzU5LDM1IEBAIHN0YXRpYyBjb21wX2Nvc3QKIGl2X2Nh X2Nvc3QgKHN0cnVjdCBpdl9jYSAqaXZzKQogewogICAvKiBUaGlzIHdhcyBh IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYnV0IGl0IHRyaWdnZXJlZCBhIGJ1 ZyBpbgogICAgICBTdW4gQyA1LjUuICAqLwogICBpZiAoaXZzLT5iYWRfZ3Jv dXBzKQogICAgIHJldHVybiBpbmZpbml0ZV9jb3N0OwogICBlbHNlCiAgICAg cmV0dXJuIGl2cy0+Y29zdDsKIH0KIAotLyogUmV0dXJucyB0cnVlIGlmIGFs bCBkZXBlbmRlbmNlcyBvZiBDUCBhcmUgYW1vbmcgaW52YXJpYW50cyBpbiBJ VlMuICAqLworLyogUmV0dXJucyB0cnVlIGlmIGFwcGx5aW5nIE5FV19DUCB0 byBHUk9VUCBmb3IgSVZTIGludHJvZHVjZXMgbW9yZQorICAgaW52YXJpYW50 cyB0aGFuIE9MRF9DUC4gICovCiAKIHN0YXRpYyBib29sCi1pdl9jYV9oYXNf ZGVwcyAoc3RydWN0IGl2X2NhICppdnMsIHN0cnVjdCBjb3N0X3BhaXIgKmNw KQoraXZfY2FfbW9yZV9kZXBzIChzdHJ1Y3QgaXZvcHRzX2RhdGEgKmRhdGEs IHN0cnVjdCBpdl9jYSAqaXZzLAorCQkgc3RydWN0IGl2X2dyb3VwICpncm91 cCwgc3RydWN0IGNvc3RfcGFpciAqb2xkX2NwLAorCQkgc3RydWN0IGNvc3Rf cGFpciAqbmV3X2NwKQogewotICB1bnNpZ25lZCBpOwotICBiaXRtYXBfaXRl cmF0b3IgYmk7CisgIGdjY19hc3NlcnQgKG9sZF9jcCAmJiBuZXdfY3AgJiYg b2xkX2NwICE9IG5ld19jcCk7CisgIHVuc2lnbmVkIG9sZF9uX2ludnMgPSBp dnMtPm5faW52czsKKyAgaXZfY2Ffc2V0X2NwIChkYXRhLCBpdnMsIGdyb3Vw LCBuZXdfY3ApOworICB1bnNpZ25lZCBuZXdfbl9pbnZzID0gaXZzLT5uX2lu dnM7CisgIGl2X2NhX3NldF9jcCAoZGF0YSwgaXZzLCBncm91cCwgb2xkX2Nw KTsKIAotICBpZiAoY3AtPmludl92YXJzKQotICAgIEVYRUNVVEVfSUZfU0VU X0lOX0JJVE1BUCAoY3AtPmludl92YXJzLCAwLCBpLCBiaSkKLSAgICAgIGlm IChpdnMtPm5faW52X3Zhcl91c2VzW2ldID09IDApCi0JcmV0dXJuIGZhbHNl OwotCi0gIGlmIChjcC0+aW52X2V4cHJzKQotICAgIEVYRUNVVEVfSUZfU0VU X0lOX0JJVE1BUCAoY3AtPmludl9leHBycywgMCwgaSwgYmkpCi0gICAgICBp ZiAoaXZzLT5uX2ludl9leHByX3VzZXNbaV0gPT0gMCkKLQlyZXR1cm4gZmFs c2U7Ci0KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiAobmV3X25faW52cyA+ IG9sZF9uX2ludnMpOwogfQogCiAvKiBDcmVhdGVzIGNoYW5nZSBvZiBleHBy ZXNzaW5nIEdST1VQIGJ5IE5FV19DUCBpbnN0ZWFkIG9mIE9MRF9DUCBhbmQg Y2hhaW5zCiAgICBpdCBiZWZvcmUgTkVYVC4gICovCiAKIHN0YXRpYyBzdHJ1 Y3QgaXZfY2FfZGVsdGEgKgogaXZfY2FfZGVsdGFfYWRkIChzdHJ1Y3QgaXZf Z3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29zdF9wYWlyICpvbGRfY3AsCiAJCSBz dHJ1Y3QgY29zdF9wYWlyICpuZXdfY3AsIHN0cnVjdCBpdl9jYV9kZWx0YSAq bmV4dCkKIHsKICAgc3RydWN0IGl2X2NhX2RlbHRhICpjaGFuZ2UgPSBYTkVX IChzdHJ1Y3QgaXZfY2FfZGVsdGEpOwpAQCAtNjQ3MSwyMSArNjAwNSwyMSBA QCBpdl9jYV9leHRlbmQgKHN0cnVjdCBpdm9wdHNfZGF0YSAqZGF0YSwgc3Ry dWN0IGl2X2NhICppdnMsCiAgICAgICBvbGRfY3AgPSBpdl9jYV9jYW5kX2Zv cl9ncm91cCAoaXZzLCBncm91cCk7CiAKICAgICAgIGlmIChvbGRfY3AKIAkg ICYmIG9sZF9jcC0+Y2FuZCA9PSBjYW5kKQogCWNvbnRpbnVlOwogCiAgICAg ICBuZXdfY3AgPSBnZXRfZ3JvdXBfaXZfY29zdCAoZGF0YSwgZ3JvdXAsIGNh bmQpOwogICAgICAgaWYgKCFuZXdfY3ApCiAJY29udGludWU7CiAKLSAgICAg IGlmICghbWluX25jYW5kICYmICFpdl9jYV9oYXNfZGVwcyAoaXZzLCBuZXdf Y3ApKQorICAgICAgaWYgKCFtaW5fbmNhbmQgJiYgaXZfY2FfbW9yZV9kZXBz IChkYXRhLCBpdnMsIGdyb3VwLCBvbGRfY3AsIG5ld19jcCkpCiAJY29udGlu dWU7CiAKICAgICAgIGlmICghbWluX25jYW5kICYmICFjaGVhcGVyX2Nvc3Rf cGFpciAobmV3X2NwLCBvbGRfY3ApKQogCWNvbnRpbnVlOwogCiAgICAgICAq ZGVsdGEgPSBpdl9jYV9kZWx0YV9hZGQgKGdyb3VwLCBvbGRfY3AsIG5ld19j cCwgKmRlbHRhKTsKICAgICB9CiAKICAgaXZfY2FfZGVsdGFfY29tbWl0IChk YXRhLCBpdnMsICpkZWx0YSwgdHJ1ZSk7CiAgIGNvc3QgPSBpdl9jYV9jb3N0 IChpdnMpOwo= --94eb2c0942ea9b8792054e0f156a--